4ac6c0c3ee
Not sure how this managed to fall out of master -- some of these fixes are five days old, and should certianly have been merged in prior to just now.
62 lines
1.7 KiB
Ruby
62 lines
1.7 KiB
Ruby
module Msf
|
|
class DBManager
|
|
|
|
class Cred < ActiveRecord::Base
|
|
include DBSave
|
|
belongs_to :service
|
|
|
|
KEY_ID_REGEX = /([0-9a-fA-F:]{47})/ # Could be more strict
|
|
|
|
# Returns its workspace
|
|
def workspace
|
|
self.service.host.workspace
|
|
end
|
|
|
|
# Returns its key id. If this is not an ssh-type key, returns nil.
|
|
def ssh_key_id
|
|
return nil unless self.ptype =~ /^ssh_/
|
|
return nil unless self.proof =~ KEY_ID_REGEX
|
|
$1.downcase # Can't run into NilClass problems.
|
|
end
|
|
|
|
# Returns all private keys with matching key ids, including itself
|
|
# If this is not an ssh-type key, always returns an empty array.
|
|
def ssh_private_keys
|
|
return [] unless self.ssh_key_id
|
|
matches = self.class.all(:conditions => ["creds.ptype = ? AND creds.proof ILIKE ?", "ssh_key", "%#{self.ssh_key_id}%"])
|
|
matches.select {|c| c.workspace == self.workspace}
|
|
end
|
|
|
|
# Returns all public keys with matching key ids, including itself
|
|
# If this is not an ssh-type key, always returns an empty array.
|
|
def ssh_public_keys
|
|
return [] unless self.ssh_key_id
|
|
matches = self.class.all(:conditions => ["creds.ptype = ? AND creds.proof ILIKE ?", "ssh_pubkey", "%#{self.ssh_key_id}%"])
|
|
matches.select {|c| c.workspace == self.workspace}
|
|
end
|
|
|
|
# Returns all keys with matching key ids, including itself
|
|
# If this is not an ssh-type key, always returns an empty array.
|
|
def ssh_keys
|
|
(self.ssh_private_keys | self.ssh_public_keys)
|
|
end
|
|
|
|
def ssh_key_matches?(other_cred)
|
|
return false unless other_cred.kind_of? self.class
|
|
return false unless self.ptype == other_cred.ptype
|
|
case self.ptype
|
|
when "ssh_key"
|
|
matches = self.ssh_private_keys
|
|
when "ssh_pubkey"
|
|
matches = self.ssh_public_keys
|
|
else
|
|
false
|
|
end
|
|
matches.include?(self) and matches.include?(other_cred)
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
end
|