occi-api 4.2.6 → 4.3.0.beta.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.
- checksums.yaml +4 -4
- data/.travis.yml +4 -3
- data/README.md +15 -213
- data/lib/occi/api/client/authn_utils.rb +2 -71
- data/lib/occi/api/client/base/entity_methods.rb +22 -37
- data/lib/occi/api/client/client_http.rb +4 -0
- data/lib/occi/api/client/http/authn_plugins/x509.rb +4 -8
- data/lib/occi/api/client/http/party_wrappers.rb +25 -51
- data/lib/occi/api/version.rb +1 -1
- data/occi-api.gemspec +9 -8
- data/spec/occi/api/client/authn_utils_spec.rb +2 -36
- metadata +63 -28
- data/spec/occi/api/client/rocci-cred-key-jruby.pem +0 -3
- data/spec/occi/api/client/rocci-cred-key.pem +0 -3
- data/spec/occi/api/client/rocci-cred.p12 +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7ab882ff01d442af84f9ac23fc4b4da41091f5d6
|
4
|
+
data.tar.gz: 6ded8b446e879ad73334b2b42e868c04a9009f3f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a11d6fb175e27d18a240c8303671f8847de44026883cf3dfd60fae017103c2cd9d5b0587bf0d550f710b9370f6419ac56bd155e21ad1071c98e12e68ebff881
|
7
|
+
data.tar.gz: 74b2e556f12c701a92a00074b85f4a96a201a45f64691037573642deb281898342f6a02c1f50a826c13f3c851a959415029af922a7cdb67691cb3a8c09d7ad8b
|
data/.travis.yml
CHANGED
@@ -3,7 +3,7 @@ language: ruby
|
|
3
3
|
rvm:
|
4
4
|
- 1.9.3
|
5
5
|
- 2.0.0
|
6
|
-
- 2.1
|
6
|
+
- 2.1
|
7
7
|
- ruby-head
|
8
8
|
- jruby-19mode
|
9
9
|
- jruby-head
|
@@ -26,9 +26,9 @@ matrix:
|
|
26
26
|
jdk: openjdk7
|
27
27
|
- rvm: 2.0.0
|
28
28
|
jdk: oraclejdk7
|
29
|
-
- rvm: 2.1
|
29
|
+
- rvm: 2.1
|
30
30
|
jdk: openjdk7
|
31
|
-
- rvm: 2.1
|
31
|
+
- rvm: 2.1
|
32
32
|
jdk: oraclejdk7
|
33
33
|
- rvm: ruby-head
|
34
34
|
jdk: openjdk7
|
@@ -42,3 +42,4 @@ branches:
|
|
42
42
|
- 4.0.x
|
43
43
|
- 4.1.x
|
44
44
|
- 4.2.x
|
45
|
+
- 4.3.x
|
data/README.md
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
rOCCI-api - A Ruby OCCI Framework
|
2
2
|
=================================
|
3
3
|
|
4
|
-
[](http://travis-ci.org/EGI-FCTF/rOCCI-api)
|
5
|
+
[](https://gemnasium.com/EGI-FCTF/rOCCI-api)
|
6
6
|
[](https://badge.fury.io/rb/occi-api)
|
7
|
-
[](https://codeclimate.com/github/EGI-FCTF/rOCCI-api)
|
8
8
|
|
9
9
|
Requirements
|
10
10
|
------------
|
@@ -12,7 +12,6 @@ Requirements
|
|
12
12
|
### Ruby
|
13
13
|
* Ruby 1.9.3 is required
|
14
14
|
* RubyGems have to be installed
|
15
|
-
* Rake has to be installed (e.g., `gem install rake`)
|
16
15
|
|
17
16
|
### Examples
|
18
17
|
#### For distros based on Debian:
|
@@ -44,12 +43,10 @@ Installation
|
|
44
43
|
|
45
44
|
To install the most recent stable version
|
46
45
|
|
47
|
-
gem install rake
|
48
46
|
gem install occi-api
|
49
47
|
|
50
48
|
To install the most recent beta version
|
51
49
|
|
52
|
-
gem install rake
|
53
50
|
gem install occi-api --pre
|
54
51
|
|
55
52
|
### From source (dev)
|
@@ -60,7 +57,7 @@ To install the most recent beta version
|
|
60
57
|
|
61
58
|
To build and install the bleeding edge version from master
|
62
59
|
|
63
|
-
git clone git://github.com/
|
60
|
+
git clone git://github.com/EGI-FCTF/rOCCI-api.git
|
64
61
|
cd rOCCI-api
|
65
62
|
gem install bundler
|
66
63
|
bundle install
|
@@ -87,213 +84,18 @@ ruby -v
|
|
87
84
|
|
88
85
|
Usage
|
89
86
|
-----
|
90
|
-
|
91
|
-
|
92
|
-
For Basic auth use
|
93
|
-
|
94
|
-
auth = Hashie::Mash.new
|
95
|
-
auth.type = 'basic'
|
96
|
-
auth.username = 'user'
|
97
|
-
auth.password = 'mypass'
|
98
|
-
|
99
|
-
For Digest auth use
|
100
|
-
|
101
|
-
auth = Hashie::Mash.new
|
102
|
-
auth.type = 'digest'
|
103
|
-
auth.username = 'user'
|
104
|
-
auth.password = 'mypass'
|
105
|
-
|
106
|
-
For X.509 auth use
|
107
|
-
|
108
|
-
auth = Hashie::Mash.new
|
109
|
-
auth.type = 'x509'
|
110
|
-
auth.user_cert = '/Path/To/My/usercert.pem'
|
111
|
-
auth.user_cert_password = 'MyPassword'
|
112
|
-
auth.ca_path = '/Path/To/root-certificates'
|
113
|
-
|
114
|
-
### DSL
|
115
|
-
In your scripts, you can use the OCCI client DSL.
|
116
|
-
|
117
|
-
To include the DSL definitions in a script use
|
118
|
-
|
119
|
-
extend Occi::Api::Dsl
|
120
|
-
|
121
|
-
To include the DSL definitions in a class use
|
122
|
-
|
123
|
-
include Occi::Api::Dsl
|
124
|
-
|
125
|
-
To connect to an OCCI endpoint/server (e.g. running on http://localhost:3300/ )
|
126
|
-
|
127
|
-
# defaults
|
128
|
-
options = {
|
129
|
-
:endpoint => "http://localhost:3300/",
|
130
|
-
:auth => {:type => "none"},
|
131
|
-
:log => {:out => STDERR, :level => Occi::Api::Log::WARN, :logger => nil},
|
132
|
-
:auto_connect => "value", auto_connect => true,
|
133
|
-
:media_type => nil
|
134
|
-
}
|
135
|
-
|
136
|
-
connect(:http, options ||= {})
|
137
|
-
|
138
|
-
To get the list of available resource, mixin, entity or link types use
|
139
|
-
|
140
|
-
resource_types
|
141
|
-
mixin_types
|
142
|
-
entity_types
|
143
|
-
link_types
|
144
|
-
|
145
|
-
To get compute, storage or network descriptions use
|
146
|
-
|
147
|
-
describe "compute"
|
148
|
-
describe "storage"
|
149
|
-
describe "network"
|
150
|
-
|
151
|
-
To get the location of compute, storage or network resources use
|
152
|
-
|
153
|
-
list "compute"
|
154
|
-
list "storage"
|
155
|
-
list "network"
|
156
|
-
|
157
|
-
To get the identifiers of specific mixins in specific mixin types use
|
158
|
-
|
159
|
-
mixin "my_template", "os_tpl"
|
160
|
-
mixin "small", "resource_tpl"
|
161
|
-
|
162
|
-
To get the identifiers of specific mixins with unknown types use
|
163
|
-
|
164
|
-
mixin "medium"
|
165
|
-
|
166
|
-
To get mixin descriptions use
|
167
|
-
|
168
|
-
mixin "medium", nil, true
|
169
|
-
mixin "my_template", "os_tpl", true
|
170
|
-
|
171
|
-
To get a list of names of all / OS templates / Resource templates mixins use
|
172
|
-
|
173
|
-
mixins
|
174
|
-
mixins "os_tpl"
|
175
|
-
mixins "resource_tpl"
|
176
|
-
|
177
|
-
To create a new compute resource use
|
178
|
-
|
179
|
-
os = mixin 'my_os', 'os_tpl'
|
180
|
-
size = mixin 'large', 'resource_tpl'
|
181
|
-
cmpt = resource "compute"
|
182
|
-
cmpt.mixins << os << size
|
183
|
-
cmpt.title = "My VM"
|
184
|
-
create cmpt
|
185
|
-
|
186
|
-
To get a description of a specific resource use
|
187
|
-
|
188
|
-
describe "/compute/<OCCI_ID>"
|
189
|
-
describe "/storage/<OCCI_ID>"
|
190
|
-
describe "/network/<OCCI_ID>"
|
191
|
-
|
192
|
-
To delete a specific resource use
|
193
|
-
|
194
|
-
delete "/compute/<OCCI_ID>"
|
195
|
-
delete "/storage/<OCCI_ID>"
|
196
|
-
delete "/network/<OCCI_ID>"
|
197
|
-
|
198
|
-
### API
|
199
|
-
If you need low level access to parts of the OCCI client or need to use more than one instance
|
200
|
-
at a time, you should use the OCCI client API directly.
|
201
|
-
|
202
|
-
To connect to an OCCI endpoint/server (e.g. running on http://localhost:3300/ )
|
203
|
-
|
204
|
-
# defaults
|
205
|
-
options = {
|
206
|
-
:endpoint => "http://localhost:3300/",
|
207
|
-
:auth => {:type => "none"},
|
208
|
-
:log => {:out => STDERR, :level => Occi::Api::Log::WARN, :logger => nil},
|
209
|
-
:auto_connect => "value", auto_connect => true,
|
210
|
-
:media_type => nil
|
211
|
-
}
|
212
|
-
|
213
|
-
client = Occi::Api::Client::ClientHttp.new(options ||= {})
|
214
|
-
|
215
|
-
All available categories are automatically registered to the OCCI model during client initialization. You can get them via
|
216
|
-
|
217
|
-
client.model
|
218
|
-
|
219
|
-
To get the list of available resource, mixin, entity or link types use
|
220
|
-
|
221
|
-
client.get_resource_types
|
222
|
-
client.get_mixin_types
|
223
|
-
client.get_entity_types
|
224
|
-
client.get_link_types
|
225
|
-
|
226
|
-
To get compute, storage or network descriptions use
|
227
|
-
|
228
|
-
client.describe "compute"
|
229
|
-
client.describe "storage"
|
230
|
-
client.describe "network"
|
231
|
-
|
232
|
-
To get the location of compute, storage or network resources use
|
233
|
-
|
234
|
-
client.list "compute"
|
235
|
-
client.list "storage"
|
236
|
-
client.list "network"
|
237
|
-
|
238
|
-
To get the identifiers of specific mixins in specific mixin types use
|
239
|
-
|
240
|
-
client.find_mixin "my_template", "os_tpl"
|
241
|
-
client.find_mixin "small", "resource_tpl"
|
242
|
-
|
243
|
-
To get the identifiers of specific mixins with unknown types use
|
244
|
-
|
245
|
-
client.find_mixin "medium"
|
246
|
-
|
247
|
-
To get mixin descriptions use
|
248
|
-
|
249
|
-
client.find_mixin "medium", nil, true
|
250
|
-
client.find_mixin "my_template", "os_tpl", true
|
251
|
-
|
252
|
-
To get a list of names of all / OS templates / Resource templates mixins use
|
253
|
-
|
254
|
-
client.get_mixins
|
255
|
-
client.get_mixins "os_tpl"
|
256
|
-
client.get_mixins "resource_tpl"
|
257
|
-
|
258
|
-
To create a new compute resource use
|
259
|
-
|
260
|
-
os = client.find_mixin 'my_os', 'os_tpl'
|
261
|
-
size = client.find_mixin 'large', 'resource_tpl'
|
262
|
-
cmpt = client.get_resource "compute"
|
263
|
-
cmpt.mixins << os << size
|
264
|
-
cmpt.title = "My VM"
|
265
|
-
client.create cmpt
|
266
|
-
|
267
|
-
To get a description of a specific resource use
|
268
|
-
|
269
|
-
client.describe "/compute/<OCCI_ID>"
|
270
|
-
client.describe "/storage/<OCCI_ID>"
|
271
|
-
client.describe "/network/<OCCI_ID>"
|
272
|
-
|
273
|
-
To delete a specific resource use
|
274
|
-
|
275
|
-
client.delete "/compute/<OCCI_ID>"
|
276
|
-
client.delete "/storage/<OCCI_ID>"
|
277
|
-
client.delete "/network/<OCCI_ID>"
|
278
|
-
|
279
|
-
### Logging
|
280
|
-
|
281
|
-
The OCCI gem includes its own logging mechanism using a message queue. By default, no one is listening to that queue.
|
282
|
-
A new OCCI Logger can be initialized by specifying the log destination (either a filename or an IO object like
|
283
|
-
STDOUT) and the log level.
|
284
|
-
|
285
|
-
logger = Occi::Api::Log.new STDOUT
|
286
|
-
logger.level = Occi::Api::Log::INFO
|
287
|
-
|
288
|
-
You can create multiple Loggers to receive the log output.
|
289
|
-
|
290
|
-
You can always, even if there is no logger defined, log output using the class methods of OCCI::Api::Log e.g.
|
291
|
-
|
292
|
-
Occi::Api::Log.info("Test message")
|
87
|
+
Detailed documentation is available in our [Wiki](https://github.com/EGI-FCTF/rOCCI-api/wiki).
|
293
88
|
|
294
89
|
Changelog
|
295
90
|
---------
|
296
91
|
|
92
|
+
### Version 4.3
|
93
|
+
* Updated dependencies
|
94
|
+
* Powered by rOCCI-core 4.3.x
|
95
|
+
|
96
|
+
### Version 4.2
|
97
|
+
* Updated dependencies
|
98
|
+
|
297
99
|
### Version 4.1
|
298
100
|
* Dropped Ruby 1.8.x support
|
299
101
|
* Dropped jRuby 1.6.x support
|
@@ -362,7 +164,7 @@ Development
|
|
362
164
|
|
363
165
|
Checkout latest version from GIT:
|
364
166
|
|
365
|
-
git clone git://github.com/
|
167
|
+
git clone git://github.com/EGI-FCTF/rOCCI-api.git
|
366
168
|
|
367
169
|
Change to rOCCI-api folder
|
368
170
|
|
@@ -374,11 +176,11 @@ Install dependencies for deployment
|
|
374
176
|
|
375
177
|
### Code Documentation
|
376
178
|
|
377
|
-
[Code Documentation for rOCCI-api by YARD](http://rubydoc.info/github/
|
179
|
+
[Code Documentation for rOCCI-api by YARD](http://rubydoc.info/github/EGI-FCTF/rOCCI-api/)
|
378
180
|
|
379
181
|
### Continuous integration
|
380
182
|
|
381
|
-
[Continuous integration for rOCCI-api by Travis-CI](http://travis-ci.org/
|
183
|
+
[Continuous integration for rOCCI-api by Travis-CI](http://travis-ci.org/EGI-FCTF/rOCCI-api/)
|
382
184
|
|
383
185
|
### Contribute
|
384
186
|
|
@@ -1,79 +1,9 @@
|
|
1
|
-
require 'openssl'
|
2
|
-
|
3
|
-
if defined? JRUBY_VERSION
|
4
|
-
require 'java'
|
5
|
-
end
|
6
|
-
|
7
1
|
module Occi::Api::Client
|
8
2
|
|
9
3
|
class AuthnUtils
|
10
4
|
|
11
5
|
CERT_REGEXP = /\n?(-----BEGIN CERTIFICATE-----\n.+?\n-----END CERTIFICATE-----)\n/m
|
12
6
|
|
13
|
-
# Reads credentials from a PKCS#12 compliant file. Returns
|
14
|
-
# X.509 certificate and decrypted private key in PEM
|
15
|
-
# formatted string.
|
16
|
-
#
|
17
|
-
# @example
|
18
|
-
# AuthnUtils.extract_pem_from_pkcs12 "~/.globus/usercert.p12", "123456"
|
19
|
-
# # => #<String>
|
20
|
-
#
|
21
|
-
# @param path_to_p12_file [String] Path to a PKCS#12 file with credentials
|
22
|
-
# @param p12_password [String] Password needed to unlock the PKCS#12 file
|
23
|
-
# @return [String] Decrypted credentials in a PEM formatted string
|
24
|
-
def self.extract_pem_from_pkcs12(path_to_p12_file, p12_password)
|
25
|
-
# decode certificate and its private key
|
26
|
-
if defined? JRUBY_VERSION
|
27
|
-
extract_pem_from_pkcs12_java(path_to_p12_file, p12_password)
|
28
|
-
else
|
29
|
-
extract_pem_from_pkcs12_c(path_to_p12_file, p12_password)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.extract_pem_from_pkcs12_java(path_to_p12_file, p12_password)
|
34
|
-
# Java-based Ruby, read PKCS12 manually
|
35
|
-
# using KeyStore
|
36
|
-
keystore = Java::JavaSecurity::KeyStore.getInstance("PKCS12")
|
37
|
-
p12_input_stream = Java::JavaIo::FileInputStream.new(path_to_p12_file)
|
38
|
-
pass_char_array = Java::JavaLang::String.new(p12_password).to_char_array
|
39
|
-
|
40
|
-
# load and unlock PKCS#12 store
|
41
|
-
keystore.load p12_input_stream, pass_char_array
|
42
|
-
|
43
|
-
# read the first certificate and PK
|
44
|
-
cert = keystore.getCertificate("1")
|
45
|
-
pk = keystore.getKey("1", pass_char_array)
|
46
|
-
|
47
|
-
pem_from_pkcs12 = ""
|
48
|
-
|
49
|
-
pem_from_pkcs12 << "-----BEGIN CERTIFICATE-----\n"
|
50
|
-
pem_from_pkcs12 << Java::JavaxXmlBind::DatatypeConverter.printBase64Binary(cert.getEncoded())
|
51
|
-
pem_from_pkcs12 << "\n-----END CERTIFICATE-----"
|
52
|
-
|
53
|
-
pem_from_pkcs12 << "\n"
|
54
|
-
|
55
|
-
pem_from_pkcs12 << "-----BEGIN PRIVATE KEY-----\n"
|
56
|
-
pem_from_pkcs12 << Java::JavaxXmlBind::DatatypeConverter.printBase64Binary(pk.getEncoded())
|
57
|
-
pem_from_pkcs12 << "\n-----END PRIVATE KEY-----"
|
58
|
-
|
59
|
-
pem_from_pkcs12
|
60
|
-
end
|
61
|
-
|
62
|
-
def self.extract_pem_from_pkcs12_c(path_to_p12_file, p12_password)
|
63
|
-
# C-based Ruby, use OpenSSL::PKCS12
|
64
|
-
pem_from_pkcs12 = ""
|
65
|
-
|
66
|
-
pkcs12 = OpenSSL::PKCS12.new(
|
67
|
-
File.open(path_to_p12_file, 'rb'),
|
68
|
-
p12_password
|
69
|
-
)
|
70
|
-
|
71
|
-
# store cert and private key in a single PEM formatted string
|
72
|
-
pem_from_pkcs12 << pkcs12.certificate.to_pem << pkcs12.key.to_pem
|
73
|
-
|
74
|
-
pem_from_pkcs12
|
75
|
-
end
|
76
|
-
|
77
7
|
# Reads X.509 certificates from a file to an array.
|
78
8
|
#
|
79
9
|
# @example
|
@@ -83,7 +13,8 @@ module Occi::Api::Client
|
|
83
13
|
# @param ca_file [String] Path to a PEM file containing certificates
|
84
14
|
# @return [Array<String>] An array of read certificates
|
85
15
|
def self.certs_to_file_ary(ca_file)
|
86
|
-
|
16
|
+
raise ArgumentError, "PKCS12 file #{ca_file.inspect} " \
|
17
|
+
"is not supported in VOMS mode!" if /\A(.)+\.p12\z/ =~ ca_file
|
87
18
|
certs_str = File.open(ca_file).read
|
88
19
|
|
89
20
|
certs_ary = certs_str.scan(CERT_REGEXP)
|
@@ -33,8 +33,7 @@ module Occi::Api::Client
|
|
33
33
|
#
|
34
34
|
# @return [Array<String>] list of available entity types in a human-readable format
|
35
35
|
def get_entity_types
|
36
|
-
|
37
|
-
collection.kinds.to_a.collect { |kind| kind.term }
|
36
|
+
get_types(Occi::Core::Entity.kind)
|
38
37
|
end
|
39
38
|
|
40
39
|
# Retrieves all available entity type identifiers.
|
@@ -59,19 +58,7 @@ module Occi::Api::Client
|
|
59
58
|
# @param type [String] short entity type
|
60
59
|
# @return [String, nil] entity type identifier for the given entity type
|
61
60
|
def get_entity_type_identifier(type)
|
62
|
-
|
63
|
-
|
64
|
-
collection = @model.get(Occi::Core::Entity.kind.type_identifier)
|
65
|
-
e_kinds = collection.kinds.to_a.select { |e| e.term == type }
|
66
|
-
tis = e_kinds.collect { |e| e.type_identifier }
|
67
|
-
tis.uniq!
|
68
|
-
|
69
|
-
if tis.length > 1
|
70
|
-
raise Occi::Api::Client::Errors::AmbiguousNameError,
|
71
|
-
"Entity type #{type.inspect} is ambiguous, use a type identifier!"
|
72
|
-
end
|
73
|
-
|
74
|
-
tis.first
|
61
|
+
get_type_identifier(type, Occi::Core::Entity.kind)
|
75
62
|
end
|
76
63
|
|
77
64
|
# Retrieves all available resource types.
|
@@ -81,8 +68,7 @@ module Occi::Api::Client
|
|
81
68
|
#
|
82
69
|
# @return [Array<String>] list of available resource types in a human-readable format
|
83
70
|
def get_resource_types
|
84
|
-
|
85
|
-
collection.kinds.to_a.collect { |kind| kind.term }
|
71
|
+
get_types(Occi::Core::Resource.kind)
|
86
72
|
end
|
87
73
|
|
88
74
|
# Retrieves all available resource type identifiers.
|
@@ -107,19 +93,7 @@ module Occi::Api::Client
|
|
107
93
|
# @param type [String] short resource type
|
108
94
|
# @return [String, nil] resource type identifier for the given resource type
|
109
95
|
def get_resource_type_identifier(type)
|
110
|
-
|
111
|
-
|
112
|
-
collection = @model.get(Occi::Core::Resource.kind.type_identifier)
|
113
|
-
r_kinds = collection.kinds.to_a.select { |r| r.term == type }
|
114
|
-
tis = r_kinds.collect { |r| r.type_identifier }
|
115
|
-
tis.uniq!
|
116
|
-
|
117
|
-
if tis.length > 1
|
118
|
-
raise Occi::Api::Client::Errors::AmbiguousNameError,
|
119
|
-
"Resource type #{type.inspect} is ambiguous, use a type identifier!"
|
120
|
-
end
|
121
|
-
|
122
|
-
tis.first
|
96
|
+
get_type_identifier(type, Occi::Core::Resource.kind)
|
123
97
|
end
|
124
98
|
|
125
99
|
# Retrieves all available link types.
|
@@ -129,8 +103,7 @@ module Occi::Api::Client
|
|
129
103
|
#
|
130
104
|
# @return [Array<String>] list of available link types in a human-readable format
|
131
105
|
def get_link_types
|
132
|
-
|
133
|
-
collection.kinds.to_a.collect { |kind| kind.term }
|
106
|
+
get_types(Occi::Core::Link.kind)
|
134
107
|
end
|
135
108
|
|
136
109
|
# Retrieves all available link type identifiers.
|
@@ -154,22 +127,34 @@ module Occi::Api::Client
|
|
154
127
|
# @param type [String] short link type
|
155
128
|
# @return [String, nil] link type identifier for the given link type
|
156
129
|
def get_link_type_identifier(type)
|
130
|
+
get_type_identifier(type, Occi::Core::Link.kind)
|
131
|
+
end
|
132
|
+
|
133
|
+
private
|
134
|
+
|
135
|
+
def get_type_identifier(type, related_to)
|
157
136
|
return type if (type =~ URI::ABS_URI) || (type && type.start_with?('/'))
|
158
137
|
|
159
|
-
collection = @model.get(
|
160
|
-
|
161
|
-
tis =
|
138
|
+
collection = @model.get(related_to.type_identifier)
|
139
|
+
e_kinds = collection.kinds.to_a.select { |e| e.term == type }
|
140
|
+
tis = e_kinds.collect { |e| e.type_identifier }
|
162
141
|
tis.uniq!
|
163
142
|
|
164
143
|
if tis.length > 1
|
165
144
|
raise Occi::Api::Client::Errors::AmbiguousNameError,
|
166
|
-
"
|
145
|
+
"#{related_to.type_identifier.split('#').capitalize} type " \
|
146
|
+
"#{type.inspect} is ambiguous, use a type identifier!"
|
167
147
|
end
|
168
148
|
|
169
149
|
tis.first
|
170
150
|
end
|
171
151
|
|
152
|
+
def get_types(related_to)
|
153
|
+
collection = @model.get(related_to.type_identifier)
|
154
|
+
collection ? collection.kinds.to_a.collect { |kind| kind.term } : []
|
155
|
+
end
|
156
|
+
|
172
157
|
end
|
173
158
|
|
174
159
|
end
|
175
|
-
end
|
160
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'httparty'
|
2
|
+
require 'persistent_httparty'
|
2
3
|
|
3
4
|
# load all parts of the ClientHttp
|
4
5
|
Dir[File.join(File.dirname(__FILE__), 'http', '*.rb')].each { |file| require file.gsub('.rb', '') }
|
@@ -10,6 +11,9 @@ module Occi::Api::Client
|
|
10
11
|
# HTTParty for raw HTTP requests
|
11
12
|
include HTTParty
|
12
13
|
|
14
|
+
# Take advantage of persistent HTTP connections
|
15
|
+
persistent_connection_adapter
|
16
|
+
|
13
17
|
# TODO: change default Accept to JSON as soon as it is properly
|
14
18
|
# implemented in OpenStack's OCCI-OS
|
15
19
|
# 'Accept' => 'application/occi+json,text/plain;q=0.8,text/occi;q=0.2'
|
@@ -14,16 +14,12 @@ module Occi::Api::Client
|
|
14
14
|
raise ArgumentError, "Missing required option 'user_cert' for x509 auth!" unless @options[:user_cert]
|
15
15
|
raise ArgumentError, "The file specified in 'user_cert' does not exist!" unless File.exists? @options[:user_cert]
|
16
16
|
|
17
|
-
# handle
|
18
|
-
|
17
|
+
# handle credentials, separate PKCS12 from PEM
|
18
|
+
cert_content = File.open(@options[:user_cert], 'rb').read
|
19
19
|
if /\A(.)+\.p12\z/ =~ @options[:user_cert]
|
20
|
-
|
21
|
-
@env_ref.class.pem pem_cert, ''
|
20
|
+
@env_ref.class.pkcs12 cert_content, @options[:user_cert_password]
|
22
21
|
else
|
23
|
-
|
24
|
-
# TODO: Issue #49, check PEM credentials in jRuby
|
25
|
-
pem_cert = File.open(@options[:user_cert], 'rb').read
|
26
|
-
@env_ref.class.pem pem_cert, @options[:user_cert_password]
|
22
|
+
@env_ref.class.pem cert_content, @options[:user_cert_password]
|
27
23
|
end
|
28
24
|
|
29
25
|
@env_ref.class.ssl_ca_path @options[:ca_path] if @options[:ca_path]
|
@@ -28,18 +28,7 @@ module Occi::Api::Client
|
|
28
28
|
end
|
29
29
|
|
30
30
|
response = self.class.get(path, :headers => headers)
|
31
|
-
|
32
|
-
|
33
|
-
unless response.code == 200
|
34
|
-
if response.headers["x-request-id"]
|
35
|
-
message = "HTTP GET with ID[#{response.headers["x-request-id"].inspect}] failed! " \
|
36
|
-
"#{response_msg} : #{response.body.inspect}"
|
37
|
-
else
|
38
|
-
message = "HTTP GET failed! #{response_msg} : #{response.body.inspect}"
|
39
|
-
end
|
40
|
-
|
41
|
-
raise message
|
42
|
-
end
|
31
|
+
report_failure(response)
|
43
32
|
|
44
33
|
get_process_response(path, response)
|
45
34
|
end
|
@@ -64,18 +53,7 @@ module Occi::Api::Client
|
|
64
53
|
raise ArgumentError, "Collection is a required argument!" if collection.blank?
|
65
54
|
|
66
55
|
response = send_coll_request(path, collection)
|
67
|
-
|
68
|
-
|
69
|
-
unless response.code.between?(200, 201)
|
70
|
-
if response.headers["x-request-id"]
|
71
|
-
message = "HTTP POST with ID[#{response.headers["x-request-id"].inspect}] failed! " \
|
72
|
-
"#{response_msg} : #{response.body.inspect}"
|
73
|
-
else
|
74
|
-
message = "HTTP POST failed! #{response_msg} : #{response.body.inspect}"
|
75
|
-
end
|
76
|
-
|
77
|
-
raise message
|
78
|
-
end
|
56
|
+
report_failure(response)
|
79
57
|
|
80
58
|
collection.send(:standalone_action_instance?) ? post_action(response) : post_create(response)
|
81
59
|
end
|
@@ -93,20 +71,9 @@ module Occi::Api::Client
|
|
93
71
|
raise ArgumentError, "Collection is a required argument!" if collection.blank?
|
94
72
|
|
95
73
|
response = send_coll_request(path, collection, :put)
|
96
|
-
|
97
|
-
|
98
|
-
if response.code.between? 200, 201
|
99
|
-
Occi::Parser.parse(response.content_type, response.body)
|
100
|
-
else
|
101
|
-
if response.headers["x-request-id"]
|
102
|
-
message = "HTTP PUT with ID[#{response.headers["x-request-id"].inspect}] failed! " \
|
103
|
-
"#{response_msg} : #{response.body.inspect}"
|
104
|
-
else
|
105
|
-
message = "HTTP PUT failed! #{response_msg} : #{response.body.inspect}"
|
106
|
-
end
|
74
|
+
report_failure(response)
|
107
75
|
|
108
|
-
|
109
|
-
end
|
76
|
+
Occi::Parser.parse(response.content_type, response.body)
|
110
77
|
end
|
111
78
|
|
112
79
|
# Performs DELETE requests and returns True on success.
|
@@ -119,20 +86,7 @@ module Occi::Api::Client
|
|
119
86
|
# @return [Boolean] status
|
120
87
|
def del(path, filter=nil)
|
121
88
|
raise ArgumentError, "Path is a required argument!" if path.blank?
|
122
|
-
|
123
|
-
response = self.class.delete(path)
|
124
|
-
response_msg = response_message(response)
|
125
|
-
|
126
|
-
unless response.code == 200
|
127
|
-
if response.headers["x-request-id"]
|
128
|
-
message = "HTTP DELETE with ID[#{response.headers["x-request-id"].inspect}] failed! " \
|
129
|
-
"#{response_msg} : #{response.body.inspect}"
|
130
|
-
else
|
131
|
-
message = "HTTP DELETE failed! #{response_msg} : #{response.body.inspect}"
|
132
|
-
end
|
133
|
-
|
134
|
-
raise message
|
135
|
-
end
|
89
|
+
report_failure(self.class.delete(path))
|
136
90
|
|
137
91
|
true
|
138
92
|
end
|
@@ -218,6 +172,26 @@ module Occi::Api::Client
|
|
218
172
|
end
|
219
173
|
end
|
220
174
|
|
175
|
+
def report_failure(response)
|
176
|
+
# Is there something to report?
|
177
|
+
return if response.code.between? 200, 202
|
178
|
+
|
179
|
+
# get a human-readable response message
|
180
|
+
response_msg = response_message(response)
|
181
|
+
|
182
|
+
# include a Request ID if it is available
|
183
|
+
if response.headers["x-request-id"]
|
184
|
+
message = "HTTP #{response.request.http_method.upcase} with " \
|
185
|
+
"ID[#{response.headers["x-request-id"].inspect}] failed! " \
|
186
|
+
"#{response_msg} : #{response.body.inspect}"
|
187
|
+
else
|
188
|
+
message = "HTTP #{response.request.http_method.upcase} failed! " \
|
189
|
+
"#{response_msg} : #{response.body.inspect}"
|
190
|
+
end
|
191
|
+
|
192
|
+
raise message
|
193
|
+
end
|
194
|
+
|
221
195
|
end
|
222
196
|
|
223
197
|
end
|
data/lib/occi/api/version.rb
CHANGED
data/occi-api.gemspec
CHANGED
@@ -8,19 +8,20 @@ Gem::Specification.new do |gem|
|
|
8
8
|
gem.name = "occi-api"
|
9
9
|
gem.version = Occi::Api::VERSION
|
10
10
|
gem.authors = ["Florian Feldhaus","Piotr Kasprzak", "Boris Parak"]
|
11
|
-
gem.email = [
|
11
|
+
gem.email = ['florian.feldhaus@gmail.com', 'piotr.kasprzak@gwdg.de', 'parak@cesnet.cz']
|
12
12
|
gem.description = %q{This gem provides ready-to-use client classes to simplify the integration of OCCI into your application}
|
13
|
-
gem.summary = %q{OCCI development library providing a high-level API}
|
14
|
-
gem.homepage = 'https://github.com/
|
13
|
+
gem.summary = %q{OCCI development library providing a high-level client API}
|
14
|
+
gem.homepage = 'https://github.com/EGI-FCTF/rOCCI-api'
|
15
15
|
gem.license = 'Apache License, Version 2.0'
|
16
16
|
|
17
17
|
gem.files = `git ls-files`.split("\n")
|
18
18
|
gem.test_files = `git ls-files -- {test,spec}/*`.split("\n")
|
19
|
-
gem.require_paths = [
|
19
|
+
gem.require_paths = ['lib']
|
20
20
|
|
21
|
-
gem.add_dependency 'occi-core', '~> 4.
|
22
|
-
gem.add_dependency 'httparty'
|
23
|
-
gem.add_dependency 'json'
|
21
|
+
gem.add_dependency 'occi-core', '~> 4.3', '>= 4.3.0'
|
22
|
+
gem.add_dependency 'httparty', '~> 0.13', '>= 0.13.1'
|
23
|
+
gem.add_dependency 'json', '~> 1.8', '>= 1.8.1'
|
24
|
+
gem.add_dependency 'persistent_httparty', '~> 0.1', '>= 0.1.2'
|
24
25
|
|
25
|
-
gem.required_ruby_version
|
26
|
+
gem.required_ruby_version = '>= 1.9.3'
|
26
27
|
end
|
@@ -7,45 +7,11 @@ module Occi
|
|
7
7
|
|
8
8
|
describe AuthnUtils do
|
9
9
|
|
10
|
-
it "can handle PKCS#12 user credentials" do
|
11
|
-
path = File.expand_path("..", __FILE__)
|
12
|
-
|
13
|
-
pem_cert_pk = AuthnUtils.extract_pem_from_pkcs12(
|
14
|
-
path + "/rocci-cred.p12",
|
15
|
-
"passworD123"
|
16
|
-
)
|
17
|
-
|
18
|
-
pem_cert_ok = File.open(path + "/rocci-cred-cert.pem", "rb").read
|
19
|
-
|
20
|
-
if defined? JRUBY_VERSION
|
21
|
-
# PK is in PKCS#8 when running jRuby
|
22
|
-
pem_pk_ok = File.open(path + "/rocci-cred-key-jruby.pem", "rb").read
|
23
|
-
else
|
24
|
-
# PK is raw RSA key when running cRuby
|
25
|
-
pem_pk_ok = File.open(path + "/rocci-cred-key.pem", "rb").read
|
26
|
-
end
|
27
|
-
|
28
|
-
pem_cert_pk_ok = ""
|
29
|
-
pem_cert_pk_ok << pem_cert_ok << pem_pk_ok
|
30
|
-
|
31
|
-
|
32
|
-
# remove line wrapping
|
33
|
-
pem_cert_pk.delete! "\n"
|
34
|
-
pem_cert_pk_ok.delete! "\n"
|
35
|
-
|
36
|
-
# remove trailing new lines
|
37
|
-
pem_cert_pk.chomp!
|
38
|
-
pem_cert_pk_ok.chomp!
|
39
|
-
|
40
|
-
pem_cert_pk.should eq pem_cert_pk_ok
|
41
|
-
end
|
42
|
-
|
43
10
|
it "can read CA certificates from a file" do
|
44
11
|
path = File.expand_path("..", __FILE__)
|
45
12
|
|
46
|
-
ca_certs = AuthnUtils.certs_to_file_ary(path
|
47
|
-
|
48
|
-
ca_certs.should =~ [File.open(path + "/rocci-cred-cert.pem", "rb").read.chomp("\n")]
|
13
|
+
ca_certs = AuthnUtils.certs_to_file_ary("#{path}/rocci-cred-cert.pem")
|
14
|
+
ca_certs.should =~ [File.open("#{path}/rocci-cred-cert.pem", "rb").read.chomp("\n")]
|
49
15
|
end
|
50
16
|
|
51
17
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: occi-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.3.0.beta.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florian Feldhaus
|
@@ -10,64 +10,102 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-
|
13
|
+
date: 2014-10-05 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: occi-core
|
17
17
|
requirement: !ruby/object:Gem::Requirement
|
18
18
|
requirements:
|
19
|
-
- - ~>
|
19
|
+
- - "~>"
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 4.
|
21
|
+
version: '4.3'
|
22
|
+
- - ">="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 4.3.0
|
22
25
|
type: :runtime
|
23
26
|
prerelease: false
|
24
27
|
version_requirements: !ruby/object:Gem::Requirement
|
25
28
|
requirements:
|
26
|
-
- - ~>
|
29
|
+
- - "~>"
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: '4.3'
|
32
|
+
- - ">="
|
27
33
|
- !ruby/object:Gem::Version
|
28
|
-
version: 4.
|
34
|
+
version: 4.3.0
|
29
35
|
- !ruby/object:Gem::Dependency
|
30
36
|
name: httparty
|
31
37
|
requirement: !ruby/object:Gem::Requirement
|
32
38
|
requirements:
|
33
|
-
- -
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0.13'
|
42
|
+
- - ">="
|
34
43
|
- !ruby/object:Gem::Version
|
35
|
-
version:
|
44
|
+
version: 0.13.1
|
36
45
|
type: :runtime
|
37
46
|
prerelease: false
|
38
47
|
version_requirements: !ruby/object:Gem::Requirement
|
39
48
|
requirements:
|
40
|
-
- -
|
49
|
+
- - "~>"
|
41
50
|
- !ruby/object:Gem::Version
|
42
|
-
version: '0'
|
51
|
+
version: '0.13'
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.13.1
|
43
55
|
- !ruby/object:Gem::Dependency
|
44
56
|
name: json
|
45
57
|
requirement: !ruby/object:Gem::Requirement
|
46
58
|
requirements:
|
47
|
-
- -
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.8'
|
62
|
+
- - ">="
|
48
63
|
- !ruby/object:Gem::Version
|
49
|
-
version:
|
64
|
+
version: 1.8.1
|
50
65
|
type: :runtime
|
51
66
|
prerelease: false
|
52
67
|
version_requirements: !ruby/object:Gem::Requirement
|
53
68
|
requirements:
|
54
|
-
- -
|
69
|
+
- - "~>"
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '1.8'
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 1.8.1
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: persistent_httparty
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0.1'
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: 0.1.2
|
85
|
+
type: :runtime
|
86
|
+
prerelease: false
|
87
|
+
version_requirements: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - "~>"
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0.1'
|
92
|
+
- - ">="
|
55
93
|
- !ruby/object:Gem::Version
|
56
|
-
version:
|
94
|
+
version: 0.1.2
|
57
95
|
description: This gem provides ready-to-use client classes to simplify the integration
|
58
96
|
of OCCI into your application
|
59
97
|
email:
|
60
|
-
- florian.feldhaus@
|
98
|
+
- florian.feldhaus@gmail.com
|
61
99
|
- piotr.kasprzak@gwdg.de
|
62
|
-
-
|
100
|
+
- parak@cesnet.cz
|
63
101
|
executables: []
|
64
102
|
extensions: []
|
65
103
|
extra_rdoc_files: []
|
66
104
|
files:
|
67
|
-
- .gitignore
|
68
|
-
- .rspec
|
69
|
-
- .travis.yml
|
70
|
-
- .yardopts
|
105
|
+
- ".gitignore"
|
106
|
+
- ".rspec"
|
107
|
+
- ".travis.yml"
|
108
|
+
- ".yardopts"
|
71
109
|
- AUTHORS
|
72
110
|
- Gemfile
|
73
111
|
- LICENSE
|
@@ -193,13 +231,10 @@ files:
|
|
193
231
|
- spec/occi/api/client/http/httparty_fix_spec.rb
|
194
232
|
- spec/occi/api/client/http/net_http_fix_spec.rb
|
195
233
|
- spec/occi/api/client/rocci-cred-cert.pem
|
196
|
-
- spec/occi/api/client/rocci-cred-key-jruby.pem
|
197
|
-
- spec/occi/api/client/rocci-cred-key.pem
|
198
|
-
- spec/occi/api/client/rocci-cred.p12
|
199
234
|
- spec/occi/api/dsl_spec.rb
|
200
235
|
- spec/occi/helpers/helpers_spec.rb
|
201
236
|
- spec/spec_helper.rb
|
202
|
-
homepage: https://github.com/
|
237
|
+
homepage: https://github.com/EGI-FCTF/rOCCI-api
|
203
238
|
licenses:
|
204
239
|
- Apache License, Version 2.0
|
205
240
|
metadata: {}
|
@@ -209,18 +244,18 @@ require_paths:
|
|
209
244
|
- lib
|
210
245
|
required_ruby_version: !ruby/object:Gem::Requirement
|
211
246
|
requirements:
|
212
|
-
- -
|
247
|
+
- - ">="
|
213
248
|
- !ruby/object:Gem::Version
|
214
249
|
version: 1.9.3
|
215
250
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
216
251
|
requirements:
|
217
|
-
- -
|
252
|
+
- - ">"
|
218
253
|
- !ruby/object:Gem::Version
|
219
|
-
version:
|
254
|
+
version: 1.3.1
|
220
255
|
requirements: []
|
221
256
|
rubyforge_project:
|
222
257
|
rubygems_version: 2.2.2
|
223
258
|
signing_key:
|
224
259
|
specification_version: 4
|
225
|
-
summary: OCCI development library providing a high-level API
|
260
|
+
summary: OCCI development library providing a high-level client API
|
226
261
|
test_files: []
|
@@ -1,3 +0,0 @@
|
|
1
|
-
-----BEGIN PRIVATE KEY-----
|
2
|
-
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDcjeRWvUe+p+bOTgl0JtUWpHCDrSoV5DQD59Rinol+1+471JDF6wloBrmo7nCyLtOpDUDUcRZIp9UKCZZLqx0FhmUySFCjU7wBtU1+IOhbEVH97+pff/2x9920C9uyV/06Vr7Ch8G8fYOZCplrmmWs5wj88mUSQBtSYMOZNQxkX18tj3oKgvLhAlRYoIAYJgkhFUsXegMUc7NRa9Kpt2ag2C7eKs9VMZuI9XF+e6xPK6lUPFV8lWzfKtrhiUkmEMbzb0A3CQLZNw8IPXYjNm4daoeZSZkLY9P6KlIXJnBZX1DfJ1WdpS19GUVlU7EmRqwccOeT7FkS3MAR8nK35nOVAgMBAAECggEAS3pTlkuYberP1fJm0dUoP2NvDeEI8gzysBN6X3WZ4ErNQLRyBwl0YqFKkEFpV9Empkfe09UPpzWodpLpWGPqvqVLpHWTAxH42SzOpEdmvSOkR57/Okd27pzAxoj4WoQ6KOjex3vmFTdu/cTe1DA2c4FtVgMuC5zcvMhYp+m7n+1Q5Y/MFWgatMh5Oo20q34CzLNkJ1w0sZfKd8+yhFZc6PJRqp4obJTWALL5EJNxLxw8vzXfnn8y69VZWIqMHHE6QqgZGj6T9aXhDKpjgao6n0zXQu7GrGSz+KxefqEAEV8YyZMeCkFEBMmOS/huWotlzhj8ALtq7vm7JMgIkTDz0QKBgQDu7ezX3UC3JskQOoXKPuwUAdkoL1C7O6k/A8meHzrSvPTnPzdmO7Zj8nZOG58O5cFAh6jT+2k0xa/TrvWUgdD7Xiaw7pWk/MBAEqdReYaAHl6Q440fkvWS4Qn/VP0ZAXwHmqO3zdHRlHE8HsKzqPIjOaU2stNwvgqS2QZs5MOybwKBgQDsT+GfJlESE/MRZ04VZTn6HQSy4NocRPJ+t7ddFYxoETBGDtAg4lvSNhpl9aTY625iGASFVec3A8pSPIgOO4q7yX0FyEtkNHhgKnbGVZzLyBTiHv+eMDVFGauWV7HTUjxiasalSLAtUKVC+AzsSdrDT2HhEt7KK5W/erkw3ZLsOwKBgBJqHfXpJIK5J4frqsISpWlJVy5Er0ku6PVlWlWofIUfcRSdh6yGb6E2X63XbSPdy04o5ncoCky567o54s2GT8//yqWaTchAfqSxi1m5LweSz6EFGKxVTD38wCOArl0OAzwmy/VvlHs9oJiMml70Z20VlUko8SjgTLpSpa8g1oBbAoGBAOP33+m/diAhfLDCXvKG99pQWjMSdXcmEGWsZ8j1u8C9LDu5mJDQrdHp/ad0xPW6kX8yOlJC384T6v9Qg9RvHlQweVq1sf1WHPZwoKqO9rckKvlE/EWnrgweSoi7ysHZKIWtCjtzFvpwPS2QzC66xL77+qm9oY2ZZFoXU0ZPyqf3AoGATw1FWCPsdyC8iA4D9UlWvK5JskLxlNr0OZGgjo1rc+n+oopgn/GxxyMHhwaUZpftA1ab1G58xGnlcjCkhr2ZK/7XNhb7SfLKxTjB2BAehaq2YyzwCpsKUI7oLi0wTt7mD51qh3B1fMSTkfBZg/prwq6nIaDBwXL1xsd/BPfMCYw=
|
3
|
-
-----END PRIVATE KEY-----
|
@@ -1,3 +0,0 @@
|
|
1
|
-
-----BEGIN RSA PRIVATE KEY-----
|
2
|
-
MIIEowIBAAKCAQEA3I3kVr1Hvqfmzk4JdCbVFqRwg60qFeQ0A+fUYp6JftfuO9SQxesJaAa5qO5wsi7TqQ1A1HEWSKfVCgmWS6sdBYZlMkhQo1O8AbVNfiDoWxFR/e/qX3/9sffdtAvbslf9Ola+wofBvH2DmQqZa5plrOcI/PJlEkAbUmDDmTUMZF9fLY96CoLy4QJUWKCAGCYJIRVLF3oDFHOzUWvSqbdmoNgu3irPVTGbiPVxfnusTyupVDxVfJVs3yra4YlJJhDG829ANwkC2TcPCD12IzZuHWqHmUmZC2PT+ipSFyZwWV9Q3ydVnaUtfRlFZVOxJkasHHDnk+xZEtzAEfJyt+ZzlQIDAQABAoIBAEt6U5ZLmG3qz9XyZtHVKD9jbw3hCPIM8rATel91meBKzUC0cgcJdGKhSpBBaVfRJqZH3tPVD6c1qHaS6Vhj6r6lS6R1kwMR+NkszqRHZr0jpEee/zpHdu6cwMaI+FqEOijo3sd75hU3bv3E3tQwNnOBbVYDLguc3LzIWKfpu5/tUOWPzBVoGrTIeTqNtKt+AsyzZCdcNLGXynfPsoRWXOjyUaqeKGyU1gCy+RCTcS8cPL81355/MuvVWViKjBxxOkKoGRo+k/Wl4QyqY4GqOp9M10Luxqxks/isXn6hABFfGMmTHgpBRATJjkv4blqLZc4Y/AC7au75uyTICJEw89ECgYEA7u3s191AtybJEDqFyj7sFAHZKC9QuzupPwPJnh860rz05z83Zju2Y/J2ThufDuXBQIeo0/tpNMWv0671lIHQ+14msO6VpPzAQBKnUXmGgB5ekOONH5L1kuEJ/1T9GQF8B5qjt83R0ZRxPB7Cs6jyIzmlNrLTcL4KktkGbOTDsm8CgYEA7E/hnyZREhPzEWdOFWU5+h0EsuDaHETyfre3XRWMaBEwRg7QIOJb0jYaZfWk2OtuYhgEhVXnNwPKUjyIDjuKu8l9BchLZDR4YCp2xlWcy8gU4h7/njA1RRmrllex01I8YmrGpUiwLVClQvgM7Enaw09h4RLeyiuVv3q5MN2S7DsCgYASah316SSCuSeH66rCEqVpSVcuRK9JLuj1ZVpVqHyFH3EUnYeshm+hNl+t120j3ctOKOZ3KApMueu6OeLNhk/P/8qlmk3IQH6ksYtZuS8Hks+hBRisVUw9/MAjgK5dDgM8Jsv1b5R7PaCYjJpe9GdtFZVJKPEo4Ey6UqWvINaAWwKBgQDj99/pv3YgIXywwl7yhvfaUFozEnV3JhBlrGfI9bvAvSw7uZiQ0K3R6f2ndMT1upF/MjpSQt/OE+r/UIPUbx5UMHlatbH9Vhz2cKCqjva3JCr5RPxFp64MHkqIu8rB2SiFrQo7cxb6cD0tkMwuusS++/qpvaGNmWRaF1NGT8qn9wKBgE8NRVgj7HcgvIgOA/VJVryuSbJC8ZTa9DmRoI6Na3Pp/qKKYJ/xsccjB4cGlGaX7QNWm9RufMRp5XIwpIa9mSv+1zYW+0nyysU4wdgQHoWqtmMs8AqbClCO6C4tME7e5g+daodwdXzEk5HwWYP6a8KupyGgwcFy9cbHfwT3zAmM
|
3
|
-
-----END RSA PRIVATE KEY-----
|
Binary file
|