rkerberos 0.1.3 → 0.1.4
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.
- checksums.yaml +4 -4
- data/CHANGES +6 -0
- data/README.md +8 -5
- data/Rakefile +2 -1
- data/ext/rkerberos/ccache.c +2 -2
- data/ext/rkerberos/config.c +0 -3
- data/ext/rkerberos/extconf.rb +7 -0
- data/ext/rkerberos/kadm5.c +131 -32
- data/ext/rkerberos/keytab.c +5 -5
- data/ext/rkerberos/keytab_entry.c +0 -4
- data/ext/rkerberos/policy.c +1 -4
- data/ext/rkerberos/principal.c +2 -8
- data/ext/rkerberos/rkerberos.c +16 -12
- data/ext/rkerberos/rkerberos.h +2 -1
- data/rkerberos.gemspec +7 -6
- data/test/test_credentials_cache.rb +2 -2
- data/test/test_kadm5.rb +71 -5
- data/test/test_krb5.rb +7 -7
- data/test/test_krb5_keytab.rb +16 -8
- metadata +38 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b3bb9284b0e33854b70e8b3bb81a363ef17d431d
|
4
|
+
data.tar.gz: 144e3ceffc05e362b6a1ca016ceae205771bca77
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1795e8628f251b6283e8290d7af9d9379682ee599d2f94521b3d90d7d34651fbea4d71f373acd9da87482ad8c40126e36d0799613be6a2f47aad2d07643a1c64
|
7
|
+
data.tar.gz: 6f876d9ec6e2fc8baade8be576a8247b5e6f8a5f0444af14c3618020d8fd51bffa377e5e1dff9d3de8a224e2f8b8a8ed9846a2551c4bd4faf4ce26f947a77adc
|
data/CHANGES
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
= 0.1.4 - 14-Oct-2016
|
2
|
+
* Implement db_args functionality in kadmin (fixes #8)
|
3
|
+
* Fix a double-free error when setting the realm for a principal
|
4
|
+
* Fix an error in policy creation that would sometimes cause a communication failure
|
5
|
+
* Set C99 as the C Standard and fix all compiler warnings at this level
|
6
|
+
|
1
7
|
= 0.1.3 - 07-Sep-2013
|
2
8
|
* Add optional 'service' argument to get_init_creds_password (fixes #3)
|
3
9
|
* Artistic License 2.0 text now included (fixes #2)
|
data/README.md
CHANGED
@@ -4,13 +4,15 @@
|
|
4
4
|
# Requirements
|
5
5
|
Kerberos 1.7.0 or later, including admin header and library files.
|
6
6
|
|
7
|
-
#
|
7
|
+
# OS X (10.11)
|
8
8
|
krb5 must be installed from source before installing the rkerberos gem:
|
9
9
|
```
|
10
|
-
|
11
|
-
|
12
|
-
tar -
|
13
|
-
cd krb5-1.
|
10
|
+
brew install openssl
|
11
|
+
curl -0 http://web.mit.edu/kerberos/dist/krb5/1.14/krb5-1.14.tar.gz
|
12
|
+
tar -xzf krb5-1.14.tar.gz
|
13
|
+
cd krb5-1.14/src
|
14
|
+
export CPPFLAGS='-I/usr/local/opt/openssl/include'
|
15
|
+
export LDFLAGS='-L/usr/local/opt/openssl/lib'
|
14
16
|
./configure
|
15
17
|
make
|
16
18
|
make install
|
@@ -60,6 +62,7 @@
|
|
60
62
|
# Authors
|
61
63
|
* Daniel Berger
|
62
64
|
* Dominic Cleal (maintainer)
|
65
|
+
* Simon Levermann (maintainer)
|
63
66
|
|
64
67
|
# License
|
65
68
|
rkerberos is distributed under the Artistic 2.0 license.
|
data/Rakefile
CHANGED
@@ -3,6 +3,7 @@ require 'rake/testtask'
|
|
3
3
|
require 'rake/extensiontask'
|
4
4
|
require 'rake/clean'
|
5
5
|
require 'rbconfig'
|
6
|
+
require 'rubygems/package'
|
6
7
|
|
7
8
|
Rake::ExtensionTask.new('rkerberos')
|
8
9
|
|
@@ -36,7 +37,7 @@ namespace :gem do
|
|
36
37
|
desc 'Create the gem'
|
37
38
|
task :create => [:clean] do
|
38
39
|
spec = eval(IO.read('rkerberos.gemspec'))
|
39
|
-
Gem::
|
40
|
+
Gem::Package.build(spec)
|
40
41
|
end
|
41
42
|
|
42
43
|
desc 'Install the gem'
|
data/ext/rkerberos/ccache.c
CHANGED
@@ -56,7 +56,7 @@ static VALUE rkrb5_ccache_initialize(int argc, VALUE* argv, VALUE self){
|
|
56
56
|
|
57
57
|
kerror = krb5_parse_name(
|
58
58
|
ptr->ctx,
|
59
|
-
|
59
|
+
StringValueCStr(v_principal),
|
60
60
|
&ptr->principal
|
61
61
|
);
|
62
62
|
|
@@ -79,7 +79,7 @@ static VALUE rkrb5_ccache_initialize(int argc, VALUE* argv, VALUE self){
|
|
79
79
|
}
|
80
80
|
else{
|
81
81
|
Check_Type(v_name, T_STRING);
|
82
|
-
kerror = krb5_cc_resolve(ptr->ctx,
|
82
|
+
kerror = krb5_cc_resolve(ptr->ctx, StringValueCStr(v_name), &ptr->ccache);
|
83
83
|
|
84
84
|
if(kerror)
|
85
85
|
rb_raise(cKrb5Exception, "krb5_cc_resolve: %s", error_message(kerror));
|
data/ext/rkerberos/config.c
CHANGED
@@ -163,11 +163,8 @@ static VALUE rkadm5_config_initialize(VALUE self){
|
|
163
163
|
}
|
164
164
|
|
165
165
|
static VALUE rkadm5_config_inspect(VALUE self){
|
166
|
-
RUBY_KADM5_CONFIG* ptr;
|
167
166
|
VALUE v_str;
|
168
167
|
|
169
|
-
Data_Get_Struct(self, RUBY_KADM5_CONFIG, ptr);
|
170
|
-
|
171
168
|
v_str = rb_str_new2("#<");
|
172
169
|
rb_str_buf_cat2(v_str, rb_obj_classname(self));
|
173
170
|
rb_str_buf_cat2(v_str, " ");
|
data/ext/rkerberos/extconf.rb
CHANGED
data/ext/rkerberos/kadm5.c
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
#include <rkerberos.h>
|
2
|
+
#include <kdb.h>
|
2
3
|
|
3
4
|
VALUE cKadm5;
|
4
5
|
VALUE cKadm5Exception;
|
@@ -6,6 +7,10 @@ VALUE cKadm5PrincipalNotFoundException;
|
|
6
7
|
|
7
8
|
// Prototype
|
8
9
|
static VALUE rkadm5_close(VALUE);
|
10
|
+
char** parse_db_args(VALUE v_db_args);
|
11
|
+
void add_db_args(kadm5_principal_ent_rec*, char**);
|
12
|
+
void add_tl_data(krb5_int16 *, krb5_tl_data **,
|
13
|
+
krb5_int16, krb5_ui_2, krb5_octet *);
|
9
14
|
|
10
15
|
// Free function for the Kerberos::Kadm5 class.
|
11
16
|
static void rkadm5_free(RUBY_KADM5* ptr){
|
@@ -18,6 +23,7 @@ static void rkadm5_free(RUBY_KADM5* ptr){
|
|
18
23
|
if(ptr->ctx)
|
19
24
|
krb5_free_context(ptr->ctx);
|
20
25
|
|
26
|
+
free(ptr->db_args);
|
21
27
|
free(ptr);
|
22
28
|
}
|
23
29
|
|
@@ -44,10 +50,15 @@ static VALUE rkadm5_allocate(VALUE klass){
|
|
44
50
|
*
|
45
51
|
* You may also pass the :service option to specify the service name. The
|
46
52
|
* default is kadmin/admin.
|
53
|
+
*
|
54
|
+
* There is also a :db_args option, which is a single string or array of strings
|
55
|
+
* containing options usually passed to kadmin with the -x switch. For a list of
|
56
|
+
* available options, see the kadmin manpage
|
57
|
+
*
|
47
58
|
*/
|
48
59
|
static VALUE rkadm5_initialize(VALUE self, VALUE v_opts){
|
49
60
|
RUBY_KADM5* ptr;
|
50
|
-
VALUE v_principal, v_password, v_keytab, v_service;
|
61
|
+
VALUE v_principal, v_password, v_keytab, v_service, v_db_args;
|
51
62
|
char* user;
|
52
63
|
char* pass = NULL;
|
53
64
|
char* keytab = NULL;
|
@@ -64,7 +75,7 @@ static VALUE rkadm5_initialize(VALUE self, VALUE v_opts){
|
|
64
75
|
rb_raise(rb_eArgError, "principal must be specified");
|
65
76
|
|
66
77
|
Check_Type(v_principal, T_STRING);
|
67
|
-
user =
|
78
|
+
user = StringValueCStr(v_principal);
|
68
79
|
|
69
80
|
v_password = rb_hash_aref2(v_opts, "password");
|
70
81
|
v_keytab = rb_hash_aref2(v_opts, "keytab");
|
@@ -74,19 +85,22 @@ static VALUE rkadm5_initialize(VALUE self, VALUE v_opts){
|
|
74
85
|
|
75
86
|
if(RTEST(v_password)){
|
76
87
|
Check_Type(v_password, T_STRING);
|
77
|
-
pass =
|
88
|
+
pass = StringValueCStr(v_password);
|
78
89
|
}
|
79
90
|
|
80
91
|
v_service = rb_hash_aref2(v_opts, "service");
|
81
92
|
|
82
93
|
if(NIL_P(v_service)){
|
83
|
-
service = "kadmin/admin";
|
94
|
+
service = (char *) "kadmin/admin";
|
84
95
|
}
|
85
96
|
else{
|
86
97
|
Check_Type(v_service, T_STRING);
|
87
|
-
service =
|
98
|
+
service = StringValueCStr(v_service);
|
88
99
|
}
|
89
100
|
|
101
|
+
v_db_args = rb_hash_aref2(v_opts, "db_args");
|
102
|
+
ptr->db_args = parse_db_args(v_db_args);
|
103
|
+
|
90
104
|
// Normally I would wait to initialize the context, but we might need it
|
91
105
|
// to get the default keytab file name.
|
92
106
|
kerror = krb5_init_context(&ptr->ctx);
|
@@ -108,7 +122,7 @@ static VALUE rkadm5_initialize(VALUE self, VALUE v_opts){
|
|
108
122
|
}
|
109
123
|
else{
|
110
124
|
Check_Type(v_keytab, T_STRING);
|
111
|
-
keytab =
|
125
|
+
keytab = StringValueCStr(v_keytab);
|
112
126
|
}
|
113
127
|
}
|
114
128
|
|
@@ -122,7 +136,7 @@ static VALUE rkadm5_initialize(VALUE self, VALUE v_opts){
|
|
122
136
|
NULL,
|
123
137
|
KADM5_STRUCT_VERSION,
|
124
138
|
KADM5_API_VERSION_3,
|
125
|
-
|
139
|
+
ptr->db_args,
|
126
140
|
&ptr->handle
|
127
141
|
);
|
128
142
|
#else
|
@@ -133,7 +147,7 @@ static VALUE rkadm5_initialize(VALUE self, VALUE v_opts){
|
|
133
147
|
NULL,
|
134
148
|
KADM5_STRUCT_VERSION,
|
135
149
|
KADM5_API_VERSION_2,
|
136
|
-
|
150
|
+
ptr->db_args,
|
137
151
|
&ptr->handle
|
138
152
|
);
|
139
153
|
#endif
|
@@ -151,7 +165,7 @@ static VALUE rkadm5_initialize(VALUE self, VALUE v_opts){
|
|
151
165
|
NULL,
|
152
166
|
KADM5_STRUCT_VERSION,
|
153
167
|
KADM5_API_VERSION_3,
|
154
|
-
|
168
|
+
ptr->db_args,
|
155
169
|
&ptr->handle
|
156
170
|
);
|
157
171
|
#else
|
@@ -162,7 +176,7 @@ static VALUE rkadm5_initialize(VALUE self, VALUE v_opts){
|
|
162
176
|
NULL,
|
163
177
|
KADM5_STRUCT_VERSION,
|
164
178
|
KADM5_API_VERSION_2,
|
165
|
-
|
179
|
+
ptr->db_args,
|
166
180
|
&ptr->handle
|
167
181
|
);
|
168
182
|
#endif
|
@@ -188,15 +202,17 @@ static VALUE rkadm5_initialize(VALUE self, VALUE v_opts){
|
|
188
202
|
* Set the password for +user+ (i.e. the principal) to +password+.
|
189
203
|
*/
|
190
204
|
static VALUE rkadm5_set_password(VALUE self, VALUE v_user, VALUE v_pass){
|
191
|
-
Check_Type(v_user, T_STRING);
|
192
|
-
Check_Type(v_pass, T_STRING);
|
193
|
-
|
194
205
|
RUBY_KADM5* ptr;
|
195
|
-
char* user = StringValuePtr(v_user);
|
196
|
-
char* pass = StringValuePtr(v_pass);
|
197
206
|
krb5_error_code kerror;
|
207
|
+
char *user;
|
208
|
+
char *pass;
|
209
|
+
|
210
|
+
Check_Type(v_user, T_STRING);
|
211
|
+
Check_Type(v_pass, T_STRING);
|
198
212
|
|
199
213
|
Data_Get_Struct(self, RUBY_KADM5, ptr);
|
214
|
+
user = StringValueCStr(v_user);
|
215
|
+
pass = StringValueCStr(v_pass);
|
200
216
|
|
201
217
|
if(!ptr->ctx)
|
202
218
|
rb_raise(cKadm5Exception, "no context has been established");
|
@@ -216,31 +232,41 @@ static VALUE rkadm5_set_password(VALUE self, VALUE v_user, VALUE v_pass){
|
|
216
232
|
|
217
233
|
/*
|
218
234
|
* call-seq:
|
219
|
-
* kadm5.create_principal(name, password)
|
235
|
+
* kadm5.create_principal(name, password, db_args=nil)
|
220
236
|
* kadm5.create_principal(principal)
|
221
237
|
*
|
222
238
|
* Creates a new principal +name+ with an initial password of +password+.
|
239
|
+
* +db_args+ is an optional string or array of strings containing options that are usually
|
240
|
+
* passed to add_principal with the -x option. For a list of options, see the kadmin manpage,
|
241
|
+
* in the add_principal section.
|
223
242
|
*--
|
224
243
|
* TODO: Allow a Principal object to be passed in as an argument.
|
225
244
|
*/
|
226
|
-
static VALUE rkadm5_create_principal(
|
245
|
+
static VALUE rkadm5_create_principal(int argc, VALUE* argv, VALUE self){
|
227
246
|
RUBY_KADM5* ptr;
|
228
247
|
char* user;
|
229
248
|
char* pass;
|
249
|
+
char** db_args;
|
230
250
|
int mask;
|
231
251
|
kadm5_principal_ent_rec princ;
|
232
252
|
krb5_error_code kerror;
|
253
|
+
VALUE v_user, v_pass, v_db_args;
|
233
254
|
|
234
255
|
Data_Get_Struct(self, RUBY_KADM5, ptr);
|
235
256
|
|
257
|
+
rb_scan_args(argc, argv, "21", &v_user, &v_pass, &v_db_args);
|
236
258
|
Check_Type(v_user, T_STRING);
|
237
259
|
Check_Type(v_pass, T_STRING);
|
238
260
|
|
239
261
|
memset(&princ, 0, sizeof(princ));
|
240
262
|
|
241
|
-
mask = KADM5_PRINCIPAL;
|
242
|
-
user =
|
243
|
-
pass =
|
263
|
+
mask = KADM5_PRINCIPAL | KADM5_TL_DATA;
|
264
|
+
user = StringValueCStr(v_user);
|
265
|
+
pass = StringValueCStr(v_pass);
|
266
|
+
|
267
|
+
db_args = parse_db_args(v_db_args);
|
268
|
+
add_db_args(&princ, db_args);
|
269
|
+
free(db_args);
|
244
270
|
|
245
271
|
if(!ptr->ctx)
|
246
272
|
rb_raise(cKadm5Exception, "no context has been established");
|
@@ -272,7 +298,7 @@ static VALUE rkadm5_delete_principal(VALUE self, VALUE v_user){
|
|
272
298
|
|
273
299
|
Data_Get_Struct(self, RUBY_KADM5, ptr);
|
274
300
|
Check_Type(v_user, T_STRING);
|
275
|
-
user =
|
301
|
+
user = StringValueCStr(v_user);
|
276
302
|
|
277
303
|
if(!ptr->ctx)
|
278
304
|
rb_raise(cKadm5Exception, "no context has been established");
|
@@ -313,6 +339,9 @@ static VALUE rkadm5_close(VALUE self){
|
|
313
339
|
if(ptr->handle)
|
314
340
|
kadm5_destroy(ptr->handle);
|
315
341
|
|
342
|
+
free(ptr->db_args);
|
343
|
+
|
344
|
+
ptr->db_args = NULL;
|
316
345
|
ptr->ctx = NULL;
|
317
346
|
ptr->princ = NULL;
|
318
347
|
ptr->handle = NULL;
|
@@ -394,7 +423,7 @@ static VALUE rkadm5_find_principal(VALUE self, VALUE v_user){
|
|
394
423
|
|
395
424
|
Data_Get_Struct(self, RUBY_KADM5, ptr);
|
396
425
|
Check_Type(v_user, T_STRING);
|
397
|
-
user =
|
426
|
+
user = StringValueCStr(v_user);
|
398
427
|
|
399
428
|
memset(&ent, 0, sizeof(ent));
|
400
429
|
|
@@ -450,7 +479,7 @@ static VALUE rkadm5_get_principal(VALUE self, VALUE v_user){
|
|
450
479
|
|
451
480
|
Data_Get_Struct(self, RUBY_KADM5, ptr);
|
452
481
|
Check_Type(v_user, T_STRING);
|
453
|
-
user =
|
482
|
+
user = StringValueCStr(v_user);
|
454
483
|
|
455
484
|
memset(&ent, 0, sizeof(ent));
|
456
485
|
|
@@ -521,7 +550,8 @@ static VALUE rkadm5_create_policy(VALUE self, VALUE v_policy){
|
|
521
550
|
v_max_life = rb_iv_get(v_policy, "@max_life");
|
522
551
|
v_history_num = rb_iv_get(v_policy, "@history_num");
|
523
552
|
|
524
|
-
ent
|
553
|
+
memset(&ent, 0, sizeof(ent));
|
554
|
+
ent.policy = StringValueCStr(v_name);
|
525
555
|
|
526
556
|
if(RTEST(v_min_classes)){
|
527
557
|
mask |= KADM5_PW_MIN_CLASSES;
|
@@ -573,7 +603,7 @@ static VALUE rkadm5_delete_policy(VALUE self, VALUE v_policy){
|
|
573
603
|
|
574
604
|
Data_Get_Struct(self, RUBY_KADM5, ptr);
|
575
605
|
|
576
|
-
policy =
|
606
|
+
policy = StringValueCStr(v_policy);
|
577
607
|
|
578
608
|
kerror = kadm5_delete_policy(ptr->handle, policy);
|
579
609
|
|
@@ -606,7 +636,7 @@ static VALUE rkadm5_get_policy(VALUE self, VALUE v_name){
|
|
606
636
|
if(!ptr->ctx)
|
607
637
|
rb_raise(cKadm5Exception, "no context has been established");
|
608
638
|
|
609
|
-
policy_name =
|
639
|
+
policy_name = StringValueCStr(v_name);
|
610
640
|
|
611
641
|
kerror = kadm5_get_policy(ptr->handle, policy_name, &ent);
|
612
642
|
|
@@ -658,7 +688,7 @@ static VALUE rkadm5_find_policy(VALUE self, VALUE v_name){
|
|
658
688
|
if(!ptr->ctx)
|
659
689
|
rb_raise(cKadm5Exception, "no context has been established");
|
660
690
|
|
661
|
-
policy_name =
|
691
|
+
policy_name = StringValueCStr(v_name);
|
662
692
|
|
663
693
|
kerror = kadm5_get_policy(ptr->handle, policy_name, &ent);
|
664
694
|
|
@@ -762,7 +792,7 @@ static VALUE rkadm5_get_policies(int argc, VALUE* argv, VALUE self){
|
|
762
792
|
if(NIL_P(v_expr))
|
763
793
|
expr = NULL;
|
764
794
|
else
|
765
|
-
expr =
|
795
|
+
expr = StringValueCStr(v_expr);
|
766
796
|
|
767
797
|
kerror = kadm5_get_policies(ptr->handle, expr, &pols, &count);
|
768
798
|
|
@@ -810,7 +840,7 @@ static VALUE rkadm5_get_principals(int argc, VALUE* argv, VALUE self){
|
|
810
840
|
if(NIL_P(v_expr))
|
811
841
|
expr = NULL;
|
812
842
|
else
|
813
|
-
expr =
|
843
|
+
expr = StringValueCStr(v_expr);
|
814
844
|
|
815
845
|
kerror = kadm5_get_principals(ptr->handle, expr, &princs, &count);
|
816
846
|
|
@@ -848,7 +878,7 @@ static VALUE rkadm5_get_privs(int argc, VALUE* argv, VALUE self){
|
|
848
878
|
VALUE v_return = Qnil;
|
849
879
|
VALUE v_strings = Qfalse;
|
850
880
|
kadm5_ret_t kerror;
|
851
|
-
int i;
|
881
|
+
unsigned int i;
|
852
882
|
long privs;
|
853
883
|
int result = 0;
|
854
884
|
|
@@ -911,7 +941,7 @@ static VALUE rkadm5_randkey_principal(VALUE self, VALUE v_user){
|
|
911
941
|
|
912
942
|
Data_Get_Struct(self, RUBY_KADM5, ptr);
|
913
943
|
|
914
|
-
user =
|
944
|
+
user = StringValueCStr(v_user);
|
915
945
|
|
916
946
|
if(!ptr->ctx)
|
917
947
|
rb_raise(cKadm5Exception, "no context has been established");
|
@@ -934,6 +964,75 @@ static VALUE rkadm5_randkey_principal(VALUE self, VALUE v_user){
|
|
934
964
|
return INT2NUM(n_keys);
|
935
965
|
}
|
936
966
|
|
967
|
+
/**
|
968
|
+
* Parses an array or a single string containing database arguments for kerberos functions.
|
969
|
+
* Returns NULL if v_db_args is nil, otherwise returns a NULL-Terminated array of NULL-Terminated strings
|
970
|
+
*/
|
971
|
+
char** parse_db_args(VALUE v_db_args){
|
972
|
+
long array_length;
|
973
|
+
char** db_args;
|
974
|
+
switch(TYPE(v_db_args)){
|
975
|
+
case T_STRING:
|
976
|
+
db_args = (char **) malloc(2 * sizeof(char *));
|
977
|
+
db_args[0] = StringValueCStr(v_db_args);
|
978
|
+
db_args[1] = NULL;
|
979
|
+
break;
|
980
|
+
case T_ARRAY:
|
981
|
+
// Multiple arguments
|
982
|
+
array_length = RARRAY_LEN(v_db_args);
|
983
|
+
db_args = (char **) malloc(array_length * sizeof(char *) + 1);
|
984
|
+
for(long i = 0; i < array_length; ++i){
|
985
|
+
VALUE elem = rb_ary_entry(v_db_args, i);
|
986
|
+
Check_Type(elem, T_STRING);
|
987
|
+
db_args[i] = StringValueCStr(elem);
|
988
|
+
}
|
989
|
+
db_args[array_length] = NULL;
|
990
|
+
break;
|
991
|
+
case T_NIL:
|
992
|
+
db_args = NULL;
|
993
|
+
break;
|
994
|
+
default:
|
995
|
+
rb_raise(rb_eTypeError, "Need Single String or Array of Strings for db_args");
|
996
|
+
}
|
997
|
+
return db_args;
|
998
|
+
}
|
999
|
+
|
1000
|
+
/**
|
1001
|
+
* Add parsed db-args to principal entry
|
1002
|
+
*/
|
1003
|
+
void add_db_args(kadm5_principal_ent_rec* entry, char** db_args){
|
1004
|
+
if (db_args){
|
1005
|
+
int i;
|
1006
|
+
for(i = 0; db_args[i] != NULL; i++){
|
1007
|
+
add_tl_data(&entry->n_tl_data, &entry->tl_data, KRB5_TL_DB_ARGS, strlen(db_args[i]) + 1, (krb5_octet*)db_args[i]);
|
1008
|
+
}
|
1009
|
+
}
|
1010
|
+
}
|
1011
|
+
|
1012
|
+
/**
|
1013
|
+
* Source code taken from kadmin source code at https://github.com/krb5/krb5/blob/master/src/kadmin/cli/kadmin.c
|
1014
|
+
*/
|
1015
|
+
void add_tl_data(krb5_int16 *n_tl_datap, krb5_tl_data **tl_datap,
|
1016
|
+
krb5_int16 tl_type, krb5_ui_2 len, krb5_octet *contents){
|
1017
|
+
krb5_tl_data* tl_data;
|
1018
|
+
krb5_octet* copy;
|
1019
|
+
|
1020
|
+
copy = malloc(len);
|
1021
|
+
tl_data = calloc(1, sizeof(*tl_data));
|
1022
|
+
memcpy(copy, contents, len);
|
1023
|
+
|
1024
|
+
tl_data->tl_data_type = tl_type;
|
1025
|
+
tl_data->tl_data_length = len;
|
1026
|
+
tl_data->tl_data_contents = copy;
|
1027
|
+
tl_data->tl_data_next = NULL;
|
1028
|
+
|
1029
|
+
// Forward to end of tl_data
|
1030
|
+
for(; *tl_datap != NULL; tl_datap = &(*tl_datap)->tl_data_next);
|
1031
|
+
|
1032
|
+
*tl_datap = tl_data;
|
1033
|
+
(*n_tl_datap)++;
|
1034
|
+
}
|
1035
|
+
|
937
1036
|
void Init_kadm5(){
|
938
1037
|
/* The Kadm5 class encapsulates administrative Kerberos functions. */
|
939
1038
|
cKadm5 = rb_define_class_under(mKerberos, "Kadm5", rb_cObject);
|
@@ -958,7 +1057,7 @@ void Init_kadm5(){
|
|
958
1057
|
|
959
1058
|
rb_define_method(cKadm5, "close", rkadm5_close, 0);
|
960
1059
|
rb_define_method(cKadm5, "create_policy", rkadm5_create_policy, 1);
|
961
|
-
rb_define_method(cKadm5, "create_principal", rkadm5_create_principal,
|
1060
|
+
rb_define_method(cKadm5, "create_principal", rkadm5_create_principal, -1);
|
962
1061
|
rb_define_method(cKadm5, "delete_policy", rkadm5_delete_policy, 1);
|
963
1062
|
rb_define_method(cKadm5, "delete_principal", rkadm5_delete_principal, 1);
|
964
1063
|
rb_define_method(cKadm5, "find_principal", rkadm5_find_principal, 1);
|
data/ext/rkerberos/keytab.c
CHANGED
@@ -143,7 +143,7 @@ static VALUE rkrb5_keytab_remove_entry(int argc, VALUE* argv, VALUE self){
|
|
143
143
|
|
144
144
|
Check_Type(v_name, T_STRING);
|
145
145
|
|
146
|
-
name =
|
146
|
+
name = StringValueCStr(v_name);
|
147
147
|
|
148
148
|
if(!ptr->ctx)
|
149
149
|
rb_raise(cKrb5Exception, "no context has been established");
|
@@ -190,7 +190,7 @@ static VALUE rkrb5_keytab_add_entry(int argc, VALUE* argv, VALUE self){
|
|
190
190
|
|
191
191
|
Check_Type(v_name, T_STRING);
|
192
192
|
|
193
|
-
name =
|
193
|
+
name = StringValueCStr(v_name);
|
194
194
|
|
195
195
|
if(!ptr->ctx)
|
196
196
|
rb_raise(cKrb5Exception, "no context has been established");
|
@@ -252,7 +252,7 @@ static VALUE rkrb5_keytab_get_entry(int argc, VALUE* argv, VALUE self){
|
|
252
252
|
rb_scan_args(argc, argv, "12", &v_principal, &v_vno, &v_enctype);
|
253
253
|
|
254
254
|
Check_Type(v_principal, T_STRING);
|
255
|
-
name =
|
255
|
+
name = StringValueCStr(v_principal);
|
256
256
|
|
257
257
|
kerror = krb5_parse_name(ptr->ctx, name, &principal);
|
258
258
|
|
@@ -331,7 +331,7 @@ static VALUE rkrb5_keytab_initialize(int argc, VALUE* argv, VALUE self){
|
|
331
331
|
}
|
332
332
|
else{
|
333
333
|
Check_Type(v_keytab_name, T_STRING);
|
334
|
-
strncpy(keytab_name,
|
334
|
+
strncpy(keytab_name, StringValueCStr(v_keytab_name), MAX_KEYTAB_NAME_LEN);
|
335
335
|
rb_iv_set(self, "@name", v_keytab_name);
|
336
336
|
}
|
337
337
|
|
@@ -391,7 +391,7 @@ static VALUE rkrb5_s_keytab_foreach(int argc, VALUE* argv, VALUE klass){
|
|
391
391
|
}
|
392
392
|
else{
|
393
393
|
Check_Type(v_keytab_name, T_STRING);
|
394
|
-
strncpy(keytab_name,
|
394
|
+
strncpy(keytab_name, StringValueCStr(v_keytab_name), MAX_KEYTAB_NAME_LEN);
|
395
395
|
}
|
396
396
|
|
397
397
|
kerror = krb5_kt_resolve(
|
@@ -27,8 +27,6 @@ static VALUE rkrb5_kt_entry_allocate(VALUE klass){
|
|
27
27
|
* methods.
|
28
28
|
*/
|
29
29
|
static VALUE rkrb5_kt_entry_initialize(VALUE self){
|
30
|
-
RUBY_KRB5_KT_ENTRY* ptr;
|
31
|
-
Data_Get_Struct(self, RUBY_KRB5_KT_ENTRY, ptr);
|
32
30
|
return self;
|
33
31
|
}
|
34
32
|
|
@@ -36,8 +34,6 @@ static VALUE rkrb5_kt_entry_initialize(VALUE self){
|
|
36
34
|
* A custom inspect method for nicer output.
|
37
35
|
*/
|
38
36
|
static VALUE rkrb5_kt_entry_inspect(VALUE self){
|
39
|
-
RUBY_KRB5_KT_ENTRY* ptr;
|
40
|
-
Data_Get_Struct(self, RUBY_KRB5_KT_ENTRY, ptr);
|
41
37
|
VALUE v_str;
|
42
38
|
|
43
39
|
v_str = rb_str_new2("#<");
|
data/ext/rkerberos/policy.c
CHANGED
@@ -63,7 +63,7 @@ static VALUE rkadm5_policy_init(VALUE self, VALUE v_options){
|
|
63
63
|
rb_raise(rb_eArgError, "name policy option is mandatory");
|
64
64
|
}
|
65
65
|
else{
|
66
|
-
ptr->policy.policy =
|
66
|
+
ptr->policy.policy = StringValueCStr(v_name);
|
67
67
|
rb_iv_set(self, "@policy", v_name);
|
68
68
|
}
|
69
69
|
|
@@ -117,11 +117,8 @@ static VALUE rkadm5_policy_init(VALUE self, VALUE v_options){
|
|
117
117
|
* A custom inspect method for Policy objects.
|
118
118
|
*/
|
119
119
|
static VALUE rkadm5_policy_inspect(VALUE self){
|
120
|
-
RUBY_KADM5_POLICY* ptr;
|
121
120
|
VALUE v_str;
|
122
121
|
|
123
|
-
Data_Get_Struct(self, RUBY_KADM5_POLICY, ptr);
|
124
|
-
|
125
122
|
v_str = rb_str_new2("#<");
|
126
123
|
rb_str_buf_cat2(v_str, rb_obj_classname(self));
|
127
124
|
rb_str_buf_cat2(v_str, " ");
|
data/ext/rkerberos/principal.c
CHANGED
@@ -55,7 +55,7 @@ static VALUE rkrb5_princ_initialize(VALUE self, VALUE v_name){
|
|
55
55
|
else{
|
56
56
|
char* name;
|
57
57
|
Check_Type(v_name, T_STRING);
|
58
|
-
name =
|
58
|
+
name = StringValueCStr(v_name);
|
59
59
|
kerror = krb5_parse_name(ptr->ctx, name, &ptr->principal);
|
60
60
|
|
61
61
|
if(kerror)
|
@@ -106,15 +106,12 @@ static VALUE rkrb5_princ_get_realm(VALUE self){
|
|
106
106
|
*/
|
107
107
|
static VALUE rkrb5_princ_set_realm(VALUE self, VALUE v_realm){
|
108
108
|
RUBY_KRB5_PRINC* ptr;
|
109
|
-
krb5_data kdata;
|
110
109
|
|
111
|
-
memset(&kdata, 0, sizeof(kdata));
|
112
110
|
Data_Get_Struct(self, RUBY_KRB5_PRINC, ptr);
|
113
111
|
|
114
112
|
Check_Type(v_realm, T_STRING);
|
115
|
-
kdata.data = StringValuePtr(v_realm);
|
116
113
|
|
117
|
-
|
114
|
+
krb5_set_principal_realm(ptr->ctx, ptr->principal, StringValueCStr(v_realm));
|
118
115
|
|
119
116
|
return v_realm;
|
120
117
|
}
|
@@ -146,11 +143,8 @@ static VALUE rkrb5_princ_equal(VALUE self, VALUE v_other){
|
|
146
143
|
* A custom inspect method for the Principal object.
|
147
144
|
*/
|
148
145
|
static VALUE rkrb5_princ_inspect(VALUE self){
|
149
|
-
RUBY_KRB5_PRINC* ptr;
|
150
146
|
VALUE v_str;
|
151
147
|
|
152
|
-
Data_Get_Struct(self, RUBY_KRB5_PRINC, ptr);
|
153
|
-
|
154
148
|
v_str = rb_str_new2("#<");
|
155
149
|
rb_str_buf_cat2(v_str, rb_obj_classname(self));
|
156
150
|
rb_str_buf_cat2(v_str, " ");
|
data/ext/rkerberos/rkerberos.c
CHANGED
@@ -7,7 +7,7 @@ VALUE cKrb5Exception;
|
|
7
7
|
// Function prototypes
|
8
8
|
static VALUE rkrb5_close(VALUE);
|
9
9
|
|
10
|
-
VALUE rb_hash_aref2(VALUE v_hash, char* key){
|
10
|
+
VALUE rb_hash_aref2(VALUE v_hash, const char* key){
|
11
11
|
VALUE v_key, v_val;
|
12
12
|
|
13
13
|
v_key = rb_str_new2(key);
|
@@ -115,7 +115,7 @@ static VALUE rkrb5_set_default_realm(int argc, VALUE* argv, VALUE self){
|
|
115
115
|
}
|
116
116
|
else{
|
117
117
|
Check_Type(v_realm, T_STRING);
|
118
|
-
realm =
|
118
|
+
realm = StringValueCStr(v_realm);
|
119
119
|
}
|
120
120
|
|
121
121
|
kerror = krb5_set_default_realm(ptr->ctx, realm);
|
@@ -167,7 +167,7 @@ static VALUE rkrb5_get_init_creds_keytab(int argc, VALUE* argv, VALUE self){
|
|
167
167
|
}
|
168
168
|
else{
|
169
169
|
Check_Type(v_service, T_STRING);
|
170
|
-
service =
|
170
|
+
service = StringValueCStr(v_service);
|
171
171
|
}
|
172
172
|
|
173
173
|
// Convert the name (or service name) to a kerberos principal.
|
@@ -187,7 +187,7 @@ static VALUE rkrb5_get_init_creds_keytab(int argc, VALUE* argv, VALUE self){
|
|
187
187
|
}
|
188
188
|
else{
|
189
189
|
Check_Type(v_user, T_STRING);
|
190
|
-
user =
|
190
|
+
user = StringValueCStr(v_user);
|
191
191
|
|
192
192
|
kerror = krb5_parse_name(ptr->ctx, user, &ptr->princ);
|
193
193
|
|
@@ -208,7 +208,7 @@ static VALUE rkrb5_get_init_creds_keytab(int argc, VALUE* argv, VALUE self){
|
|
208
208
|
}
|
209
209
|
else{
|
210
210
|
Check_Type(v_keytab_name, T_STRING);
|
211
|
-
strncpy(keytab_name,
|
211
|
+
strncpy(keytab_name, StringValueCStr(v_keytab_name), MAX_KEYTAB_NAME_LEN);
|
212
212
|
}
|
213
213
|
|
214
214
|
kerror = krb5_kt_resolve(
|
@@ -270,17 +270,21 @@ static VALUE rkrb5_get_init_creds_keytab(int argc, VALUE* argv, VALUE self){
|
|
270
270
|
* krb5.change_password('XXXXXX', 'YYYYYY') # Change password for 'foo'
|
271
271
|
*/
|
272
272
|
static VALUE rkrb5_change_password(VALUE self, VALUE v_old, VALUE v_new){
|
273
|
-
Check_Type(v_old, T_STRING);
|
274
|
-
Check_Type(v_new, T_STRING);
|
275
273
|
|
276
274
|
RUBY_KRB5* ptr;
|
277
275
|
krb5_data result_string;
|
278
276
|
krb5_data pw_result_string;
|
279
277
|
krb5_error_code kerror;
|
278
|
+
char *old_passwd;
|
279
|
+
char *new_passwd;
|
280
280
|
|
281
281
|
int pw_result;
|
282
|
-
|
283
|
-
|
282
|
+
|
283
|
+
Check_Type(v_old, T_STRING);
|
284
|
+
Check_Type(v_new, T_STRING);
|
285
|
+
|
286
|
+
old_passwd = StringValueCStr(v_old);
|
287
|
+
new_passwd = StringValueCStr(v_new);
|
284
288
|
|
285
289
|
Data_Get_Struct(self, RUBY_KRB5, ptr);
|
286
290
|
|
@@ -345,15 +349,15 @@ static VALUE rkrb5_get_init_creds_passwd(int argc, VALUE* argv, VALUE self){
|
|
345
349
|
|
346
350
|
Check_Type(v_user, T_STRING);
|
347
351
|
Check_Type(v_pass, T_STRING);
|
348
|
-
user =
|
349
|
-
pass =
|
352
|
+
user = StringValueCStr(v_user);
|
353
|
+
pass = StringValueCStr(v_pass);
|
350
354
|
|
351
355
|
if(NIL_P(v_service)){
|
352
356
|
service = NULL;
|
353
357
|
}
|
354
358
|
else{
|
355
359
|
Check_Type(v_service, T_STRING);
|
356
|
-
service =
|
360
|
+
service = StringValueCStr(v_service);
|
357
361
|
}
|
358
362
|
|
359
363
|
kerror = krb5_parse_name(ptr->ctx, user, &ptr->princ);
|
data/ext/rkerberos/rkerberos.h
CHANGED
@@ -20,7 +20,7 @@ void Init_keytab_entry();
|
|
20
20
|
void Init_ccache();
|
21
21
|
|
22
22
|
// Defined in rkerberos.c
|
23
|
-
VALUE rb_hash_aref2(VALUE, char*);
|
23
|
+
VALUE rb_hash_aref2(VALUE, const char*);
|
24
24
|
|
25
25
|
// Variable declarations
|
26
26
|
extern VALUE mKerberos;
|
@@ -55,6 +55,7 @@ typedef struct {
|
|
55
55
|
krb5_context ctx;
|
56
56
|
krb5_principal princ;
|
57
57
|
void* handle;
|
58
|
+
char** db_args;
|
58
59
|
} RUBY_KADM5;
|
59
60
|
|
60
61
|
// Kerberos::Krb5::Keytab::Entry
|
data/rkerberos.gemspec
CHANGED
@@ -2,23 +2,24 @@ require 'rubygems'
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |spec|
|
4
4
|
spec.name = 'rkerberos'
|
5
|
-
spec.version = '0.1.
|
6
|
-
spec.authors = ['Daniel Berger', 'Dominic Cleal']
|
5
|
+
spec.version = '0.1.4'
|
6
|
+
spec.authors = ['Daniel Berger', 'Dominic Cleal', 'Simon Levermann']
|
7
7
|
spec.license = 'Artistic 2.0'
|
8
|
-
spec.email = ['djberg96@gmail.com', 'dcleal@redhat.com']
|
8
|
+
spec.email = ['djberg96@gmail.com', 'dcleal@redhat.com', 'simon-rubygems@slevermann.de']
|
9
9
|
spec.homepage = 'http://github.com/domcleal/rkerberos'
|
10
10
|
spec.summary = 'A Ruby interface for the the Kerberos library'
|
11
11
|
spec.test_files = Dir['test/test*']
|
12
12
|
spec.extensions = ['ext/rkerberos/extconf.rb']
|
13
13
|
spec.files = `git ls-files`.split("\n").reject { |f| f.include?('git') }
|
14
|
-
|
14
|
+
|
15
15
|
spec.extra_rdoc_files = ['README.md', 'CHANGES', 'MANIFEST', 'LICENSE'] + Dir['ext/rkerberos/*.c']
|
16
16
|
|
17
17
|
spec.add_dependency('rake-compiler')
|
18
|
-
|
18
|
+
|
19
19
|
spec.add_development_dependency('test-unit', '>= 2.1.0')
|
20
20
|
spec.add_development_dependency('dbi-dbrc', '>= 1.1.6')
|
21
|
-
|
21
|
+
spec.add_development_dependency('net-ldap')
|
22
|
+
|
22
23
|
spec.description = <<-EOF
|
23
24
|
The rkerberos library is an interface for the Kerberos 5 network
|
24
25
|
authentication protocol. It wraps the Kerberos C API.
|
@@ -39,13 +39,13 @@ class TC_Krb5_Credentials_Cache < Test::Unit::TestCase
|
|
39
39
|
|
40
40
|
test "calling constructor with no arguments does not create a cache" do
|
41
41
|
assert_nothing_raised{ @ccache = Kerberos::Krb5::CredentialsCache.new }
|
42
|
-
assert_false(File.
|
42
|
+
assert_false(File.exist?(@cfile))
|
43
43
|
assert_false(cache_found)
|
44
44
|
end
|
45
45
|
|
46
46
|
test "calling constructor with a principal argument creates a credentials cache" do
|
47
47
|
assert_nothing_raised{ @ccache = Kerberos::Krb5::CredentialsCache.new(@princ) }
|
48
|
-
assert_true(File.
|
48
|
+
assert_true(File.exist?(@cfile))
|
49
49
|
assert_true(cache_found)
|
50
50
|
end
|
51
51
|
|
data/test/test_kadm5.rb
CHANGED
@@ -23,6 +23,11 @@ class TC_Kerberos_Kadm5 < Test::Unit::TestCase
|
|
23
23
|
@@server = Kerberos::Kadm5::Config.new.admin_server
|
24
24
|
@@info = DBI::DBRC.new('local-kerberos')
|
25
25
|
@@host = Socket.gethostname
|
26
|
+
begin
|
27
|
+
@@ldap_info = DBI::DBRC.new('kerberos-ldap')
|
28
|
+
rescue DBI::DBRC::Error
|
29
|
+
@@ldap_info = nil
|
30
|
+
end
|
26
31
|
|
27
32
|
# For local testing the FQDN may or may not be available, so let's assume
|
28
33
|
# that hosts with the same name are on the same domain.
|
@@ -42,9 +47,26 @@ class TC_Kerberos_Kadm5 < Test::Unit::TestCase
|
|
42
47
|
@test_princ = "zztop"
|
43
48
|
@test_policy = "test_policy"
|
44
49
|
|
50
|
+
if @@ldap_info
|
51
|
+
gem 'net-ldap'
|
52
|
+
require 'net/ldap'
|
53
|
+
|
54
|
+
username = @@ldap_info.user.split('@')
|
55
|
+
@bind_dn = username[0]
|
56
|
+
@ldap_host = username[1]
|
57
|
+
@ldap_password = @@ldap_info.password
|
58
|
+
driver = @@ldap_info.driver.split(':')
|
59
|
+
@subtree_dn = driver[0]
|
60
|
+
@existing_ldap = driver[1]
|
61
|
+
@userprefix = driver[2]
|
62
|
+
@ldap_test_princ = 'martymcfly'
|
63
|
+
|
64
|
+
@ldap = Net::LDAP.new(host: @ldap_host)
|
65
|
+
@ldap.authenticate(@bind_dn, @ldap_password)
|
66
|
+
end
|
45
67
|
@keytab = Kerberos::Krb5::Keytab.new.default_name.split(':').last
|
46
68
|
|
47
|
-
unless File.
|
69
|
+
unless File.exist?(@keytab)
|
48
70
|
@keytab = '/etc/krb5.keytab'
|
49
71
|
end
|
50
72
|
end
|
@@ -71,7 +93,7 @@ class TC_Kerberos_Kadm5 < Test::Unit::TestCase
|
|
71
93
|
|
72
94
|
test "constructor with valid user and default keytab works as expected" do
|
73
95
|
omit_unless(@@host == @@server, "keytab on different host, skipping")
|
74
|
-
omit_unless(File.
|
96
|
+
omit_unless(File.exist?(@keytab), "default keytab file '#{@keytab}' not found")
|
75
97
|
|
76
98
|
assert_nothing_raised{
|
77
99
|
@kadm = Kerberos::Kadm5.new(:principal => @user, :keytab => true)
|
@@ -80,7 +102,7 @@ class TC_Kerberos_Kadm5 < Test::Unit::TestCase
|
|
80
102
|
|
81
103
|
test "constructor with valid user and explicit keytab works as expected" do
|
82
104
|
omit_unless(@@host == @@server, "keytab on different host, skipping")
|
83
|
-
omit_unless(File.
|
105
|
+
omit_unless(File.exist?(@keytab), "keytab file '#{@keytab}' not found")
|
84
106
|
|
85
107
|
assert_nothing_raised{
|
86
108
|
@kadm = Kerberos::Kadm5.new(:principal => @user, :keytab => @keytab)
|
@@ -247,11 +269,51 @@ class TC_Kerberos_Kadm5 < Test::Unit::TestCase
|
|
247
269
|
assert_nothing_raised{ @kadm.create_principal(@test_princ, "changeme") }
|
248
270
|
end
|
249
271
|
|
250
|
-
|
272
|
+
##
|
273
|
+
# The following two tests are skipped if there is no .dbrc entry for 'kerberos-ldap'
|
274
|
+
# The expected format for the entries is as follows
|
275
|
+
# username: <bind_dn>@<ldap.hostname>
|
276
|
+
# password: <ldap_bind_password>
|
277
|
+
# driver: <krbSubtreeDn>:<user>:<userprefix>
|
278
|
+
# Username must be an LDAP user that has access to read attributes of objects under krbSubtreeDn,
|
279
|
+
# so possibly an administrative user.
|
280
|
+
# Password must be the LDAP bind password for that user
|
281
|
+
# krbSubtreeDn must be configured in kerberos as a subtree that contains kerberos principals
|
282
|
+
# user must be an existing ldap user that does not yet have kerberos information attached to them
|
283
|
+
# user must be accessible in LDAP as <userprefix>=<user>,<krbSubtreeDn>, so if userprefix is uid,
|
284
|
+
# user is foobar, and krbSubtreeDn is ou=People,dc=example,dc=com, the driver variable should read
|
285
|
+
# ou=People,dc=example.com:foobar:uid
|
286
|
+
# The user in the driver must not be the same as the user that is used to connect to kerberos, as it
|
287
|
+
# is deleted after each test.
|
288
|
+
# If the entry is present, but the format is not matched (or LDAP is misconfigured), theses tests fail.
|
289
|
+
##
|
290
|
+
test "create_principal with db_princ_args creates a user under the expected subtree" do
|
291
|
+
omit_unless(@@ldap_info, "No LDAP info specified, skipping db_args tests")
|
292
|
+
assert_nothing_raised { @kadm = Kerberos::Kadm5.new(:principal => @user, :password => @pass) }
|
293
|
+
assert_nothing_raised { @kadm.create_principal(@ldap_test_princ, "changeme", "containerdn=#{@subtree_dn}") }
|
294
|
+
@ldap.open do |ldap|
|
295
|
+
filter = Net::LDAP::Filter.eq(:krbPrincipalName, "#{@ldap_test_princ}@*")
|
296
|
+
base = @subtree_dn
|
297
|
+
assert_not_empty(ldap.search(:base => base, :filter => filter, :return_result => true))
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
test "create_principal with a dn db_princ_args correctly adds kerberos information to existing user" do
|
302
|
+
omit_unless(@@ldap_info, "No LDAP info specified, skipping db_princ_args tests")
|
303
|
+
assert_nothing_raised { @kadm = Kerberos::Kadm5.new(:principal => @user, :password => @pass) }
|
304
|
+
assert_nothing_raised { @kadm.create_principal(@existing_ldap, "changeme", "dn=#{@userprefix}=#{@existing_ldap},#{@subtree_dn}") }
|
305
|
+
@ldap.open do |ldap|
|
306
|
+
filter = Net::LDAP::Filter.eq(:uid, @existing_ldap) & Net::LDAP::Filter.eq(:objectclass, 'krbPrincipalAux')
|
307
|
+
base = @subtree_dn
|
308
|
+
assert_not_empty(ldap.search(:base => base, :filter => filter, :return_result => true))
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
312
|
+
test "create_principal requires two or three arguments" do
|
251
313
|
assert_nothing_raised{ @kadm = Kerberos::Kadm5.new(:principal => @user, :password => @pass) }
|
252
314
|
assert_raise(ArgumentError){ @kadm.create_principal }
|
253
315
|
assert_raise(ArgumentError){ @kadm.create_principal(@user) }
|
254
|
-
assert_raise(ArgumentError){ @kadm.create_principal(@user, @pass, @pass) }
|
316
|
+
assert_raise(ArgumentError){ @kadm.create_principal(@user, @pass, @pass, @pass) }
|
255
317
|
end
|
256
318
|
|
257
319
|
test "attempting to create a principal that already exists raises an error" do
|
@@ -406,6 +468,10 @@ class TC_Kerberos_Kadm5 < Test::Unit::TestCase
|
|
406
468
|
if @kadm
|
407
469
|
@kadm.delete_principal(@test_princ) rescue nil
|
408
470
|
@kadm.delete_policy(@test_policy) rescue nil
|
471
|
+
if @@ldap_info
|
472
|
+
@kadm.delete_principal(@ldap_test_princ) rescue nil
|
473
|
+
@kadm.delete_principal(@existing_ldap) rescue nil
|
474
|
+
end
|
409
475
|
@kadm.close
|
410
476
|
end
|
411
477
|
|
data/test/test_krb5.rb
CHANGED
@@ -21,7 +21,7 @@ class TC_Krb5 < Test::Unit::TestCase
|
|
21
21
|
end
|
22
22
|
|
23
23
|
@@krb5_conf = ENV['KRB5_CONFIG'] || '/etc/krb5.conf'
|
24
|
-
@@realm = IO.read(@@krb5_conf).grep(/default_realm/).first.split('=').last.lstrip.chomp
|
24
|
+
@@realm = IO.read(@@krb5_conf).split("\n").grep(/default_realm/).first.split('=').last.lstrip.chomp
|
25
25
|
end
|
26
26
|
|
27
27
|
def setup
|
@@ -111,33 +111,33 @@ class TC_Krb5 < Test::Unit::TestCase
|
|
111
111
|
end
|
112
112
|
|
113
113
|
test "get_init_creds_keytab uses a default keytab if no keytab file is specified" do
|
114
|
-
omit_unless(File.
|
114
|
+
omit_unless(File.exist?(@keytab), "keytab file not found, skipping")
|
115
115
|
assert_nothing_raised{ @krb5.get_init_creds_keytab(@user) }
|
116
116
|
end
|
117
117
|
|
118
118
|
test "get_init_creds_keytab accepts a keytab" do
|
119
|
-
omit_unless(File.
|
119
|
+
omit_unless(File.exist?(@keytab), "keytab file not found, skipping")
|
120
120
|
assert_nothing_raised{ @krb5.get_init_creds_keytab(@user, @keytab) }
|
121
121
|
end
|
122
122
|
|
123
123
|
# This test will probably fail (since it defaults to "host") so I've commented it out for now.
|
124
124
|
#test "get_init_creds_keytab uses default service principal if no arguments are provided" do
|
125
|
-
# omit_unless(File.
|
125
|
+
# omit_unless(File.exist?(@keytab), "keytab file not found, skipping")
|
126
126
|
# assert_nothing_raised{ @krb5.get_init_creds_keytab }
|
127
127
|
#end
|
128
128
|
|
129
129
|
test "get_init_creds_keytab accepts a service name" do
|
130
|
-
omit_unless(File.
|
130
|
+
omit_unless(File.exist?(@keytab), "keytab file not found, skipping")
|
131
131
|
assert_nothing_raised{ @krb5.get_init_creds_keytab(@user, @keytab, @service) }
|
132
132
|
end
|
133
133
|
|
134
134
|
test "get_init_creds_keytab accepts a credential cache" do
|
135
|
-
omit_unless(File.
|
135
|
+
omit_unless(File.exist?(@keytab), "keytab file not found, skipping")
|
136
136
|
assert_nothing_raised{ @krb5.get_init_creds_keytab(@user, @keytab, @service, @ccache) }
|
137
137
|
end
|
138
138
|
|
139
139
|
test "get_init_creds_keytab stores credentials in the credential cache" do
|
140
|
-
omit_unless(File.
|
140
|
+
omit_unless(File.exist?(@keytab), "keytab file not found, skipping")
|
141
141
|
ccache = Kerberos::Krb5::CredentialsCache.new
|
142
142
|
assert_nothing_raised{ @krb5.get_init_creds_keytab(@user, @keytab, @service, @ccache) }
|
143
143
|
assert_equal @user, ccache.primary_principal
|
data/test/test_krb5_keytab.rb
CHANGED
@@ -23,16 +23,24 @@ class TC_Krb5_Keytab < Test::Unit::TestCase
|
|
23
23
|
|
24
24
|
@@key_file = "FILE:" + file
|
25
25
|
@@home_dir = ENV['HOME'] || ENV['USER_PROFILE']
|
26
|
+
realm = Kerberos::Kadm5::Config.new.realm
|
26
27
|
|
27
|
-
PTY.spawn('
|
28
|
-
reader.
|
29
|
-
|
28
|
+
PTY.spawn('ktutil') do |reader, writer, pid|
|
29
|
+
reader.expect(/ktutil:\s+/)
|
30
|
+
writer.puts("add_entry -password -p testuser1@#{realm} -k 1 -e aes128-cts-hmac-sha1-96")
|
31
|
+
reader.expect(/Password for testuser1@#{Regexp.quote(realm)}:\s+/)
|
32
|
+
writer.puts("asdfasdfasdf")
|
30
33
|
|
31
|
-
|
32
|
-
reader.expect(/local:\s+/)
|
34
|
+
reader.expect(/ktutil:\s+/)
|
33
35
|
|
34
|
-
writer.puts("
|
35
|
-
reader.expect(/
|
36
|
+
writer.puts("add_entry -password -p testuser2@#{realm} -k 1 -e aes128-cts-hmac-sha1-96")
|
37
|
+
reader.expect(/Password for testuser2@#{Regexp.quote(realm)}:\s+/)
|
38
|
+
writer.puts("asdfasdfasdf")
|
39
|
+
|
40
|
+
reader.expect(/ktutil:\s+/)
|
41
|
+
|
42
|
+
writer.puts("wkt #{file}")
|
43
|
+
reader.expect(/ktutil:\s+/)
|
36
44
|
end
|
37
45
|
end
|
38
46
|
|
@@ -287,7 +295,7 @@ class TC_Krb5_Keytab < Test::Unit::TestCase
|
|
287
295
|
end
|
288
296
|
|
289
297
|
def self.shutdown
|
290
|
-
File.delete(@@key_file) if File.
|
298
|
+
File.delete(@@key_file) if File.exist?(@@key_file)
|
291
299
|
@@key_file = nil
|
292
300
|
@@home_dir = nil
|
293
301
|
end
|
metadata
CHANGED
@@ -1,64 +1,80 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rkerberos
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Berger
|
8
8
|
- Dominic Cleal
|
9
|
+
- Simon Levermann
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date:
|
13
|
+
date: 2016-10-14 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: rake-compiler
|
16
17
|
requirement: !ruby/object:Gem::Requirement
|
17
18
|
requirements:
|
18
|
-
- -
|
19
|
+
- - ">="
|
19
20
|
- !ruby/object:Gem::Version
|
20
21
|
version: '0'
|
21
22
|
type: :runtime
|
22
23
|
prerelease: false
|
23
24
|
version_requirements: !ruby/object:Gem::Requirement
|
24
25
|
requirements:
|
25
|
-
- -
|
26
|
+
- - ">="
|
26
27
|
- !ruby/object:Gem::Version
|
27
28
|
version: '0'
|
28
29
|
- !ruby/object:Gem::Dependency
|
29
30
|
name: test-unit
|
30
31
|
requirement: !ruby/object:Gem::Requirement
|
31
32
|
requirements:
|
32
|
-
- -
|
33
|
+
- - ">="
|
33
34
|
- !ruby/object:Gem::Version
|
34
35
|
version: 2.1.0
|
35
36
|
type: :development
|
36
37
|
prerelease: false
|
37
38
|
version_requirements: !ruby/object:Gem::Requirement
|
38
39
|
requirements:
|
39
|
-
- -
|
40
|
+
- - ">="
|
40
41
|
- !ruby/object:Gem::Version
|
41
42
|
version: 2.1.0
|
42
43
|
- !ruby/object:Gem::Dependency
|
43
44
|
name: dbi-dbrc
|
44
45
|
requirement: !ruby/object:Gem::Requirement
|
45
46
|
requirements:
|
46
|
-
- -
|
47
|
+
- - ">="
|
47
48
|
- !ruby/object:Gem::Version
|
48
49
|
version: 1.1.6
|
49
50
|
type: :development
|
50
51
|
prerelease: false
|
51
52
|
version_requirements: !ruby/object:Gem::Requirement
|
52
53
|
requirements:
|
53
|
-
- -
|
54
|
+
- - ">="
|
54
55
|
- !ruby/object:Gem::Version
|
55
56
|
version: 1.1.6
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
name: net-ldap
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
type: :development
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
56
71
|
description: |2
|
57
72
|
The rkerberos library is an interface for the Kerberos 5 network
|
58
73
|
authentication protocol. It wraps the Kerberos C API.
|
59
74
|
email:
|
60
75
|
- djberg96@gmail.com
|
61
76
|
- dcleal@redhat.com
|
77
|
+
- simon-rubygems@slevermann.de
|
62
78
|
executables: []
|
63
79
|
extensions:
|
64
80
|
- ext/rkerberos/extconf.rb
|
@@ -67,15 +83,15 @@ extra_rdoc_files:
|
|
67
83
|
- CHANGES
|
68
84
|
- MANIFEST
|
69
85
|
- LICENSE
|
70
|
-
- ext/rkerberos/ccache.c
|
71
|
-
- ext/rkerberos/context.c
|
72
|
-
- ext/rkerberos/rkerberos.c
|
73
86
|
- ext/rkerberos/config.c
|
87
|
+
- ext/rkerberos/rkerberos.c
|
88
|
+
- ext/rkerberos/keytab.c
|
89
|
+
- ext/rkerberos/keytab_entry.c
|
74
90
|
- ext/rkerberos/principal.c
|
91
|
+
- ext/rkerberos/ccache.c
|
75
92
|
- ext/rkerberos/kadm5.c
|
76
93
|
- ext/rkerberos/policy.c
|
77
|
-
- ext/rkerberos/
|
78
|
-
- ext/rkerberos/keytab_entry.c
|
94
|
+
- ext/rkerberos/context.c
|
79
95
|
files:
|
80
96
|
- CHANGES
|
81
97
|
- Gemfile
|
@@ -114,27 +130,27 @@ require_paths:
|
|
114
130
|
- lib
|
115
131
|
required_ruby_version: !ruby/object:Gem::Requirement
|
116
132
|
requirements:
|
117
|
-
- -
|
133
|
+
- - ">="
|
118
134
|
- !ruby/object:Gem::Version
|
119
135
|
version: '0'
|
120
136
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
137
|
requirements:
|
122
|
-
- -
|
138
|
+
- - ">="
|
123
139
|
- !ruby/object:Gem::Version
|
124
140
|
version: '0'
|
125
141
|
requirements: []
|
126
142
|
rubyforge_project:
|
127
|
-
rubygems_version: 2.
|
143
|
+
rubygems_version: 2.5.1
|
128
144
|
signing_key:
|
129
145
|
specification_version: 4
|
130
146
|
summary: A Ruby interface for the the Kerberos library
|
131
147
|
test_files:
|
132
|
-
- test/
|
133
|
-
- test/test_keytab_entry.rb
|
134
|
-
- test/test_context.rb
|
148
|
+
- test/test_krb5.rb
|
135
149
|
- test/test_kadm5.rb
|
136
|
-
- test/
|
150
|
+
- test/test_krb5_keytab.rb
|
137
151
|
- test/test_credentials_cache.rb
|
152
|
+
- test/test_policy.rb
|
138
153
|
- test/test_config.rb
|
139
|
-
- test/
|
140
|
-
- test/
|
154
|
+
- test/test_principal.rb
|
155
|
+
- test/test_context.rb
|
156
|
+
- test/test_keytab_entry.rb
|