rkerberos 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES CHANGED
@@ -1,3 +1,8 @@
1
+ = 0.1.1 - 08-May-2013
2
+ * Add credential cache argument to get_init_creds_keytab
3
+ * Fixed invalid VALUE declarations affecting non-gcc compilers
4
+ * Add OS X install instructions
5
+
1
6
  = 0.1.0 - 28-Apr-2011
2
7
  * Initial release. This is effectively a re-release of my own custom branch
3
8
  of the krb5-auth library, with some minor changes.
@@ -1,10 +1,24 @@
1
- = Description
1
+ # Description
2
2
  The rkerberos library provides a Ruby interface for Kerberos.
3
3
 
4
- = Requirements
4
+ # Requirements
5
5
  Kerberos 1.7.0 or later, including admin header and library files.
6
6
 
7
- = Synopsis
7
+ # OSX
8
+ krb5 must be installed from source before installing the rkerberos gem:
9
+ ```
10
+ wget http://web.mit.edu/kerberos/dist/krb5/1.10/krb5-1.10.2-signed.tar
11
+ tar -xf krb5-1.10.2-signed.tar
12
+ tar -xf krb5-1.10.2-signed.tar.gz
13
+ cd krb5-1.10.2
14
+ ./configure
15
+ make
16
+ make install
17
+ ```
18
+ latest release is here: http://web.mit.edu/kerberos/dist/index.html
19
+
20
+ # Synopsis
21
+ ```ruby
8
22
  require 'rkerberos'
9
23
 
10
24
  # Get the default realm name
@@ -27,25 +41,23 @@
27
41
  p kadm5.get_principal('someuser')
28
42
  kadm5.set_password('someuser', 'abc123')
29
43
  end
44
+ ```
30
45
 
31
- = Notes
46
+ # Notes
32
47
  The rkerberos library is a repackaging of my custom branch of the krb5_auth
33
48
  library. Eventually the gem djberg96-krb5_auth will be removed from the gem
34
49
  index.
35
50
 
36
- = MIT vs Heimdal
51
+ # MIT vs Heimdal
37
52
  This code was written for the MIT Kerberos library. It has not been tested
38
53
  with the Heimdal Kerberos library.
39
54
 
40
- = TODO
55
+ # TODO
41
56
  Create a separate class for the replay cache.
42
57
  Better credentials cache support.
43
58
  Ability to add and delete keytab entries.
44
59
 
45
- = Known Issues
46
- OS X users will probably need to install Kerberos manually and specify
47
- the dir-config option because it ships with old Kerberos header files,
48
- and none of the admin headers or libraries by default.
49
-
50
- = Author
60
+ # Authors
51
61
  Daniel Berger
62
+ Dominic Cleal (maintainer)
63
+
data/Rakefile CHANGED
@@ -14,6 +14,7 @@ CLEAN.include(
14
14
  '**/*.log', # Ruby extension build log
15
15
  '**/Makefile', # C Makefile
16
16
  '**/conftest.dSYM', # OS X build directory
17
+ '**/tmp', # Temp directory
17
18
  "**/*.#{CONFIG['DLEXT']}" # C shared object
18
19
  )
19
20
 
@@ -35,7 +35,6 @@ static VALUE rkrb5_keytab_allocate(VALUE klass){
35
35
  static VALUE rkrb5_keytab_each(VALUE self){
36
36
  RUBY_KRB5_KEYTAB* ptr;
37
37
  VALUE v_kt_entry;
38
- VALUE v_args[0];
39
38
  krb5_error_code kerror;
40
39
  krb5_kt_cursor cursor;
41
40
  krb5_keytab_entry entry;
@@ -55,7 +54,7 @@ static VALUE rkrb5_keytab_each(VALUE self){
55
54
  while((kerror = krb5_kt_next_entry(ptr->ctx, ptr->keytab, &entry, &cursor)) == 0){
56
55
  krb5_unparse_name(ptr->ctx, entry.principal, &principal);
57
56
 
58
- v_kt_entry = rb_class_new_instance(0, v_args, cKrb5KtEntry);
57
+ v_kt_entry = rb_class_new_instance(0, NULL, cKrb5KtEntry);
59
58
 
60
59
  rb_iv_set(v_kt_entry, "@principal", rb_str_new2(principal));
61
60
  rb_iv_set(v_kt_entry, "@timestamp", rb_time_new(entry.timestamp, 0));
@@ -247,7 +246,6 @@ static VALUE rkrb5_keytab_get_entry(int argc, VALUE* argv, VALUE self){
247
246
  krb5_keytab_entry entry;
248
247
  char* name;
249
248
  VALUE v_principal, v_vno, v_enctype, v_entry;
250
- VALUE v_args[0];
251
249
 
252
250
  Data_Get_Struct(self, RUBY_KRB5_KEYTAB, ptr);
253
251
 
@@ -276,7 +274,7 @@ static VALUE rkrb5_keytab_get_entry(int argc, VALUE* argv, VALUE self){
276
274
  if(kerror)
277
275
  rb_raise(cKrb5Exception, "krb5_kt_get_entry: %s", error_message(kerror));
278
276
 
279
- v_entry = rb_class_new_instance(0, v_args, cKrb5KtEntry);
277
+ v_entry = rb_class_new_instance(0, NULL, cKrb5KtEntry);
280
278
 
281
279
  rb_iv_set(v_entry, "@principal", rb_str_new2(name));
282
280
  rb_iv_set(v_entry, "@timestamp", rb_time_new(entry.timestamp, 0));
@@ -365,7 +363,6 @@ static VALUE rkrb5_keytab_initialize(int argc, VALUE* argv, VALUE self){
365
363
  static VALUE rkrb5_s_keytab_foreach(int argc, VALUE* argv, VALUE klass){
366
364
  VALUE v_kt_entry;
367
365
  VALUE v_keytab_name;
368
- VALUE v_args[0];
369
366
  krb5_error_code kerror;
370
367
  krb5_kt_cursor cursor;
371
368
  krb5_keytab keytab;
@@ -429,7 +426,7 @@ static VALUE rkrb5_s_keytab_foreach(int argc, VALUE* argv, VALUE klass){
429
426
  while((kerror = krb5_kt_next_entry(context, keytab, &entry, &cursor)) == 0){
430
427
  krb5_unparse_name(context, entry.principal, &principal);
431
428
 
432
- v_kt_entry = rb_class_new_instance(0, v_args, cKrb5KtEntry);
429
+ v_kt_entry = rb_class_new_instance(0, NULL, cKrb5KtEntry);
433
430
 
434
431
  rb_iv_set(v_kt_entry, "@principal", rb_str_new2(principal));
435
432
  rb_iv_set(v_kt_entry, "@timestamp", rb_time_new(entry.timestamp, 0));
@@ -127,7 +127,7 @@ static VALUE rkrb5_set_default_realm(int argc, VALUE* argv, VALUE self){
127
127
  }
128
128
 
129
129
  /* call-seq:
130
- * krb5.get_init_creds_keytab(principal = nil, keytab = nil, service = nil)
130
+ * krb5.get_init_creds_keytab(principal = nil, keytab = nil, service = nil, ccache = nil)
131
131
  *
132
132
  * Acquire credentials for +principal+ from +keytab+ using +service+. If
133
133
  * no principal is specified, then a principal is derived from the service
@@ -135,16 +135,19 @@ static VALUE rkrb5_set_default_realm(int argc, VALUE* argv, VALUE self){
135
135
  *
136
136
  * If no keytab file is provided, the default keytab file is used. This is
137
137
  * typically /etc/krb5.keytab.
138
+ *
139
+ * If +ccache+ is supplied and is a Kerberos::Krb5::CredentialsCache, the
140
+ * resulting credentials will be stored in the credential cache.
138
141
  */
139
142
  static VALUE rkrb5_get_init_creds_keytab(int argc, VALUE* argv, VALUE self){
140
143
  RUBY_KRB5* ptr;
141
- VALUE v_user, v_keytab_name, v_service;
144
+ VALUE v_user, v_keytab_name, v_service, v_ccache;
142
145
  char* user;
143
146
  char* service;
144
147
  char keytab_name[MAX_KEYTAB_NAME_LEN];
145
148
 
146
149
  krb5_error_code kerror;
147
- krb5_get_init_creds_opt opt;
150
+ krb5_get_init_creds_opt* opt;
148
151
  krb5_creds cred;
149
152
 
150
153
  Data_Get_Struct(self, RUBY_KRB5, ptr);
@@ -152,7 +155,11 @@ static VALUE rkrb5_get_init_creds_keytab(int argc, VALUE* argv, VALUE self){
152
155
  if(!ptr->ctx)
153
156
  rb_raise(cKrb5Exception, "no context has been established");
154
157
 
155
- rb_scan_args(argc, argv, "03", &v_user, &v_keytab_name, &v_service);
158
+ kerror = krb5_get_init_creds_opt_alloc(ptr->ctx, &opt);
159
+ if(kerror)
160
+ rb_raise(cKrb5Exception, "krb5_get_init_creds_opt_alloc: %s", error_message(kerror));
161
+
162
+ rb_scan_args(argc, argv, "04", &v_user, &v_keytab_name, &v_service, &v_ccache);
156
163
 
157
164
  // We need the service information for later.
158
165
  if(NIL_P(v_service)){
@@ -173,8 +180,10 @@ static VALUE rkrb5_get_init_creds_keytab(int argc, VALUE* argv, VALUE self){
173
180
  &ptr->princ
174
181
  );
175
182
 
176
- if(kerror)
183
+ if(kerror) {
184
+ krb5_get_init_creds_opt_free(ptr->ctx, opt);
177
185
  rb_raise(cKrb5Exception, "krb5_sname_to_principal: %s", error_message(kerror));
186
+ }
178
187
  }
179
188
  else{
180
189
  Check_Type(v_user, T_STRING);
@@ -182,16 +191,20 @@ static VALUE rkrb5_get_init_creds_keytab(int argc, VALUE* argv, VALUE self){
182
191
 
183
192
  kerror = krb5_parse_name(ptr->ctx, user, &ptr->princ);
184
193
 
185
- if(kerror)
194
+ if(kerror) {
195
+ krb5_get_init_creds_opt_free(ptr->ctx, opt);
186
196
  rb_raise(cKrb5Exception, "krb5_parse_name: %s", error_message(kerror));
197
+ }
187
198
  }
188
199
 
189
200
  // Use the default keytab if none is specified.
190
201
  if(NIL_P(v_keytab_name)){
191
202
  kerror = krb5_kt_default_name(ptr->ctx, keytab_name, MAX_KEYTAB_NAME_LEN);
192
203
 
193
- if(kerror)
204
+ if(kerror) {
205
+ krb5_get_init_creds_opt_free(ptr->ctx, opt);
194
206
  rb_raise(cKrb5Exception, "krb5_kt_default_name: %s", error_message(kerror));
207
+ }
195
208
  }
196
209
  else{
197
210
  Check_Type(v_keytab_name, T_STRING);
@@ -204,10 +217,22 @@ static VALUE rkrb5_get_init_creds_keytab(int argc, VALUE* argv, VALUE self){
204
217
  &ptr->keytab
205
218
  );
206
219
 
207
- if(kerror)
220
+ if(kerror) {
221
+ krb5_get_init_creds_opt_free(ptr->ctx, opt);
208
222
  rb_raise(cKrb5Exception, "krb5_kt_resolve: %s", error_message(kerror));
223
+ }
224
+
225
+ // Set the credential cache from the supplied Kerberos::Krb5::CredentialsCache
226
+ if(!NIL_P(v_ccache)){
227
+ RUBY_KRB5_CCACHE* ccptr;
228
+ Data_Get_Struct(v_ccache, RUBY_KRB5_CCACHE, ccptr);
209
229
 
210
- krb5_get_init_creds_opt_init(&opt);
230
+ kerror = krb5_get_init_creds_opt_set_out_ccache(ptr->ctx, opt, ccptr->ccache);
231
+ if(kerror) {
232
+ krb5_get_init_creds_opt_free(ptr->ctx, opt);
233
+ rb_raise(cKrb5Exception, "krb5_get_init_creds_opt_set_out_ccache: %s", error_message(kerror));
234
+ }
235
+ }
211
236
 
212
237
  kerror = krb5_get_init_creds_keytab(
213
238
  ptr->ctx,
@@ -216,11 +241,15 @@ static VALUE rkrb5_get_init_creds_keytab(int argc, VALUE* argv, VALUE self){
216
241
  ptr->keytab,
217
242
  0,
218
243
  service,
219
- &opt
244
+ opt
220
245
  );
221
246
 
222
- if(kerror)
247
+ if(kerror) {
248
+ krb5_get_init_creds_opt_free(ptr->ctx, opt);
223
249
  rb_raise(cKrb5Exception, "krb5_get_init_creds_keytab: %s", error_message(kerror));
250
+ }
251
+
252
+ krb5_get_init_creds_opt_free(ptr->ctx, opt);
224
253
 
225
254
  return self;
226
255
  }
Binary file
@@ -2,19 +2,17 @@ require 'rubygems'
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = 'rkerberos'
5
- spec.version = '0.1.0'
6
- spec.author = 'Daniel Berger'
5
+ spec.version = '0.1.1'
6
+ spec.authors = ['Daniel Berger', 'Dominic Cleal']
7
7
  spec.license = 'Artistic 2.0'
8
- spec.email = 'djberg96@gmail.com'
9
- spec.homepage = 'http://github.com/djberg96/rkerberos'
10
- spec.platform = Gem::Platform::RUBY
8
+ spec.email = ['djberg96@gmail.com', 'dcleal@redhat.com']
9
+ spec.homepage = 'http://github.com/domcleal/rkerberos'
11
10
  spec.summary = 'A Ruby interface for the the Kerberos library'
12
11
  spec.test_files = Dir['test/test*']
13
12
  spec.extensions = ['ext/rkerberos/extconf.rb']
14
13
  spec.files = Dir['**/*'].reject{ |f| f.include?('git') || f.include?('tmp') }
15
14
 
16
- spec.rubyforge_project = 'rkerberos'
17
- spec.extra_rdoc_files = ['README', 'CHANGES', 'MANIFEST'] + Dir['ext/rkerberos/*.c']
15
+ spec.extra_rdoc_files = ['README.md', 'CHANGES', 'MANIFEST'] + Dir['ext/rkerberos/*.c']
18
16
 
19
17
  spec.add_dependency('rake-compiler')
20
18
 
@@ -129,6 +129,18 @@ class TC_Krb5 < Test::Unit::TestCase
129
129
  assert_nothing_raised{ @krb5.get_init_creds_keytab(@user, @keytab, @service) }
130
130
  end
131
131
 
132
+ test "get_init_creds_keytab accepts a credential cache" do
133
+ omit_unless(File.exists?(@keytab), "keytab file not found, skipping")
134
+ assert_nothing_raised{ @krb5.get_init_creds_keytab(@user, @keytab, @service, @ccache) }
135
+ end
136
+
137
+ test "get_init_creds_keytab stores credentials in the credential cache" do
138
+ omit_unless(File.exists?(@keytab), "keytab file not found, skipping")
139
+ ccache = Kerberos::Krb5::CredentialsCache.new
140
+ assert_nothing_raised{ @krb5.get_init_creds_keytab(@user, @keytab, @service, @ccache) }
141
+ assert_equal @user, ccache.primary_principal
142
+ end
143
+
132
144
  test "get_init_creds_keytab requires string arguments" do
133
145
  assert_raise(TypeError){ @krb5.get_init_creds_keytab(1) }
134
146
  assert_raise(TypeError){ @krb5.get_init_creds_keytab(@user, 1) }
@@ -21,6 +21,9 @@ class TC_Krb5_Keytab < Test::Unit::TestCase
21
21
  def self.startup
22
22
  file = Dir.tmpdir + "/test.keytab"
23
23
 
24
+ @@key_file = "FILE:" + file
25
+ @@home_dir = ENV['HOME'] || ENV['USER_PROFILE']
26
+
24
27
  PTY.spawn('kadmin.local') do |reader, writer, pid|
25
28
  reader.gets
26
29
  reader.expect(/local:\s+/)
@@ -31,9 +34,6 @@ class TC_Krb5_Keytab < Test::Unit::TestCase
31
34
  writer.puts("ktadd -k #{file} testuser2")
32
35
  reader.expect(/local:\s+/)
33
36
  end
34
-
35
- @@key_file = "FILE:" + file
36
- @@home_dir = ENV['HOME'] || ENV['USER_PROFILE']
37
37
  end
38
38
 
39
39
  def setup
metadata CHANGED
@@ -1,155 +1,145 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: rkerberos
3
- version: !ruby/object:Gem::Version
4
- hash: 27
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 1
9
- - 0
10
- version: 0.1.0
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Daniel Berger
9
+ - Dominic Cleal
14
10
  autorequire:
15
11
  bindir: bin
16
12
  cert_chain: []
17
-
18
- date: 2011-04-28 00:00:00 -06:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
13
+ date: 2013-05-08 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
22
16
  name: rake-compiler
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
17
+ requirement: !ruby/object:Gem::Requirement
25
18
  none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 0
32
- version: "0"
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
33
23
  type: :runtime
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: test-unit
37
24
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ - !ruby/object:Gem::Dependency
32
+ name: test-unit
33
+ requirement: !ruby/object:Gem::Requirement
39
34
  none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- hash: 11
44
- segments:
45
- - 2
46
- - 1
47
- - 0
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
48
38
  version: 2.1.0
49
39
  type: :development
50
- version_requirements: *id002
51
- - !ruby/object:Gem::Dependency
52
- name: dbi-dbrc
53
40
  prerelease: false
54
- requirement: &id003 !ruby/object:Gem::Requirement
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: 2.1.0
47
+ - !ruby/object:Gem::Dependency
48
+ name: dbi-dbrc
49
+ requirement: !ruby/object:Gem::Requirement
55
50
  none: false
56
- requirements:
57
- - - ">="
58
- - !ruby/object:Gem::Version
59
- hash: 31
60
- segments:
61
- - 1
62
- - 1
63
- - 6
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
64
54
  version: 1.1.6
65
55
  type: :development
66
- version_requirements: *id003
67
- description: " The rkerberos library is an interface for the Kerberos 5 network\n authentication protocol. It wraps the Kerberos C API.\n"
68
- email: djberg96@gmail.com
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: 1.1.6
63
+ description: ! " The rkerberos library is an interface for the Kerberos 5 network\n
64
+ \ authentication protocol. It wraps the Kerberos C API.\n"
65
+ email:
66
+ - djberg96@gmail.com
67
+ - dcleal@redhat.com
69
68
  executables: []
70
-
71
- extensions:
69
+ extensions:
72
70
  - ext/rkerberos/extconf.rb
73
- extra_rdoc_files:
74
- - README
71
+ extra_rdoc_files:
72
+ - README.md
75
73
  - CHANGES
76
74
  - MANIFEST
75
+ - ext/rkerberos/context.c
76
+ - ext/rkerberos/keytab.c
77
77
  - ext/rkerberos/principal.c
78
- - ext/rkerberos/rkerberos.c
79
78
  - ext/rkerberos/kadm5.c
80
79
  - ext/rkerberos/keytab_entry.c
81
- - ext/rkerberos/context.c
82
- - ext/rkerberos/keytab.c
80
+ - ext/rkerberos/config.c
81
+ - ext/rkerberos/rkerberos.c
83
82
  - ext/rkerberos/ccache.c
84
83
  - ext/rkerberos/policy.c
85
- - ext/rkerberos/config.c
86
- files:
87
- - Rakefile
88
- - README
89
- - rkerberos.gemspec
90
- - CHANGES
84
+ files:
85
+ - MANIFEST
86
+ - README.md
87
+ - test/test_config.rb
88
+ - test/test_krb5_keytab.rb
89
+ - test/test_keytab_entry.rb
90
+ - test/test_context.rb
91
91
  - test/test_principal.rb
92
92
  - test/test_credentials_cache.rb
93
- - test/test_config.rb
94
93
  - test/test_krb5.rb
95
- - test/test_context.rb
96
- - test/test_krb5_keytab.rb
97
94
  - test/test_kadm5.rb
98
- - test/test_keytab_entry.rb
99
95
  - test/test_policy.rb
100
- - MANIFEST
96
+ - Rakefile
97
+ - lib/rkerberos.so
101
98
  - ext/rkerberos/extconf.rb
99
+ - ext/rkerberos/rkerberos.h
100
+ - ext/rkerberos/context.c
101
+ - ext/rkerberos/keytab.c
102
102
  - ext/rkerberos/principal.c
103
- - ext/rkerberos/rkerberos.c
104
103
  - ext/rkerberos/kadm5.c
105
104
  - ext/rkerberos/keytab_entry.c
106
- - ext/rkerberos/context.c
107
- - ext/rkerberos/keytab.c
105
+ - ext/rkerberos/config.c
106
+ - ext/rkerberos/rkerberos.c
108
107
  - ext/rkerberos/ccache.c
109
108
  - ext/rkerberos/policy.c
110
- - ext/rkerberos/rkerberos.h
111
- - ext/rkerberos/config.c
112
- has_rdoc: true
113
- homepage: http://github.com/djberg96/rkerberos
114
- licenses:
109
+ - rkerberos.gemspec
110
+ - CHANGES
111
+ homepage: http://github.com/domcleal/rkerberos
112
+ licenses:
115
113
  - Artistic 2.0
116
114
  post_install_message:
117
115
  rdoc_options: []
118
-
119
- require_paths:
116
+ require_paths:
120
117
  - lib
121
- required_ruby_version: !ruby/object:Gem::Requirement
118
+ required_ruby_version: !ruby/object:Gem::Requirement
122
119
  none: false
123
- requirements:
124
- - - ">="
125
- - !ruby/object:Gem::Version
126
- hash: 3
127
- segments:
128
- - 0
129
- version: "0"
130
- required_rubygems_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ! '>='
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
131
125
  none: false
132
- requirements:
133
- - - ">="
134
- - !ruby/object:Gem::Version
135
- hash: 3
136
- segments:
137
- - 0
138
- version: "0"
126
+ requirements:
127
+ - - ! '>='
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
139
130
  requirements: []
140
-
141
- rubyforge_project: rkerberos
142
- rubygems_version: 1.6.2
131
+ rubyforge_project:
132
+ rubygems_version: 1.8.25
143
133
  signing_key:
144
134
  specification_version: 3
145
135
  summary: A Ruby interface for the the Kerberos library
146
- test_files:
136
+ test_files:
137
+ - test/test_config.rb
138
+ - test/test_krb5_keytab.rb
139
+ - test/test_keytab_entry.rb
140
+ - test/test_context.rb
147
141
  - test/test_principal.rb
148
142
  - test/test_credentials_cache.rb
149
- - test/test_config.rb
150
143
  - test/test_krb5.rb
151
- - test/test_context.rb
152
- - test/test_krb5_keytab.rb
153
144
  - test/test_kadm5.rb
154
- - test/test_keytab_entry.rb
155
145
  - test/test_policy.rb