pocket_jekyll_auth0 0.1.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 +7 -0
- data/lib/pocket_jekyll_auth0.rb +193 -0
- metadata +44 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f05cf53c210884098e0c678c1558b1e3b9026e9d5abeebd4e4df0b8d96228f98
|
4
|
+
data.tar.gz: 89cf2c26e1519334d8ea7ae4f3dcad7a92cc76040b0df2cf7f1248964c8f6c85
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4a1d6727c558763f7698b9116e7d1da169f9304959338b2d00e101d5d92cdb59b8ec25ef935eee116b144d386b9983b5633520734f869e07554e31c412fc86d6
|
7
|
+
data.tar.gz: e0081eaf50640f543769efe045591da61ee1a45ba94a964633543fdd25881c442bc65ac1c95dfd2e098ed383532ff97a65da1f87a97370d3de4e07f0af281707
|
@@ -0,0 +1,193 @@
|
|
1
|
+
require 'jekyll'
|
2
|
+
require 'auth0_machine_to_machine'
|
3
|
+
require 'uri'
|
4
|
+
require 'net/http'
|
5
|
+
|
6
|
+
class JekyllPocketError < StandardError; end
|
7
|
+
|
8
|
+
class NetworkError < JekyllPocketError; end
|
9
|
+
|
10
|
+
module PocketJekyllAuth0
|
11
|
+
class Tag < Liquid::Tag
|
12
|
+
def self.cache
|
13
|
+
@cache ||= Jekyll::Cache.new('PocketJekyllAuth0')
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.attemptListCacheClear(site)
|
17
|
+
config = site.config['jekyll-pocket']
|
18
|
+
config_pocket_api = config['pocket-api-config']
|
19
|
+
|
20
|
+
if config_pocket_api['cache-clear-on-initialize']
|
21
|
+
puts 'Clearing cache on pre_render.'
|
22
|
+
cache.delete 'pocket_list' if cache.key? 'pocket_list'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def getTokenObject(config_auth0)
|
27
|
+
begin
|
28
|
+
::Auth0MachineToMachine::Client.new.getM2M!(config_auth0)
|
29
|
+
rescue Exception => e
|
30
|
+
puts 'Could not authenticate with Auth0.', e
|
31
|
+
false
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def fillTokenCache(config_auth0)
|
36
|
+
token_object = getTokenObject(config_auth0)
|
37
|
+
|
38
|
+
if token_object != false
|
39
|
+
cache = PocketJekyllAuth0.cache
|
40
|
+
|
41
|
+
return cache['token_object'] = token_object
|
42
|
+
end
|
43
|
+
|
44
|
+
false
|
45
|
+
end
|
46
|
+
|
47
|
+
def getFillTokenCache(config_auth0)
|
48
|
+
cache = PocketJekyllAuth0.cache
|
49
|
+
|
50
|
+
if !cache.key?('token_object')
|
51
|
+
fillTokenCache(config_auth0)
|
52
|
+
else
|
53
|
+
token_object = cache['token_object']
|
54
|
+
if Time.now <= token_object[:expire_date]
|
55
|
+
return token_object
|
56
|
+
end
|
57
|
+
|
58
|
+
fillTokenCache(config_auth0)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def fillPocketList(bearer_token, pocket_api_url, pocket_list_filter)
|
63
|
+
cache = PocketJekyllAuth0.cache
|
64
|
+
|
65
|
+
url = URI(pocket_api_url)
|
66
|
+
|
67
|
+
http = Net::HTTP.new(url.host, url.port)
|
68
|
+
use_ssl = url.scheme == 'https'
|
69
|
+
http.use_ssl = use_ssl
|
70
|
+
if use_ssl
|
71
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
72
|
+
else
|
73
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
74
|
+
end
|
75
|
+
|
76
|
+
request = Net::HTTP::Post.new(url)
|
77
|
+
request['content-type'] = 'application/json'
|
78
|
+
request['accept'] = 'application/json'
|
79
|
+
request['authorization'] = "Bearer #{bearer_token}"
|
80
|
+
|
81
|
+
body = pocket_list_filter
|
82
|
+
|
83
|
+
puts "Requesting Pocket list with filters #{pocket_list_filter.to_json}."
|
84
|
+
|
85
|
+
request.body = body.to_json
|
86
|
+
|
87
|
+
begin
|
88
|
+
response = http.request(request)
|
89
|
+
|
90
|
+
if response.is_a?(Net::HTTPSuccess)
|
91
|
+
list = JSON.parse(response.body)
|
92
|
+
download_date = Time.now
|
93
|
+
|
94
|
+
return cache['pocket_list'] = {
|
95
|
+
list: list['list'],
|
96
|
+
download_date: download_date
|
97
|
+
}
|
98
|
+
else
|
99
|
+
puts response
|
100
|
+
raise NetworkError.new response
|
101
|
+
end
|
102
|
+
rescue Exception => e
|
103
|
+
puts e
|
104
|
+
end
|
105
|
+
|
106
|
+
false
|
107
|
+
end
|
108
|
+
|
109
|
+
def getFillPocketList(bearer_token, pocket_api_url, pocket_list_filter, cache_timeout)
|
110
|
+
cache = PocketJekyllAuth0.cache
|
111
|
+
|
112
|
+
if !cache.key?('pocket_list')
|
113
|
+
puts "pocket_list key not in cache. Trying to fill."
|
114
|
+
return fillPocketList(bearer_token, pocket_api_url, pocket_list_filter)
|
115
|
+
else
|
116
|
+
pocket_list = cache['pocket_list']
|
117
|
+
if (Time.now - cache_timeout) <= pocket_list[:download_date]
|
118
|
+
return pocket_list
|
119
|
+
end
|
120
|
+
|
121
|
+
puts "pocket_list key expired. Trying to fill with new data."
|
122
|
+
|
123
|
+
fillPocketList(bearer_token, pocket_api_url, pocket_list_filter)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def getTemplate
|
128
|
+
custom_template_path = File.join Dir.pwd, '_includes', 'pocket.html'
|
129
|
+
|
130
|
+
if File.exist?(custom_template_path)
|
131
|
+
template = File.read custom_template_path
|
132
|
+
else
|
133
|
+
template_path = File.join __dir__, '_includes', 'pocket.html'
|
134
|
+
template = File.read template_path
|
135
|
+
end
|
136
|
+
Liquid::Template.parse template
|
137
|
+
end
|
138
|
+
|
139
|
+
def renderTemplate(site, pocket_list)
|
140
|
+
getTemplate.render site.site_payload.merge!({'pocket_list' => pocket_list})
|
141
|
+
end
|
142
|
+
|
143
|
+
def render(context)
|
144
|
+
site = context.registers[:site]
|
145
|
+
config = site.config['jekyll-pocket']
|
146
|
+
config_auth0 = config['auth0-config']
|
147
|
+
config_pocket_api = config['pocket-api-config']
|
148
|
+
|
149
|
+
# TODO: Use value from config for cache timeouts.
|
150
|
+
# TODO: Invalidate caches when configuration in _config.yml changes.
|
151
|
+
|
152
|
+
token_object = getFillTokenCache(config_auth0)
|
153
|
+
|
154
|
+
if token_object
|
155
|
+
puts "Auth0 token object received. Object expiration date is #{token_object[:expire_date]}."
|
156
|
+
|
157
|
+
bearer_token = token_object[:access_token]
|
158
|
+
pocket_api_url = config_pocket_api['url']
|
159
|
+
|
160
|
+
puts "Fetching list from Pocket service."
|
161
|
+
|
162
|
+
pocket_list_filter_allowed_keys = ['offset', 'count', 'state', 'favorite', 'tag', 'contentType', 'sort', 'search', 'domain', 'since']
|
163
|
+
pocket_list_filter = config_pocket_api.select { |config_key, config_value| pocket_list_filter_allowed_keys.include? config_key }
|
164
|
+
|
165
|
+
cache_timeout = config_pocket_api['cache-timeout']
|
166
|
+
|
167
|
+
pocket_list = getFillPocketList(bearer_token, pocket_api_url, pocket_list_filter, cache_timeout)
|
168
|
+
|
169
|
+
if pocket_list != false
|
170
|
+
# TODO: only get new bearer token when current was rejected instead of getting it on every error
|
171
|
+
token_object = getFillTokenCache(context)
|
172
|
+
pocket_list = getFillPocketList(bearer_token, pocket_api_url, pocket_list_filter, cache_timeout)[:list]
|
173
|
+
|
174
|
+
ordered_pocket_list = []
|
175
|
+
pocket_list.each { |item_id, item_value| ordered_pocket_list << item_value }
|
176
|
+
ordered_pocket_list.sort_by { |item_value| item_value['time_updated'] }
|
177
|
+
|
178
|
+
render = renderTemplate(site, ordered_pocket_list)
|
179
|
+
else
|
180
|
+
render = renderTemplate(site, [])
|
181
|
+
end
|
182
|
+
else
|
183
|
+
render = renderTemplate(site, [])
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
Liquid::Template.register_tag "pocket", self
|
188
|
+
|
189
|
+
Jekyll::Hooks.register :site, :pre_render do |site|
|
190
|
+
self.attemptListCacheClear site
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
metadata
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pocket_jekyll_auth0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- playfulcorgi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-03-14 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description:
|
14
|
+
email:
|
15
|
+
- unrulybeardedweekend@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/pocket_jekyll_auth0.rb
|
21
|
+
homepage: https://github.com/playfulcorgi/pocket_jekyll_auth0
|
22
|
+
licenses:
|
23
|
+
- MIT
|
24
|
+
metadata: {}
|
25
|
+
post_install_message:
|
26
|
+
rdoc_options: []
|
27
|
+
require_paths:
|
28
|
+
- lib
|
29
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.7.0
|
34
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
requirements: []
|
40
|
+
rubygems_version: 3.1.2
|
41
|
+
signing_key:
|
42
|
+
specification_version: 4
|
43
|
+
summary: Pocket Jekyll Auth0.
|
44
|
+
test_files: []
|