121 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require "db/exceptions/invalid_record"
 | |
| require "exceptions/invalid_command"
 | |
| require "db/mongo/models/mongo_model"
 | |
| 
 | |
| #require "common/fog"
 | |
| 
 | |
| class User < MongoModel
 | |
| 
 | |
|   ROOT_USER_NAME = 'root'
 | |
|   ROOT_PASSWORD = ''
 | |
| 
 | |
|   PRIVILEGES = ["r", "w", "x"]
 | |
|   PRIVILEGES_REGEX = /^r?w?x?$/
 | |
| 
 | |
|   attr_accessor :id, :password, :privileges, :email
 | |
|   types :id => {:type => String, :empty => false},
 | |
|         :email => {:type => String, :empty => false},
 | |
|         :password => {:type => String, :empty => true}
 | |
| 
 | |
|   def initialize p={}
 | |
|     self.id = p['username']
 | |
|     self.email = p['email']
 | |
|     self.password = p['password']
 | |
|     self.privileges = p["privileges"] || self.default_privileges
 | |
|   end
 | |
| 
 | |
|   def all_privileges
 | |
|     privileges_with_value("rwx")
 | |
|   end
 | |
| 
 | |
|   def default_privileges
 | |
|     privileges_with_value("r", "user" => "")
 | |
|   end
 | |
| 
 | |
|   def grant cmd, priv=''
 | |
|     if !priv.empty? and PRIVILEGES_REGEX.match(priv).to_s.empty?
 | |
|       raise InvalidCommand.new "Invalid privileges '#{priv}'. Available values are '#{PRIVILEGES.join("', '")}'"
 | |
|     end
 | |
|     raise InvalidPrivileges.new "Can't grant privileges to root" if self.id == ROOT_USER_NAME
 | |
| 
 | |
|     case cmd
 | |
|     when "all"
 | |
|       self.privileges.each_key do |key|
 | |
|         self.privileges[key] = priv
 | |
|       end
 | |
|     when ""
 | |
|       self.privileges = self.default_privileges
 | |
|     else
 | |
|       raise InvalidCommand.new "Unsupported command #{cmd}" unless self.all_privileges.include?(cmd)
 | |
|       self.privileges[cmd] = priv
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def self.create_from_bson s
 | |
|     user = User.new s
 | |
|     user.id = s["_id"]
 | |
|     user
 | |
|   end
 | |
| 
 | |
|   def self.create_from_json json
 | |
|     User.new( JSON.parse(json) )
 | |
|   end
 | |
| 
 | |
|   def to_hash_without_id
 | |
|     o = {
 | |
|       "email" => self.email,
 | |
|       "password" => self.password,
 | |
|       "privileges" => self.privileges
 | |
|     }
 | |
|     o
 | |
|   end
 | |
| 
 | |
|   def check_privilege cmd, priv
 | |
|     p = self.privileges[cmd]
 | |
|     return false if p.nil?
 | |
|     return p.include?(priv)
 | |
|   end
 | |
| 
 | |
| =begin
 | |
|   def check_privilege_read cmd
 | |
|     check_privilege_r_w cmd, "r"
 | |
|   end
 | |
| 
 | |
|   def check_privilege_write cmd
 | |
|     check_privilege_r_w cmd, "w"
 | |
|   end
 | |
| 
 | |
|   def check_privilege_r_w cmd, flag
 | |
|     p = self.privileges[cmd]
 | |
|     return false if p.nil?
 | |
|     return p == flag || p == 'rw'
 | |
|   end
 | |
| =end
 | |
| 
 | |
|   def self.create_root
 | |
|     root = User.new({'username' => ROOT_USER_NAME, 'password' => ROOT_PASSWORD})
 | |
|     root.privileges = root.all_privileges
 | |
|     root.email = "#{ROOT_USER_NAME}@host"
 | |
|     root
 | |
|   end
 | |
| 
 | |
|   private
 | |
|   def privileges_with_value v, options={}
 | |
|     {
 | |
|       "flavor" => v,
 | |
|       "group" => v,
 | |
|       "image" => v,
 | |
|       "project" => v,
 | |
|       "server" => v,
 | |
|       "key" => v,
 | |
|       "user" => v,
 | |
|       "filter" => v,
 | |
|       "network" => v,
 | |
|       "provider" => v,
 | |
|       "script" => v,
 | |
|       "templates" => v
 | |
|     }.merge(options)
 | |
|   end
 | |
| 
 | |
| end
 | 
