navilocal 1.1.4 → 1.1.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|