daphne_util 0.0.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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.