21: def register_services( container )
22: container.namespace_define :userauth do |b|
23:
24: b.require 'net/ssh/userauth/methods/services', "#{self}::Methods"
25:
26: b.agent_socket_factory do
27: if File::ALT_SEPARATOR
28: require 'net/ssh/userauth/pageant'
29: Pageant::Socket
30: else
31: require 'socket'
32: defined?( UNIXSocket ) ? UNIXSocket : nil
33: end
34: end
35:
36: b.default_agent_socket_name { ENV['SSH_AUTH_SOCK'] }
37:
38: b.default_agent_version { 2 }
39:
40: b.agent( :model => :prototype ) do |c,p|
41: socket_factory = c[:agent_socket_factory]
42: socket_name = c[:default_agent_socket_name]
43:
44: if (File::ALT_SEPARATOR || socket_name) && socket_factory
45: require 'net/ssh/userauth/agent'
46: require 'net/ssh/transport/services'
47:
48: agent = Agent.new
49: agent.socket_factory = socket_factory
50: agent.socket_name = socket_name
51: agent.version = c[:default_agent_version]
52: agent.buffers = c[:transport][:buffers]
53: agent.keys = c[:transport][:keys]
54:
55: begin
56: agent.connect!
57: rescue Net::SSH::Exception
58:
59:
60: agent = nil
61: end
62: end
63:
64: agent
65: end
66:
67: b.agent_factory do |c,p|
68: factory = Object.new
69: klass = class << factory; self; end
70: klass.send( :define_method, :open ) { c[:agent] }
71: factory
72: end
73:
74: b.default_user_key_locations do
75: [ "#{ENV['HOME']}/.ssh/id_dsa",
76: "#{ENV['HOME']}/.ssh2/id_dsa",
77: "#{ENV['HOME']}/.ssh/id_rsa",
78: "#{ENV['HOME']}/.ssh2/id_rsa" ]
79: end
80:
81: b.default_host_key_locations do
82: [ "/etc/ssh/ssh_host_dsa_key",
83: "/etc/ssh/ssh_host_rsa_key" ]
84: end
85:
86: b.key_existence_tester { File }
87:
88: b.user_keys do |c,p|
89: require 'net/ssh/userauth/userkeys'
90:
91: userkeys = UserKeyManager.new
92: userkeys.agent_factory = c[:agent_factory]
93: userkeys.keys = c[:transport][:keys]
94: userkeys.buffers = c[:transport][:buffers]
95: userkeys.log = c[:log_for, p]
96: userkeys.key_existence_tester = b.key_existence_tester
97:
98: b.default_user_key_locations.each { |f| userkeys.add f }
99: b.default_host_key_locations.each { |f| userkeys.add_host_key f }
100:
101: userkeys
102: end
103:
104: b.authentication_method_order do
105: [ "publickey",
106: "hostbased",
107: "password",
108: "keyboard-interactive" ]
109: end
110:
111: b.driver do |c,p|
112: require 'net/ssh/userauth/driver'
113:
114: driver = Driver.new( c[:log_for, p],
115: c[:transport][:buffers],
116: c[:methods],
117: c[:authentication_method_order] )
118:
119: driver.key_manager = c[:user_keys]
120: driver.session = c[:transport][:session]
121:
122: if c.knows_key?(:userauth_keys) && c[:userauth_keys]
123: driver.set_key_files c[:userauth_keys]
124: end
125: if c.knows_key?(:userauth_host_keys) && c[:userauth_host_keys]
126: driver.set_host_key_files c[:userauth_host_keys]
127: end
128: if c.knows_key?(:userauth_method_order) && c[:userauth_method_order]
129: driver.set_auth_method_order *c[:userauth_method_order]
130: end
131:
132: driver
133: end
134:
135: end
136: end