panoptes-client 0.3.8 → 0.4.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 +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +3 -2
- data/lib/panoptes/client.rb +3 -22
- data/lib/panoptes/client/authentication.rb +86 -0
- data/lib/panoptes/client/comments.rb +1 -1
- data/lib/panoptes/client/version.rb +1 -1
- data/panoptes-client.gemspec +1 -0
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 738ea26bbdcac1cfd64a537f11210c5dbce0fb18
|
4
|
+
data.tar.gz: 03143cbb89f128160b9659f744572d1bfa05986c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8570661b211f00b0f20ab1b076ab1c033d467c89a495e8b4062081e4c6eb246b57555c76ba449d5e16c08b1674b28a778740f11dbb88ec011f15e803c82e0e4a
|
7
|
+
data.tar.gz: fd0d5ebb58e5521b884abbe5723e2a09c6c69603f829d38b74e6f43fa40750662b646765edd37945f7e88b0f730ef7e45172ee7d53df4e890f7a3c7fd33b04c9
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/lib/panoptes/client.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'panoptes/endpoints/json_api_endpoint'
|
2
2
|
require 'panoptes/endpoints/json_endpoint'
|
3
3
|
|
4
|
+
require 'panoptes/client/authentication'
|
4
5
|
require 'panoptes/client/cellect'
|
5
6
|
require 'panoptes/client/classifications'
|
6
7
|
require 'panoptes/client/collections'
|
@@ -21,6 +22,7 @@ module Panoptes
|
|
21
22
|
include Panoptes::Client::Me
|
22
23
|
|
23
24
|
# Panoptes
|
25
|
+
include Panoptes::Client::Authentication
|
24
26
|
include Panoptes::Client::Classifications
|
25
27
|
include Panoptes::Client::Collections
|
26
28
|
include Panoptes::Client::Projects
|
@@ -43,6 +45,7 @@ module Panoptes
|
|
43
45
|
class ResourceNotFound < GenericError; end
|
44
46
|
class ServerError < GenericError; end
|
45
47
|
class NotLoggedIn < GenericError; end
|
48
|
+
class AuthenticationExpired < GenericError; end
|
46
49
|
|
47
50
|
attr_reader :env, :auth, :panoptes, :talk, :cellect
|
48
51
|
|
@@ -61,28 +64,6 @@ module Panoptes
|
|
61
64
|
)
|
62
65
|
end
|
63
66
|
|
64
|
-
def current_user
|
65
|
-
raise NotLoggedIn unless @auth[:token]
|
66
|
-
|
67
|
-
payload, = JWT.decode @auth[:token], jwt_signing_public_key, algorithm: 'RS512'
|
68
|
-
payload.fetch('data')
|
69
|
-
end
|
70
|
-
|
71
|
-
def jwt_signing_public_key
|
72
|
-
@jwt_signing_public_key ||= OpenSSL::PKey::RSA.new(File.read(@public_key_path))
|
73
|
-
end
|
74
|
-
|
75
|
-
def public_key_for_env(env)
|
76
|
-
case env.to_s
|
77
|
-
when "staging"
|
78
|
-
File.expand_path(File.join("..", "..", "..", "data", "doorkeeper-jwt-staging.pub"), __FILE__)
|
79
|
-
when "production"
|
80
|
-
File.expand_path(File.join("..", "..", "..", "data", "doorkeeper-jwt-production.pub"), __FILE__)
|
81
|
-
else
|
82
|
-
nil
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
67
|
def panoptes_url
|
87
68
|
case env
|
88
69
|
when :production, 'production'.freeze
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'deprecate'
|
2
|
+
|
3
|
+
module Panoptes
|
4
|
+
class Client
|
5
|
+
module Authentication
|
6
|
+
extend Gem::Deprecate
|
7
|
+
|
8
|
+
def jwt_payload
|
9
|
+
raise NotLoggedIn unless @auth[:token]
|
10
|
+
payload, = decode_token(@auth[:token])
|
11
|
+
payload
|
12
|
+
rescue JWT::ExpiredSignature
|
13
|
+
raise AuthenticationExpired
|
14
|
+
end
|
15
|
+
|
16
|
+
def token_contents
|
17
|
+
if !@payload.nil? && expiry_from_payload(@payload) > Time.now.utc
|
18
|
+
@payload.fetch('data', {})
|
19
|
+
elsif @payload.nil?
|
20
|
+
@payload = jwt_payload
|
21
|
+
@expires_at = expiry_from_payload(@payload)
|
22
|
+
@payload.fetch('data', ())
|
23
|
+
else
|
24
|
+
raise AuthenticationExpired
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def token_expiry
|
29
|
+
@expires_at || expiry_from_payload(jwt_payload)
|
30
|
+
end
|
31
|
+
|
32
|
+
def authenticated?
|
33
|
+
!!token_contents['id']
|
34
|
+
end
|
35
|
+
|
36
|
+
def authenticated_user_login
|
37
|
+
raise NotLoggedIn unless authenticated?
|
38
|
+
token_contents.fetch('login', nil)
|
39
|
+
end
|
40
|
+
|
41
|
+
def authenticated_user_display_name
|
42
|
+
raise NotLoggedIn unless authenticated?
|
43
|
+
token_contents.fetch('dname', nil)
|
44
|
+
end
|
45
|
+
|
46
|
+
def authenticated_user_id
|
47
|
+
raise NotLoggedIn unless authenticated?
|
48
|
+
token_contents.fetch('id')
|
49
|
+
end
|
50
|
+
|
51
|
+
def authenticated_admin?
|
52
|
+
raise NotLoggedIn unless authenticated?
|
53
|
+
token_contents.fetch('admin', false)
|
54
|
+
end
|
55
|
+
|
56
|
+
def current_user
|
57
|
+
token_contents
|
58
|
+
end
|
59
|
+
deprecate :current_user, :token_contents, 2019, 7
|
60
|
+
|
61
|
+
def jwt_signing_public_key
|
62
|
+
@jwt_signing_public_key ||= OpenSSL::PKey::RSA.new(File.read(@public_key_path))
|
63
|
+
end
|
64
|
+
|
65
|
+
def expiry_from_payload(payload)
|
66
|
+
Time.at(payload.fetch('exp',0)).utc
|
67
|
+
end
|
68
|
+
|
69
|
+
def decode_token(token)
|
70
|
+
payload, = JWT.decode token, jwt_signing_public_key, algorithm: 'RS512'
|
71
|
+
payload
|
72
|
+
end
|
73
|
+
|
74
|
+
def public_key_for_env(env)
|
75
|
+
case env.to_s
|
76
|
+
when "staging"
|
77
|
+
File.expand_path(File.join("..","..", "..", "..", "data", "doorkeeper-jwt-staging.pub"), __FILE__)
|
78
|
+
when "production"
|
79
|
+
File.expand_path(File.join("..","..", "..", "..", "data", "doorkeeper-jwt-production.pub"), __FILE__)
|
80
|
+
else
|
81
|
+
nil
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -7,7 +7,7 @@ module Panoptes
|
|
7
7
|
# @param focus_type [String] filter by focussable type
|
8
8
|
# @return list of discussions
|
9
9
|
def create_comment(discussion_id:, body:)
|
10
|
-
user_id =
|
10
|
+
user_id = token_contents["id"]
|
11
11
|
response = talk.post("/comments", comments: {discussion_id: discussion_id, body: body, user_id: user_id})
|
12
12
|
response.fetch("comments")[0]
|
13
13
|
end
|
data/panoptes-client.gemspec
CHANGED
@@ -18,6 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
+
spec.add_dependency "deprecate"
|
21
22
|
spec.add_dependency "faraday"
|
22
23
|
spec.add_dependency "faraday-panoptes", "~> 0.3.0"
|
23
24
|
spec.add_dependency "jwt", "~> 1.5.0"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: panoptes-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marten Veldthuis
|
@@ -10,8 +10,22 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2019-03-11 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: deprecate
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - ">="
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: '0'
|
15
29
|
- !ruby/object:Gem::Dependency
|
16
30
|
name: faraday
|
17
31
|
requirement: !ruby/object:Gem::Requirement
|
@@ -150,6 +164,7 @@ files:
|
|
150
164
|
- data/doorkeeper-jwt-staging.pub
|
151
165
|
- lib/panoptes-client.rb
|
152
166
|
- lib/panoptes/client.rb
|
167
|
+
- lib/panoptes/client/authentication.rb
|
153
168
|
- lib/panoptes/client/cellect.rb
|
154
169
|
- lib/panoptes/client/classifications.rb
|
155
170
|
- lib/panoptes/client/collections.rb
|
@@ -195,4 +210,3 @@ signing_key:
|
|
195
210
|
specification_version: 4
|
196
211
|
summary: API wrapper for https://panoptes.zooniverse.org
|
197
212
|
test_files: []
|
198
|
-
has_rdoc:
|