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 +9 -9
- data/CHANGES.md +3 -0
- data/README.md +54 -3
- data/bin/daphne +11 -0
- data/bin/daphne_client_api_key +13 -0
- data/daphne_util.gemspec +2 -0
- data/lib/daphne_util.rb +15 -1
- data/lib/daphne_util/api_key_generator.rb +19 -0
- data/lib/daphne_util/errors.rb +3 -1
- data/lib/daphne_util/id_generator.rb +1 -1
- data/lib/daphne_util/tools.rb +399 -0
- data/lib/daphne_util/version.rb +2 -2
- data/spec/api_key_generator_spec.rb +22 -0
- data/spec/tools_spec.rb +10 -0
- metadata +28 -4
- data/LICENSE.txt +0 -22
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NTlhNjE2YzhiMGNlYjFhOTNhZWY5ZjY3NWYxZGE0NDA1MTZiZmM5Ng==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
7
|
-
|
6
|
+
ZDcwYTI3NTM0Y2VkZjlkN2NjODYwYzE5NzhmODliNWUxMjg1MDNkZQ==
|
7
|
+
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YTZiNmI2NDYwOWExMWI2MDA1NmI4ZTQyMTM1NWU4NTg3YzM3NWM4OTE4YzA4
|
10
|
+
ZGJlYjI0MjZkYmFhNjU1MDExYTFhNDk0NzU5ZTBkZTI0NGE4ZDM2YjY0M2Rm
|
11
|
+
NWM5MmY3YjNhNDgxNmMwMDc4M2I1ZTI4OWJlZWQ3MmRlZmZhNjQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
N2UyMDk4ZWQ2YTY4NzMyZWUzYTMyZWE3MjY1Njg4OTUzOWE2ZGYzNzcwMDlk
|
14
|
+
MDM0ZDJmNzNlMjhiNDZmNTAwOWZhYWQ0ZDUzZDlhYmIyMjY4YTljODM4NmRl
|
15
|
+
MjQzNzlkMWJlZWMyZTEzZDc2OTA4YmNiYTEzYTM0M2M4MDZiNGY=
|
data/CHANGES.md
ADDED
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
|
-
$
|
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,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
|
data/lib/daphne_util/errors.rb
CHANGED
@@ -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.
|
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
|
data/lib/daphne_util/version.rb
CHANGED
@@ -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
|
data/spec/tools_spec.rb
ADDED
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
|
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:
|
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.
|
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.
|