mischacks 0.2.0 → 0.2.1
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/History.txt +6 -0
- data/README.txt +38 -13
- data/Rakefile +3 -6
- data/VERSION +1 -1
- data/lib/mischacks.rb +1 -1
- data/lib/mischacks/password.rb +5 -1
- data/spec/mischacks/password_spec.rb +16 -12
- metadata +24 -3
- data/Manifest.txt +0 -9
data/History.txt
CHANGED
data/README.txt
CHANGED
@@ -6,7 +6,8 @@
|
|
6
6
|
|
7
7
|
Miscellaneous methods that may or may not be useful.
|
8
8
|
|
9
|
-
sh:: Safely pass untrusted parameters to sh scripts.
|
9
|
+
sh:: Safely pass untrusted parameters to sh scripts. Raise an exception if the
|
10
|
+
script returns a non-zero value.
|
10
11
|
|
11
12
|
fork_and_check:: Run a block in a forked process and raise an exception if the
|
12
13
|
process returns a non-zero value.
|
@@ -48,16 +49,23 @@ ever use an untrusted variable as a command.
|
|
48
49
|
|
49
50
|
== SYNOPSIS:
|
50
51
|
|
51
|
-
|
52
|
+
sh::
|
53
|
+
|
54
|
+
Note that the scripts are run with set -e.
|
55
|
+
|
56
|
+
MiscHacks.sh 'exec ls'
|
52
57
|
|
53
58
|
MiscHacks.sh %q{
|
54
59
|
diff -u "$1" "$2" | tr a-z A-Z >"$output"
|
55
60
|
}, '/dev/null', '/etc/motd', :output => 'foo'
|
56
61
|
|
57
62
|
unsafe_str = %q{" 'foo' $(bar) `baz` "}
|
58
|
-
MiscHacks.sh 'printf "%s\n" "$1"', unsafe_str
|
63
|
+
MiscHacks.sh 'exec printf "%s\n" "$1"', unsafe_str
|
59
64
|
|
60
|
-
#
|
65
|
+
# Raises MiscHacks::ChildError.
|
66
|
+
MiscHacks.sh 'exec false'
|
67
|
+
|
68
|
+
fork_and_check::
|
61
69
|
|
62
70
|
# These examples raise MiscHacks::ChildError.
|
63
71
|
MiscHacks.fork_and_check do exit! 42 end
|
@@ -67,7 +75,7 @@ ever use an untrusted variable as a command.
|
|
67
75
|
# Does not raise an error.
|
68
76
|
MiscHacks.fork_and_check do exit! 0 end
|
69
77
|
|
70
|
-
|
78
|
+
do_and_exit::
|
71
79
|
|
72
80
|
# Prints foo if there are no failures. If anything fails, raises an
|
73
81
|
# exception.
|
@@ -77,23 +85,23 @@ ever use an untrusted variable as a command.
|
|
77
85
|
end
|
78
86
|
end
|
79
87
|
|
80
|
-
|
88
|
+
overwrite::
|
81
89
|
|
82
90
|
MiscHacks.overwrite 'myconfig' do |io|
|
83
|
-
|
91
|
+
config.to_yaml io
|
84
92
|
end
|
85
93
|
|
86
|
-
|
94
|
+
tempname_for::
|
87
95
|
|
88
96
|
MiscHacks.tempname_for '/foo/bar/baz' # => '/foo/bar/.baz.klyce3f517qkh9l'
|
89
97
|
|
90
|
-
|
98
|
+
try_n_times::
|
91
99
|
|
92
100
|
io = MiscHacks.try_n_times do
|
93
101
|
File.open path, File::RDWR|File::CREAT|File::EXCL
|
94
102
|
end
|
95
103
|
|
96
|
-
|
104
|
+
Exception#to_formatted_string::
|
97
105
|
|
98
106
|
begin
|
99
107
|
# Do something
|
@@ -101,14 +109,31 @@ ever use an untrusted variable as a command.
|
|
101
109
|
warn e.to_formatted_string
|
102
110
|
end
|
103
111
|
|
112
|
+
Random::
|
113
|
+
|
114
|
+
n = MiscHacks::RANDOM.exp 4 # 0 ≤ n < 2⁴
|
115
|
+
n = MiscHacks::RANDOM.float # 0.0 ≤ n < 1.0
|
116
|
+
n = MiscHacks::RANDOM.float 4 # 0.0 ≤ n < 4.0
|
117
|
+
n = MiscHacks::RANDOM.int 4 # 0 ≤ n < 4
|
118
|
+
|
119
|
+
Password::
|
120
|
+
|
121
|
+
# New password
|
122
|
+
password = MiscHacks::Password.new_from_password cleartext_from_user
|
123
|
+
store_in_database password.to_s # encrypted
|
124
|
+
|
125
|
+
# Verify password
|
126
|
+
password = MiscHacks::Password.new password_from_database
|
127
|
+
password =~ cleartext_from_user # ⇒ true/false
|
128
|
+
|
104
129
|
== REQUIREMENTS:
|
105
130
|
|
106
|
-
* POSIX sh
|
107
|
-
* A system that implements fork
|
131
|
+
* POSIX sh for the sh method
|
132
|
+
* A system that implements fork for some methods
|
108
133
|
|
109
134
|
== INSTALL:
|
110
135
|
|
111
|
-
* sudo gem install
|
136
|
+
* sudo gem install mischacks
|
112
137
|
|
113
138
|
== LICENSE:
|
114
139
|
|
data/Rakefile
CHANGED
@@ -28,12 +28,9 @@ begin
|
|
28
28
|
Jeweler::Tasks.new do |gemspec|
|
29
29
|
gemspec.name = "mischacks"
|
30
30
|
gemspec.summary = "Miscellaneous methods that may or may not be useful"
|
31
|
-
gemspec.description =
|
32
|
-
|
33
|
-
|
34
|
-
"Exception#to_formatted_string: Return a string that looks like how Ruby would dump an uncaught exception. " \
|
35
|
-
"Random: Generate various types of random numbers using SecureRandom. " \
|
36
|
-
"Password: A small wrapper for String#crypt that does secure salt generation and easy password verification."
|
31
|
+
gemspec.description = File.read(File.dirname(__FILE__)+'/README.txt').
|
32
|
+
sub(/.*^=+ DESCRIPTION[^\n]*\n*/m, '').
|
33
|
+
sub(/\n*^=.*/m, '')
|
37
34
|
gemspec.email = "devel@johan.kiviniemi.name"
|
38
35
|
gemspec.homepage = "http://johan.kiviniemi.name/software/mischacks/"
|
39
36
|
gemspec.authors = ["Johan Kiviniemi"]
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.1
|
data/lib/mischacks.rb
CHANGED
data/lib/mischacks/password.rb
CHANGED
@@ -19,14 +19,6 @@ require 'mischacks/password'
|
|
19
19
|
require 'set'
|
20
20
|
|
21
21
|
describe MiscHacks::Password do
|
22
|
-
def match expected
|
23
|
-
simple_matcher("match #{expected.inspect}") do |given, matcher|
|
24
|
-
matcher.failure_message = "expected #{given.inspect} to match #{expected.inspect}"
|
25
|
-
matcher.negative_failure_message = "expected #{given.inspect} not to match #{expected.inspect}"
|
26
|
-
given.match? expected
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
22
|
before :all do
|
31
23
|
@many = 1000
|
32
24
|
|
@@ -117,17 +109,29 @@ describe MiscHacks::Password do
|
|
117
109
|
end
|
118
110
|
end
|
119
111
|
|
120
|
-
describe '
|
112
|
+
describe '=~' do
|
121
113
|
it 'should verify whether the cleartext parameter matches the encrypted password' do
|
122
114
|
%w{foo bar baz}.each do |password|
|
123
115
|
pw = MiscHacks::Password.new_from_password password
|
124
|
-
pw.should
|
125
|
-
pw.should_not
|
126
|
-
pw.should_not
|
116
|
+
pw.should =~ password
|
117
|
+
pw.should_not =~ "#{password}x"
|
118
|
+
pw.should_not =~ ''
|
127
119
|
end
|
128
120
|
end
|
129
121
|
end
|
130
122
|
|
123
|
+
describe '==' do
|
124
|
+
it 'should verify whether the encrypted parameter matches the encrypted password' do
|
125
|
+
pw = MiscHacks::Password.new @encrypted
|
126
|
+
|
127
|
+
pw.should == @encrypted
|
128
|
+
pw.should == MiscHacks::Password.new(@encrypted)
|
129
|
+
|
130
|
+
pw.should_not == 'foo'
|
131
|
+
pw.should_not == MiscHacks::Password.new_from_password("#{@password}x")
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
131
135
|
describe 'to_s' do
|
132
136
|
it 'should return the encrypted password' do
|
133
137
|
MiscHacks::Password.new(@encrypted).to_s.should == @encrypted
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mischacks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Johan Kiviniemi
|
@@ -13,7 +13,29 @@ date: 2010-08-29 00:00:00 +03:00
|
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
16
|
-
description: "
|
16
|
+
description: "Miscellaneous methods that may or may not be useful.\n\n\
|
17
|
+
sh:: Safely pass untrusted parameters to sh scripts. Raise an exception if the\n\
|
18
|
+
script returns a non-zero value.\n\n\
|
19
|
+
fork_and_check:: Run a block in a forked process and raise an exception if the\n\
|
20
|
+
process returns a non-zero value.\n\n\
|
21
|
+
do_and_exit, do_and_exit!:: Run a block. If the block does not run exit!, a\n\
|
22
|
+
successful exec or equivalent, run exit(1) or exit!(1) ourselves. Useful to\n\
|
23
|
+
make sure a forked block either runs a successful exec or dies.\n\n\
|
24
|
+
Any exceptions from the block are printed to standard error.\n\n\
|
25
|
+
overwrite:: Safely replace a file. Writes to a temporary file and then moves it\n\
|
26
|
+
over the old file.\n\n\
|
27
|
+
tempname_for:: Generates an unique temporary path based on a filename. The\n\
|
28
|
+
generated filename resides in the same directory as the original one.\n\n\
|
29
|
+
try_n_times:: Retries a block of code until it succeeds or a maximum number of\n\
|
30
|
+
attempts (default 10) is exceeded.\n\n\
|
31
|
+
Exception#to_formatted_string:: Return a string that looks like how Ruby would\n\
|
32
|
+
dump an uncaught exception.\n\n\
|
33
|
+
IO#best_datasync:: Try fdatasync, falling back to fsync, falling back to flush.\n\n\
|
34
|
+
Random#exp:: Return a random integer 0 \xE2\x89\xA4 n < 2^argument (using SecureRandom).\n\n\
|
35
|
+
Random#float:: Return a random float 0.0 \xE2\x89\xA4 n < argument (using SecureRandom).\n\n\
|
36
|
+
Random#int:: Return a random integer 0 \xE2\x89\xA4 n < argument (using SecureRandom).\n\n\
|
37
|
+
Password:: A small wrapper for String#crypt that does secure salt generation\n\
|
38
|
+
and easy password verification."
|
17
39
|
email: devel@johan.kiviniemi.name
|
18
40
|
executables: []
|
19
41
|
|
@@ -25,7 +47,6 @@ files:
|
|
25
47
|
- .gitignore
|
26
48
|
- COPYING
|
27
49
|
- History.txt
|
28
|
-
- Manifest.txt
|
29
50
|
- README.txt
|
30
51
|
- Rakefile
|
31
52
|
- VERSION
|