pocket_jekyll_auth0 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|