occi-api 4.2.6 → 4.3.0.beta.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
[![Build Status](https://secure.travis-ci.org/
|
5
|
-
[![Dependency Status](https://gemnasium.com/
|
4
|
+
[![Build Status](https://secure.travis-ci.org/EGI-FCTF/rOCCI-api.png)](http://travis-ci.org/EGI-FCTF/rOCCI-api)
|
5
|
+
[![Dependency Status](https://gemnasium.com/EGI-FCTF/rOCCI-api.png)](https://gemnasium.com/EGI-FCTF/rOCCI-api)
|
6
6
|
[![Gem Version](https://fury-badge.herokuapp.com/rb/occi-api.png)](https://badge.fury.io/rb/occi-api)
|
7
|
-
[![Code Climate](https://codeclimate.com/github/
|
7
|
+
[![Code Climate](https://codeclimate.com/github/EGI-FCTF/rOCCI-api.png)](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
|