gssapi 1.0.3 → 1.1.0
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/VERSION +1 -1
- data/examples/gss_iov_client.rb +55 -0
- data/examples/gss_iov_helpers.rb +74 -0
- data/examples/gss_iov_server.rb +67 -0
- data/examples/gss_server.rb +2 -3
- data/gssapi.gemspec +1 -1
- data/lib/gssapi/lib_gssapi.rb +10 -21
- data/lib/gssapi/lib_gssapi_loader.rb +58 -24
- data/lib/gssapi/simple.rb +1 -1
- metadata +35 -36
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0
|
1
|
+
1.1.0
|
@@ -0,0 +1,55 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$: << '../lib'
|
3
|
+
$: << '.'
|
4
|
+
#require 'gssapi/heimdal'
|
5
|
+
require 'gssapi'
|
6
|
+
require 'gss_iov_helpers'
|
7
|
+
require 'base64'
|
8
|
+
require 'socket'
|
9
|
+
|
10
|
+
class GssIovClient
|
11
|
+
include GssIOVHelpers
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@host = 'example.org'
|
15
|
+
@service = 'host'
|
16
|
+
@sock = TCPSocket.new(@host, 8082)
|
17
|
+
@gss = GSSAPI::Simple.new(@host, @service)
|
18
|
+
end
|
19
|
+
|
20
|
+
def run
|
21
|
+
handshake
|
22
|
+
begin
|
23
|
+
print "> "
|
24
|
+
msg = STDIN.gets.chomp
|
25
|
+
emsg = iov_encrypt(msg)
|
26
|
+
@sock.write("#{emsg.last}\n")
|
27
|
+
end while msg != 'exit'
|
28
|
+
|
29
|
+
@sock.close
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def handshake
|
36
|
+
tok = @gss.init_context
|
37
|
+
stok = Base64.strict_encode64(tok)
|
38
|
+
|
39
|
+
@sock.write("#{stok}\n") # send initial token
|
40
|
+
stok = @sock.gets.chomp # get back continuation token
|
41
|
+
ctx = @gss.init_context(Base64.strict_decode64(stok.chomp)) # complete security context
|
42
|
+
puts "Connection #{(ctx ? 'succeeded' : 'failed')}"
|
43
|
+
end
|
44
|
+
|
45
|
+
# Encrypt message
|
46
|
+
def msg_enc(msg)
|
47
|
+
emsg = @gss.wrap_message(msg)
|
48
|
+
Base64.strict_encode64(emsg)
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
cli = GssIovClient.new
|
55
|
+
cli.run
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module GssIOVHelpers
|
2
|
+
|
3
|
+
def iov_encrypt(str)
|
4
|
+
iov_cnt = 3
|
5
|
+
iov = FFI::MemoryPointer.new(GSSAPI::LibGSSAPI::GssIOVBufferDesc.size * iov_cnt)
|
6
|
+
|
7
|
+
iov0 = GSSAPI::LibGSSAPI::GssIOVBufferDesc.new(FFI::Pointer.new(iov.address))
|
8
|
+
iov0[:type] = (GSSAPI::LibGSSAPI::GSS_IOV_BUFFER_TYPE_HEADER | GSSAPI::LibGSSAPI::GSS_IOV_BUFFER_FLAG_ALLOCATE)
|
9
|
+
|
10
|
+
iov1 = GSSAPI::LibGSSAPI::GssIOVBufferDesc.new(FFI::Pointer.new(iov.address + (GSSAPI::LibGSSAPI::GssIOVBufferDesc.size * 1)))
|
11
|
+
iov1[:type] = (GSSAPI::LibGSSAPI::GSS_IOV_BUFFER_TYPE_DATA)
|
12
|
+
iov1[:buffer].value = str
|
13
|
+
|
14
|
+
iov2 = GSSAPI::LibGSSAPI::GssIOVBufferDesc.new(FFI::Pointer.new(iov.address + (GSSAPI::LibGSSAPI::GssIOVBufferDesc.size * 2)))
|
15
|
+
iov2[:type] = (GSSAPI::LibGSSAPI::GSS_IOV_BUFFER_TYPE_PADDING | GSSAPI::LibGSSAPI::GSS_IOV_BUFFER_FLAG_ALLOCATE)
|
16
|
+
|
17
|
+
conf_state = FFI::MemoryPointer.new :uint32
|
18
|
+
min_stat = FFI::MemoryPointer.new :uint32
|
19
|
+
|
20
|
+
maj_stat = GSSAPI::LibGSSAPI.gss_wrap_iov(min_stat, @gss.context, 1, GSSAPI::LibGSSAPI::GSS_C_QOP_DEFAULT, conf_state, iov, iov_cnt)
|
21
|
+
|
22
|
+
token = [iov0[:buffer].length].pack('L')
|
23
|
+
token += iov0[:buffer].value
|
24
|
+
token += iov1[:buffer].value
|
25
|
+
pad_len = iov2[:buffer].length
|
26
|
+
token += iov2[:buffer].value if pad_len > 0
|
27
|
+
[pad_len, token]
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return [String] the unencrypted response string
|
31
|
+
def iov_decrypt(str)
|
32
|
+
puts "Decrypting message:\n#{str}"
|
33
|
+
iov_cnt = 3
|
34
|
+
iov = FFI::MemoryPointer.new(GSSAPI::LibGSSAPI::GssIOVBufferDesc.size * iov_cnt)
|
35
|
+
|
36
|
+
iov0 = GSSAPI::LibGSSAPI::GssIOVBufferDesc.new(FFI::Pointer.new(iov.address))
|
37
|
+
iov0[:type] = (GSSAPI::LibGSSAPI::GSS_IOV_BUFFER_TYPE_HEADER | GSSAPI::LibGSSAPI::GSS_IOV_BUFFER_FLAG_ALLOCATE)
|
38
|
+
|
39
|
+
iov1 = GSSAPI::LibGSSAPI::GssIOVBufferDesc.new(FFI::Pointer.new(iov.address + (GSSAPI::LibGSSAPI::GssIOVBufferDesc.size * 1)))
|
40
|
+
iov1[:type] = (GSSAPI::LibGSSAPI::GSS_IOV_BUFFER_TYPE_DATA)
|
41
|
+
|
42
|
+
iov2 = GSSAPI::LibGSSAPI::GssIOVBufferDesc.new(FFI::Pointer.new(iov.address + (GSSAPI::LibGSSAPI::GssIOVBufferDesc.size * 2)))
|
43
|
+
iov2[:type] = (GSSAPI::LibGSSAPI::GSS_IOV_BUFFER_TYPE_DATA)
|
44
|
+
|
45
|
+
str.force_encoding('BINARY')
|
46
|
+
#str.sub!(/^.*Content-Type: application\/octet-stream\r\n(.*)--Encrypted.*$/m, '\1')
|
47
|
+
|
48
|
+
len = str.unpack("L").first
|
49
|
+
puts "LEN: #{len}"
|
50
|
+
iov_data = str.unpack("LA#{len}A*")
|
51
|
+
iov0[:buffer].value = iov_data[1]
|
52
|
+
iov1[:buffer].value = iov_data[2]
|
53
|
+
|
54
|
+
min_stat = FFI::MemoryPointer.new :uint32
|
55
|
+
conf_state = FFI::MemoryPointer.new :uint32
|
56
|
+
conf_state.write_int(1)
|
57
|
+
qop_state = FFI::MemoryPointer.new :uint32
|
58
|
+
qop_state.write_int(0)
|
59
|
+
|
60
|
+
puts "Unwrapping IOV...."
|
61
|
+
maj_stat = GSSAPI::LibGSSAPI.gss_unwrap_iov(min_stat, @gss.context, conf_state, qop_state, iov, iov_cnt)
|
62
|
+
puts "Done Unwrapping IOV...."
|
63
|
+
if(maj_stat == 0)
|
64
|
+
puts "Success!!!"
|
65
|
+
else
|
66
|
+
puts "GSSAPI Failure. Status Codes(major: #{maj_stat}, minor: #{min_stat.read_int})"
|
67
|
+
end
|
68
|
+
|
69
|
+
puts "???HELLO???"
|
70
|
+
|
71
|
+
iov1[:buffer].value
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$: << '../lib'
|
3
|
+
$: << '.'
|
4
|
+
#require 'gssapi/heimdal'
|
5
|
+
require 'gssapi'
|
6
|
+
require 'gss_iov_helpers'
|
7
|
+
require 'base64'
|
8
|
+
require 'socket'
|
9
|
+
|
10
|
+
class GssIovServer
|
11
|
+
include GssIOVHelpers
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@host = 'example.org'
|
15
|
+
@service = "host"
|
16
|
+
@keytab = "#{ENV['HOME']}/.gssapi/krb5.keytab" # this is optional, but probably required if not running as root
|
17
|
+
@port = 8082
|
18
|
+
@tcpsrv = TCPServer.new(@host, @port)
|
19
|
+
end
|
20
|
+
|
21
|
+
def runner
|
22
|
+
loop do
|
23
|
+
puts "Listening on port #{@port}"
|
24
|
+
Thread.start(@tcpsrv.accept) do |s|
|
25
|
+
init_krb
|
26
|
+
handshake(s)
|
27
|
+
|
28
|
+
begin
|
29
|
+
emsg = (s.gets.chomp)
|
30
|
+
puts "---> Received: #{emsg}"
|
31
|
+
msg = iov_decrypt(emsg)
|
32
|
+
puts "===> Received: #{msg}"
|
33
|
+
end while msg != 'exit'
|
34
|
+
|
35
|
+
print(s, "Closing Socket\n")
|
36
|
+
s.close
|
37
|
+
puts "Closed...."
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def init_krb
|
46
|
+
@gss = GSSAPI::Simple.new(@host, @service, @keytab)
|
47
|
+
@gss.acquire_credentials
|
48
|
+
puts "HELLO"
|
49
|
+
end
|
50
|
+
|
51
|
+
def handshake(sock)
|
52
|
+
print(sock, "Accepted Connection\n")
|
53
|
+
stok = sock.gets.chomp
|
54
|
+
print(sock, "Received string#{stok}\n")
|
55
|
+
otok = @gss.accept_context(Base64.strict_decode64(stok.chomp))
|
56
|
+
sock.write("#{Base64.strict_encode64(otok)}\n")
|
57
|
+
end
|
58
|
+
|
59
|
+
# Decrypt message
|
60
|
+
def msg_dec(msg)
|
61
|
+
@gss.unwrap_message(Base64.strict_decode64(msg.chomp))
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
gserv = GssIovServer.new
|
67
|
+
gserv.runner
|
data/examples/gss_server.rb
CHANGED
@@ -9,14 +9,13 @@ keytab = "#{ENV['HOME']}/.gssapi/krb5.keytab" # this is optional, but probably
|
|
9
9
|
|
10
10
|
tcpsrv = TCPServer.new(host, 8082)
|
11
11
|
|
12
|
-
srv = GSSAPI::Simple.new(host, service, keytab)
|
13
|
-
srv.acquire_credentials
|
14
|
-
|
15
12
|
loop do
|
16
13
|
Thread.start(tcpsrv.accept) do |s|
|
17
14
|
print(s, "Accepted Connection\n")
|
18
15
|
stok = s.gets.chomp
|
19
16
|
print(s, "Received string#{stok}\n")
|
17
|
+
srv = GSSAPI::Simple.new(host, service, keytab)
|
18
|
+
srv.acquire_credentials
|
20
19
|
otok = srv.accept_context(Base64.strict_decode64(stok.chomp))
|
21
20
|
s.write("#{Base64.strict_encode64(otok)}\n")
|
22
21
|
|
data/gssapi.gemspec
CHANGED
@@ -28,6 +28,6 @@ Gem::Specification.new do |gem|
|
|
28
28
|
gem.rdoc_options = %w(-x test/ -x examples/)
|
29
29
|
gem.extra_rdoc_files = %w(README.textile COPYING)
|
30
30
|
|
31
|
-
gem.required_ruby_version = '>= 1.
|
31
|
+
gem.required_ruby_version = '>= 1.8.7'
|
32
32
|
gem.add_runtime_dependency 'ffi', '>= 1.0.1'
|
33
33
|
end
|
data/lib/gssapi/lib_gssapi.rb
CHANGED
@@ -15,15 +15,6 @@ module GSSAPI
|
|
15
15
|
# void *memcpy(void *dest, const void *src, size_t n);
|
16
16
|
attach_function :memcpy, [:pointer, :pointer, :size_t], :pointer
|
17
17
|
|
18
|
-
class GssOID < FFI::Struct
|
19
|
-
layout :length => :OM_uint32,
|
20
|
-
:elements => :pointer # pointer of :void
|
21
|
-
|
22
|
-
def self.gss_c_no_oid
|
23
|
-
self.new(GSSAPI::LibGSSAPI::GSS_C_NO_OID)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
18
|
# This is a generic Managed Struct subclass that hides the [] methods.
|
28
19
|
# Classes that implement this class should provide accessor methods to get to the attributes.
|
29
20
|
class GssMStruct < FFI::ManagedStruct
|
@@ -56,8 +47,8 @@ module GSSAPI
|
|
56
47
|
module GssBufferDescLayout
|
57
48
|
def self.included(base)
|
58
49
|
base.class_eval do
|
59
|
-
layout :length
|
60
|
-
:value
|
50
|
+
layout :length, :OM_uint32,
|
51
|
+
:value, :pointer # pointer of :void
|
61
52
|
|
62
53
|
def length
|
63
54
|
self[:length]
|
@@ -142,16 +133,16 @@ module GSSAPI
|
|
142
133
|
# iov_buff[:buffer][:length] = str.size
|
143
134
|
# iov_buff[:buffer][:value] = str
|
144
135
|
class GssIOVBufferDesc < FFI::Struct
|
145
|
-
layout
|
146
|
-
|
136
|
+
layout :type, :OM_uint32,
|
137
|
+
:buffer, UnManagedGssBufferDesc
|
147
138
|
end
|
148
139
|
|
149
140
|
class GssChannelBindingsStruct < FFI::Struct
|
150
|
-
layout
|
151
|
-
:initiator_address
|
152
|
-
:acceptor_addrtype
|
153
|
-
:acceptor_address
|
154
|
-
:application_data
|
141
|
+
layout :initiator_addrtype, :OM_uint32,
|
142
|
+
:initiator_address, UnManagedGssBufferDesc,
|
143
|
+
:acceptor_addrtype, :OM_uint32,
|
144
|
+
:acceptor_address, UnManagedGssBufferDesc,
|
145
|
+
:application_data, UnManagedGssBufferDesc
|
155
146
|
|
156
147
|
no_chn_bind = FFI::MemoryPointer.new :pointer #
|
157
148
|
no_chn_bind.write_int 0
|
@@ -199,6 +190,7 @@ module GSSAPI
|
|
199
190
|
# gss_cred_id_t
|
200
191
|
class GssCredIdT < GssPointer
|
201
192
|
def self.release_ptr(cred_ptr)
|
193
|
+
puts "Releasing gss_cred_id_t at #{cred_ptr.address.to_s(16)}" if $DEBUG
|
202
194
|
min_stat = FFI::MemoryPointer.new :OM_uint32
|
203
195
|
maj_stat = LibGSSAPI.gss_release_cred(min_stat, cred_ptr)
|
204
196
|
end
|
@@ -335,9 +327,6 @@ module GSSAPI
|
|
335
327
|
# Variable definitions
|
336
328
|
# --------------------
|
337
329
|
|
338
|
-
attach_variable :GSS_C_NT_HOSTBASED_SERVICE, :pointer # type gss_OID
|
339
|
-
attach_variable :GSS_C_NT_EXPORT_NAME, :pointer # type gss_OID
|
340
|
-
|
341
330
|
# Flag bits for context-level services.
|
342
331
|
GSS_C_DELEG_FLAG = 1
|
343
332
|
GSS_C_MUTUAL_FLAG = 2
|
@@ -6,35 +6,69 @@ Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.p
|
|
6
6
|
module GSSAPI
|
7
7
|
module LibGSSAPI
|
8
8
|
|
9
|
+
class GssOID < FFI::Struct
|
10
|
+
layout :length, :OM_uint32,
|
11
|
+
:elements, :pointer # pointer of :void
|
12
|
+
|
13
|
+
def self.gss_c_no_oid
|
14
|
+
self.new(GSSAPI::LibGSSAPI::GSS_C_NO_OID)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
def self.load_mit
|
20
|
+
case RUBY_PLATFORM
|
21
|
+
when /linux/
|
22
|
+
gssapi_lib = 'libgssapi_krb5.so.2'
|
23
|
+
when /darwin/
|
24
|
+
gssapi_lib = '/usr/lib/libgssapi_krb5.dylib'
|
25
|
+
when /mswin|mingw32|windows/
|
26
|
+
# Pull the gssapi32 path from the environment if it exist, otherwise use the default in Program Files
|
27
|
+
gssapi32_path = ENV['gssapi32'] ? ENV['gssapi32'] : 'C:\Program Files (x86)\MIT\Kerberos\bin\gssapi32.dll'
|
28
|
+
ffi_lib gssapi32_path, FFI::Library::LIBC # Required the MIT Kerberos libraries to be installed
|
29
|
+
ffi_convention :stdcall
|
30
|
+
else
|
31
|
+
raise LoadError, "This platform (#{RUBY_PLATFORM}) is not supported by ruby gssapi and the MIT libraries."
|
32
|
+
end
|
33
|
+
ffi_lib gssapi_lib, FFI::Library::LIBC
|
34
|
+
|
35
|
+
# -------------------- MIT Specifics --------------------
|
36
|
+
attach_variable :__GSS_C_NT_HOSTBASED_SERVICE, :GSS_C_NT_HOSTBASED_SERVICE, :pointer # type gss_OID
|
37
|
+
attach_variable :__GSS_C_NT_EXPORT_NAME, :GSS_C_NT_EXPORT_NAME, :pointer # type gss_OID
|
38
|
+
LibGSSAPI.const_set("GSS_C_NT_HOSTBASED_SERVICE", __GSS_C_NT_HOSTBASED_SERVICE)
|
39
|
+
LibGSSAPI.const_set("GSS_C_NT_EXPORT_NAME", __GSS_C_NT_EXPORT_NAME)
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.load_heimdal
|
43
|
+
case RUBY_PLATFORM
|
44
|
+
when /linux/
|
45
|
+
gssapi_lib = 'libgssapi.so.3'
|
46
|
+
when /darwin/
|
47
|
+
# use Heimdal Kerberos since Mac MIT Kerberos is OLD. Do a "require 'gssapi/heimdal'" first
|
48
|
+
gssapi_lib = '/usr/heimdal/lib/libgssapi.dylib'
|
49
|
+
else
|
50
|
+
raise LoadError, "This platform (#{RUBY_PLATFORM}) is not supported by ruby gssapi and the Heimdal libraries."
|
51
|
+
end
|
52
|
+
ffi_lib gssapi_lib, FFI::Library::LIBC
|
53
|
+
|
54
|
+
# ------------------ Heimdal Specifics ------------------
|
55
|
+
attach_variable :__gss_c_nt_hostbased_service_oid_desc, GssOID
|
56
|
+
attach_variable :__gss_c_nt_export_name_oid_desc, GssOID
|
57
|
+
LibGSSAPI.const_set("GSS_C_NT_HOSTBASED_SERVICE", FFI::Pointer.new(__gss_c_nt_hostbased_service_oid_desc.to_ptr))
|
58
|
+
LibGSSAPI.const_set("GSS_C_NT_EXPORT_NAME", FFI::Pointer.new(__gss_c_nt_export_name_oid_desc.to_ptr))
|
59
|
+
end
|
60
|
+
|
9
61
|
# Heimdal supported the *_iov functions befor MIT did so in some OS distributions if
|
10
62
|
# you need IOV support and MIT does not provide it try the Heimdal libs and then
|
11
63
|
# before doing a "require 'gssapi'" do a "require 'gssapi/heimdal'" and that will attempt
|
12
64
|
# to load the Heimdal libs
|
13
|
-
case
|
14
|
-
when
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
when :heimdal
|
19
|
-
GSSAPI_LIB = 'libgssapi.so.2'
|
20
|
-
end
|
21
|
-
ffi_lib GSSAPI_LIB, FFI::Library::LIBC
|
22
|
-
when /darwin/
|
23
|
-
case GSSAPI_LIB_TYPE
|
24
|
-
when :mit
|
25
|
-
GSSAPI_LIB = '/usr/lib/libgssapi_krb5.dylib'
|
26
|
-
when :heimdal
|
27
|
-
# use Heimdal Kerberos since Mac MIT Kerberos is OLD. Do a "require 'gssapi/heimdal'" first
|
28
|
-
GSSAPI_LIB = '/usr/heimdal/lib/libgssapi.dylib'
|
29
|
-
end
|
30
|
-
ffi_lib GSSAPI_LIB, FFI::Library::LIBC
|
31
|
-
when /mswin|mingw32|windows/
|
32
|
-
# Pull the gssapi32 path from the environment if it exist, otherwise use the default in Program Files
|
33
|
-
gssapi32_path = ENV['gssapi32'] ? ENV['gssapi32'] : 'C:\Program Files (x86)\MIT\Kerberos\bin\gssapi32.dll'
|
34
|
-
ffi_lib gssapi32_path, FFI::Library::LIBC # Required the MIT Kerberos libraries to be installed
|
35
|
-
ffi_convention :stdcall
|
65
|
+
case GSSAPI_LIB_TYPE
|
66
|
+
when :mit
|
67
|
+
load_mit
|
68
|
+
when :heimdal
|
69
|
+
load_heimdal
|
36
70
|
else
|
37
|
-
raise LoadError, "
|
71
|
+
raise LoadError, "Unexpected Lib type: #{GSSAPI_LIB_TYPE}"
|
38
72
|
end
|
39
73
|
|
40
74
|
end
|
data/lib/gssapi/simple.rb
CHANGED
@@ -38,7 +38,7 @@ module GSSAPI
|
|
38
38
|
if (str =~ /[A-Za-z0-9]+\/[^@]+@.+$/)
|
39
39
|
mech = LibGSSAPI::GssOID.gss_c_no_oid
|
40
40
|
else
|
41
|
-
mech = LibGSSAPI
|
41
|
+
mech = LibGSSAPI::GSS_C_NT_HOSTBASED_SERVICE
|
42
42
|
end
|
43
43
|
name = FFI::MemoryPointer.new :pointer # gss_name_t
|
44
44
|
min_stat = FFI::MemoryPointer.new :OM_uint32
|
metadata
CHANGED
@@ -1,43 +1,46 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: gssapi
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.1.0
|
4
5
|
prerelease:
|
5
|
-
version: 1.0.3
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Dan Wanek
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-02-10 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
16
15
|
name: ffi
|
17
|
-
|
18
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &17171140 !ruby/object:Gem::Requirement
|
19
17
|
none: false
|
20
|
-
requirements:
|
21
|
-
- -
|
22
|
-
- !ruby/object:Gem::Version
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
23
21
|
version: 1.0.1
|
24
22
|
type: :runtime
|
25
|
-
|
26
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *17171140
|
25
|
+
description: ! " A FFI wrapper around the system GSSAPI library. Please make sure
|
26
|
+
and read the\n Yard docs or standard GSSAPI documentation if you have any questions.\n
|
27
|
+
\ \n There is also a class called GSSAPI::Simple that wraps many of the common
|
28
|
+
features\n used for GSSAPI.\n"
|
27
29
|
email: dan.wanek@gmail.com
|
28
30
|
executables: []
|
29
|
-
|
30
31
|
extensions: []
|
31
|
-
|
32
|
-
extra_rdoc_files:
|
32
|
+
extra_rdoc_files:
|
33
33
|
- README.textile
|
34
34
|
- COPYING
|
35
|
-
files:
|
35
|
+
files:
|
36
36
|
- COPYING
|
37
37
|
- README.textile
|
38
38
|
- Rakefile
|
39
39
|
- VERSION
|
40
40
|
- examples/gss_client.rb
|
41
|
+
- examples/gss_iov_client.rb
|
42
|
+
- examples/gss_iov_helpers.rb
|
43
|
+
- examples/gss_iov_server.rb
|
41
44
|
- examples/gss_server.rb
|
42
45
|
- gssapi.gemspec
|
43
46
|
- lib/gssapi.rb
|
@@ -51,34 +54,30 @@ files:
|
|
51
54
|
- test/spec/test_buffer_spec.rb
|
52
55
|
homepage: http://github.com/zenchild/gssapi
|
53
56
|
licenses: []
|
54
|
-
|
55
57
|
post_install_message:
|
56
|
-
rdoc_options:
|
58
|
+
rdoc_options:
|
57
59
|
- -x
|
58
60
|
- test/
|
59
61
|
- -x
|
60
62
|
- examples/
|
61
|
-
require_paths:
|
63
|
+
require_paths:
|
62
64
|
- lib
|
63
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
65
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
66
|
none: false
|
65
|
-
requirements:
|
66
|
-
- -
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: 1.
|
69
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 1.8.7
|
71
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
72
|
none: false
|
71
|
-
requirements:
|
72
|
-
- -
|
73
|
-
- !ruby/object:Gem::Version
|
74
|
-
version:
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
75
77
|
requirements: []
|
76
|
-
|
77
78
|
rubyforge_project:
|
78
|
-
rubygems_version: 1.8.
|
79
|
+
rubygems_version: 1.8.10
|
79
80
|
signing_key:
|
80
81
|
specification_version: 3
|
81
82
|
summary: A FFI wrapper around the system GSSAPI library.
|
82
83
|
test_files: []
|
83
|
-
|
84
|
-
has_rdoc:
|