rubylibcrack 0.1.1 → 0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/{README.txt → README} +8 -2
- data/lib/rubylibcrack.rb +57 -0
- data/test/test_rubylibcrack.rb +5 -10
- metadata +66 -42
- data/History.txt +0 -7
- data/Manifest.txt +0 -13
- data/Rakefile +0 -37
- data/ext/extconf.rb +0 -7
- data/ext/rubylibcrack.c +0 -49
data/{README.txt → README}
RENAMED
@@ -11,7 +11,10 @@ A Ruby binding to the password strength checker, libcrack/cracklib.
|
|
11
11
|
== FEATURES/PROBLEMS:
|
12
12
|
|
13
13
|
A very simple password class with methods, weak? and strong? to check a password.
|
14
|
-
A suitable message is provided if the password is weak.
|
14
|
+
A suitable message is provided if the password is weak. You can pass a path to
|
15
|
+
a dictionary, but the gem will try to find a default too.
|
16
|
+
|
17
|
+
Tested on Ruby 1.8, Ruby 1.9 and JRuby 1.2.
|
15
18
|
|
16
19
|
== SYNOPSIS:
|
17
20
|
|
@@ -21,10 +24,12 @@ Usage:
|
|
21
24
|
=> true
|
22
25
|
>> require "rubylibcrack"
|
23
26
|
=> true
|
24
|
-
>> my_password = Password.new("hello001")
|
27
|
+
>> my_password = Cracklib::Password.new("hello001")
|
25
28
|
=> "hello001"
|
26
29
|
>> my_password.strong?
|
27
30
|
=> false
|
31
|
+
>> my_password.strong?("/usr/share/cracklib/pw_dict")
|
32
|
+
=> false
|
28
33
|
>> my_password.message
|
29
34
|
=> "it is based on a dictionary word"
|
30
35
|
|
@@ -34,6 +39,7 @@ Usage:
|
|
34
39
|
- Gentoo will have these if cracklib is installed
|
35
40
|
- Redhat and Fedora will require cracklib-devel
|
36
41
|
- Ubuntu will require cracklib-devel
|
42
|
+
* FFI
|
37
43
|
|
38
44
|
== INSTALL:
|
39
45
|
|
data/lib/rubylibcrack.rb
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'ffi'
|
3
|
+
|
4
|
+
module Cracklib
|
5
|
+
class Password
|
6
|
+
attr_reader :message
|
7
|
+
|
8
|
+
extend FFI::Library
|
9
|
+
ffi_lib "crack"
|
10
|
+
attach_function :check, "FascistCheck", [ :string, :string ], :string
|
11
|
+
POTENTIAL_DICT_PATHS = %w(/usr/share/cracklib/pw_dict /usr/lib/cracklib_dict /usr/lib64/cracklib_dict /var/cache/cracklib/cracklib_dict)
|
12
|
+
@@dictpath = ""
|
13
|
+
|
14
|
+
def initialize(password)
|
15
|
+
@password = password
|
16
|
+
end
|
17
|
+
|
18
|
+
def strong?(dictpath = default_dictpath)
|
19
|
+
if not valid_dictpath? dictpath
|
20
|
+
raise "#{dictpath} is not a valid dictionary path!"
|
21
|
+
end
|
22
|
+
begin
|
23
|
+
@message = check(@password, dictpath)
|
24
|
+
return @message.nil?
|
25
|
+
rescue
|
26
|
+
return true
|
27
|
+
end
|
28
|
+
return false
|
29
|
+
end
|
30
|
+
|
31
|
+
def weak?(dictpath = default_dictpath)
|
32
|
+
not strong? dictpath
|
33
|
+
end
|
34
|
+
|
35
|
+
protected
|
36
|
+
|
37
|
+
def default_dictpath
|
38
|
+
if @@dictpath.empty?
|
39
|
+
POTENTIAL_DICT_PATHS.each do |path|
|
40
|
+
if valid_dictpath? path
|
41
|
+
@@dictpath = path
|
42
|
+
break
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
@@dictpath
|
47
|
+
end
|
48
|
+
|
49
|
+
def valid_dictpath?(dictpath)
|
50
|
+
if File.exists? dictpath+'.hwm' and File.exists? dictpath+'.pwi' and File.exists? dictpath+'.pwd'
|
51
|
+
true
|
52
|
+
else
|
53
|
+
false
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/test/test_rubylibcrack.rb
CHANGED
@@ -1,21 +1,16 @@
|
|
1
1
|
require "test/unit"
|
2
|
-
|
3
|
-
puts "You must build the extension before running these tests. The rake task :test calls the :build_extension task and does all this for you."
|
4
|
-
puts 'Alternatively, you can run this command: "cd ext; ruby extconf.rb; make; cd ../"'
|
5
|
-
exit 0
|
6
|
-
end
|
7
|
-
require File.dirname(__FILE__)+"/../ext/rubylibcrack"
|
2
|
+
require File.dirname(__FILE__)+"/../lib/rubylibcrack"
|
8
3
|
|
9
4
|
class PasswordTest < Test::Unit::TestCase
|
10
5
|
def test_password
|
11
|
-
poor_password = Password.new("hello")
|
12
|
-
assert_kind_of Password, poor_password
|
6
|
+
poor_password = Cracklib::Password.new("hello")
|
7
|
+
assert_kind_of Cracklib::Password, poor_password
|
13
8
|
assert !poor_password.strong?
|
14
9
|
assert poor_password.weak?
|
15
10
|
assert_not_nil poor_password.message
|
16
11
|
|
17
|
-
good_password = Password.new("jUY d3 i5 gr38")
|
18
|
-
assert_kind_of Password, good_password
|
12
|
+
good_password = Cracklib::Password.new("jUY d3 i5 gr38")
|
13
|
+
assert_kind_of Cracklib::Password, good_password
|
19
14
|
assert good_password.strong?
|
20
15
|
assert !good_password.weak?
|
21
16
|
assert_nil good_password.message
|
metadata
CHANGED
@@ -1,53 +1,77 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.4
|
3
|
-
specification_version: 1
|
4
2
|
name: rubylibcrack
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
email: rubyforge@scottishclimbs.com
|
12
|
-
homepage: http://mark.scottishclimbs.com/ (http://www.pccl.info/)
|
13
|
-
rubyforge_project: rubylibcrack
|
14
|
-
description: A Ruby binding to the password strength checker, libcrack/cracklib.
|
15
|
-
autorequire:
|
16
|
-
default_executable:
|
17
|
-
bindir: bin
|
18
|
-
has_rdoc: true
|
19
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">"
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.0.0
|
24
|
-
version:
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 2
|
8
|
+
version: "0.2"
|
25
9
|
platform: ruby
|
26
|
-
signing_key:
|
27
|
-
cert_chain:
|
28
|
-
post_install_message:
|
29
10
|
authors:
|
30
|
-
- Mark Somerville
|
11
|
+
- Mark Somerville
|
12
|
+
autorequire:
|
13
|
+
bindir: bin
|
14
|
+
cert_chain: []
|
15
|
+
|
16
|
+
date: 2010-11-18 00:00:00 +00:00
|
17
|
+
default_executable:
|
18
|
+
dependencies:
|
19
|
+
- !ruby/object:Gem::Dependency
|
20
|
+
name: ffi
|
21
|
+
prerelease: false
|
22
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
23
|
+
none: false
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
version: "0"
|
30
|
+
type: :runtime
|
31
|
+
version_requirements: *id001
|
32
|
+
description:
|
33
|
+
email: mark@scottishclimbs.com
|
34
|
+
executables: []
|
35
|
+
|
36
|
+
extensions: []
|
37
|
+
|
38
|
+
extra_rdoc_files:
|
39
|
+
- README
|
31
40
|
files:
|
32
|
-
-
|
33
|
-
- Rakefile
|
34
|
-
- History.txt
|
35
|
-
- Manifest.txt
|
36
|
-
- README.txt
|
37
|
-
test_files:
|
41
|
+
- lib/rubylibcrack.rb
|
38
42
|
- test/test_rubylibcrack.rb
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
executables: []
|
43
|
+
- README
|
44
|
+
has_rdoc: true
|
45
|
+
homepage: http://mark.scottishclimbs.com/
|
46
|
+
licenses: []
|
47
|
+
|
48
|
+
post_install_message:
|
49
|
+
rdoc_options: []
|
47
50
|
|
48
|
-
|
49
|
-
-
|
51
|
+
require_paths:
|
52
|
+
- lib
|
53
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
+
none: false
|
55
|
+
requirements:
|
56
|
+
- - ">="
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
segments:
|
59
|
+
- 0
|
60
|
+
version: "0"
|
61
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
segments:
|
67
|
+
- 0
|
68
|
+
version: "0"
|
50
69
|
requirements: []
|
51
70
|
|
52
|
-
|
71
|
+
rubyforge_project: rubylibcrack
|
72
|
+
rubygems_version: 1.3.7
|
73
|
+
signing_key:
|
74
|
+
specification_version: 3
|
75
|
+
summary: A binding to the *nix password strength checking library, libcrack/cracklib.
|
76
|
+
test_files: []
|
53
77
|
|
data/History.txt
DELETED
data/Manifest.txt
DELETED
data/Rakefile
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'hoe'
|
3
|
-
|
4
|
-
class Hoe
|
5
|
-
def extra_deps
|
6
|
-
@extra_deps.reject do |x|
|
7
|
-
Array(x).first == 'hoe'
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
Hoe.new('rubylibcrack', "0.1.1") do |p|
|
13
|
-
p.rubyforge_name = 'rubylibcrack'
|
14
|
-
p.author = p.paragraphs_of('README.txt', 1..1).to_s.strip.sub("By: ", "")
|
15
|
-
p.email = 'rubyforge@scottishclimbs.com'
|
16
|
-
p.summary = p.paragraphs_of('README.txt', 3).to_s.sub("== DESCRIPTION:", "")
|
17
|
-
p.description = p.paragraphs_of('README.txt', 3).to_s.sub("== DESCRIPTION:", "")
|
18
|
-
p.url = p.paragraphs_of('README.txt', 2..2).to_s.strip.sub("URL: ", "")
|
19
|
-
p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
|
20
|
-
p.spec_extras["files"] = [ "ext/rubylibcrack.c", "Rakefile" ]
|
21
|
-
p.spec_extras["extensions"] = "ext/extconf.rb"
|
22
|
-
end
|
23
|
-
|
24
|
-
desc "Builds the extension"
|
25
|
-
task :build_extension do
|
26
|
-
system "cd ext; ruby extconf.rb; make; cd ../"
|
27
|
-
end
|
28
|
-
|
29
|
-
desc "Cleans the files compiled by build_extension"
|
30
|
-
task :clean_extension do
|
31
|
-
system "cd ext; rm dictconfig.h rubylibcrack.so rubylibcrack.o Makefile; cd ../"
|
32
|
-
end
|
33
|
-
|
34
|
-
desc "Run the unit tests"
|
35
|
-
task :test => [ :build_extension ] do
|
36
|
-
Rake::Task[ :clean_extension ].invoke
|
37
|
-
end
|
data/ext/extconf.rb
DELETED
data/ext/rubylibcrack.c
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
#include <ruby.h>
|
2
|
-
#include <crack.h>
|
3
|
-
#include "dictconfig.h"
|
4
|
-
|
5
|
-
/*
|
6
|
-
* Runs FascistCheck and returns if the password is regarded as weak or not.
|
7
|
-
* If it is, the class variable @message is set to the value of the error message.
|
8
|
-
*/
|
9
|
-
static VALUE t_weak(VALUE self)
|
10
|
-
{
|
11
|
-
char *failure_message;
|
12
|
-
failure_message = (char *) FascistCheck(STR2CSTR(self), DICTPATH);
|
13
|
-
if(failure_message)
|
14
|
-
{
|
15
|
-
rb_iv_set(self, "@message", rb_str_new2(failure_message));
|
16
|
-
return Qtrue;
|
17
|
-
}
|
18
|
-
else
|
19
|
-
{
|
20
|
-
return Qfalse;
|
21
|
-
}
|
22
|
-
}
|
23
|
-
|
24
|
-
/*
|
25
|
-
* Runs FascistCheck and returns if the password is regarded as strong or not.
|
26
|
-
* If it isn't, the class variable @message is set to the value of the error message.
|
27
|
-
*/
|
28
|
-
static VALUE t_strong(VALUE self)
|
29
|
-
{
|
30
|
-
VALUE weak;
|
31
|
-
weak = t_weak(self);
|
32
|
-
if(weak == Qtrue)
|
33
|
-
{
|
34
|
-
return Qfalse;
|
35
|
-
}
|
36
|
-
else
|
37
|
-
{
|
38
|
-
return Qtrue;
|
39
|
-
}
|
40
|
-
}
|
41
|
-
|
42
|
-
VALUE cPassword;
|
43
|
-
|
44
|
-
void Init_rubylibcrack() {
|
45
|
-
cPassword = rb_define_class("Password", rb_cString);
|
46
|
-
rb_define_attr(cPassword, "message", 1, 0);
|
47
|
-
rb_define_method(cPassword, "weak?", t_weak, 0);
|
48
|
-
rb_define_method(cPassword, "strong?", t_strong, 0);
|
49
|
-
}
|