ruby-shadow 2.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (9) hide show
  1. data/HISTORY +53 -0
  2. data/MANIFEST +8 -0
  3. data/README +87 -0
  4. data/README.euc +80 -0
  5. data/depend +9 -0
  6. data/extconf.rb +29 -0
  7. data/ruby-shadow.gemspec +17 -0
  8. data/shadow.c +295 -0
  9. metadata +69 -0
data/HISTORY ADDED
@@ -0,0 +1,53 @@
1
+ [2011/02/08]
2
+ * Version 2.1.2
3
+ - Jeff Blaine <>, Adam Palmblad <adam.palmblad@teampages.com>:
4
+ Fix issues with compiling against Solaris. Apparently solaris does not offer sgetspent
5
+ compiling against ruby 1.8; fixes were made to the ruby header path.
6
+ [2011/02/08]
7
+ * Version 2.1.1
8
+ - Eric Hankins <ssilver@stormsilver.net>: Looks like there was a minor bug in
9
+ compiling against ruby 1.8; fixes were made to the ruby header path.
10
+ [2011/01/27]
11
+ * Version 2.1
12
+ - Ian Marlier <imarlier@brightcove.com>: Make ruby-shadow compile under Ruby 1.9.2
13
+ * STR2CSTR macro was removed in Ruby 1.9.2, after being deprecated in Ruby 1.8. Change
14
+ to StringValuePtr() in its place.
15
+
16
+ [2010/07/27]
17
+ * Version 2.0
18
+ - Adam Palmblad <adam.palmblad@teampages.com>: Make ruby-shadow compile under Ruby 1.9
19
+
20
+ [1999/08/18]
21
+ * version 1.4.1
22
+ - extconf.rb supports glibc2(libc6).
23
+
24
+ [1999/03/09]
25
+ * version 1.4
26
+ - require ruby-1.3 or later version.
27
+ - sShadowPasswd,mShadow,eFileLock was renamed.
28
+ - FileLock class is inner class of Shadow Module.
29
+ - lock,unlock was changed.
30
+ - lock? method was added.
31
+ - getspent,fgetspent doesn't raise EOFError
32
+ - class hierarchy was changed.
33
+ Shadow Module
34
+ + Passwd Module
35
+ + Entry Structure
36
+ + Group Module (not implemented yet)
37
+ + Entry Structure (not implemented yet)
38
+ + FileLock Class
39
+
40
+ [1998/12/17]
41
+ * version 1.3
42
+ - require ruby-1.1d0 or later version.
43
+
44
+ [1998/10/31]
45
+ * version 1.2
46
+ - only some bug fix.
47
+
48
+ [1998/08/31]
49
+ * version 1.1
50
+ - structure Shadow::ShadowPasswd is added.
51
+
52
+ [1998/07/15]
53
+ * version 1.0 released.
@@ -0,0 +1,8 @@
1
+ depend
2
+ extconf.rb
3
+ HISTORY
4
+ MANIFEST
5
+ README
6
+ README.euc
7
+ ruby-shadow.gemspec
8
+ shadow.c
data/README ADDED
@@ -0,0 +1,87 @@
1
+ Shadow Password module
2
+
3
+ Copyright (C) 1998-1999 Takaaki Tateishi <ttate@jaist.ac.jp>
4
+ Modified at: <1999/8/19 06:47:14 by ttate>
5
+ License: Free for any use with your own risk!
6
+
7
+
8
+ 1. What's this
9
+
10
+ This is the module which used when you access linux shadow password files.
11
+
12
+ Recent versions work on both Linux and Solaris.
13
+
14
+ 2. install
15
+
16
+ ruby extconf.rb
17
+ make
18
+ (make install)
19
+
20
+ * Note:
21
+ Version 2 was developed to compile on Ruby 1.9. 1.8 compatibility should be
22
+ still present, but no promises about earlier versions of Ruby.
23
+
24
+ 3. Shadow::Passwd module's methods
25
+
26
+ getspent
27
+ getspnam(name)
28
+ setspent
29
+ endspent
30
+ fgetspent(file)
31
+ sgetspent(str)
32
+ putspent(entry,file)
33
+ lckpwdf,lock
34
+ ulckpwdf,unlock
35
+ lock?
36
+
37
+ * Note: sgetspent is not available under Solaris and some other operating
38
+ systems. In current versions, that method will be completely missing.
39
+
40
+
41
+ 4. Structure
42
+
43
+ Shadow::Passwd::Entry (Struct::PasswdEntry)
44
+ sp_namp - pointer to null-terminated user name.
45
+ sp_pwdp - pointer to null-terminated password.
46
+ sp_lstchg - days since Jan 1, 1970 password was last
47
+ changed.
48
+ sp_min - days before which password may not be changed.
49
+ sp_max - days after which password must be changed.
50
+ sp_warn - days before password is to expire that user is
51
+ warned of pending password expiration.
52
+ sp_inact - days after password expires that account is
53
+ considered inactive and disabled.
54
+ sp_expire - days since Jan 1, 1970 when account will be
55
+
56
+
57
+ 5. Description
58
+
59
+ getspent, getspname, fgetspent and sgetspent each return
60
+ a structure Shadow::Passwd::Entry. getspent returns the
61
+ next entry from the file, and fgetspent returns the next
62
+ entry from the given stream. sgetspent returns a structure
63
+ Shadow::Passwd::Entry using the provided string as input.
64
+ getspnam searches from the current position in the file for
65
+ an entry matching name.
66
+ if you get EOF from each operation, you will get nil.
67
+
68
+ setspent and endspent may be used to begin and end, respe-
69
+ ctively, access to the shadow password file.
70
+
71
+ lckpwdf(lock) and ulckpwdf(unlock) methods should be used
72
+ to insure exclusive access to the /etc/shadow file.
73
+ when either method fail, Exception Shadow::FileLock is raised.
74
+ if you use lock as the iterator, unlock is automatically called
75
+ when you exit the iterator block.
76
+
77
+ 6. Reference
78
+
79
+ * man shadow
80
+ * /usr/include/shadow.h
81
+
82
+
83
+ Original Author:
84
+ Takaaki Tateishi <ttate@jaist.ac.jp>
85
+
86
+ This GitHub repository is maintained by Adam Palmblad <adam.palmblad@teampages.com>. I'll
87
+ do my best to keep the repository reasonably up-to-date if you care to send pull requests.
@@ -0,0 +1,80 @@
1
+ Shadow Password module
2
+
3
+ Copyright (C) 1998-1999 Takaaki Tateishi <ttate@jaist.ac.jp>
4
+ Modified at: <1999/8/19 06:48:01 by ttate>
5
+ License: Free for any use with your own risk!
6
+
7
+
8
+ 1. ����
9
+
10
+ linux�ˤ�����shadow password�ե�����򰷤�����
11
+ �Υ⥸�塼�롣
12
+
13
+
14
+ 2. ���󥹥ȡ���
15
+
16
+ ruby extconf.rb
17
+ make
18
+ make install
19
+
20
+ * ����
21
+ shadow-1.3�Ǥ�ruby-1.3�⤷���Ϥ���ʹߤΥС������
22
+ ��ɬ�פǤ���
23
+
24
+ 3. Shadow::Passwd�⥸�塼��Υ᥽�å�ã
25
+
26
+ getspent
27
+ getspnam(name)
28
+ setspent
29
+ endspent
30
+ fgetspent(file)
31
+ sgetspent(str)
32
+ putspent(entry,file)
33
+ lckpwdf,lock
34
+ ulckpwdf,unlock
35
+ lock?
36
+
37
+ 4. Structure
38
+
39
+ Shadow::Passwd::Entry (Struct::PasswdEntry)
40
+ sp_namp - pointer to null-terminated user name.
41
+ sp_pwdp - pointer to null-terminated password.
42
+ sp_lstchg - days since Jan 1, 1970 password was last
43
+ changed.
44
+ sp_min - days before which password may not be changed.
45
+ sp_max - days after which password must be changed.
46
+ sp_warn - days before password is to expire that user is
47
+ warned of pending password expiration.
48
+ sp_inact - days after password expires that account is
49
+ considered inactive and disabled.
50
+ sp_expire - days since Jan 1, 1970 when account will be
51
+
52
+
53
+ 5. ����
54
+
55
+ getspent, getspname, fgetspent, sgetspent��Shadow::Passwd::Entry
56
+ ���ȥ饯������֤��ޤ���getspent �ϥե����뤫�鼡�Υѥ���
57
+ ���ɥ���ȥ���֤���fgetspent ��Ϳ����줿IO���鼡�Υ����
58
+ ����֤��ޤ���sgetspent��Ϳ����줿ʸ���󤫤�Shadow::Passwd::Entry
59
+ ���ȥ饯������֤��ޤ���getspnam�ϥ桼��̾��Ϳ�����/etc/shadow
60
+ ���餽�Υ桼����Shadow::Passwd::Entry���ȥ饯������֤��ޤ���
61
+ �ե�����ν�ü��ã�����nil���ͤ��֤��ޤ���
62
+
63
+ setspent,endspent�Ϥ��줾�졢�ե�����ؤΥ��������ΤϤ����
64
+ �����˻Ȥ��ޤ���
65
+
66
+ lckpwdf(lock),ulckpwdf(unlock)��/etc/shadow�ؤ���¾Ū��������
67
+ ��¸����뤿��ˤ���ޤ���
68
+ lock�˼��Ԥ����Shadow::FileLock�Ȥ����㳰��ȯ�������ޤ���
69
+ lock�򥤥ƥ졼���Ȥ��ƻȤ����Ȥˤ�äơ����ƥ졼���֥��å���ȴ����
70
+ �Ȥ��˼�ưŪ��unlock��Ԥʤ��ޤ���
71
+
72
+
73
+ 6. ����
74
+
75
+ * man shadow
76
+ * /usr/include/shadow.h
77
+
78
+
79
+
80
+ ttate@jaist.ac.jp
data/depend ADDED
@@ -0,0 +1,9 @@
1
+ ifneq (,$(findstring 1.9,$(ruby_version)))
2
+ io_lib=$(hdrdir)/ruby/ruby/io.h
3
+ hdr=$(hdrdir)/ruby/ruby.h
4
+ else
5
+ io_lib=$(hdrdir)/ruby/rubyio.h
6
+ hdr=$(hdrdir)/ruby.h
7
+ endif
8
+
9
+ shadow.o: shadow.c $(hdr) $(io_lib)
@@ -0,0 +1,29 @@
1
+ # -*- ruby -*-
2
+ # extconf.rb
3
+ #
4
+ # Modified at: <1999/8/19 06:38:55 by ttate>
5
+ #
6
+
7
+ require 'mkmf'
8
+
9
+ $CFLAGS = RUBY_VERSION =~ /1\.9/ ? '-DRUBY19' : ''
10
+
11
+ #$LDFLAGS = "-lshadow"
12
+
13
+ if( ! (ok = have_library("shadow","getspent")) )
14
+ $LDFLAGS = ""
15
+ ok = have_func("getspent")
16
+ end
17
+
18
+ ok &= have_func("fgetspent")
19
+ ok &= have_func("setspent")
20
+ ok &= have_func("endspent")
21
+ ok &= have_func("lckpwdf")
22
+ ok &= have_func("ulckpwdf")
23
+
24
+ if ok
25
+ if !have_func("sgetspent")
26
+ $CFLAGS += ' -DSOLARIS'
27
+ end
28
+ create_makefile("shadow")
29
+ end
@@ -0,0 +1,17 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.authors = ['Adam Palmblad', 'Eric Hankins', 'Ian Marlier', 'Jeff Blaine', 'Remi Broemeling', 'Takaaki Tateishi']
5
+ spec.description = 'This module provides access to shadow passwords on Linux and Solaris'
6
+ spec.email = ['adam.palmblad@teampages.com']
7
+ spec.extensions = ['extconf.rb']
8
+ spec.files = []
9
+ File.open('MANIFEST').each { |file|
10
+ spec.files << file.chomp
11
+ }
12
+ spec.homepage = 'https://github.com/apalmblad/ruby-shadow'
13
+ spec.name = 'ruby-shadow'
14
+ spec.required_ruby_version = '>= 1.8'
15
+ spec.summary = '*nix Shadow Password Module'
16
+ spec.version = '2.1.2'
17
+ end
@@ -0,0 +1,295 @@
1
+ /*
2
+ * shadow.c
3
+ *
4
+ * Ruby extention module for using Linux shadow password.
5
+ *
6
+ * Copyright (C) 1998-1999 by Takaaki.Tateishi(ttate@jaist.ac.jp)
7
+ * License: Free for any use with your own risk!
8
+ * Modified at: <1999/8/19 06:48:18 by ttate>
9
+ */
10
+
11
+ #include <shadow.h>
12
+ #include "ruby.h"
13
+ #ifdef RUBY19
14
+ #include <ruby/io.h>
15
+ #else
16
+ #include "rubyio.h"
17
+ #endif
18
+
19
+ #ifdef RUBY19
20
+ #define file_ptr(x) (x)->stdio_file
21
+ #else
22
+ #define file_ptr(x) (x)->f
23
+ #endif
24
+
25
+ static VALUE rb_mShadow;
26
+ static VALUE rb_mPasswd;
27
+ static VALUE rb_sPasswdEntry;
28
+ static VALUE rb_mGroup;
29
+ static VALUE rb_sGroupEntry;
30
+ static VALUE rb_eFileLock;
31
+
32
+
33
+ static VALUE
34
+ rb_shadow_setspent(VALUE self)
35
+ {
36
+ setspent();
37
+ return Qnil;
38
+ };
39
+
40
+
41
+ static VALUE
42
+ rb_shadow_endspent(VALUE self)
43
+ {
44
+ endspent();
45
+ return Qnil;
46
+ };
47
+
48
+
49
+ #ifndef SOLARIS
50
+ static VALUE
51
+ rb_shadow_sgetspent(VALUE self, VALUE str)
52
+ {
53
+ struct spwd *entry;
54
+ VALUE result;
55
+
56
+ if( TYPE(str) != T_STRING )
57
+ rb_raise(rb_eException,"argument must be a string.");
58
+
59
+ entry = sgetspent(StringValuePtr(str));
60
+
61
+ if( entry == NULL )
62
+ return Qnil;
63
+
64
+ result = rb_struct_new(rb_sPasswdEntry,
65
+ rb_tainted_str_new2(entry->sp_namp),
66
+ rb_tainted_str_new2(entry->sp_pwdp),
67
+ INT2FIX(entry->sp_lstchg),
68
+ INT2FIX(entry->sp_min),
69
+ INT2FIX(entry->sp_max),
70
+ INT2FIX(entry->sp_warn),
71
+ INT2FIX(entry->sp_inact),
72
+ INT2FIX(entry->sp_expire),
73
+ INT2FIX(entry->sp_flag),
74
+ NULL);
75
+ free(entry);
76
+ return result;
77
+ };
78
+ #endif
79
+
80
+ static VALUE
81
+ rb_shadow_fgetspent(VALUE self, VALUE file)
82
+ {
83
+ struct spwd *entry;
84
+ VALUE result;
85
+
86
+ if( TYPE(file) != T_FILE )
87
+ rb_raise(rb_eTypeError,"argument must be a File.");
88
+
89
+ entry = fgetspent( file_ptr( (RFILE(file)->fptr) ) );
90
+
91
+ if( entry == NULL )
92
+ return Qnil;
93
+
94
+ result = rb_struct_new(rb_sPasswdEntry,
95
+ rb_tainted_str_new2(entry->sp_namp),
96
+ rb_tainted_str_new2(entry->sp_pwdp),
97
+ INT2FIX(entry->sp_lstchg),
98
+ INT2FIX(entry->sp_min),
99
+ INT2FIX(entry->sp_max),
100
+ INT2FIX(entry->sp_warn),
101
+ INT2FIX(entry->sp_inact),
102
+ INT2FIX(entry->sp_expire),
103
+ INT2FIX(entry->sp_flag),
104
+ NULL);
105
+ return result;
106
+ };
107
+
108
+ static VALUE
109
+ rb_shadow_getspent(VALUE self)
110
+ {
111
+ struct spwd *entry;
112
+ VALUE result;
113
+
114
+ entry = getspent();
115
+
116
+ if( entry == NULL )
117
+ return Qnil;
118
+
119
+ result = rb_struct_new(rb_sPasswdEntry,
120
+ rb_tainted_str_new2(entry->sp_namp),
121
+ rb_tainted_str_new2(entry->sp_pwdp),
122
+ INT2FIX(entry->sp_lstchg),
123
+ INT2FIX(entry->sp_min),
124
+ INT2FIX(entry->sp_max),
125
+ INT2FIX(entry->sp_warn),
126
+ INT2FIX(entry->sp_inact),
127
+ INT2FIX(entry->sp_expire),
128
+ INT2FIX(entry->sp_flag),
129
+ NULL);
130
+ return result;
131
+ };
132
+
133
+ static VALUE
134
+ rb_shadow_getspnam(VALUE self, VALUE name)
135
+ {
136
+ struct spwd *entry;
137
+ VALUE result;
138
+
139
+ if( TYPE(name) != T_STRING )
140
+ rb_raise(rb_eException,"argument must be a string.");
141
+
142
+ entry = getspnam(StringValuePtr(name));
143
+
144
+ if( entry == NULL )
145
+ return Qnil;
146
+
147
+ result = rb_struct_new(rb_sPasswdEntry,
148
+ rb_tainted_str_new2(entry->sp_namp),
149
+ rb_tainted_str_new2(entry->sp_pwdp),
150
+ INT2FIX(entry->sp_lstchg),
151
+ INT2FIX(entry->sp_min),
152
+ INT2FIX(entry->sp_max),
153
+ INT2FIX(entry->sp_warn),
154
+ INT2FIX(entry->sp_inact),
155
+ INT2FIX(entry->sp_expire),
156
+ INT2FIX(entry->sp_flag),
157
+ NULL);
158
+ return result;
159
+ };
160
+
161
+
162
+ static VALUE
163
+ rb_shadow_putspent(VALUE self, VALUE entry, VALUE file)
164
+ {
165
+ struct spwd centry;
166
+ FILE* cfile;
167
+ VALUE val[9];
168
+ int i;
169
+ int result;
170
+
171
+ for(i=0; i<=8; i++)
172
+ val[i] = RSTRUCT_PTR( entry )[i]; //val[i] = RSTRUCT(entry)->ptr[i];
173
+ cfile = file_pr( RFILE(file)->fptr );
174
+
175
+ centry.sp_namp = StringValuePtr(val[0]);
176
+ centry.sp_pwdp = StringValuePtr(val[1]);
177
+ centry.sp_lstchg = FIX2INT(val[2]);
178
+ centry.sp_min = FIX2INT(val[3]);
179
+ centry.sp_max = FIX2INT(val[4]);
180
+ centry.sp_warn = FIX2INT(val[5]);
181
+ centry.sp_inact = FIX2INT(val[6]);
182
+ centry.sp_expire = FIX2INT(val[7]);
183
+ centry.sp_flag = FIX2INT(val[8]);
184
+
185
+ result = putspent(&centry,cfile);
186
+
187
+ if( result == -1 )
188
+ rb_raise(rb_eStandardError,"can't change password");
189
+
190
+ return Qtrue;
191
+ };
192
+
193
+
194
+ static VALUE
195
+ rb_shadow_lckpwdf(VALUE self)
196
+ {
197
+ int result;
198
+ result = lckpwdf();
199
+ if( result == -1 )
200
+ rb_raise(rb_eFileLock,"password file was locked");
201
+ else
202
+ return Qtrue;
203
+ };
204
+
205
+ static int in_lock;
206
+
207
+ static VALUE
208
+ rb_shadow_lock(VALUE self)
209
+ {
210
+ int result;
211
+
212
+ if( rb_iterator_p() ){
213
+ result = lckpwdf();
214
+ if( result == -1 ){
215
+ rb_raise(rb_eFileLock,"password file was locked");
216
+ }
217
+ else{
218
+ in_lock++;
219
+ rb_yield(Qnil);
220
+ in_lock--;
221
+ ulckpwdf();
222
+ };
223
+ return Qtrue;
224
+ }
225
+ else{
226
+ return rb_shadow_lckpwdf(self);
227
+ };
228
+ };
229
+
230
+
231
+ static VALUE
232
+ rb_shadow_ulckpwdf(VALUE self)
233
+ {
234
+ if( in_lock ){
235
+ rb_raise(rb_eFileLock,"you call unlock method in lock iterator.");
236
+ };
237
+ ulckpwdf();
238
+ return Qtrue;
239
+ };
240
+
241
+ static VALUE
242
+ rb_shadow_unlock(VALUE self)
243
+ {
244
+ return rb_shadow_ulckpwdf(self);
245
+ };
246
+
247
+ static VALUE
248
+ rb_shadow_lock_p(VALUE self)
249
+ {
250
+ int result;
251
+
252
+ result = lckpwdf();
253
+ if( result == -1 ){
254
+ return Qtrue;
255
+ }
256
+ else{
257
+ ulckpwdf();
258
+ return Qfalse;
259
+ };
260
+ };
261
+
262
+
263
+ void
264
+ Init_shadow()
265
+ {
266
+ rb_sPasswdEntry = rb_struct_define("PasswdEntry",
267
+ "sp_namp","sp_pwdp","sp_lstchg",
268
+ "sp_min","sp_max","sp_warn",
269
+ "sp_inact","sp_expire","sp_flag", NULL);
270
+ rb_sGroupEntry = rb_struct_define("GroupEntry",
271
+ "sg_name","sg_passwd",
272
+ "sg_adm","sg_mem",NULL);
273
+
274
+ rb_mShadow = rb_define_module("Shadow");
275
+ rb_eFileLock = rb_define_class_under(rb_mShadow,"FileLock",rb_eException);
276
+ rb_mPasswd = rb_define_module_under(rb_mShadow,"Passwd");
277
+ rb_define_const(rb_mPasswd,"Entry",rb_sPasswdEntry);
278
+ rb_mGroup = rb_define_module_under(rb_mShadow,"Group");
279
+ rb_define_const(rb_mGroup,"Entry",rb_sGroupEntry);
280
+
281
+ rb_define_module_function(rb_mPasswd,"setspent",rb_shadow_setspent,0);
282
+ rb_define_module_function(rb_mPasswd,"endspent",rb_shadow_endspent,0);
283
+ #ifndef SOLARIS
284
+ rb_define_module_function(rb_mPasswd,"sgetspent",rb_shadow_sgetspent,1);
285
+ #endif
286
+ rb_define_module_function(rb_mPasswd,"fgetspent",rb_shadow_fgetspent,1);
287
+ rb_define_module_function(rb_mPasswd,"getspent",rb_shadow_getspent,0);
288
+ rb_define_module_function(rb_mPasswd,"getspnam",rb_shadow_getspnam,1);
289
+ rb_define_module_function(rb_mPasswd,"putspent",rb_shadow_putspent,2);
290
+ rb_define_module_function(rb_mPasswd,"lckpwdf",rb_shadow_lckpwdf,0);
291
+ rb_define_module_function(rb_mPasswd,"lock",rb_shadow_lock,0);
292
+ rb_define_module_function(rb_mPasswd,"ulckpwdf",rb_shadow_ulckpwdf,0);
293
+ rb_define_module_function(rb_mPasswd,"unlock",rb_shadow_unlock,0);
294
+ rb_define_module_function(rb_mPasswd,"lock?",rb_shadow_lock_p,0);
295
+ };
metadata ADDED
@@ -0,0 +1,69 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby-shadow
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 2.1.2
6
+ platform: ruby
7
+ authors:
8
+ - Adam Palmblad
9
+ - Eric Hankins
10
+ - Ian Marlier
11
+ - Jeff Blaine
12
+ - Remi Broemeling
13
+ - Takaaki Tateishi
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-04-13 00:00:00 -07:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description: This module provides access to shadow passwords on Linux and Solaris
23
+ email:
24
+ - adam.palmblad@teampages.com
25
+ executables: []
26
+
27
+ extensions:
28
+ - extconf.rb
29
+ extra_rdoc_files: []
30
+
31
+ files:
32
+ - extconf.rb
33
+ - depend
34
+ - HISTORY
35
+ - MANIFEST
36
+ - README
37
+ - README.euc
38
+ - ruby-shadow.gemspec
39
+ - shadow.c
40
+ has_rdoc: true
41
+ homepage: https://github.com/apalmblad/ruby-shadow
42
+ licenses: []
43
+
44
+ post_install_message:
45
+ rdoc_options: []
46
+
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: "1.8"
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: "0"
61
+ requirements: []
62
+
63
+ rubyforge_project:
64
+ rubygems_version: 1.5.2
65
+ signing_key:
66
+ specification_version: 3
67
+ summary: "*nix Shadow Password Module"
68
+ test_files: []
69
+