daphne_util 0.0.1 → 0.2.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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MDc4OGFiNGE1OWQ3YjllMTgxMjU1NTFmMzY3YzBkZTdkYTJmYjFmNA==
4
+ NTlhNjE2YzhiMGNlYjFhOTNhZWY5ZjY3NWYxZGE0NDA1MTZiZmM5Ng==
5
5
  data.tar.gz: !binary |-
6
- MTU2N2NlNTcwOTQ3YjU4OTJjYmViYTIwNWMzY2JkYzkzZjkzNGJlOA==
7
- !binary "U0hBNTEy":
6
+ ZDcwYTI3NTM0Y2VkZjlkN2NjODYwYzE5NzhmODliNWUxMjg1MDNkZQ==
7
+ SHA512:
8
8
  metadata.gz: !binary |-
9
- NTBkOTc4NGExZTJjOTIyODhlMDFkMjM1ZTBlZDhkNzZlODEzMzcyMDFmY2E1
10
- YTNjMDg1Yjk1NjI2NWM2NjUzNjE0OGQ0ZjE5NTdjODEzZTMxMzg0YWRmNzQy
11
- NGEwMmNjMTUyZTc4MWE2ZDVhYmEwNDU2OGYxYmI5N2Q1MzU4N2Y=
9
+ YTZiNmI2NDYwOWExMWI2MDA1NmI4ZTQyMTM1NWU4NTg3YzM3NWM4OTE4YzA4
10
+ ZGJlYjI0MjZkYmFhNjU1MDExYTFhNDk0NzU5ZTBkZTI0NGE4ZDM2YjY0M2Rm
11
+ NWM5MmY3YjNhNDgxNmMwMDc4M2I1ZTI4OWJlZWQ3MmRlZmZhNjQ=
12
12
  data.tar.gz: !binary |-
13
- YWZlYjk3ZGYyY2QyODhiMGVhNjZjM2Y3OTVjNGE2MjZiMzliNWRjMjFjMzll
14
- YmIxNzIzNTI0YTA5MWNkZjc1YjA0M2EzNmZmMmViZDU2YmNiOWIyYmVhZmRk
15
- YzEzMDc1NWIzY2E5ZWViYjgxMWU5OGVjYjE2YzgyZTlkY2FkODQ=
13
+ N2UyMDk4ZWQ2YTY4NzMyZWUzYTMyZWE3MjY1Njg4OTUzOWE2ZGYzNzcwMDlk
14
+ MDM0ZDJmNzNlMjhiNDZmNTAwOWZhYWQ0ZDUzZDlhYmIyMjY4YTljODM4NmRl
15
+ MjQzNzlkMWJlZWMyZTEzZDc2OTA4YmNiYTEzYTM0M2M4MDZiNGY=
data/CHANGES.md ADDED
@@ -0,0 +1,3 @@
1
+ # 0.1.0 / 2014-02-06 / Grady Griffin
2
+
3
+ * adding api key generator
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # DaphneUtil
2
2
 
3
- A pseudorandom credential generator to create/distribute application credentials
3
+ A pseudorandom credential generator to create/distribute application credentials and command line client for Daphne
4
4
 
5
5
  ## Installation
6
6
 
@@ -14,7 +14,12 @@ And then execute:
14
14
 
15
15
  Or install it yourself as:
16
16
 
17
- $ gem install daphne_util
17
+ $ git clone git@github.com:MTNSatelliteComm/daphne_util.git
18
+ $ cd daphne_util
19
+ $ gem build daphne_util.gemspec
20
+ $ gem install daphne_util-0.2.0.gem
21
+
22
+ Keep in mind the version may need to match the version created by gem build
18
23
 
19
24
  ## CLI Usage
20
25
 
@@ -22,6 +27,8 @@ daphne_client_id arg1[,arg2[,argN]]
22
27
 
23
28
  daphne_client_secret arg1[,arg2[,argN]]
24
29
 
30
+ daphne_client_api_key arg1[,arg2[,argN]]
31
+
25
32
  ## Ruby App Usage
26
33
 
27
34
 
@@ -29,7 +36,7 @@ DaphneUtil::IdGenerator.generate(arg1[,arg2[,argN]])
29
36
 
30
37
  DaphneUtil::SecretGenerator.generate(arg1[,arg2[,argN]])
31
38
 
32
-
39
+ DaphneUtil::ApiKeyGenerator.generate(arg1[,arg2[,argN]])
33
40
 
34
41
 
35
42
  ### CLI Example
@@ -40,6 +47,9 @@ DaphneUtil::SecretGenerator.generate(arg1[,arg2[,argN]])
40
47
  $ daphne_client_secret aname aplace athing
41
48
  60934d2dd5069fd4f39550f90cde5b39e0337c91211eb9d8a01174563698fd32
42
49
 
50
+ $ daphne_client_api_key aname aplace athing
51
+ application-key-0079d3f97d0c27b457e428f86fa4f4cd910e2bd3f25b82716dcdc7301a312d35
52
+
43
53
  ### Ruby Code Example
44
54
 
45
55
  ```
@@ -51,6 +61,9 @@ DaphneUtil.generate_id("aname","aplace","athing")
51
61
  DaphneUtil.generate_secret("aname","aplace","athing")
52
62
  #60934d2dd5069fd4f39550f90cde5b39e0337c91211eb9d8a01174563698fd32
53
63
 
64
+ DaphneUtil.generate_api_key("aname","aplace","athing")
65
+ application-key-0079d3f97d0c27b457e428f86fa4f4cd910e2bd3f25b82716dcdc7301a312d35
66
+
54
67
 
55
68
  #extending a class
56
69
 
@@ -63,8 +76,46 @@ Foo.generate_id("aname","aplace","athing")
63
76
 
64
77
  Foo.generate_secret("aname","aplace","athing")
65
78
  #60934d2dd5069fd4f39550f90cde5b39e0337c91211eb9d8a01174563698fd32
79
+
80
+ Foo.generate_api_key("aname","aplace","athing")
81
+ application-key-0079d3f97d0c27b457e428f86fa4f4cd910e2bd3f25b82716dcdc7301a312d35
66
82
  ```
67
83
 
84
+ ### Example using the Daphne client
85
+
86
+ create an environment
87
+
88
+ $ daphne create env my_env_name http://my_env_target.com
89
+
90
+ create application credentials
91
+
92
+ $ daphne creds a_pre_loaded_app value1 value2
93
+
94
+ create an application token
95
+
96
+ $ daphne create token a_pre_loaded_app
97
+
98
+ if there are no preloaded app app uid and secret can create a token. if that is accompanied with email and password a resource owner token associated to the application is created.
99
+
100
+ set the token for this environment
101
+
102
+ $ daphne token dba23d73388e1326cb461f4410fe4ce73667e5ccecd6911341b7af1af9173d9a
103
+
104
+ verify the token
105
+
106
+ $ daphne verify token dba23d73388e1326cb461f4410fe4ce73667e5ccecd6911341b7af1af9173d9a
107
+
108
+ with a token with api access you can create/modify/delete/view Daphne resources
109
+
110
+ $ daphne create resource_owner email=an_email@email.com entity_id=an_id password=password
111
+
112
+ $ daphne update resource_owner an_email@email.com password=new_password
113
+
114
+ use daphne help command to see the usage information
115
+
116
+ $ daphne help
117
+
118
+
68
119
 
69
120
 
70
121
  ## Contributing
data/bin/daphne ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+ begin
3
+ require 'daphne_util'
4
+ rescue LoadError
5
+ require 'rubygems'
6
+ require 'daphne_util'
7
+ end
8
+
9
+ include DaphneUtil::Tools
10
+
11
+ execute(*ARGV)
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ begin
3
+ require 'daphne_util'
4
+ rescue LoadError
5
+ require 'rubygems'
6
+ require 'daphne_util'
7
+ end
8
+
9
+ if ARGV.length == 0
10
+ puts "Please include at least one argument"
11
+ else
12
+ puts DaphneUtil::ApiKeyGenerator.generate(*ARGV)
13
+ end
data/daphne_util.gemspec CHANGED
@@ -18,6 +18,8 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
+ spec.add_runtime_dependency "rest-client", "~>1.6.7"
22
+
21
23
  spec.add_development_dependency "bundler", "~> 1.3"
22
24
  spec.add_development_dependency "rake"
23
25
  spec.add_development_dependency "rspec"
data/lib/daphne_util.rb CHANGED
@@ -3,7 +3,9 @@ require "digest"
3
3
  require "daphne_util/version"
4
4
  require "daphne_util/id_generator"
5
5
  require "daphne_util/secret_generator"
6
+ require "daphne_util/api_key_generator"
6
7
  require "daphne_util/errors"
8
+ require "daphne_util/tools"
7
9
 
8
10
 
9
11
  module DaphneUtil
@@ -15,7 +17,11 @@ module DaphneUtil
15
17
  end
16
18
 
17
19
  def self.apps
18
- ['seanet', 'poseidon', 'apollo']
20
+ ['seanet', 'poseidon', 'apollo', 'ics']
21
+ end
22
+
23
+ def self.prefix(val)
24
+ apps.include?(val.to_s.strip.downcase) ? val : "application"
19
25
  end
20
26
 
21
27
  def self.salt=(val)
@@ -30,6 +36,10 @@ module DaphneUtil
30
36
  DaphneUtil::SecretGenerator.generate(*seed)
31
37
  end
32
38
 
39
+ def self.generate_api_key(*seed)
40
+ DaphneUtil::ApiKeyGenerator.generate(*seed)
41
+ end
42
+
33
43
  def generate_id(*seed)
34
44
  DaphneUtil::IdGenerator.generate(*seed)
35
45
  end
@@ -38,4 +48,8 @@ module DaphneUtil
38
48
  DaphneUtil::SecretGenerator.generate(*seed)
39
49
  end
40
50
 
51
+ def generate_api_key(*seed)
52
+ DaphneUtil::ApiKeyGenerator.generate(*seed)
53
+ end
54
+
41
55
  end
@@ -0,0 +1,19 @@
1
+ module DaphneUtil
2
+ module ApiKeyGenerator
3
+
4
+ def self.generate(*seed)
5
+ seed_string = seed.compact.join("-")
6
+ hashes = (0..1).to_a.map {|x| Digest::MD5.hexdigest("api_key=#{seed_string}#{DaphneUtil.salt}#{x}")}
7
+
8
+ hashes.unshift("-key-")
9
+ hashes.unshift(DaphneUtil.prefix(seed.first))
10
+
11
+ hashes.join
12
+ end
13
+
14
+ def generate(seed)
15
+ DaphneUtil::SecretGenerator.generate(seed)
16
+ end
17
+
18
+ end
19
+ end
@@ -1 +1,3 @@
1
- class SaltUndefined < StandardError; end
1
+ class SaltUndefined < StandardError; end
2
+
3
+ class IncorrectUsage < StandardError; end
@@ -5,7 +5,7 @@ module DaphneUtil
5
5
  seed_string = seed.compact.join("-")
6
6
  hashes = (0..4).to_a.map {|x| Digest::MD5.hexdigest("client_id=#{seed_string}#{DaphneUtil.salt}#{x}")}
7
7
 
8
- prefix = DaphneUtil.apps.include?(seed[0]) ? seed[0] : "application"
8
+ prefix = DaphneUtil.prefix(seed[0])
9
9
 
10
10
  [
11
11
  prefix,
@@ -0,0 +1,399 @@
1
+ module DaphneUtil
2
+ module Tools
3
+
4
+ require "pstore"
5
+ require "cgi"
6
+ require "json"
7
+ require "rest-client"
8
+
9
+ class Store
10
+
11
+ attr_reader :loaded, :env
12
+
13
+ def self.file_location
14
+ "#{File.expand_path('~')}/.daphne"
15
+ end
16
+
17
+ def self.default_version
18
+ "1"
19
+ end
20
+
21
+ def initialize
22
+ @loaded = PStore.new(self.class.file_location, true)
23
+ save
24
+ end
25
+
26
+ def env=(x_env)
27
+ x_env = x_env.to_sym
28
+ loaded.transaction do
29
+ loaded[:envs].has_key?(x_env) ? (loaded[:env] = x_env) : x_env = nil
30
+ end
31
+
32
+ save
33
+ end
34
+
35
+ def add_env(name, x_url)
36
+ new_env = {
37
+ url: x_url,
38
+ version: self.class.default_version,
39
+ apps: {}
40
+ }
41
+
42
+ loaded.transaction { loaded[:envs][name.to_sym] = new_env }
43
+ save
44
+ self.env = name.to_sym
45
+ loaded.transaction { loaded[:envs][name.to_sym] }
46
+ end
47
+
48
+ def rm_env(name)
49
+ loaded.transaction do
50
+
51
+ loaded[:envs].delete(name.to_sym)
52
+ loaded[:env] = nil if loaded[:envs][env].nil?
53
+ end
54
+ save
55
+ loaded.transaction { loaded[:envs][env] }
56
+ end
57
+
58
+ def url
59
+ loaded.transaction { loaded[:envs][env][:url] }
60
+ end
61
+
62
+ def url=(x_url)
63
+ loaded.transaction do
64
+ old_env = loaded[:envs][env]
65
+ new_env = old_env.merge(url: x_url)
66
+
67
+ loaded[:envs][env] = new_env
68
+ end
69
+
70
+ save
71
+ loaded.transaction { loaded[:envs][env][:url] }
72
+ end
73
+
74
+ def token
75
+ loaded.transaction { loaded[:envs][env][:token] }
76
+ end
77
+
78
+ def token=(x_token)
79
+ loaded.transaction do
80
+ old_env = loaded[:envs][env]
81
+ new_env = old_env.merge(token: x_token)
82
+
83
+ loaded[:envs][env] = new_env
84
+ end
85
+
86
+ save
87
+ loaded.transaction {loaded[:envs][env][:token]}
88
+ end
89
+
90
+ def version
91
+ loaded.transaction { loaded[:envs][env][:version] }
92
+ end
93
+
94
+ def version=(x_version)
95
+ loaded.transaction do
96
+ old_env = loaded[:envs][env]
97
+ new_env = old_env.merge(version: (x_version.scan(/\d+/).first || self.class.default_version))
98
+
99
+ loaded[:envs][env] = new_env
100
+ end
101
+
102
+ save
103
+ loaded.transaction {loaded[:envs][env][:version]}
104
+ end
105
+
106
+ def add_app(name, *seed)
107
+ new_app = {name.to_sym => seed}
108
+ loaded.transaction do
109
+ old_apps = loaded[:envs][env][:apps]
110
+ new_apps = old_apps.merge(new_app)
111
+ loaded[:envs][env][:apps] = new_apps
112
+ end
113
+
114
+ save
115
+ loaded.transaction {loaded[:envs][env][:apps]}
116
+ end
117
+
118
+ def rm_app(name)
119
+ loaded.transaction do
120
+ old_env = loaded[:envs][env]
121
+ new_env = old_env[:apps].delete(name.to_sym)
122
+ end
123
+
124
+ save
125
+
126
+ loaded.transaction { loaded[:envs][name.to_sym] }
127
+ end
128
+
129
+ def apps
130
+ loaded.transaction { loaded[:envs][env][:apps]}
131
+ end
132
+
133
+ def app_keys
134
+ apps.keys
135
+ end
136
+
137
+ private
138
+
139
+ def save
140
+ loaded.transaction do
141
+ loaded[:env] ||= :local
142
+ loaded[:envs] ||= {}
143
+ loaded[:envs][:local] ||= {url: "localhost:3001", version: "1", apps: {} }
144
+ @env = loaded[:env]
145
+ loaded.commit
146
+ end
147
+ end
148
+
149
+ end
150
+
151
+ def store
152
+ @store ||= Store.new
153
+ end
154
+
155
+ def env
156
+ %{ Environment #{store.env} :
157
+ - url : #{store.url}
158
+ - version : #{store.version}
159
+ - token : #{store.token || 'No token set'}
160
+ Credentials : #{apps}}
161
+ end
162
+
163
+ def app(k, v = nil)
164
+ k = k.to_s.to_sym
165
+ v ||= store.apps[k]
166
+ seed = [k] + v
167
+ %{
168
+ #{k} : #{v.join(',')}
169
+ - uid : #{DaphneUtil.generate_id(*seed)}
170
+ - secret : #{DaphneUtil.generate_secret(*seed)}
171
+ - api_key : #{DaphneUtil.generate_api_key(*seed)}
172
+ }
173
+ end
174
+
175
+ def apps
176
+ return 'None' if store.apps.empty?
177
+ store.apps.collect {|k,v| app(k,v) }.join("\n")
178
+ end
179
+
180
+ def token
181
+ store.token
182
+ end
183
+
184
+ def usage
185
+ %{Environments
186
+ create env <name> <url>
187
+ delete env <name>
188
+ get env
189
+ env
190
+ Application Credentials
191
+ create creds <name> [arg1, [arg2, [arg3] ...]]
192
+ Token
193
+ token [string]
194
+ verify <string>
195
+ create token <creds name>
196
+ create token <app uid> <app secret>
197
+ create token <creds name> <email> <password>
198
+ create token <app uid> <app secret> <email> <password>
199
+ Url
200
+ url [string]
201
+ Application
202
+ create app <attr1>=<value1> <attr2>=<value2> <attr3>=<value3>
203
+ update app <uid or composite id> <attr1>=<value1> <attr2>=<value2> <attr3>=<value3>
204
+ delete app <uid or composite id>
205
+ get app <uid or composite id>
206
+ Resource Owner
207
+ create resource_owmer <attr1>=<value1> <attr2>=<value2> <attr3>=<value3>
208
+ update resource_owmer <uid or composite id or email> <attr1>=<value1> <attr2>=<value2> <attr3>=<value3>
209
+ delete resource_owmer <uid or composite id or email>
210
+ get resource_owmer <uid or composite id or email>
211
+ }
212
+ end
213
+
214
+ def api_domain
215
+ "#{store.url}/api/v#{store.version}"
216
+ end
217
+
218
+ def oauth_domain
219
+ "#{store.url}/oauth2/v#{store.version}"
220
+ end
221
+
222
+ def to_payload(args)
223
+ r = CGI.parse(args.join('&'))
224
+ Hash[*r.to_a.flatten]
225
+ end
226
+
227
+ def output(str)
228
+ puts JSON.pretty_generate(JSON.parse(str))
229
+ end
230
+
231
+ def resource_mapping(key)
232
+ {
233
+ resource_owner: "resource_owners",
234
+ application: "applications"
235
+ }[key.to_s.to_sym]
236
+ end
237
+
238
+ def create_api_resource(resource_type, payload)
239
+ raise IncorrectUsage unless resource_type && payload
240
+ RestClient.post("#{api_domain}/#{resource_mapping(resource_type)}", {resource_type => payload}, authorization: "Bearer #{token}")
241
+ end
242
+
243
+ def update_api_resource(resource_type, identifier, payload)
244
+ raise IncorrectUsage unless payload && identifier
245
+ RestClient.put("#{api_domain}/#{resource_mapping(resource_type)}/#{identifier}", {resource_type => payload}, authorization: "Bearer #{token}")
246
+ end
247
+
248
+ def delete_api_resource(resource_type, identifier)
249
+ raise IncorrectUsage unless identifier
250
+ RestClient.delete("#{api_domain}/#{resource_mapping(resource_type)}/#{identifier}", authorization: "Bearer #{token}")
251
+ end
252
+
253
+ def retrieve_api_resource(resource_type, identifier)
254
+ raise IncorrectUsage unless identifier
255
+ RestClient.get("#{api_domain}/#{resource_mapping(resource_type)}/#{identifier}", authorization: "Bearer #{token}")
256
+ end
257
+
258
+ def create_token(*args)
259
+ raise IncorrectUsage if args.empty?
260
+ params = {grant_type: "client_credentials"}
261
+ case args.length
262
+ when 1
263
+ if store.app_keys.include?(args.first.to_sym)
264
+ seed = [args.first] + store.apps[args.first.to_sym]
265
+ params[:client_id] = DaphneUtil.generate_id(*seed)
266
+ params[:client_secret] = DaphneUtil.generate_secret(*seed)
267
+ else
268
+ raise IncorrectUsage
269
+ end
270
+ when 2
271
+ params[:client_id] = args[0]
272
+ params[:client_secret] = args[1]
273
+ when 3
274
+ raise IncorrectUsage
275
+ else
276
+ params[:grant_type] = "password"
277
+ params[:client_id] = args[0]
278
+ params[:client_secret] = args[1]
279
+ params[:email] = args[2]
280
+ params[:password] = args[3]
281
+ end
282
+
283
+ RestClient.post("#{oauth_domain}/token", params)
284
+ end
285
+
286
+ def verify_token(val)
287
+ raise IncorrectUsage if val.to_s.empty?
288
+ RestClient.post("#{oauth_domain}/verify?access_token=#{val}")
289
+ end
290
+
291
+ def create_env(name, url)
292
+ raise IncorrectUsage unless url && name
293
+ store.add_env(name, url)
294
+ end
295
+
296
+ def delete_env(name)
297
+ raise IncorrectUsage unless name
298
+ store.rm_env(name)
299
+ end
300
+
301
+ def create_app(name, *args)
302
+ raise IncorrectUsage unless name
303
+ store.add_app(name, *args)
304
+ end
305
+
306
+ def delete_app(name)
307
+ raise IncorrectUsage unless name
308
+ store.add_app(name)
309
+ end
310
+
311
+ def execute(*argv)
312
+ raise IncorrectUsage if argv.empty?
313
+
314
+ action, resource, args = argv[0], argv[1].to_s.to_sym, argv[2..-1].to_a
315
+
316
+ case action
317
+ when "create" then create(resource, *args)
318
+ when "update" then update(resource, *args)
319
+ when "delete" then delete(resource, *args)
320
+ when "get" then retrieve(resource, *args)
321
+ when "verify" then verify_token(args[1])
322
+ when "env" then retrieve(:env)
323
+ when "help" then puts usage
324
+ when "token"
325
+ argv[1] ? update(:token, argv[1]) : retrieve(:token)
326
+ when "url"
327
+ argv[1] ? update(:url, argv[1]) : retrieve(:url)
328
+ else raise IncorrectUsage
329
+ end
330
+ rescue IncorrectUsage
331
+ puts usage
332
+ rescue RestClient::Exception => e
333
+ puts "Error :"
334
+ e.is_a?(RestClient::InternalServerError) ? (raise e) : output(e.response)
335
+ end
336
+
337
+ def create(resource, *args)
338
+ case resource
339
+ when :resource_owner, :application, :app
340
+ rtn = create_api_resource(resource, to_payload(args))
341
+ output(rtn)
342
+ when :token
343
+ rtn = create_token(*args)
344
+ output(rtn)
345
+ when :env
346
+ rtn = create_env(args[0], args[1])
347
+ puts env
348
+ when :creds
349
+ create_app(args[0], *args[1..-1])
350
+ puts env
351
+ else raise IncorrectUsage
352
+ end
353
+ end
354
+
355
+ def update(resource, *args)
356
+ case resource
357
+ when :resource_owner, :application, :app
358
+ rtn = update_api_resource(resource, args[0], to_payload(args[1..-1]))
359
+ output(rtn)
360
+ when :token
361
+ store.token = args.first
362
+ puts env
363
+ when :url
364
+ store.url = args.first
365
+ puts env
366
+ else raise IncorrectUsage
367
+ end
368
+ end
369
+
370
+ def delete(resource, *args)
371
+ case resource
372
+ when :resource_owner, :application, :app
373
+ rtn = delete_api_resource(resource, args.first)
374
+ output(rtn)
375
+ when :env
376
+ store.rm_env(args.first)
377
+ puts env
378
+ when :creds
379
+ store.rm_app(args.first)
380
+ puts env
381
+ else raise IncorrectUsage
382
+ end
383
+ end
384
+
385
+ def retrieve(resource, *args)
386
+ case resource
387
+ when :resource_owner, :application
388
+ rtn = retrieve_api_resource(resource, args.first)
389
+ output(rtn)
390
+ when :token
391
+ puts(store.token ? store.token : "Token not configured for this environment.")
392
+ when :env
393
+ puts env
394
+ else raise IncorrectUsage
395
+ end
396
+ end
397
+
398
+ end
399
+ end
@@ -1,8 +1,8 @@
1
1
  module DaphneUtil
2
2
  module VERSION
3
3
  MAJOR = 0
4
- MINOR = 0
5
- TINY = 1
4
+ MINOR = 2
5
+ TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'ApiKeyGenerator#generate' do
4
+
5
+ before(:each) do
6
+ DaphneUtil.salt = 'hello'
7
+ @seed = Digest::MD5.hexdigest(rand(9999).to_s)
8
+ end
9
+
10
+ it "should generate a secret string" do
11
+ DaphneUtil::ApiKeyGenerator.generate(@seed).should be_a(String)
12
+ end
13
+
14
+ it "should be consistent" do
15
+ DaphneUtil::ApiKeyGenerator.generate(@seed).should eq(DaphneUtil::ApiKeyGenerator.generate(@seed))
16
+ end
17
+
18
+ it "should have the correct structure" do
19
+ DaphneUtil::ApiKeyGenerator.generate(@seed).should match /^[A-Za-z]\w*-key-[\da-f]{64}$/
20
+ end
21
+
22
+ end
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'DaphneUtil::Tools' do
4
+
5
+ before(:each) do
6
+ File.delete(Store.file_location)
7
+ end
8
+
9
+
10
+ end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: daphne_util
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Grady Griffin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-17 00:00:00.000000000 Z
11
+ date: 2014-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 1.6.7
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 1.6.7
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -56,29 +70,37 @@ description: Daphne pseudorandom credential generator
56
70
  email:
57
71
  - gradygriffin@gmail.com
58
72
  executables:
73
+ - daphne
74
+ - daphne_client_api_key
59
75
  - daphne_client_id
60
76
  - daphne_client_secret
61
77
  extensions: []
62
78
  extra_rdoc_files: []
63
79
  files:
64
80
  - .gitignore
81
+ - CHANGES.md
65
82
  - Gemfile
66
83
  - LICENSE
67
- - LICENSE.txt
68
84
  - README.md
69
85
  - Rakefile
86
+ - bin/daphne
87
+ - bin/daphne_client_api_key
70
88
  - bin/daphne_client_id
71
89
  - bin/daphne_client_secret
72
90
  - daphne_util.gemspec
73
91
  - lib/daphne_util.rb
92
+ - lib/daphne_util/api_key_generator.rb
74
93
  - lib/daphne_util/errors.rb
75
94
  - lib/daphne_util/id_generator.rb
76
95
  - lib/daphne_util/secret_generator.rb
96
+ - lib/daphne_util/tools.rb
77
97
  - lib/daphne_util/version.rb
98
+ - spec/api_key_generator_spec.rb
78
99
  - spec/daphne_util_spec.rb
79
100
  - spec/id_generator_spec.rb
80
101
  - spec/secret_generator_spec.rb
81
102
  - spec/spec_helper.rb
103
+ - spec/tools_spec.rb
82
104
  homepage: ''
83
105
  licenses:
84
106
  - MIT
@@ -99,12 +121,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
121
  version: '0'
100
122
  requirements: []
101
123
  rubyforge_project:
102
- rubygems_version: 2.0.6
124
+ rubygems_version: 2.2.2
103
125
  signing_key:
104
126
  specification_version: 4
105
127
  summary: A pseudorandom credential generator to create and generate application credentials
106
128
  test_files:
129
+ - spec/api_key_generator_spec.rb
107
130
  - spec/daphne_util_spec.rb
108
131
  - spec/id_generator_spec.rb
109
132
  - spec/secret_generator_spec.rb
110
133
  - spec/spec_helper.rb
134
+ - spec/tools_spec.rb
data/LICENSE.txt DELETED
@@ -1,22 +0,0 @@
1
- Copyright (c) 2013 Grady Griffin
2
-
3
- MIT License
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining
6
- a copy of this software and associated documentation files (the
7
- "Software"), to deal in the Software without restriction, including
8
- without limitation the rights to use, copy, modify, merge, publish,
9
- distribute, sublicense, and/or sell copies of the Software, and to
10
- permit persons to whom the Software is furnished to do so, subject to
11
- the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be
14
- included in all copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.