WiKID 3.0.2 → 3.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/doc/README +1 -1
- data/lib/WiKID.rb +841 -591
- data/lib/WiKID_version.rb +5 -0
- data/share/data/WiKID-ca.pem +39 -0
- data/test-options-dist.rb +10 -0
- data/test/ts_load_wikid.rb +21 -0
- data/test/ts_wikid.rb +187 -33
- metadata +67 -42
@@ -0,0 +1,39 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIG4jCCBMqgAwIBAgIBAjANBgkqhkiG9w0BAQQFADCBpTEiMCAGCSqGSIb3DQEJ
|
3
|
+
ARYTY2FAd2lraWRzeXN0ZW1zLmNvbTELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB0dl
|
4
|
+
b3JnaWExEDAOBgNVBAcMB0F0bGFudGExGjAYBgNVBAoMEVdpS0lEIFN5c3RlbXMg
|
5
|
+
SW5jMRQwEgYDVQQLDAtDQSBTZXJ2aWNlczEcMBoGA1UEAwwTY2Eud2lraWRzeXN0
|
6
|
+
ZW1zLmNvbTAeFw0xMzA0MTcxMTQzMzhaFw0yMzA0MTcxMTQzMzhaMIGlMSIwIAYJ
|
7
|
+
KoZIhvcNAQkBFhNjYUB3aWtpZHN5c3RlbXMuY29tMQswCQYDVQQGEwJVUzEQMA4G
|
8
|
+
A1UECAwHR2VvcmdpYTEQMA4GA1UEBwwHQXRsYW50YTEaMBgGA1UECgwRV2lLSUQg
|
9
|
+
U3lzdGVtcyBJbmMxFDASBgNVBAsMC0NBIFNlcnZpY2VzMRwwGgYDVQQDDBNjYS53
|
10
|
+
aWtpZHN5c3RlbXMuY29tMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
|
11
|
+
qFrO3TUybKfA38FH7rXhQEMnpy+59vwZJns6j8NcYyyUbeEZXY8vQ7VSCLjro7bF
|
12
|
+
wBbAAvt3z+XWPWwqS7njtmm4H8b1xnwp2waBooXawCY0GWKsD6sRUmA42E3y++li
|
13
|
+
+J/mz2BrdZ/srWxh5wyrn/TkgzBlRUgwbF6qKPb14l9NhPi8MtWfrrqkdBYsBZFd
|
14
|
+
MW6vTj/pDusQwWxxQKf4tIWM2mOoB51YKJqLiNr4i7Ke3vqErz5EsTTl2Srbuxqr
|
15
|
+
jo45XV7JaB4lsxecbm1mQmWo1e5n37EEVSwj8H64H7b59/n//eGQGSZjs2vAyzUe
|
16
|
+
A0QAluYjioMXX1yg52dHCBtmqseDfamhCZ9MyqwSqFu/w6vFbFvqZQns7NoUxWar
|
17
|
+
736Wp6+IfpnO7irD/EeP6JZOgX+TV1ZyjEyEf5oDutsfTx8Zn+OG2vR9/7nfHnYo
|
18
|
+
3yZYX6Nj8qWcODuCSzpBD5RSMsmYSf53YM3OTCo1xAq0f3C9t4syGmaQDidGR8Mr
|
19
|
+
OOhDF0rtSHgi8EXqBgA4KT/KXcoogLnlMSxy4TUq7l0wrUVZ4STMXhG7MWK49g0w
|
20
|
+
DqY/mhQ1GcJyBQ89ClGajsGiA90DIjnVVLRHaDvy5bKEgJigUdpC/kf9W0IO025k
|
21
|
+
KtaptwHi6SMsSKbCRhr5dsew4Q6CW6YTwXIwDjrPuKUCAwEAAaOCARkwggEVMB0G
|
22
|
+
A1UdDgQWBBT+OIb6dSVaXUQ8D5ApW5lzz0yhOzARBglghkgBhvhCAQEEBAMCBkAw
|
23
|
+
DAYDVR0TBAUwAwEB/zCB0gYDVR0jBIHKMIHHgBT+OIb6dSVaXUQ8D5ApW5lzz0yh
|
24
|
+
O6GBq6SBqDCBpTEiMCAGCSqGSIb3DQEJARYTY2FAd2lraWRzeXN0ZW1zLmNvbTEL
|
25
|
+
MAkGA1UEBhMCVVMxEDAOBgNVBAgTB0dlb3JnaWExEDAOBgNVBAcTB0F0bGFudGEx
|
26
|
+
GjAYBgNVBAoTEVdpS0lEIFN5c3RlbXMgSW5jMRQwEgYDVQQLEwtDQSBTZXJ2aWNl
|
27
|
+
czEcMBoGA1UEAxMTY2Eud2lraWRzeXN0ZW1zLmNvbYIBAjANBgkqhkiG9w0BAQQF
|
28
|
+
AAOCAgEAHDO4GqAB0u3DlcgrFmqJghJoUTNMz1EkyvrZui/Q0qp5V5fu5CoKdwuZ
|
29
|
+
r1iitBUW0rhn83CEZ5efFQu6ua7YdHsxpD4jX3OBjrCELQOAYEGiZd1G8EupfEU4
|
30
|
+
4JTAY2LlANToITmOTslzVwCJ5znGlPEjLF2xYF3xMAH8zqkhfFeZi+xDPcdgpUmk
|
31
|
+
lT2YUn3FZMxXMV6h8ANw72iCMON82uifBMsVQ3G/MG0qFCyeiYqj9gYMDO8yXqTM
|
32
|
+
ftuy4UBOOBWHJWpTy7JXlaYyLcEVJXeq92KH/MwHaG6xpyT8CyPGZpv4yyaNE9YO
|
33
|
+
f9g3XbEWUa5eHWo0qVVmf4tF3wfyG/gQ/TdFVJHcqGTpPtLmumM49+Bbbd/Ohoea
|
34
|
+
3Jc1ZwPIxu/W76bs0ZK530me8vzq0Wzo2cKc77gi2zByasdMh6hwY4Q7oYeh6kqh
|
35
|
+
fLq3dc3Hv5jgzU2ivbkOnyFs6wxLjub+Gklkg65IKyYMLIG/OVDuns3kUnJnXO+i
|
36
|
+
Kkol7KbkxI3oZypsOqXMUFZ+4TYUMs+xWSD2kmi3Vp/XaiUiaiZ3ZTIbHpnqK6HC
|
37
|
+
sFcMy5yGnNYJqudi5ZfbYuvVLJcqj1q6xY8+b/4bgbingKH2v97uBSePp+Mb6Sol
|
38
|
+
qoln8zxXi9eQMDI+rfAZtpztGXcwlyjpuyivCFnYm+jftz3gEwk=
|
39
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,10 @@
|
|
1
|
+
## rename to test-options.rb and set the parameter per your environment
|
2
|
+
|
3
|
+
DOMAIN_CODE = "127000000001"
|
4
|
+
SERVER_HOST = "127.0.0.1"
|
5
|
+
SERVER_PORT = 8388
|
6
|
+
|
7
|
+
CLIENT_KEY_FILE = File.join(File.dirname(__FILE__), 'network-client.pem')
|
8
|
+
CLIENT_KEY_PASS = 'changeme'
|
9
|
+
|
10
|
+
JCMD_REGISTER = "java -cp lib/wikidtoken-3.1.23.jar:lib/wikid-tokentest.jar com.wikidsystems.test.JavaSETokenTester register"
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
class TestLoadWiKID < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def test_load_module
|
8
|
+
|
9
|
+
$:.unshift File.join(File.dirname(__FILE__), "..", "lib")
|
10
|
+
|
11
|
+
begin
|
12
|
+
require 'WiKID'
|
13
|
+
loaded = 1
|
14
|
+
rescue
|
15
|
+
loaded = 0
|
16
|
+
end
|
17
|
+
assert(loaded == 1, "Unable to load WiKID module!")
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
data/test/ts_wikid.rb
CHANGED
@@ -1,52 +1,206 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'test/unit'
|
4
|
-
|
4
|
+
$:.unshift File.join(File.dirname(__FILE__), "..", "lib")
|
5
|
+
require 'WiKID'
|
6
|
+
require 'SecureRandom'
|
7
|
+
require 'rexml/document'
|
8
|
+
include REXML
|
9
|
+
|
10
|
+
TEST_OPTIONS_FILE = File.join(File.dirname(__FILE__), "..", "test-options.rb")
|
11
|
+
config_file_exists = FileTest.exists?(TEST_OPTIONS_FILE)
|
12
|
+
if config_file_exists
|
13
|
+
require TEST_OPTIONS_FILE
|
14
|
+
end
|
15
|
+
|
16
|
+
SERVER_HOST = "127.0.0.1" if !defined?(SERVER_HOST)
|
17
|
+
DOMAIN_CODE = "127000000001" if !defined?(DOMAIN_CODE)
|
18
|
+
SERVER_PORT = 8388 if !defined?(SERVER_PORT)
|
19
|
+
CLIENT_KEY_FILE = '' if !defined?(CLIENT_KEY_FILE)
|
20
|
+
CLIENT_KEY_PASS = '' if !defined?(CLIENT_KEY_PASS)
|
21
|
+
|
22
|
+
puts "* Running with server: #{SERVER_HOST}:#{SERVER_PORT}"
|
5
23
|
|
6
24
|
class TestWiKID < Test::Unit::TestCase
|
7
25
|
|
8
|
-
|
26
|
+
def test_init_module
|
27
|
+
|
28
|
+
wc = WiKID::Auth.new(SERVER_HOST, SERVER_PORT, CLIENT_KEY_FILE, CLIENT_KEY_PASS)
|
29
|
+
|
30
|
+
assert_not_nil(wc, "WiKID module successfully loaded!")
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_check_keys
|
35
|
+
|
36
|
+
wc = WiKID::Auth.new(SERVER_HOST, SERVER_PORT, CLIENT_KEY_FILE, CLIENT_KEY_PASS)
|
37
|
+
assert_nothing_raised do
|
38
|
+
|
39
|
+
wc.checkKeys()
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_invalid_user_registration
|
44
|
+
|
45
|
+
username = 'test'
|
46
|
+
domaincode = DOMAIN_CODE
|
47
|
+
|
48
|
+
wc = WiKID::Auth.new(SERVER_HOST, SERVER_PORT, CLIENT_KEY_FILE, CLIENT_KEY_PASS)
|
49
|
+
|
50
|
+
regcode = ""
|
51
|
+
result = wc.registerUsername(username, regcode, domaincode)
|
52
|
+
assert_not_equal(0, result, "Properly failed to register user")
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_valid_user_registration
|
57
|
+
|
58
|
+
username = 'test-' + SecureRandom.uuid
|
59
|
+
domaincode = DOMAIN_CODE
|
60
|
+
|
61
|
+
wc = WiKID::Auth.new(SERVER_HOST, SERVER_PORT, CLIENT_KEY_FILE, CLIENT_KEY_PASS)
|
62
|
+
|
63
|
+
output=`#{JCMD_REGISTER} #{DOMAIN_CODE}`
|
64
|
+
matches = /code=(\w+)/.match(output)
|
65
|
+
regcode = matches[1] || ''
|
66
|
+
result = wc.registerUsername(username, regcode, DOMAIN_CODE)
|
67
|
+
|
68
|
+
assert_equal(0, result, "Failed to register user")
|
69
|
+
|
70
|
+
# cleanup
|
71
|
+
wc.deleteUser(username, domaincode)
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_invalid_pin
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_valid_pin
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_find_user
|
84
|
+
|
85
|
+
username = 'test-' + SecureRandom.uuid
|
86
|
+
domaincode = DOMAIN_CODE
|
87
|
+
|
88
|
+
wc = WiKID::Auth.new(SERVER_HOST, SERVER_PORT, CLIENT_KEY_FILE, CLIENT_KEY_PASS)
|
89
|
+
|
90
|
+
output=`#{JCMD_REGISTER} #{DOMAIN_CODE}`
|
91
|
+
matches = /code=(\w+)/.match(output)
|
92
|
+
regcode = matches[1] || ''
|
93
|
+
result = wc.registerUsername(username, regcode, DOMAIN_CODE)
|
94
|
+
|
95
|
+
user_xml = wc.findUser(username, domaincode)
|
96
|
+
|
97
|
+
user_id = XPath.first(user_xml, '//user-id/text()')
|
98
|
+
|
99
|
+
assert_equal(user_id, username, "Failed to lookup user")
|
100
|
+
|
101
|
+
# cleanup
|
102
|
+
wc.deleteUser(username, domaincode)
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
|
107
|
+
def test_update_user
|
108
|
+
|
109
|
+
username = 'test-' + SecureRandom.uuid
|
110
|
+
domaincode = DOMAIN_CODE
|
111
|
+
|
112
|
+
wc = WiKID::Auth.new(SERVER_HOST, SERVER_PORT, CLIENT_KEY_FILE, CLIENT_KEY_PASS)
|
113
|
+
|
114
|
+
output=`#{JCMD_REGISTER} #{DOMAIN_CODE}`
|
115
|
+
matches = /code=(\w+)/.match(output)
|
116
|
+
regcode = matches[1] || ''
|
117
|
+
wc.registerUsername(username, regcode, DOMAIN_CODE)
|
118
|
+
|
119
|
+
## get the XML string to modify with
|
120
|
+
user_xml = wc.findUser(username, domaincode)
|
121
|
+
|
122
|
+
## 1. modify the number of bad attempts
|
123
|
+
attempts = XPath.first(user_xml, '//bad-passcode-attempts/text()')
|
124
|
+
assert_equal(0, attempts, "Number of bad attempts is aleady non-zero!")
|
125
|
+
|
126
|
+
user_xml.elements['bad-passcode-attempts'].text = 2
|
127
|
+
|
128
|
+
result = wc.updateUser(username, domaincode, user_xml)
|
129
|
+
assert_equal(true, result, "Failed to modify the number of bad attempts!")
|
130
|
+
|
131
|
+
user_xml = wc.findUser(username, domaincode)
|
132
|
+
attempts = XPath.first(user_xml, '//bad-passcode-attempts/text()')
|
133
|
+
assert_equal(2, attempts, "Failed to correctly set the the number of bad attempts!")
|
134
|
+
|
135
|
+
## 2. modify the user status
|
136
|
+
status = XPath.first(user_xml, '//status/text()')
|
137
|
+
assert_equal(1, status, "Status is already disabled!")
|
138
|
+
|
139
|
+
user_xml.elements['status'].text = 0
|
140
|
+
|
141
|
+
result = wc.updateUser(username, domaincode, user_xml)
|
142
|
+
assert_equal(true, result, "Failed to modify the status!")
|
143
|
+
|
144
|
+
user_xml = wc.findUser(username, domaincode)
|
145
|
+
status = XPath.first(user_xml, '//status/text()')
|
146
|
+
assert_equal(0, status, "Failed to modify the status value!")
|
147
|
+
|
148
|
+
## 3. modify the user note
|
149
|
+
note = XPath.first(user_xml, '//note/text()')
|
150
|
+
assert_equal('', note.to_s, "Note is already non-empty!")
|
151
|
+
|
152
|
+
new_note_text = "This is a test note"
|
153
|
+
user_xml.elements['note'].text = new_note_text
|
154
|
+
|
155
|
+
result = wc.updateUser(username, domaincode, user_xml)
|
156
|
+
assert_equal(true, result, "Failed to modify the note!")
|
157
|
+
|
158
|
+
user_xml = wc.findUser(username, domaincode)
|
159
|
+
note = XPath.first(user_xml, '//note/text()')
|
160
|
+
assert_equal(new_note_text, note.to_s, "Failed to modity the note value!")
|
161
|
+
|
162
|
+
# cleanup
|
163
|
+
wc.deleteUser(username, domaincode)
|
164
|
+
|
165
|
+
end
|
166
|
+
|
167
|
+
def test_delete_unknown_user
|
168
|
+
|
169
|
+
username = 'junk-test-' + SecureRandom.uuid
|
170
|
+
domaincode = DOMAIN_CODE
|
171
|
+
|
172
|
+
wc = WiKID::Auth.new(SERVER_HOST, SERVER_PORT, CLIENT_KEY_FILE, CLIENT_KEY_PASS)
|
173
|
+
|
174
|
+
result = wc.deleteUser(username, domaincode)
|
175
|
+
|
176
|
+
assert_equal(false, result, "Unable to delete unknown user")
|
177
|
+
|
178
|
+
# cleanup
|
179
|
+
wc.deleteUser(username, domaincode)
|
9
180
|
|
10
|
-
|
11
|
-
require 'rubygems'
|
12
|
-
loaded = 1
|
13
|
-
rescue Exception
|
14
|
-
# puts "WARNING: RubyGems not installed"
|
15
|
-
loaded = 0
|
16
|
-
end
|
17
|
-
assert(loaded == 1, "Unable to load RubyGems!")
|
181
|
+
end
|
18
182
|
|
19
|
-
|
20
|
-
# puts "Loaded RubyGems #{Gem::RubyGemsVersion} ..."
|
183
|
+
def test_delete_user
|
21
184
|
|
22
|
-
|
23
|
-
|
24
|
-
end
|
185
|
+
username = 'test-' + SecureRandom.uuid
|
186
|
+
domaincode = DOMAIN_CODE
|
25
187
|
|
26
|
-
|
188
|
+
wc = WiKID::Auth.new(SERVER_HOST, SERVER_PORT, CLIENT_KEY_FILE, CLIENT_KEY_PASS)
|
27
189
|
|
28
|
-
|
190
|
+
output=`#{JCMD_REGISTER} #{DOMAIN_CODE}`
|
191
|
+
matches = /code=(\w+)/.match(output)
|
192
|
+
regcode = matches[1] || ''
|
193
|
+
wc.registerUsername(username, regcode, DOMAIN_CODE)
|
29
194
|
|
30
|
-
|
31
|
-
require_gem 'WiKID'
|
32
|
-
loaded = 1
|
33
|
-
rescue
|
34
|
-
loaded = 0
|
35
|
-
end
|
36
|
-
assert(loaded == 1, "Unable to load WiKID module!")
|
195
|
+
result = wc.deleteUser(username, domaincode)
|
37
196
|
|
38
|
-
|
197
|
+
assert_equal(true, result, "Failed to delete user")
|
39
198
|
|
40
|
-
|
199
|
+
user_xml = wc.findUser(username, domaincode)
|
41
200
|
|
42
|
-
|
43
|
-
server_port = -1
|
44
|
-
client_key_file = "/path/to/nowhere.pem"
|
45
|
-
client_key_pass = "changeme"
|
201
|
+
assert_nil(user_xml, "User not deleted")
|
46
202
|
|
47
|
-
|
48
|
-
assert_not_nil(wc, "WiKID module successfully loaded!")
|
203
|
+
end
|
49
204
|
|
50
|
-
end
|
51
205
|
|
52
206
|
end
|
metadata
CHANGED
@@ -1,60 +1,85 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: WiKID
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 3.2.3
|
5
5
|
platform: ruby
|
6
|
-
authors:
|
6
|
+
authors:
|
7
7
|
- Greg Haygood
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
date: 2015-02-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.7'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.7'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
16
41
|
description:
|
17
|
-
email:
|
42
|
+
email:
|
43
|
+
- ghaygood@wikidsystems.com
|
18
44
|
executables: []
|
19
|
-
|
20
45
|
extensions: []
|
21
|
-
|
22
|
-
|
23
|
-
- doc/
|
24
|
-
files:
|
25
|
-
- lib/WiKID.rb
|
26
|
-
- doc/example
|
27
|
-
- doc/rubygems-0.8.11.security-patch.diff
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- doc/LICENSE.txt
|
28
49
|
- doc/MANIFEST
|
29
50
|
- doc/README
|
30
|
-
- doc/
|
31
|
-
-
|
51
|
+
- doc/rubygems-0.8.11.security-patch.diff
|
52
|
+
- lib/WiKID.rb
|
53
|
+
- lib/WiKID_version.rb
|
54
|
+
- share/data/WiKID-ca.pem
|
55
|
+
- test-options-dist.rb
|
56
|
+
- test/ts_load_wikid.rb
|
32
57
|
- test/ts_wikid.rb
|
33
|
-
|
34
|
-
|
58
|
+
homepage: https://rubygems.org/gems/WiKID
|
59
|
+
licenses:
|
60
|
+
- LGPL
|
61
|
+
metadata: {}
|
35
62
|
post_install_message:
|
36
63
|
rdoc_options: []
|
37
|
-
|
38
|
-
require_paths:
|
64
|
+
require_paths:
|
39
65
|
- lib
|
40
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
41
|
-
requirements:
|
42
|
-
- -
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
version:
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
version: "0"
|
51
|
-
version:
|
66
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 1.9.3
|
71
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
52
76
|
requirements: []
|
53
|
-
|
54
|
-
|
55
|
-
rubygems_version: 1.1.0
|
77
|
+
rubyforge_project:
|
78
|
+
rubygems_version: 2.4.1
|
56
79
|
signing_key:
|
57
|
-
specification_version:
|
80
|
+
specification_version: 4
|
58
81
|
summary: A network client module for the WiKID Strong Authentication system
|
59
|
-
test_files:
|
60
|
-
|
82
|
+
test_files:
|
83
|
+
- test/ts_load_wikid.rb
|
84
|
+
- test/ts_wikid.rb
|
85
|
+
has_rdoc:
|