navilocal 1.1.4 → 1.1.5
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/application/models/settings.rb +4 -1
- data/application/ui/navi/account_configuration.rb +120 -7
- data/application/ui/navi/agreement.rb +2 -2
- data/application/ui/navi/installer_assistant.rb +16 -6
- data/application/ui/navi/main_runner.rb +165 -7
- data/application/ui/navi/splash.rb +19 -1
- data/bin/test.rb +90 -0
- data/gresource.bin +0 -0
- data/resources/config/gmail_api_secret.json +14 -0
- metadata +7 -5
- /data/resources/{texts → config}/env.yml +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 98103c3ff7d60501b98f0d0dfc7226f2160f5ec8bf1353edc6c99cc5e7288bd9
|
4
|
+
data.tar.gz: 9bb3577d9448c190d0c9c79968c29f15abf07b35b501055c686ef38afcc60acd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 590631360504966bece25ee644c7efb3f65d385f00e91654428f1aae8656bd8631863b3e9f26fd527cfded21c473258445cf001915edbd256d8e8ffd73337bbd
|
7
|
+
data.tar.gz: 46bfea049da5c9091bbd13b34f40f0dbf58d1079f1f321ff6a988bcd2a3f55106d06dbdfb168d32b2cdb5cd7e522a4a553737152f82c79b2cc2a03c28b90aab1
|
@@ -3,12 +3,15 @@ require 'json'
|
|
3
3
|
|
4
4
|
module NaviClientInstaller
|
5
5
|
class Settings
|
6
|
-
PROPERTIES = [:provider, :username, :password, :agreement, :location, :creation_datetime, :last_modified, :download_path, :install, :hash, :client_log_file, :common_words_file, :wikipedia_topic_file, :ai_log_file, :logout, :env].freeze
|
6
|
+
PROPERTIES = [:provider, :username, :password, :agreement, :location, :creation_datetime, :last_modified, :download_path, :install, :hash, :client_log_file, :common_words_file, :wikipedia_topic_file, :ai_log_file, :logout, :env, :method, :identifier].freeze
|
7
7
|
|
8
8
|
PRIORITIES = ['high', 'medium', 'normal', 'low'].freeze
|
9
9
|
|
10
10
|
DEFAULT_STORAGE = File.expand_path File.join('~', '.navi')
|
11
11
|
|
12
|
+
GMAIL_CLIENT_PATH = File.join(File.expand_path('../../', __dir__), 'resources', 'config', 'gmail_api_secret.json')
|
13
|
+
GMAIL_TOKEN_PATH = File.expand_path File.join('~', '.navi', 'bin', 'token.yaml')
|
14
|
+
|
12
15
|
DEFAULT_ENV = "staging"
|
13
16
|
|
14
17
|
attr_accessor *PROPERTIES
|
@@ -1,12 +1,16 @@
|
|
1
1
|
require_relative '../../lib/common_functions'
|
2
|
+
require 'gmail_client'
|
3
|
+
require "net/imap"
|
4
|
+
|
2
5
|
module NaviClientInstaller
|
3
6
|
class AccountConfiguration
|
4
7
|
attr_accessor :window_ui
|
5
8
|
include CommonFunctions
|
9
|
+
include GmailClient
|
6
10
|
attr_accessor :next_btn
|
7
11
|
attr_accessor :cancel_btn
|
8
12
|
|
9
|
-
def initialize(settings, next_btn=nil, show_cancel_btn = nil)
|
13
|
+
def initialize(settings, next_btn = nil, show_cancel_btn = nil)
|
10
14
|
builder = Gtk::Builder.new(:resource => '/com/navi/navi-client/ui/account_configuration.ui')
|
11
15
|
css_provider = Gtk::CssProvider.new
|
12
16
|
css_provider.load(:resource_path => '/com/navi/navi-client/css/main.css')
|
@@ -16,6 +20,16 @@ module NaviClientInstaller
|
|
16
20
|
@combo_text_provider = builder.get_object("combo_text_ac_provider")
|
17
21
|
@entry_email = builder.get_object("entry_email")
|
18
22
|
@entry_password = builder.get_object("entry_password")
|
23
|
+
@rb_method = builder.get_object("imap_method")
|
24
|
+
@gmail_method = builder.get_object("gmail_method")
|
25
|
+
@stack = builder.get_object("account_stack")
|
26
|
+
@imap_child = builder.get_object("imap_child")
|
27
|
+
@gmail_child = builder.get_object("gmail_child")
|
28
|
+
@google_btn = builder.get_object("google_btn")
|
29
|
+
@code_entry = builder.get_object("code_entry")
|
30
|
+
@error_ind = builder.get_object("error")
|
31
|
+
@user_holder = builder.get_object("user_holder")
|
32
|
+
|
19
33
|
@next_btn = next_btn
|
20
34
|
|
21
35
|
if(@next_btn.nil?)
|
@@ -25,8 +39,32 @@ module NaviClientInstaller
|
|
25
39
|
end
|
26
40
|
@next_btn.visible = true
|
27
41
|
|
28
|
-
|
29
|
-
|
42
|
+
if(settings.method == 'gmail')
|
43
|
+
@gmail_method.active = true
|
44
|
+
@stack.set_visible_child @gmail_child
|
45
|
+
else
|
46
|
+
@rb_method.active = true
|
47
|
+
@stack.set_visible_child @imap_child
|
48
|
+
end
|
49
|
+
|
50
|
+
if(settings.method == "gmail")
|
51
|
+
@user_holder.text = "Signed In as #{settings.username}"
|
52
|
+
@google_btn.label = "Use another gmail account"
|
53
|
+
end
|
54
|
+
|
55
|
+
@rb_method.signal_connect("toggled") {|imap_btn_active|
|
56
|
+
|
57
|
+
prepare_ui @next_btn
|
58
|
+
if imap_btn_active.active?
|
59
|
+
@stack.set_visible_child @imap_child
|
60
|
+
else
|
61
|
+
@stack.set_visible_child @gmail_child
|
62
|
+
end
|
63
|
+
|
64
|
+
}
|
65
|
+
|
66
|
+
@settings = settings
|
67
|
+
|
30
68
|
@entry_email.set_text settings.username unless settings.username.nil?
|
31
69
|
@entry_password.set_text settings.password unless settings.password.nil?
|
32
70
|
|
@@ -37,11 +75,25 @@ module NaviClientInstaller
|
|
37
75
|
|
38
76
|
prepare_ui @next_btn
|
39
77
|
|
78
|
+
@google_btn.signal_connect "clicked" do |widget|
|
79
|
+
@user_holder.text = ""
|
80
|
+
authorize_user
|
81
|
+
url = authorization_url
|
82
|
+
system("open", url)
|
83
|
+
@settings.method = nil
|
84
|
+
@code_entry.visible = true
|
85
|
+
prepare_ui @next_btn
|
86
|
+
end
|
87
|
+
|
40
88
|
@combo_text_provider.signal_connect "changed" do |widget|
|
41
89
|
settings.provider = widget.active_iter.get_value(1)
|
42
90
|
prepare_ui @next_btn
|
43
91
|
end
|
44
92
|
|
93
|
+
@code_entry.signal_connect "changed" do |widget|
|
94
|
+
prepare_ui @next_btn
|
95
|
+
end
|
96
|
+
|
45
97
|
@entry_password.signal_connect "changed" do |widget|
|
46
98
|
settings.password= widget.text
|
47
99
|
prepare_ui @next_btn
|
@@ -55,16 +107,77 @@ module NaviClientInstaller
|
|
55
107
|
white = Gdk::RGBA::new(1, 1, 1, 1.0)
|
56
108
|
@window_ui.override_background_color(:normal, white)
|
57
109
|
|
58
|
-
apply_css @
|
110
|
+
apply_css @window_ui, css_provider
|
59
111
|
|
60
|
-
|
61
|
-
|
112
|
+
end
|
113
|
+
|
114
|
+
def authorize_user
|
115
|
+
application_root_path = File.expand_path('../../../', __dir__)
|
62
116
|
|
117
|
+
init File.join(application_root_path, 'resources', 'config', 'gmail_api_secret.json'), NaviClientInstaller::Settings::DEFAULT_STORAGE + "/bin/token.yaml", "user"
|
63
118
|
end
|
64
119
|
|
65
120
|
def prepare_ui(nxt_btn, prev_btn = nil)
|
66
|
-
|
121
|
+
@error_ind.text = ""
|
122
|
+
valid = (!@entry_email.text.empty? && !@entry_password.text.empty? && !@combo_text_provider.active_iter.get_value(1).nil? && @rb_method.active?) ||
|
123
|
+
((!@code_entry.text.empty? || @settings.method == "api") && !@rb_method.active?)
|
67
124
|
nxt_btn&.set_sensitive valid
|
68
125
|
end
|
126
|
+
|
127
|
+
|
128
|
+
def post_conditions
|
129
|
+
success = false
|
130
|
+
@next_btn.set_sensitive success
|
131
|
+
|
132
|
+
if @rb_method.active?
|
133
|
+
|
134
|
+
begin
|
135
|
+
imap = Net::IMAP.new @settings.provider, ssl: true, certs: nil, verify: false
|
136
|
+
imap.login @settings.username, @settings.password
|
137
|
+
@settings.method = "imap"
|
138
|
+
success = true
|
139
|
+
rescue
|
140
|
+
@error_ind.text = "Wrong email or password."
|
141
|
+
end
|
142
|
+
|
143
|
+
else
|
144
|
+
begin
|
145
|
+
if @settings.method == "api"
|
146
|
+
success = true
|
147
|
+
else
|
148
|
+
cred = authorize @code_entry.text, "user"
|
149
|
+
|
150
|
+
unless cred.nil?
|
151
|
+
user = get_user_info "me"
|
152
|
+
update_user user.email_address
|
153
|
+
@settings.username = user.email_address
|
154
|
+
@settings.password = nil
|
155
|
+
@settings.provider = nil
|
156
|
+
@settings.method = "api"
|
157
|
+
@code_entry.text = ""
|
158
|
+
@code_entry.visible = false
|
159
|
+
@user_holder.text = "Signed In as #{user.email_address}"
|
160
|
+
@google_btn.label = "Use another gmail"
|
161
|
+
|
162
|
+
success = true
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
rescue
|
167
|
+
@error_ind.text = "Authorization Code invalid or expired."
|
168
|
+
end
|
169
|
+
|
170
|
+
end
|
171
|
+
|
172
|
+
return success
|
173
|
+
end
|
174
|
+
|
175
|
+
def update_user user_email
|
176
|
+
file_path = NaviClientInstaller::Settings::DEFAULT_STORAGE + "/bin/token.yaml"
|
177
|
+
data = YAML.load_file file_path
|
178
|
+
newData = { user_email => data["user"] }
|
179
|
+
File.open(file_path, 'w') { |f| YAML.dump(newData, f) }
|
180
|
+
end
|
181
|
+
|
69
182
|
end
|
70
183
|
end
|
@@ -8,7 +8,7 @@ module NaviClientInstaller
|
|
8
8
|
|
9
9
|
def initialize(values, btn_next = nil)
|
10
10
|
builder = Gtk::Builder.new(:resource => '/com/navi/navi-client/ui/agreement.ui')
|
11
|
-
agreementTextContent = Gio::Resources.lookup_data("/com/navi/navi-client/
|
11
|
+
agreementTextContent = Gio::Resources.lookup_data("/com/navi/navi-client/config/agreement_main_content.html", 0)
|
12
12
|
css_provider = Gtk::CssProvider.new
|
13
13
|
css_provider.load(:resource_path => '/com/navi/navi-client/css/main.css')
|
14
14
|
|
@@ -28,7 +28,7 @@ module NaviClientInstaller
|
|
28
28
|
values&.agreement = button.active?
|
29
29
|
}
|
30
30
|
|
31
|
-
agreementTextContent = Gio::Resources.lookup_data("/com/navi/navi-client/
|
31
|
+
agreementTextContent = Gio::Resources.lookup_data("/com/navi/navi-client/config/agreement_main_content.html", 0)
|
32
32
|
|
33
33
|
|
34
34
|
apply_css tv_agreement_main_content, css_provider
|
@@ -49,7 +49,7 @@ module NaviClientInstaller
|
|
49
49
|
|
50
50
|
def load_env env = 'production'
|
51
51
|
application_root_path = File.expand_path('../../../', __dir__)
|
52
|
-
envs = YAML.load_file(File.join(application_root_path, 'resources', '
|
52
|
+
envs = YAML.load_file(File.join(application_root_path, 'resources', 'config', 'env.yml'))[env]
|
53
53
|
ENV['env'] = env
|
54
54
|
envs.each {|k,v| ENV[k] = v }
|
55
55
|
end
|
@@ -118,10 +118,13 @@ module NaviClientInstaller
|
|
118
118
|
|
119
119
|
@step_account_configuration.next_btn.signal_connect 'clicked' do |button|
|
120
120
|
|
121
|
-
@
|
122
|
-
|
123
|
-
|
124
|
-
|
121
|
+
if @step_account_configuration.post_conditions
|
122
|
+
@settings.save_settings
|
123
|
+
main_stack.set_visible_child(@splash.window_ui)
|
124
|
+
# @initiate_login.call
|
125
|
+
@splash.initiate_signup @signup_gauss, @logout_control
|
126
|
+
end
|
127
|
+
|
125
128
|
end
|
126
129
|
|
127
130
|
@step_account_configuration.cancel_btn&.signal_connect 'clicked' do |button|
|
@@ -153,6 +156,7 @@ module NaviClientInstaller
|
|
153
156
|
|
154
157
|
if(resp && @settings.hash && resp.code == 200)
|
155
158
|
@settings.logout = false
|
159
|
+
@settings.identifier = JSON.parse(Base64.decode64(resp["user"]))["resource_name"]
|
156
160
|
@settings.save_settings
|
157
161
|
@current_window = @runner_window
|
158
162
|
@runner_window.set_token resp["access_token"]
|
@@ -219,6 +223,12 @@ module NaviClientInstaller
|
|
219
223
|
if index == @steps.length
|
220
224
|
initiate_splash
|
221
225
|
elsif index < @steps.length && index > -1
|
226
|
+
|
227
|
+
if factor == 1 && defined? @current_window.post_conditions
|
228
|
+
|
229
|
+
return if !@current_window.post_conditions
|
230
|
+
end
|
231
|
+
|
222
232
|
main_stack.set_transition_type(transistion_type)
|
223
233
|
@current_window = @steps[index]
|
224
234
|
|
@@ -234,7 +244,7 @@ module NaviClientInstaller
|
|
234
244
|
def recover_state
|
235
245
|
if @settings.agreement != true
|
236
246
|
@step_licence_agreement
|
237
|
-
elsif @settings.username.nil? || @settings.password.nil? || @settings.provider.nil?
|
247
|
+
elsif @settings.method.nil? || ((@settings.username.nil? || @settings.password.nil? || @settings.provider.nil?) && @settings.method == "imap") || (@settings.username.nil? && @settings.method == "gmail")
|
238
248
|
@step_account_configuration
|
239
249
|
elsif @settings.location.nil? || @settings.download_path.nil?
|
240
250
|
@step_destination_select
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require_relative '../../lib/common_functions'
|
2
2
|
require 'navi_client'
|
3
3
|
require 'httparty'
|
4
|
+
require 'base64'
|
4
5
|
|
5
6
|
module NaviClientInstaller
|
6
7
|
class NaviRunner
|
@@ -25,7 +26,7 @@ module NaviClientInstaller
|
|
25
26
|
@settings = settings
|
26
27
|
stop_naviai
|
27
28
|
|
28
|
-
@email_display.label = settings&.username
|
29
|
+
@email_display.label = settings&.username ? settings&.username : ''
|
29
30
|
|
30
31
|
image = builder.get_object("app_logo")
|
31
32
|
image.set_from_resource('/com/navi/navi-client/images/navi-logo-small.png')
|
@@ -72,10 +73,12 @@ module NaviClientInstaller
|
|
72
73
|
@action_logout.signal_connect("activate") do |_action, parameter|
|
73
74
|
@settings.logout = true
|
74
75
|
@settings.username = nil
|
76
|
+
@settings.method = nil
|
75
77
|
@settings.password = nil
|
76
78
|
@settings.hash = nil
|
77
79
|
@settings.save_settings
|
78
80
|
terminate_worker_thread
|
81
|
+
FileUtils.rm_f(NaviClientInstaller::Settings::GMAIL_TOKEN_PATH) if File.file?(NaviClientInstaller::Settings::GMAIL_TOKEN_PATH)
|
79
82
|
logout_control.call
|
80
83
|
@action_logout.set_enabled false
|
81
84
|
end
|
@@ -87,8 +90,10 @@ module NaviClientInstaller
|
|
87
90
|
@settings.username = nil
|
88
91
|
@settings.password = nil
|
89
92
|
@settings.hash = nil
|
93
|
+
@settings.method = nil
|
90
94
|
@settings.save_settings
|
91
95
|
terminate_worker_thread
|
96
|
+
FileUtils.rm_f(NaviClientInstaller::Settings::GMAIL_TOKEN_PATH) if File.file?(NaviClientInstaller::Settings::GMAIL_TOKEN_PATH)
|
92
97
|
logout_control.call
|
93
98
|
@action_logout.set_enabled false
|
94
99
|
end
|
@@ -104,7 +109,7 @@ module NaviClientInstaller
|
|
104
109
|
@spinner_indicator.active = true
|
105
110
|
@refresh_btn.sensitive = true
|
106
111
|
@stop_btn.sensitive = true
|
107
|
-
|
112
|
+
start_fetchings
|
108
113
|
end
|
109
114
|
|
110
115
|
end
|
@@ -128,7 +133,7 @@ module NaviClientInstaller
|
|
128
133
|
|
129
134
|
def start_fetching
|
130
135
|
|
131
|
-
@client = NaviClient::Local.new
|
136
|
+
@client = NaviClient::Local.new ""
|
132
137
|
@client.set_token "Token: #{@token}##{@settings.username}"
|
133
138
|
@logger = CustomLogger.new @log_display.buffer, @iter_log, @client.logger
|
134
139
|
@client.override_logger @logger
|
@@ -254,7 +259,7 @@ module NaviClientInstaller
|
|
254
259
|
end
|
255
260
|
|
256
261
|
@notifier.label = "Waiting for the new emails.."
|
257
|
-
@client.idle_loop(
|
262
|
+
@client.idle_loop(['UNSEEN'], folder, @settings.provider, @settings.username, @settings.password, callback, naviai_control)
|
258
263
|
|
259
264
|
else
|
260
265
|
@logger.debug "Failed to connect with your email. Please recheck the configuration."
|
@@ -267,6 +272,155 @@ module NaviClientInstaller
|
|
267
272
|
end
|
268
273
|
|
269
274
|
|
275
|
+
def start_fetchings
|
276
|
+
|
277
|
+
@logger = CustomLogger.new @log_display.buffer, @iter_log
|
278
|
+
@logger.debug "Running the process.."
|
279
|
+
@logger.debug "Initializing the client."
|
280
|
+
|
281
|
+
begin
|
282
|
+
|
283
|
+
if @settings.method == "imap"
|
284
|
+
@client = NaviClient::ImapApi.new @settings.method
|
285
|
+
@logger.set_custom_logger @client.logger
|
286
|
+
@client.override_logger @logger
|
287
|
+
@controller = @client.imap_connection(@settings.provider, @settings.username, @settings.password, false)
|
288
|
+
@controller = nil unless @client.errors.nil?
|
289
|
+
else
|
290
|
+
@client = NaviClient::GmailApi.new @settings.method
|
291
|
+
@logger.set_custom_logger @client.logger
|
292
|
+
@client.override_logger @logger
|
293
|
+
@controller = @client.init(NaviClientInstaller::Settings::GMAIL_CLIENT_PATH, NaviClientInstaller::Settings::GMAIL_TOKEN_PATH, @settings.username)
|
294
|
+
end
|
295
|
+
|
296
|
+
|
297
|
+
#logging to loggly
|
298
|
+
logToLoggly = true
|
299
|
+
if logToLoggly
|
300
|
+
@client.setupLoggly("navi-client")
|
301
|
+
end
|
302
|
+
|
303
|
+
@client.set_token "Token: #{@token}##{@settings.username}"
|
304
|
+
|
305
|
+
unless @controller.nil?
|
306
|
+
filenames = []
|
307
|
+
dateStarted = DateTime.now
|
308
|
+
@logger.debug "Syncing started at #{dateStarted}"
|
309
|
+
|
310
|
+
sendEmailCompletedEvent = true
|
311
|
+
folder = "INBOX"
|
312
|
+
|
313
|
+
@notifier.label = "Checking emails.."
|
314
|
+
@logger.debug "Looking up your emails.."
|
315
|
+
@client.init_messages folder
|
316
|
+
|
317
|
+
downloaded_mails = @client.downloaded
|
318
|
+
@email_indicator.label = "#{downloaded_mails}/#{@client.total_emails}"
|
319
|
+
@client.logToLoggly({event:"EMAIL_SYNC_STARTED", env: ENV['env'], storage: "local", email: @settings.username, total_email: total, already_downloaded: downloaded})
|
320
|
+
|
321
|
+
@notifier.label = "Starting up.."
|
322
|
+
@logger.debug "Starting the system"
|
323
|
+
start_naviai
|
324
|
+
@notifier.label = "Checking for previous failures.."
|
325
|
+
@logger.debug "Parsing previously fetched emails"
|
326
|
+
@client.parse_prev_failed_emails
|
327
|
+
@logger.debug "Complete. OK..."
|
328
|
+
|
329
|
+
@notifier.label = "Fetching emails..."
|
330
|
+
@logger.debug "Fetching emails"
|
331
|
+
stamp = (Time.now.to_f * 1000).to_s
|
332
|
+
@client.fetch_emails do |email_content, index, isLast, id|
|
333
|
+
|
334
|
+
@logger.debug "processing email##{index + 1} with id #{id}"
|
335
|
+
filenames << @client.process_email(email_content, id, stamp)
|
336
|
+
downloaded_mails+=1
|
337
|
+
downloaded_mails = [downloaded_mails, @client.total_emails].min
|
338
|
+
@email_indicator.label = "#{downloaded_mails}/#{@client.total_emails}"
|
339
|
+
|
340
|
+
@logger.debug "processing Complete. OK..."
|
341
|
+
|
342
|
+
if filenames.size == 50 || isLast
|
343
|
+
sendEmailCompletedEvent = !sendEmailCompletedEvent
|
344
|
+
|
345
|
+
@logger.debug "Sending Bulk Request for #{isLast ? filenames.size : 50} emails to parser."
|
346
|
+
@notifier.label = "Parsing the emails..."
|
347
|
+
|
348
|
+
start_naviai
|
349
|
+
@client.send_request(filenames, stamp, is_last: isLast)
|
350
|
+
|
351
|
+
|
352
|
+
@logger.debug "Complete Ok... continue email sync"
|
353
|
+
@notifier.label = "Fetching emails..."
|
354
|
+
# verify
|
355
|
+
filenames = []
|
356
|
+
if sendEmailCompletedEvent && !isLast
|
357
|
+
@client.logToLoggly({event:"EMAIL_SYNC_IN_PROGRESS", env: ENV['env'], storage: "local", email: @settings.username, emailCount: index + 1})
|
358
|
+
elsif isLast
|
359
|
+
|
360
|
+
dateEnded = DateTime.now
|
361
|
+
totalTimeInSecs = (dateEnded - dateStarted) * 24 * 60 * 60
|
362
|
+
|
363
|
+
@client.logToLoggly({event:"EMAIL_SYNC_FINISHED", env: ENV['env'], storage: "local", email: @settings.username, emailCount: index + 1, time_elapsed: totalTimeInSecs.to_f.round(2), total_email: @client.total_emails, already_downloaded: @client.downloaded})
|
364
|
+
@logger.debug "#{index + 1} emails from the #{folder} has been downloaded. OK"
|
365
|
+
@logger.debug "started: #{dateStarted.to_s} , ended: #{dateEnded.to_s}, Total time: #{totalTimeInSecs.to_f.round(2)} secs"
|
366
|
+
end
|
367
|
+
|
368
|
+
stamp = (Time.now.to_f * 1000).to_s
|
369
|
+
|
370
|
+
end
|
371
|
+
|
372
|
+
end
|
373
|
+
|
374
|
+
@logger.debug "All emails sync and parse completed."
|
375
|
+
|
376
|
+
if @settings.method == "imap"
|
377
|
+
@notifier.label = "Finalizing..."
|
378
|
+
callback = Proc.new do |mail, index, id, complete|
|
379
|
+
# complete = args.first || false
|
380
|
+
|
381
|
+
if complete
|
382
|
+
downloaded+=1
|
383
|
+
@logger.debug "processing Complete. OK..."
|
384
|
+
else
|
385
|
+
@notifier.label = "Fetching emails..."
|
386
|
+
@logger.debug "processing email##{index + 1} with id #{mail.__id__.to_s} and uuid #{id}"
|
387
|
+
total+=1
|
388
|
+
end
|
389
|
+
downloaded = [downloaded, total].min
|
390
|
+
@email_indicator.label = "#{downloaded}/#{total}"
|
391
|
+
|
392
|
+
end
|
393
|
+
|
394
|
+
naviai_control = Proc.new do |start|
|
395
|
+
if start
|
396
|
+
@notifier.label = "Parsing the emails..."
|
397
|
+
start_naviai
|
398
|
+
else
|
399
|
+
# stop_naviai
|
400
|
+
@logger.debug "Waiting new mails (IDLE loop)..."
|
401
|
+
@notifier.label = "Waiting for the new emails.."
|
402
|
+
end
|
403
|
+
end
|
404
|
+
|
405
|
+
@notifier.label = "Waiting for the new emails.."
|
406
|
+
@client.idle_loop(['UNSEEN'], folder, @settings.provider, @settings.username, @settings.password, callback, naviai_control)
|
407
|
+
else
|
408
|
+
@notifier.label = "Done.."
|
409
|
+
@spinner_indicator.active = false
|
410
|
+
end
|
411
|
+
|
412
|
+
else
|
413
|
+
@logger.debug "Failed to connect with your email. Please recheck the configuration."
|
414
|
+
end
|
415
|
+
|
416
|
+
rescue => e
|
417
|
+
@logger.debug "#{e.message}"
|
418
|
+
restart_process false
|
419
|
+
end
|
420
|
+
|
421
|
+
end
|
422
|
+
|
423
|
+
|
270
424
|
def prepare_ui btn_next, btn_back
|
271
425
|
|
272
426
|
end
|
@@ -324,24 +478,28 @@ class CustomLogger
|
|
324
478
|
@iter = iterator
|
325
479
|
end
|
326
480
|
|
481
|
+
def set_custom_logger logger
|
482
|
+
@logger_custom = logger
|
483
|
+
end
|
484
|
+
|
327
485
|
def info msg
|
328
486
|
# p msg
|
329
487
|
@buffer.insert(@iter, "#{msg}", :tags => %w(small_gap_below normal-size))
|
330
488
|
@buffer.insert_markup(@iter, "\n")
|
331
|
-
@logger_custom
|
489
|
+
@logger_custom&.info msg
|
332
490
|
end
|
333
491
|
|
334
492
|
def debug msg
|
335
493
|
# p msg
|
336
494
|
@buffer.insert(@iter, "#{msg}", :tags => %w(small_gap_below normal-size))
|
337
495
|
@buffer.insert_markup(@iter, "\n")
|
338
|
-
@logger_custom
|
496
|
+
@logger_custom&.debug msg
|
339
497
|
end
|
340
498
|
|
341
499
|
def error msg
|
342
500
|
# p msg
|
343
501
|
@buffer.insert(@iter, "#{msg}", :tags => %w(small_gap_below normal-size))
|
344
502
|
@buffer.insert_markup(@iter, "\n")
|
345
|
-
@logger_custom
|
503
|
+
@logger_custom&.error msg
|
346
504
|
end
|
347
505
|
end
|
@@ -31,16 +31,30 @@ module NaviClientInstaller
|
|
31
31
|
|
32
32
|
end
|
33
33
|
|
34
|
+
def get_current_user url: "#{ENV['api_url']}/get_current_user", token:
|
35
|
+
HTTParty.get(url, headers: {"Authorization": token})
|
36
|
+
end
|
37
|
+
|
34
38
|
def validate_email(email, pass)
|
35
39
|
# need to remove this hardcoded code
|
36
40
|
begin
|
37
|
-
HTTParty.post(ENV['api_url'] + "/oauth/token",
|
41
|
+
response = HTTParty.post(ENV['api_url'] + "/oauth/token",
|
38
42
|
body: {
|
39
43
|
email: email, # get from sso_web application
|
40
44
|
password: pass,
|
41
45
|
grant_type: "password"
|
42
46
|
}
|
43
47
|
)
|
48
|
+
|
49
|
+
if response.code == 200
|
50
|
+
user_resp = get_current_user token: "Token: #{response["access_token"]}##{email}"
|
51
|
+
|
52
|
+
return user_resp
|
53
|
+
else
|
54
|
+
return nil
|
55
|
+
end
|
56
|
+
|
57
|
+
|
44
58
|
rescue
|
45
59
|
false
|
46
60
|
end
|
@@ -81,8 +95,11 @@ module NaviClientInstaller
|
|
81
95
|
|
82
96
|
if response && response.code == 200
|
83
97
|
error_label.set_opacity 0
|
98
|
+
|
84
99
|
@settings.hash = password_entry.text
|
100
|
+
@settings.identifier = JSON.parse(Base64.decode64(response["user"]))["resource_name"]
|
85
101
|
@settings.save_settings
|
102
|
+
|
86
103
|
callback.call response["access_token"]
|
87
104
|
else
|
88
105
|
error_label.set_opacity 1
|
@@ -105,6 +122,7 @@ module NaviClientInstaller
|
|
105
122
|
if response && response.code == 200
|
106
123
|
error_label.set_opacity 0
|
107
124
|
@settings.hash = widget.text
|
125
|
+
@settings.identifier = JSON.parse(Base64.decode64(response["user"]))["resource_name"]
|
108
126
|
@settings.save_settings
|
109
127
|
callback.call response["access_token"]
|
110
128
|
else
|
data/bin/test.rb
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'google/apis/gmail_v1'
|
2
|
+
require 'googleauth'
|
3
|
+
require 'googleauth/stores/file_token_store'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
OOB_URI = 'urn:ietf:wg:oauth:2.0:oob'.freeze
|
7
|
+
APPLICATION_NAME = 'Gmail Api Sync'.freeze
|
8
|
+
CLIENT_SECRETS_PATH = 'client_secret.json'.freeze
|
9
|
+
CREDENTIALS_PATH = 'token.yaml'.freeze
|
10
|
+
SCOPE = Google::Apis::GmailV1::AUTH_GMAIL_READONLY
|
11
|
+
|
12
|
+
##
|
13
|
+
# Ensure valid credentials, either by restoring from the saved credentials
|
14
|
+
# files or intitiating an OAuth2 authorization. If authorization is required,
|
15
|
+
# the user's default browser will be launched to approve the request.
|
16
|
+
#
|
17
|
+
# @return [Google::Auth::UserRefreshCredentials] OAuth2 credentials
|
18
|
+
def authorize
|
19
|
+
client_id = Google::Auth::ClientId.from_file(CLIENT_SECRETS_PATH)
|
20
|
+
token_store = Google::Auth::Stores::FileTokenStore.new(file: CREDENTIALS_PATH)
|
21
|
+
authorizer = Google::Auth::UserAuthorizer.new(client_id, SCOPE, token_store)
|
22
|
+
user_id = 'woot'
|
23
|
+
credentials = authorizer.get_credentials(user_id)
|
24
|
+
if credentials.nil?
|
25
|
+
url = authorizer.get_authorization_url(base_url: OOB_URI)
|
26
|
+
puts 'Open the following URL in the browser and enter the ' \
|
27
|
+
'resulting code after authorization:\n' + url
|
28
|
+
code = gets
|
29
|
+
credentials = authorizer.get_and_store_credentials_from_code(
|
30
|
+
user_id: user_id, code: code, base_url: OOB_URI
|
31
|
+
)
|
32
|
+
end
|
33
|
+
credentials
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
# Initialize the API
|
38
|
+
service = Google::Apis::GmailV1::GmailService.new
|
39
|
+
service.client_options.application_name = APPLICATION_NAME
|
40
|
+
service.authorization = authorize
|
41
|
+
|
42
|
+
# Show the user's labels
|
43
|
+
user_id = 'me'
|
44
|
+
result = service.list_user_labels(user_id)
|
45
|
+
|
46
|
+
|
47
|
+
messages = []
|
48
|
+
next_page = nil
|
49
|
+
begin
|
50
|
+
result = service.list_user_messages('me', max_results: 1, page_token: next_page, label_ids: ["INBOX"])
|
51
|
+
messages += result.messages
|
52
|
+
p messages.length
|
53
|
+
break if messages.size >= 1
|
54
|
+
next_page = result.next_page_token
|
55
|
+
end while next_page
|
56
|
+
|
57
|
+
payload = nil
|
58
|
+
messages.each { |e|
|
59
|
+
puts "- #{e.id}"
|
60
|
+
result = service.get_user_message('me', e.id)
|
61
|
+
payload = result.payload
|
62
|
+
|
63
|
+
}
|
64
|
+
headers = payload.headers
|
65
|
+
date = headers.any? { |h| h.name == 'Date' } ? headers.find { |h| h.name == 'Date' }.value : ''
|
66
|
+
from = headers.any? { |h| h.name == 'From' } ? headers.find { |h| h.name == 'From' }.value : ''
|
67
|
+
to = headers.any? { |h| h.name == 'To' } ? headers.find { |h| h.name == 'To' }.value : ''
|
68
|
+
subject = headers.any? { |h| h.name == 'Subject' } ? headers.find { |h| h.name == 'Subject' }.value : ''
|
69
|
+
cc = headers.any? { |h| h.name == 'Cc' } ? headers.find { |h| h.name == 'Cc' }.value : ''
|
70
|
+
p date
|
71
|
+
p from
|
72
|
+
p to
|
73
|
+
p subject
|
74
|
+
p cc
|
75
|
+
|
76
|
+
body = payload.body.data
|
77
|
+
if body.nil? && payload.parts.any?
|
78
|
+
body = payload.parts.map { |part| part.body.data }.join
|
79
|
+
end
|
80
|
+
|
81
|
+
p date
|
82
|
+
p DateTime.parse date
|
83
|
+
|
84
|
+
p payload.parts[0].mime_type
|
85
|
+
p payload.parts[1].mime_type
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
# system("open", "http://stackoverflow.com/")
|
90
|
+
|
data/gresource.bin
CHANGED
Binary file
|
@@ -0,0 +1,14 @@
|
|
1
|
+
{
|
2
|
+
"installed": {
|
3
|
+
"client_id": "1088148226633-9utdj3h84e688huqjhkm5to7voob7mvj.apps.googleusercontent.com",
|
4
|
+
"project_id": "daring-research-206204",
|
5
|
+
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
|
6
|
+
"token_uri": "https://accounts.google.com/o/oauth2/token",
|
7
|
+
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
|
8
|
+
"client_secret": "iqED0l3KDUaB9xNSNp2YiysY",
|
9
|
+
"redirect_uris": [
|
10
|
+
"urn:ietf:wg:oauth:2.0:oob",
|
11
|
+
"http://localhost"
|
12
|
+
]
|
13
|
+
}
|
14
|
+
}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: navilocal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Msanjib
|
@@ -39,19 +39,19 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.11.3
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: navi-email-sync
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 0.0.1
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 0.0.1
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: httparty
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,8 +86,10 @@ files:
|
|
86
86
|
- application/ui/navi/prefs.rb
|
87
87
|
- application/ui/navi/splash.rb
|
88
88
|
- bin/navilocal
|
89
|
+
- bin/test.rb
|
89
90
|
- gresource.bin
|
90
|
-
- resources/
|
91
|
+
- resources/config/env.yml
|
92
|
+
- resources/config/gmail_api_secret.json
|
91
93
|
homepage: http://rubygems.org/gems/navilocal
|
92
94
|
licenses:
|
93
95
|
- NAVI
|
File without changes
|