pocket_jekyll_auth0 0.1.0

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