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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/pocket_jekyll_auth0.rb +193 -0
  3. 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: []