net-ssh-kerberos 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/.gitignore +8 -0
- data/Rakefile +29 -26
- data/VERSION.yml +2 -2
- data/example/Capfile +3 -0
- data/example/gss.rb +91 -0
- data/example/sspi.rb +73 -0
- data/lib/net/ssh/kerberos/drivers/gss.rb +40 -11
- data/net-ssh-kerberos.gemspec +77 -0
- metadata +9 -3
data/.document
ADDED
data/.gitignore
ADDED
data/Rakefile
CHANGED
@@ -43,33 +43,36 @@ rescue LoadError
|
|
43
43
|
end
|
44
44
|
|
45
45
|
# These are new tasks
|
46
|
-
begin
|
47
|
-
require 'rake/contrib/sshpublisher'
|
48
|
-
namespace :rubyforge do
|
49
|
-
|
50
|
-
desc "Release gem and RDoc documentation to RubyForge"
|
51
|
-
task :release => ["rubyforge:release:gem", "rubyforge:release:docs"]
|
52
|
-
|
53
|
-
namespace :release do
|
54
|
-
desc "Publish RDoc to RubyForge."
|
55
|
-
task :docs => [:rdoc] do
|
56
|
-
config = YAML.load(
|
57
|
-
File.read(File.expand_path('~/.rubyforge/user-config.yml'))
|
58
|
-
)
|
59
|
-
|
60
|
-
host = "#{config['username']}@rubyforge.org"
|
61
|
-
remote_dir = "/var/www/gforge-projects/net-ssh-krb/"
|
62
|
-
local_dir = 'doc'
|
63
|
-
|
64
|
-
Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
rescue LoadError
|
69
|
-
puts "Rake SshDirPublisher is unavailable or your rubyforge environment is not configured."
|
46
|
+
#begin
|
47
|
+
# require 'rake/contrib/sshpublisher'
|
48
|
+
# namespace :rubyforge do
|
49
|
+
#
|
50
|
+
# desc "Release gem and RDoc documentation to RubyForge"
|
51
|
+
# task :release => ["rubyforge:release:gem", "rubyforge:release:docs"]
|
52
|
+
#
|
53
|
+
# namespace :release do
|
54
|
+
# desc "Publish RDoc to RubyForge."
|
55
|
+
# task :docs => [:rdoc] do
|
56
|
+
# config = YAML.load(
|
57
|
+
# File.read(File.expand_path('~/.rubyforge/user-config.yml'))
|
58
|
+
# )
|
59
|
+
#
|
60
|
+
# host = "#{config['username']}@rubyforge.org"
|
61
|
+
# remote_dir = "/var/www/gforge-projects/net-ssh-krb/"
|
62
|
+
# local_dir = 'doc'
|
63
|
+
#
|
64
|
+
# Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
|
65
|
+
# end
|
66
|
+
# end
|
67
|
+
# end
|
68
|
+
#rescue LoadError
|
69
|
+
# puts "Rake SshDirPublisher is unavailable or your rubyforge environment is not configured."
|
70
|
+
#end
|
71
|
+
#
|
72
|
+
Jeweler::RubyforgeTasks.new do |rubyforge|
|
73
|
+
rubyforge.doc_task = "rdoc"
|
70
74
|
end
|
71
75
|
|
72
|
-
|
73
76
|
task :default => :test
|
74
77
|
|
75
78
|
require 'rake/rdoctask'
|
@@ -84,7 +87,7 @@ Rake::RDocTask.new do |rdoc|
|
|
84
87
|
'--main' << 'README.rdoc' <<
|
85
88
|
'--charset' << 'utf-8'
|
86
89
|
|
87
|
-
rdoc.rdoc_dir = '
|
90
|
+
rdoc.rdoc_dir = 'rdoc'
|
88
91
|
rdoc.title = "Net::SSH::Kerberos #{version}"
|
89
92
|
rdoc.rdoc_files.include('README*')
|
90
93
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
data/VERSION.yml
CHANGED
data/example/Capfile
ADDED
data/example/gss.rb
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'socket'
|
2
|
+
require 'rubygems'
|
3
|
+
gem 'net-ssh'
|
4
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
5
|
+
require 'net/ssh'
|
6
|
+
require 'net/ssh/errors'
|
7
|
+
require 'net/ssh/kerberos'
|
8
|
+
|
9
|
+
unless Net::SSH::Kerberos::Drivers.available.include? 'GSS'
|
10
|
+
$stderr.puts "No drivers supporting GSSAPI could be loaded."
|
11
|
+
exit 1
|
12
|
+
end
|
13
|
+
|
14
|
+
include Net::SSH::Kerberos::Drivers::GSS
|
15
|
+
include Net::SSH::Kerberos::Constants
|
16
|
+
|
17
|
+
result = API.gss_acquire_cred nil, 60, nil, GSS_C_INITIATE, nil, nil, 0
|
18
|
+
if result.ok?
|
19
|
+
creds = API._args_[4]
|
20
|
+
$stderr.puts "gss_acquire_cred: (#{result}) => #{creds.to_i}"
|
21
|
+
begin
|
22
|
+
result = API.gss_inquire_cred creds, nil, 0, 0, nil
|
23
|
+
if result.ok?
|
24
|
+
name, oids = API._args_[1], API._args_[4]
|
25
|
+
$stderr.puts "gss_inquire_cred: (#{result}) #{oids.inspect}"
|
26
|
+
begin
|
27
|
+
result = API.gss_display_name name, buffer=API::GssBuffer.malloc, nil
|
28
|
+
if result.ok?
|
29
|
+
oid = API._args_[2]
|
30
|
+
$stderr.puts "gss_display_name: (#{result}) #{buffer} #{oid.inspect}"
|
31
|
+
result = API.gss_release_buffer buffer
|
32
|
+
$stderr.puts "gss_release_buffer: (#{result})"
|
33
|
+
else
|
34
|
+
$stderr.puts "gss_display_name failed : (#{result})"
|
35
|
+
end
|
36
|
+
ensure
|
37
|
+
result = API.gss_release_oid_set oids
|
38
|
+
$stderr.puts "gss_release_oid_set: (#{result})"
|
39
|
+
result = API.gss_release_name name
|
40
|
+
$stderr.puts "gss_release_name: (#{result})"
|
41
|
+
end
|
42
|
+
else
|
43
|
+
$stderr.puts "gss_inquire_cred failed: (#{result})"
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
target_name = 'host@'+Socket.gethostbyname(`hostname || echo "localhost"`.strip)[0]
|
48
|
+
buffer = API::GssBuffer.malloc
|
49
|
+
buffer.value = target_name
|
50
|
+
buffer.length = target_name.length
|
51
|
+
API.gss_import_name buffer, GSS_C_NT_HOSTBASED_SERVICE, nil
|
52
|
+
if result.ok?
|
53
|
+
target = API._args_[2]
|
54
|
+
$stderr.puts "gss_import_name: (#{result}) #{target.to_i}"
|
55
|
+
begin
|
56
|
+
result = API.gss_display_name target, buffer, nil
|
57
|
+
if result.ok?
|
58
|
+
oid = API._args_[2]
|
59
|
+
$stderr.puts "gss_display_name: (#{result}) #{buffer} #{oid.inspect}"
|
60
|
+
result = API.gss_release_buffer buffer
|
61
|
+
$stderr.puts "gss_release_buffer: (#{result})"
|
62
|
+
else
|
63
|
+
$stderr.puts "gss_display_name failed : (#{result})"
|
64
|
+
end
|
65
|
+
result = API.gss_init_sec_context creds, GSS_C_NO_CONTEXT, target, GSS_C_KRB5,
|
66
|
+
GSS_C_DELEG_FLAG | GSS_C_MUTUAL_FLAG | GSS_C_INTEG_FLAG, 60,
|
67
|
+
GSS_C_NO_CHANNEL_BINDINGS, GSS_C_NO_BUFFER, nil, buffer, 0, 0
|
68
|
+
if result.ok?
|
69
|
+
context, actual_mech = API._args_[1], API._args_[8]
|
70
|
+
$stderr.puts "gss_init_sec_context: (#{result}) token.length=#{buffer.length}, #{actual_mech.inspect}"
|
71
|
+
result = API.gss_release_buffer buffer
|
72
|
+
$stderr.puts "gss_release_buffer: (#{result})"
|
73
|
+
result = API.gss_delete_sec_context context, nil
|
74
|
+
$stderr.puts "gss_delete_sec_context: (#{result})"
|
75
|
+
else
|
76
|
+
$stderr.puts "gss_init_sec_context failed : (#{result})"
|
77
|
+
end
|
78
|
+
ensure
|
79
|
+
result = API.gss_release_name target
|
80
|
+
$stderr.puts "gss_release_name: (#{result})"
|
81
|
+
end
|
82
|
+
else
|
83
|
+
$stderr.puts "gss_import_name failed: (#{result})"
|
84
|
+
end
|
85
|
+
ensure
|
86
|
+
result = API.gss_release_cred creds
|
87
|
+
$stderr.puts "gss_release_cred: (#{result})"
|
88
|
+
end
|
89
|
+
else
|
90
|
+
$stderr.puts "gss_acquire_cred failed: (#{result})"
|
91
|
+
end
|
data/example/sspi.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
#$DEBUG = 1
|
2
|
+
|
3
|
+
require 'socket'
|
4
|
+
require 'rubygems'
|
5
|
+
gem 'net-ssh'
|
6
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
7
|
+
require 'net/ssh'
|
8
|
+
require 'net/ssh/errors'
|
9
|
+
require 'net/ssh/kerberos'
|
10
|
+
|
11
|
+
unless Net::SSH::Kerberos::Drivers.available.include? 'SSPI'
|
12
|
+
$stderr.puts "No drivers supporting SSPI could be loaded."
|
13
|
+
exit 1
|
14
|
+
end
|
15
|
+
|
16
|
+
include Net::SSH::Kerberos::Drivers::SSPI
|
17
|
+
include Net::SSH::Kerberos::Constants
|
18
|
+
|
19
|
+
result = API.querySecurityPackageInfo "Kerberos", nil
|
20
|
+
if result.ok?
|
21
|
+
pkg_info = API._args_[1]
|
22
|
+
$stderr.puts "querySecurityPackageInfo: (#{result}) #{pkg_info.comment} (max_token=#{pkg_info.max_token})"
|
23
|
+
@max_token = pkg_info.max_token
|
24
|
+
result = API.freeContextBuffer pkg_info
|
25
|
+
$stderr.puts "freeContextBuffer: (#{result})"
|
26
|
+
else
|
27
|
+
$stderr.puts "querySecurityPackageInfo: (#{result})"
|
28
|
+
end
|
29
|
+
|
30
|
+
result = API.acquireCredentialsHandle nil, "Kerberos", SECPKG_CRED_OUTBOUND, nil, nil, nil, nil,
|
31
|
+
creds=API::SecHandle.malloc, ts=API::TimeStamp.malloc
|
32
|
+
if result.ok?
|
33
|
+
$stderr.puts "acquireCredentialsHandle: (#{result})"
|
34
|
+
begin
|
35
|
+
result = API.queryCredentialsAttributes creds, SECPKG_ATTR_NAMES, nil
|
36
|
+
if result.ok?
|
37
|
+
names = API._args_[2]
|
38
|
+
$stderr.puts "queryCredentialsAttributes: (#{result}) #{names.to_s}"
|
39
|
+
result = API.freeContextBuffer names
|
40
|
+
$stderr.puts "freeContextBuffer: (#{result})"
|
41
|
+
|
42
|
+
token = API::SecBuffer.malloc
|
43
|
+
token.type = SECBUFFER_TOKEN
|
44
|
+
token.data = "\0" * @max_token
|
45
|
+
token.length = @max_token
|
46
|
+
output = API::SecBufferDesc.malloc
|
47
|
+
output.version = 0
|
48
|
+
output.count = 1
|
49
|
+
output.buffers = token.to_ptr
|
50
|
+
result = API.initializeSecurityContext creds, nil, 'host/'+Socket.gethostbyname('localhost')[0],
|
51
|
+
ISC_REQ_DELEGATE | ISC_REQ_MUTUAL_AUTH | ISC_REQ_INTEGRITY, 0, SECURITY_NATIVE_DREP,
|
52
|
+
nil, 0, ctx=API::SecHandle.malloc, output, 0, ts=API::TimeStamp.malloc
|
53
|
+
if result.ok?
|
54
|
+
$stderr.puts "initializeSecurityContext: (#{result}) ctx=#{! ctx.nil?} token.length=#{output.buffer(0).length}"
|
55
|
+
result = API.freeContextBuffer token.data
|
56
|
+
$stderr.puts "freeContextBuffer: (#{result})"
|
57
|
+
result = API.deleteSecurityContext ctx
|
58
|
+
$stderr.puts "deleteSecurityContext: (#{result})"
|
59
|
+
else
|
60
|
+
$stderr.puts "initializeSecurityContext: (#{result})"
|
61
|
+
end
|
62
|
+
else
|
63
|
+
$stderr.puts "queryCredentialsAttributes: (#{result})"
|
64
|
+
end
|
65
|
+
ensure
|
66
|
+
result = API.freeCredentialsHandle creds
|
67
|
+
$stderr.puts "freeCredentialsHandle : (#{result})"
|
68
|
+
end
|
69
|
+
else
|
70
|
+
$stderr.puts "acquireCredentialsHandle: (#{result})"
|
71
|
+
end
|
72
|
+
|
73
|
+
|
@@ -68,22 +68,51 @@ EOCODE
|
|
68
68
|
end
|
69
69
|
typealias 'gss_buffer_desc', 'GssBuffer'
|
70
70
|
typealias 'gss_buffer_t', 'gss_buffer_desc *'
|
71
|
-
GssOID
|
72
|
-
|
71
|
+
class GssOID
|
72
|
+
PACK = (RUBY_PLATFORM =~ /darwin/ ? 'I' : "I@#{DL.sizeof('P')}")+'P'
|
73
|
+
ELEMENTS_OFFSET = DL.sizeof(RUBY_PLATFORM =~ /darwin/ ? 'I' : 'P')
|
74
|
+
STRUCT_SIZE = ELEMENTS_OFFSET + DL.sizeof('P')
|
75
|
+
|
76
|
+
def initialize(ptr)
|
77
|
+
@ptr = ptr
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.create(bytes)
|
81
|
+
v = [bytes.length, bytes]
|
82
|
+
o = new v.pack(PACK).to_ptr
|
83
|
+
o.instance_variable_set :@unpack, v
|
84
|
+
o
|
85
|
+
end
|
86
|
+
|
87
|
+
def length; unpack[0] end
|
88
|
+
def elements; unpack[1] end
|
89
|
+
alias to_s elements
|
90
|
+
|
91
|
+
def eql?(oid) !oid.nil? && length==oid.length && to_s==oid.to_s end
|
73
92
|
def ==(oid) !oid.nil? && length==oid.length && to_s==oid.to_s end
|
74
|
-
|
75
|
-
|
93
|
+
def inspect; 'OID: ' + (to_s.unpack("H2" * length).join(' ')) end
|
94
|
+
def ptr; @ptr end
|
95
|
+
alias to_ptr ptr
|
96
|
+
|
97
|
+
def self.size; STRUCT_SIZE end
|
98
|
+
|
99
|
+
private
|
100
|
+
|
101
|
+
def unpack
|
102
|
+
@unpack ||= (begin
|
103
|
+
v = @ptr.to_s(4).unpack('I')[0]
|
104
|
+
[ v, (@ptr + ELEMENTS_OFFSET).ptr.to_s(v) ]
|
105
|
+
end)
|
106
|
+
end
|
76
107
|
end
|
77
|
-
def GssOID.create(bytes) new [bytes.length, bytes].pack("LP#{bytes.length}").to_ptr end
|
78
108
|
typealias 'gss_OID', 'P', PTR_ENC, PTR_DEC(GssOID)
|
79
109
|
typealias 'gss_OID_ref', 'p', PTR_REF_ENC, PTR_REF_DEC(GssOID)
|
80
|
-
GssOIDSet = struct2 [ "size_t count", "
|
110
|
+
GssOIDSet = struct2 [ "size_t count", "void *elements" ] do
|
81
111
|
def oids
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
@oids
|
112
|
+
return @oids unless @oids.nil?
|
113
|
+
@oids, m = [], GssOID.size
|
114
|
+
count.nonzero? and 0.upto(count-1) { |n| @oids[n] = GssOID.new(elements + n * m); @oids[n].ptr.size = m }
|
115
|
+
@oids
|
87
116
|
end
|
88
117
|
def inspect; 'OIDSet: [' + oids.map {|o| o.inspect }.join(', ') + ']' end
|
89
118
|
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{net-ssh-kerberos}
|
8
|
+
s.version = "0.2.2"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Joe Khoobyar"]
|
12
|
+
s.date = %q{2009-12-28}
|
13
|
+
s.description = %q{Extends Net::SSH by adding Kerberos authentication capability for password-less logins on multiple platforms.
|
14
|
+
}
|
15
|
+
s.email = %q{joe@ankhcraft.com}
|
16
|
+
s.extra_rdoc_files = [
|
17
|
+
"LICENSE",
|
18
|
+
"README.rdoc"
|
19
|
+
]
|
20
|
+
s.files = [
|
21
|
+
".document",
|
22
|
+
".gitignore",
|
23
|
+
"LICENSE",
|
24
|
+
"README.rdoc",
|
25
|
+
"Rakefile",
|
26
|
+
"VERSION.yml",
|
27
|
+
"example/Capfile",
|
28
|
+
"example/gss.rb",
|
29
|
+
"example/sspi.rb",
|
30
|
+
"lib/net/ssh/authentication/methods/gssapi_with_mic.rb",
|
31
|
+
"lib/net/ssh/kerberos.rb",
|
32
|
+
"lib/net/ssh/kerberos/constants.rb",
|
33
|
+
"lib/net/ssh/kerberos/context.rb",
|
34
|
+
"lib/net/ssh/kerberos/drivers.rb",
|
35
|
+
"lib/net/ssh/kerberos/drivers/gss.rb",
|
36
|
+
"lib/net/ssh/kerberos/drivers/sspi.rb",
|
37
|
+
"lib/net/ssh/kerberos/kex.rb",
|
38
|
+
"lib/net/ssh/kerberos/kex/krb5_diffie_hellman_group1_sha1.rb",
|
39
|
+
"lib/net/ssh/kerberos/kex/krb5_diffie_hellman_group_exchange_sha1.rb",
|
40
|
+
"net-ssh-kerberos.gemspec",
|
41
|
+
"test/gss_context_test.rb",
|
42
|
+
"test/gss_test.rb",
|
43
|
+
"test/net_ssh_kerberos_test.rb",
|
44
|
+
"test/sspi_context_test.rb",
|
45
|
+
"test/sspi_test.rb",
|
46
|
+
"test/test_helper.rb"
|
47
|
+
]
|
48
|
+
s.homepage = %q{http://github.com/joekhoobyar/net-ssh-kerberos}
|
49
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
50
|
+
s.require_paths = ["lib"]
|
51
|
+
s.required_ruby_version = Gem::Requirement.new("< 1.9")
|
52
|
+
s.rubyforge_project = %q{net-ssh-krb}
|
53
|
+
s.rubygems_version = %q{1.3.5}
|
54
|
+
s.summary = %q{Add Kerberos support to Net::SSH}
|
55
|
+
s.test_files = [
|
56
|
+
"test/gss_context_test.rb",
|
57
|
+
"test/gss_test.rb",
|
58
|
+
"test/net_ssh_kerberos_test.rb",
|
59
|
+
"test/sspi_context_test.rb",
|
60
|
+
"test/sspi_test.rb",
|
61
|
+
"test/test_helper.rb"
|
62
|
+
]
|
63
|
+
|
64
|
+
if s.respond_to? :specification_version then
|
65
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
66
|
+
s.specification_version = 3
|
67
|
+
|
68
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
69
|
+
s.add_runtime_dependency(%q<net-ssh>, [">= 2.0"])
|
70
|
+
else
|
71
|
+
s.add_dependency(%q<net-ssh>, [">= 2.0"])
|
72
|
+
end
|
73
|
+
else
|
74
|
+
s.add_dependency(%q<net-ssh>, [">= 2.0"])
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: net-ssh-kerberos
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joe Khoobyar
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-12-28 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -34,10 +34,15 @@ extra_rdoc_files:
|
|
34
34
|
- LICENSE
|
35
35
|
- README.rdoc
|
36
36
|
files:
|
37
|
+
- .document
|
38
|
+
- .gitignore
|
37
39
|
- LICENSE
|
38
40
|
- README.rdoc
|
39
41
|
- Rakefile
|
40
42
|
- VERSION.yml
|
43
|
+
- example/Capfile
|
44
|
+
- example/gss.rb
|
45
|
+
- example/sspi.rb
|
41
46
|
- lib/net/ssh/authentication/methods/gssapi_with_mic.rb
|
42
47
|
- lib/net/ssh/kerberos.rb
|
43
48
|
- lib/net/ssh/kerberos/constants.rb
|
@@ -48,6 +53,7 @@ files:
|
|
48
53
|
- lib/net/ssh/kerberos/kex.rb
|
49
54
|
- lib/net/ssh/kerberos/kex/krb5_diffie_hellman_group1_sha1.rb
|
50
55
|
- lib/net/ssh/kerberos/kex/krb5_diffie_hellman_group_exchange_sha1.rb
|
56
|
+
- net-ssh-kerberos.gemspec
|
51
57
|
- test/gss_context_test.rb
|
52
58
|
- test/gss_test.rb
|
53
59
|
- test/net_ssh_kerberos_test.rb
|
@@ -78,7 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
78
84
|
requirements: []
|
79
85
|
|
80
86
|
rubyforge_project: net-ssh-krb
|
81
|
-
rubygems_version: 1.3.
|
87
|
+
rubygems_version: 1.3.5
|
82
88
|
signing_key:
|
83
89
|
specification_version: 3
|
84
90
|
summary: Add Kerberos support to Net::SSH
|