kuvera-api 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +22 -3
- data/kuvera-api.gemspec +2 -0
- data/lib/kuvera/api.rb +1 -1
- data/lib/kuvera/api/client.rb +39 -5
- data/lib/kuvera/api/errors.rb +2 -0
- data/lib/kuvera/api/oauth.rb +47 -0
- data/lib/kuvera/api/version.rb +1 -1
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7b690819abf1e87b510cdd9f894cea824d4f7df76c4975c4a899439c76125cc4
|
4
|
+
data.tar.gz: 37d0fa5af70896776aaaa0deff5b24b195a19c6623223c767dcf83402b448078
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c7927b5d0192c756fdc1c1514062f775846f7368aeb64fa51a020428223195a96f8ba96dce5dd1467584d385fea9736cbbc2895af8fface0e64201dff0a5d4e8
|
7
|
+
data.tar.gz: 798e9e7d83b1ca34c2a255d10627c5d6d3b3c2fa0b62f2636cadfac2959977baaf1afc015d78c9fba1b9b9e8bc0b1442db9474a8eaff5f6004fcc7528b0efdc0
|
data/README.md
CHANGED
@@ -20,13 +20,32 @@ Or install it yourself as:
|
|
20
20
|
|
21
21
|
## Usage
|
22
22
|
|
23
|
-
|
24
|
-
command.
|
23
|
+
- One-time secrets receving through the `at` command.
|
25
24
|
|
26
25
|
```ruby
|
27
|
-
Kuvera::Api.at('
|
26
|
+
Kuvera::Api.at('SHARE-78c4e15f8f1f3e43f6950975f97ff7c2858bcc5a')
|
28
27
|
```
|
29
28
|
|
29
|
+
- Authentification with OAuth credentials
|
30
|
+
```ruby
|
31
|
+
Kuvera::Api.me
|
32
|
+
# => {"id"=>1, "admin_id"=>2, "name"=>"Kuvera Carrier"}
|
33
|
+
```
|
34
|
+
|
35
|
+
- Secret files uploading
|
36
|
+
```ruby
|
37
|
+
Kuvera::Api.upload('My Passport', File.open('passport.pdf'), 'application/pdf')
|
38
|
+
# => {"address"=>"KEY-11ff53da91ba292ef628b457895bf7ea", "status"=>"success", "title"=>"My Passport"}
|
39
|
+
```
|
40
|
+
|
41
|
+
- Secrets sharing
|
42
|
+
```ruby
|
43
|
+
Kuvera::Api.share('KEY-11ff53da91ba292ef628b457895bf7ea')
|
44
|
+
# => {"path"=>"https://kuvera.io/at/SHARE-d00a96d19889639a5a5d3991c6fab49d", "status"=>"success"}
|
45
|
+
```
|
46
|
+
|
47
|
+
In order to use carrier-related methods you need to provide `OAUTH_UID` and `OAUTH_SECRET`.
|
48
|
+
|
30
49
|
## Contributing
|
31
50
|
|
32
51
|
Bug reports and pull requests are welcome on GitHub at https://github.com/CleverLabs/kuvera-api.
|
data/kuvera-api.gemspec
CHANGED
@@ -19,6 +19,8 @@ Gem::Specification.new do |spec|
|
|
19
19
|
end
|
20
20
|
spec.require_paths = ['lib']
|
21
21
|
|
22
|
+
spec.add_dependency 'oauth2', '~> 1.4'
|
23
|
+
|
22
24
|
spec.add_development_dependency 'bundler', '~> 1.17'
|
23
25
|
spec.add_development_dependency 'rake', '~> 10.0'
|
24
26
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
data/lib/kuvera/api.rb
CHANGED
data/lib/kuvera/api/client.rb
CHANGED
@@ -4,28 +4,62 @@ require 'json'
|
|
4
4
|
require 'net/http'
|
5
5
|
|
6
6
|
require 'kuvera/api/errors'
|
7
|
+
require 'kuvera/api/oauth'
|
7
8
|
|
8
9
|
module Kuvera
|
9
10
|
module Api
|
10
11
|
class Client
|
11
12
|
HOST = 'https://kuvera.io/'
|
12
|
-
|
13
|
+
ENV_UID = ENV['OAUTH_UID']
|
14
|
+
ENV_SECRET = ENV['OAUTH_SECRET']
|
15
|
+
ENV_HOST = ENV.fetch('KUVERA_API', HOST)
|
16
|
+
|
17
|
+
AT_ENDPOINT = 'at/'
|
18
|
+
ME_ENDPOINT = '/api/v1/me'
|
19
|
+
UPLOAD_ENDPOINT = '/api/v1/secrets'
|
20
|
+
SHARE_ENDPOINT = '/api/v1/links'
|
21
|
+
|
13
22
|
ROOT = 'secret'
|
23
|
+
ATTACHMENT = 'SecretAttachment'
|
14
24
|
|
15
|
-
def initialize(host:
|
16
|
-
@host = host
|
25
|
+
def initialize(host: ENV_HOST, uid: ENV_UID, secret: ENV_SECRET)
|
26
|
+
@host = host
|
27
|
+
@uid = uid
|
28
|
+
@secret = secret
|
17
29
|
end
|
18
30
|
|
19
31
|
RESPONSES = {
|
20
|
-
200 => ->(response) {
|
32
|
+
200 => ->(response) { response.body },
|
21
33
|
403 => ->(_response) { raise SecretAlreadyRead },
|
22
34
|
404 => ->(_response) { raise SecretNotFound }
|
23
35
|
}.freeze
|
24
36
|
|
25
37
|
def at(address)
|
26
|
-
response = Net::HTTP.get_response(URI.join(@host,
|
38
|
+
response = Net::HTTP.get_response(URI.join(@host, AT_ENDPOINT, address))
|
27
39
|
RESPONSES.fetch(response.code.to_i).call(response)
|
28
40
|
end
|
41
|
+
|
42
|
+
def me
|
43
|
+
oauth.get(ME_ENDPOINT)
|
44
|
+
end
|
45
|
+
|
46
|
+
def upload(title, io, mime)
|
47
|
+
upload = Faraday::UploadIO.new(io, mime, io.path.split('/').last)
|
48
|
+
body = { new_secret: { type: ATTACHMENT, title: title, body: upload } }
|
49
|
+
oauth.post(UPLOAD_ENDPOINT, body, headers: {})
|
50
|
+
end
|
51
|
+
|
52
|
+
def share(address)
|
53
|
+
oauth.post(SHARE_ENDPOINT, { secret_id: address }.to_json)
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def oauth
|
59
|
+
raise MissingCredentials if [@host, @uid, @secret].any?(&:nil?)
|
60
|
+
|
61
|
+
@_oauth = Oauth.new(uid: @uid, secret: @secret, host: @host)
|
62
|
+
end
|
29
63
|
end
|
30
64
|
end
|
31
65
|
end
|
data/lib/kuvera/api/errors.rb
CHANGED
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'oauth2'
|
4
|
+
require 'net/http/post/multipart'
|
5
|
+
|
6
|
+
module Kuvera
|
7
|
+
module Api
|
8
|
+
class Oauth
|
9
|
+
DEFAULT_CONTENT_TYPE = { 'Content-Type' => 'application/json' }.freeze
|
10
|
+
FATAL_ERROR_MESSAGE = { 'error' => 'Internal error' }.freeze
|
11
|
+
CLIENT_SCOPE = 'ext_app'
|
12
|
+
|
13
|
+
def initialize(uid:, secret:, host:)
|
14
|
+
@oauth_client = OAuth2::Client.new(
|
15
|
+
uid, secret, site: host, token_method: :post
|
16
|
+
) do |stack|
|
17
|
+
stack.request :multipart
|
18
|
+
stack.request :url_encoded
|
19
|
+
stack.adapter Faraday.default_adapter
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def get(url, params = {})
|
24
|
+
token.get(url, params: params).parsed
|
25
|
+
rescue OAuth2::Error => error
|
26
|
+
process_exception(error)
|
27
|
+
end
|
28
|
+
|
29
|
+
def post(url, body, headers: DEFAULT_CONTENT_TYPE.dup)
|
30
|
+
token.post(url, headers: headers, body: body).parsed
|
31
|
+
rescue OAuth2::Error => error
|
32
|
+
process_exception(error)
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def token
|
38
|
+
@token ||=
|
39
|
+
@oauth_client.client_credentials.get_token(scope: CLIENT_SCOPE)
|
40
|
+
end
|
41
|
+
|
42
|
+
def process_exception(exception)
|
43
|
+
exception.response.parsed || FATAL_ERROR_MESSAGE
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/kuvera/api/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kuvera-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ignat Zakrevsky
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-11-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: oauth2
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.4'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.4'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -88,6 +102,7 @@ files:
|
|
88
102
|
- lib/kuvera/api.rb
|
89
103
|
- lib/kuvera/api/client.rb
|
90
104
|
- lib/kuvera/api/errors.rb
|
105
|
+
- lib/kuvera/api/oauth.rb
|
91
106
|
- lib/kuvera/api/version.rb
|
92
107
|
homepage: https://kuvera.io
|
93
108
|
licenses:
|