h 1.1.2 → 2.0.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c2252b8ef1fd60b325187cc109d55b7877a737de
4
+ data.tar.gz: 86ec92d920c7ee56b6b810b38a36d3e9af5c4e59
5
+ SHA512:
6
+ metadata.gz: 60086b1404f5b51e36f2007f044780614693545a736990d826dfb03ae8f92498a8f741eb4f87eda8d0430868ed11a71d0e7ec3b1f81dac444887bf9bc3122737
7
+ data.tar.gz: 5ac7b4848c58bb7b4f4c2a110bd25974ee57661c2db0325cae63023712fd273bae49d3a3663a24408083c7913b282014896adb59a330397e45337eb2ac15a344
data/.env.example ADDED
@@ -0,0 +1 @@
1
+ STATIC_KEY=secret
data/.gitignore CHANGED
@@ -1,4 +1,5 @@
1
1
  *.gem
2
2
  .bundle
3
+ .env
3
4
  Gemfile.lock
4
5
  pkg/*
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.1.1
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - 2.1.0
5
+ - 2.1.1
data/Gemfile CHANGED
@@ -1,4 +1,9 @@
1
- source "http://rubygems.org"
1
+ source 'https://rubygems.org'
2
+
3
+ ruby '2.1.1'
2
4
 
3
- # Specify your gem's dependencies in h.gemspec
4
5
  gemspec
6
+
7
+ gem 'rake'
8
+ gem 'highline'
9
+ gem 'dotenv'
@@ -1,4 +1,4 @@
1
- Copyright (c) 2011, Cyril Wack <cyril@gosu.fr>
1
+ Copyright (c) 2011, Cyril Wack
2
2
 
3
3
  Permission to use, copy, modify, and/or distribute this software for any
4
4
  purpose with or without fee is hereby granted, provided that the above
data/README.md ADDED
@@ -0,0 +1,79 @@
1
+ H
2
+ =
3
+
4
+ Overview
5
+ --------
6
+
7
+ Very small cryptographic tool that generates on-the-fly custom message digests,
8
+ according to some parameters.
9
+
10
+ Why?
11
+ ----
12
+
13
+ Because I prefer to put makeup on passwords rather than yield them to Manager™.
14
+
15
+ Installation
16
+ ------------
17
+
18
+ $ gem install h
19
+
20
+ Configuration
21
+ -------------
22
+
23
+ H reads its configuration from the YAML `~/.h` file at initialization.
24
+ This file, which should be readable by its owner only, has four parameters:
25
+
26
+ * Max length: The maximum length of returned message digests.
27
+ * Radix: The number of unique digits that compose message digests.
28
+ * Encryption: A cryptographic hash function in Ruby's Digest module.
29
+ * Static key: Provides salted messages through concatenation.
30
+
31
+ Examples
32
+ --------
33
+
34
+ Generate a digest from the system:
35
+
36
+ $ h secret
37
+ t3dpe24xie3y74t
38
+
39
+ Because no configuration has been detected, this default file was created:
40
+
41
+ $ cat ~/.h
42
+ ---
43
+ max_length: 15
44
+ radix: 36
45
+ encryption: SHA1
46
+ static_key: foobar
47
+
48
+ Same operation, from Ruby:
49
+
50
+ irb(main):001:0> require "h"
51
+ true
52
+ irb(main):002:0> H::Generator.new.input "secret"
53
+ "t3dpe24xie3y74t"
54
+
55
+ To prevent your log display the message as a string, do not specify it at first.
56
+
57
+ $ h
58
+ Message: ******
59
+ t3dpe24xie3y74t
60
+
61
+ Example with the SHA2 cryptographic hash instead of SHA1, and a custom key:
62
+
63
+ $ echo "{max_length: 15, radix: 36, encryption: SHA2, static_key: sun}" > ~/.h
64
+ $ h secret
65
+ 5gumh4smv1iit23
66
+
67
+ And now a useless test, with conventional parameters. You can Google the result.
68
+
69
+ $ echo "{max_length: 40, radix: 16, encryption: SHA1, static_key: ''}" > ~/.h
70
+ $ h "The quick brown fox jumps over the lazy dog"
71
+ 2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
72
+
73
+ Code Status
74
+ -----------
75
+
76
+ * [![Build Status](https://secure.travis-ci.org/cyril/h.png)](http://travis-ci.org/cyril/h)
77
+ * [![Dependencies Status](https://gemnasium.com/cyril/h.png?travis)](https://gemnasium.com/cyril/h)
78
+
79
+ Copyright (c) 2011 Cyril Wack, released under the ISC license
data/Rakefile CHANGED
@@ -1,12 +1,7 @@
1
- require 'bundler'
2
- Bundler::GemHelper.install_tasks
3
-
1
+ require 'bundler/gem_tasks'
4
2
  require 'rake/testtask'
5
3
 
6
4
  Rake::TestTask.new do |t|
7
- t.libs << 'lib'
8
- t.libs << 'test'
9
- t.test_files = FileList["test/**/*_{helper,test}.rb"]
10
5
  end
11
6
 
12
- task :default => :test
7
+ task default: :test
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
- :major: 1
3
- :minor: 1
4
- :patch: 2
2
+ :major: 2
3
+ :minor: 0
4
+ :patch: 0
data/bin/h CHANGED
@@ -4,8 +4,14 @@ require 'h'
4
4
 
5
5
  h = H::Generator.new
6
6
 
7
- if ARGV.first.nil?
8
- puts h.prompt
7
+ result = if ARGV.first
8
+ if ARGV[1]
9
+ h.input ARGV[0], ARGV[1].to_i
10
+ else
11
+ h.input ARGV[0]
12
+ end
9
13
  else
10
- puts h.input ARGV.first
14
+ h.prompt
11
15
  end
16
+
17
+ puts result
data/h.gemspec CHANGED
@@ -1,24 +1,26 @@
1
1
  # encoding: utf-8
2
2
 
3
+ require 'yaml'
4
+
3
5
  Gem::Specification.new do |s|
4
- s.name = "h"
5
- s.version = YAML.load_file("VERSION.yml").values.join('.')
6
+ s.name = 'h'
7
+ s.version = YAML.load_file('VERSION.yml').values.join('.')
6
8
  s.platform = Gem::Platform::RUBY
7
- s.authors = ["Cyril Wack"]
8
- s.email = ["contact@cyril.io"]
9
- s.homepage = "http://github.com/cyril/h"
9
+ s.authors = ['Cyril Wack']
10
+ s.email = ['contact@cyril.io']
11
+ s.homepage = 'https://github.com/cyril/h'
10
12
  s.summary = %q{Custom hash generator}
11
13
  s.description = %q{A quick tool for those who prefer to put makeup on passwords rather than yield them to Manager™}
12
14
 
13
15
  s.rubyforge_project = 'h'
14
16
 
15
- s.bindir = 'bin'
16
- s.executables = ['h']
17
+ s.bindir = 'bin'
18
+ s.executables = ['h']
17
19
 
18
20
  s.add_dependency 'highline'
19
21
 
20
22
  s.files = `git ls-files`.split("\n")
21
23
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
22
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
23
- s.require_paths = ["lib"]
24
+ s.executables = `git ls-files -- bin/*`.split("\n").map {|f| File.basename(f) }
25
+ s.require_paths = ['lib']
24
26
  end
data/lib/h.rb CHANGED
@@ -1,50 +1,33 @@
1
- require 'digest'
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
4
+ Bundler.require
5
+
2
6
  require 'highline/import'
3
- require 'yaml'
7
+ require 'digest'
8
+ require 'dotenv'
9
+ Dotenv.load
4
10
 
5
11
  module H
6
12
  class Generator
7
- CONF_PATH = File.join(File.expand_path('~'), '.h')
8
-
9
- def initialize(options = {})
10
- unless File.exists?(CONF_PATH)
11
- File.open(CONF_PATH, 'w') do |f|
12
- YAML.dump({ 'encryption' => 'SHA1',
13
- 'static_key' => 'foobar',
14
- 'max_length' => 15,
15
- 'radix' => 36 }, f)
16
- end
17
-
18
- File.chmod(0600, CONF_PATH)
19
- end
20
-
21
- @params = YAML.load_file(CONF_PATH)
22
- @params.update(options)
23
- @params.freeze
13
+ def prompt
14
+ input ask('Message: ') {|q| q.echo = '*' }
24
15
  end
25
16
 
26
- def input(message)
27
- m = message + @params['static_key']
17
+ def input(m, l = 44)
18
+ m = m + ENV.fetch('STATIC_KEY')
28
19
  d = cryptographic_hash(m)
29
- truncate codage(d)
30
- end
31
-
32
- def prompt
33
- input ask('Message: ') {|q| q.echo = '*' }
20
+ truncate d, l
34
21
  end
35
22
 
36
23
  protected
37
24
 
38
- def codage(hexdigest)
39
- hexdigest.to_i(16).to_s(@params['radix'])
40
- end
41
-
42
25
  def cryptographic_hash(message)
43
- Digest.class_eval(@params['encryption']).hexdigest(message)
26
+ Digest::SHA2.base64digest(message).tr('+/', '-_')
44
27
  end
45
28
 
46
- def truncate(string)
47
- string[0, @params['max_length']]
29
+ def truncate(string, length)
30
+ string[0, length]
48
31
  end
49
32
  end
50
33
  end
@@ -1,2 +1,4 @@
1
1
  require 'h'
2
2
  require 'minitest/autorun'
3
+
4
+ ENV['STATIC_KEY'] = 'secret-key-here'
data/test/test_h.rb ADDED
@@ -0,0 +1,12 @@
1
+ require_relative '_test_helper'
2
+
3
+ class HTest < MiniTest::Unit::TestCase
4
+ def setup
5
+ @h = H::Generator.new
6
+ end
7
+
8
+ def test_h
9
+ assert_equal @h.input('p@ssw0rd'), 'SdsRrcHHSpJvfhkPM8Np047CocaWRQ2nzPYEw9qWYIo='
10
+ assert_equal @h.input('p@ssw0rd', 8), 'SdsRrcHH'
11
+ end
12
+ end
metadata CHANGED
@@ -1,76 +1,75 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: h
3
- version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 1.1.2
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.0
6
5
  platform: ruby
7
- authors:
6
+ authors:
8
7
  - Cyril Wack
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
-
13
- date: 2011-08-29 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
11
+ date: 2014-04-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
16
14
  name: highline
17
- prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
19
- none: false
20
- requirements:
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
21
17
  - - ">="
22
- - !ruby/object:Gem::Version
23
- version: "0"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
24
20
  type: :runtime
25
- version_requirements: *id001
26
- description: "A quick tool for those who prefer to put makeup on passwords rather than yield them to Manager\xE2\x84\xA2"
27
- email:
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: A quick tool for those who prefer to put makeup on passwords rather than
28
+ yield them to Manager™
29
+ email:
28
30
  - contact@cyril.io
29
- executables:
31
+ executables:
30
32
  - h
31
33
  extensions: []
32
-
33
34
  extra_rdoc_files: []
34
-
35
- files:
36
- - .gitignore
37
- - .rvmrc
35
+ files:
36
+ - ".env.example"
37
+ - ".gitignore"
38
+ - ".ruby-version"
39
+ - ".travis.yml"
38
40
  - Gemfile
39
- - ISC-LICENSE
40
- - README.rdoc
41
+ - ISC-LICENSE.md
42
+ - README.md
41
43
  - Rakefile
42
44
  - VERSION.yml
43
45
  - bin/h
44
46
  - h.gemspec
45
47
  - lib/h.rb
46
- - test/h_test.rb
47
- - test/test_helper.rb
48
- homepage: http://github.com/cyril/h
48
+ - test/_test_helper.rb
49
+ - test/test_h.rb
50
+ homepage: https://github.com/cyril/h
49
51
  licenses: []
50
-
52
+ metadata: {}
51
53
  post_install_message:
52
54
  rdoc_options: []
53
-
54
- require_paths:
55
+ require_paths:
55
56
  - lib
56
- required_ruby_version: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
59
  - - ">="
60
- - !ruby/object:Gem::Version
61
- version: "0"
62
- required_rubygems_version: !ruby/object:Gem::Requirement
63
- none: false
64
- requirements:
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
+ requirements:
65
64
  - - ">="
66
- - !ruby/object:Gem::Version
67
- version: "0"
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
68
67
  requirements: []
69
-
70
68
  rubyforge_project: h
71
- rubygems_version: 1.8.9
69
+ rubygems_version: 2.2.2
72
70
  signing_key:
73
- specification_version: 3
71
+ specification_version: 4
74
72
  summary: Custom hash generator
75
- test_files: []
76
-
73
+ test_files:
74
+ - test/_test_helper.rb
75
+ - test/test_h.rb
data/.rvmrc DELETED
@@ -1 +0,0 @@
1
- rvm ruby-1.9.2@h
data/README.rdoc DELETED
@@ -1,67 +0,0 @@
1
- = H
2
-
3
- == Overview
4
-
5
- Very small cryptographic tool that generates on-the-fly custom message digests,
6
- according to some parameters.
7
-
8
- == Why?
9
-
10
- Because I prefer to put makeup on passwords rather than yield them to Manager™.
11
-
12
- == Installation
13
-
14
- gem install h
15
-
16
- == Configuration
17
-
18
- H reads its configuration from the YAML <tt>~/.h</tt> file at initialization.
19
- This file, which should be readable by its owner only, has four parameters:
20
-
21
- * Max length: The maximum length of returned message digests.
22
- * Radix: The number of unique digits that compose message digests.
23
- * Encryption: A cryptographic hash function in Ruby's Digest module.
24
- * Static key: Provides salted messages through concatenation.
25
-
26
- == Examples
27
-
28
- Generate a digest from the system:
29
-
30
- $ h secret
31
- t3dpe24xie3y74t
32
-
33
- Because no configuration has been detected, this default file was created:
34
-
35
- $ cat ~/.h
36
- ---
37
- max_length: 15
38
- radix: 36
39
- encryption: SHA1
40
- static_key: foobar
41
-
42
- Same operation, from Ruby:
43
-
44
- irb(main):001:0> require "h"
45
- true
46
- irb(main):002:0> H::Generator.new.input "secret"
47
- "t3dpe24xie3y74t"
48
-
49
- To prevent your log display the message as a string, do not specify it at first.
50
-
51
- $ h
52
- Message: ******
53
- t3dpe24xie3y74t
54
-
55
- Example with the SHA2 cryptographic hash instead of SHA1, and a custom key:
56
-
57
- $ echo "{max_length: 15, radix: 36, encryption: SHA2, static_key: sun}" > ~/.h
58
- $ h secret
59
- 5gumh4smv1iit23
60
-
61
- And now a useless test, with conventional parameters. You can Google the result.
62
-
63
- $ echo "{max_length: 40, radix: 16, encryption: SHA1, static_key: ''}" > ~/.h
64
- $ h "The quick brown fox jumps over the lazy dog"
65
- 2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
66
-
67
- Copyright (c) 2011 Cyril Wack, released under the ISC license
data/test/h_test.rb DELETED
@@ -1,25 +0,0 @@
1
- require 'test_helper'
2
-
3
- class HTest < MiniTest::Unit::TestCase
4
- def setup
5
- @h = H::Generator.new({ 'encryption' => 'SHA1',
6
- 'static_key' => 'foobar',
7
- 'max_length' => 15,
8
- 'radix' => 36 })
9
- @my_h = H::Generator.new({ 'encryption' => 'SHA2',
10
- 'static_key' => 'sun',
11
- 'max_length' => 15,
12
- 'radix' => 36 })
13
- @sha1 = H::Generator.new({ 'encryption' => 'SHA1',
14
- 'static_key' => '',
15
- 'max_length' => 40,
16
- 'radix' => 16 })
17
- end
18
-
19
- def test_h
20
- assert_equal @h.input('secret'), 't3dpe24xie3y74t'
21
- assert_equal @my_h.input('secret'), '5gumh4smv1iit23'
22
- assert_equal @sha1.input('The quick brown fox jumps over the lazy dog'),
23
- '2fd4e1c67a2d28fced849ee1bb76e7391b93eb12'
24
- end
25
- end