mournmail 1.0.1 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mournmail/config.rb +17 -0
- data/lib/mournmail/message_mode.rb +8 -0
- data/lib/mournmail/utils.rb +43 -32
- data/lib/mournmail/version.rb +1 -1
- data/mournmail.gemspec +2 -2
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7b758be18cec7a7b8e51d1d1a02cdc8652200800d3c96cd54b471f360e139310
|
4
|
+
data.tar.gz: d201ace873c79702fec68815cda4276f4d78d8dcb60e982b2d24c43efd014778
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d972e8d6410736c90eb8074f723a96bed957ca7cdd7c74350261c47cce57c3527a692ea422375e08a5f892ee08fbcfcb7d88edbb0b83e9c6ab1adf6f0616383b
|
7
|
+
data.tar.gz: fa3659729fc83d4373896511009080e36297c1382e857e25ef2c7dfa1421d78ef506bafd23d81e00f504972116a0a281843359b22b4446b2031791e6b115450c
|
data/lib/mournmail/config.rb
CHANGED
@@ -36,4 +36,21 @@ module Textbringer
|
|
36
36
|
end
|
37
37
|
CONFIG[:mournmail_addresses_path] = File.expand_path("~/.addresses")
|
38
38
|
CONFIG[:mournmail_signature_regexp] = /^\n-- /
|
39
|
+
CONFIG[:mournmail_allowed_attachment_extensions] = [
|
40
|
+
"txt",
|
41
|
+
"md",
|
42
|
+
"htm",
|
43
|
+
"html",
|
44
|
+
"pdf",
|
45
|
+
"jpg",
|
46
|
+
"jpeg",
|
47
|
+
"png",
|
48
|
+
"gif",
|
49
|
+
"doc",
|
50
|
+
"docx",
|
51
|
+
"xls",
|
52
|
+
"xlsx",
|
53
|
+
"ppt",
|
54
|
+
"zip"
|
55
|
+
]
|
39
56
|
end
|
@@ -129,6 +129,14 @@ module Mournmail
|
|
129
129
|
raise EditorError, "Can't open a multipart entity."
|
130
130
|
end
|
131
131
|
ext = part_file_name(part).slice(/\.([^.]+)\z/, 1)
|
132
|
+
if part.main_type != "text" || part.sub_type == "html"
|
133
|
+
if ext.nil?
|
134
|
+
raise EditorError, "The extension of the filename is not specified"
|
135
|
+
end
|
136
|
+
if !CONFIG[:mournmail_allowed_attachment_extensions].include?(ext)
|
137
|
+
raise EditorError, ".#{ext} is not allowed"
|
138
|
+
end
|
139
|
+
end
|
132
140
|
if ext
|
133
141
|
file_name = ["mournmail", "." + ext]
|
134
142
|
else
|
data/lib/mournmail/utils.rb
CHANGED
@@ -11,12 +11,13 @@ require 'google/api_client/client_secrets'
|
|
11
11
|
require 'google/api_client/auth/storage'
|
12
12
|
require 'google/api_client/auth/storages/file_store'
|
13
13
|
require 'launchy'
|
14
|
+
require "socket"
|
14
15
|
|
15
16
|
class Net::SMTP
|
16
17
|
def auth_xoauth2(user, secret)
|
17
18
|
check_auth_args user, secret
|
18
19
|
res = critical {
|
19
|
-
s =
|
20
|
+
s = Net::IMAP::XOauth2Authenticator.new(user, secret).process("")
|
20
21
|
get_response('AUTH XOAUTH2 ' + base64_encode(s))
|
21
22
|
}
|
22
23
|
check_auth_response res
|
@@ -24,20 +25,6 @@ class Net::SMTP
|
|
24
25
|
end
|
25
26
|
end
|
26
27
|
|
27
|
-
class Net::IMAP::Xoauth2Authenticator
|
28
|
-
def process(data)
|
29
|
-
Mournmail.xoauth2_string(@user, @access_token)
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
def initialize(user, access_token)
|
35
|
-
@user = user
|
36
|
-
@access_token = access_token
|
37
|
-
end
|
38
|
-
end
|
39
|
-
Net::IMAP.add_authenticator("XOAUTH2", Net::IMAP::Xoauth2Authenticator)
|
40
|
-
|
41
28
|
module Mournmail
|
42
29
|
begin
|
43
30
|
require "mail-gpg"
|
@@ -225,6 +212,41 @@ module Mournmail
|
|
225
212
|
end
|
226
213
|
end
|
227
214
|
|
215
|
+
class GoogleAuthCallbackServer
|
216
|
+
def initialize
|
217
|
+
@servers = Socket.tcp_server_sockets("127.0.0.1", 0)
|
218
|
+
end
|
219
|
+
|
220
|
+
def port
|
221
|
+
@servers.first.local_address.ip_port
|
222
|
+
end
|
223
|
+
|
224
|
+
def receive_code
|
225
|
+
Socket.accept_loop(@servers) do |sock, addr|
|
226
|
+
line = sock.gets
|
227
|
+
query_string = line.slice(%r'\AGET [^?]*\?(.*) HTTP/1.1\r\n', 1)
|
228
|
+
params = CGI.parse(query_string)
|
229
|
+
code = params["code"][0]
|
230
|
+
while line = sock.gets
|
231
|
+
break if line == "\r\n"
|
232
|
+
end
|
233
|
+
sock.print("HTTP/1.1 200 OK\r\n")
|
234
|
+
sock.print("Content-Type: text/plain\r\n")
|
235
|
+
sock.print("\r\n")
|
236
|
+
if code
|
237
|
+
sock.print("Authenticated!")
|
238
|
+
else
|
239
|
+
sock.print("Authentication failed!")
|
240
|
+
end
|
241
|
+
return code
|
242
|
+
ensure
|
243
|
+
sock.close
|
244
|
+
end
|
245
|
+
ensure
|
246
|
+
@servers.each(&:close)
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
228
250
|
def self.google_access_token(account = current_account)
|
229
251
|
auth_path = File.expand_path("cache/#{account}/google_auth.json",
|
230
252
|
CONFIG[:mournmail_directory])
|
@@ -236,28 +258,21 @@ module Mournmail
|
|
236
258
|
conf = CONFIG[:mournmail_accounts][account]
|
237
259
|
path = File.expand_path(conf[:client_secret_path])
|
238
260
|
client_secrets = Google::APIClient::ClientSecrets.load(path)
|
261
|
+
callback_server = GoogleAuthCallbackServer.new
|
239
262
|
auth_client = client_secrets.to_authorization
|
240
263
|
auth_client.update!(
|
241
264
|
:scope => 'https://mail.google.com/',
|
242
|
-
:redirect_uri =>
|
265
|
+
:redirect_uri => "http://127.0.0.1:#{callback_server.port}/"
|
243
266
|
)
|
244
267
|
auth_uri = auth_client.authorization_uri.to_s
|
245
|
-
|
268
|
+
foreground! do
|
246
269
|
begin
|
247
270
|
Launchy.open(auth_uri)
|
248
271
|
rescue Launchy::CommandNotFoundError
|
249
|
-
|
272
|
+
show_google_auth_uri(auth_uri)
|
250
273
|
end
|
251
|
-
|
252
|
-
|
253
|
-
Window.redisplay
|
254
|
-
read_from_minibuffer("Code: ").chomp
|
255
|
-
ensure
|
256
|
-
if buffer
|
257
|
-
kill_buffer(buffer, force: true)
|
258
|
-
end
|
259
|
-
end
|
260
|
-
}
|
274
|
+
end
|
275
|
+
auth_client.code = callback_server.receive_code
|
261
276
|
auth_client.fetch_access_token!
|
262
277
|
old_umask = File.umask(077)
|
263
278
|
begin
|
@@ -288,10 +303,6 @@ module Mournmail
|
|
288
303
|
buffer
|
289
304
|
end
|
290
305
|
|
291
|
-
def self.xoauth2_string(user, access_token)
|
292
|
-
"user=#{user}\1auth=Bearer #{access_token}\1\1"
|
293
|
-
end
|
294
|
-
|
295
306
|
def self.fetch_summary(mailbox, all: false)
|
296
307
|
if all
|
297
308
|
summary = Mournmail::Summary.new(mailbox)
|
data/lib/mournmail/version.rb
CHANGED
data/mournmail.gemspec
CHANGED
@@ -23,11 +23,11 @@ Gem::Specification.new do |spec|
|
|
23
23
|
|
24
24
|
spec.add_runtime_dependency "textbringer"
|
25
25
|
spec.add_runtime_dependency "net-smtp"
|
26
|
-
spec.add_runtime_dependency "net-imap"
|
26
|
+
spec.add_runtime_dependency "net-imap", ">= 0.3.1"
|
27
27
|
spec.add_runtime_dependency "mail"
|
28
28
|
spec.add_runtime_dependency "mime-types"
|
29
29
|
spec.add_runtime_dependency "rroonga"
|
30
|
-
spec.add_runtime_dependency "google-
|
30
|
+
spec.add_runtime_dependency "google-apis-core"
|
31
31
|
spec.add_runtime_dependency "launchy"
|
32
32
|
spec.add_runtime_dependency "html2text"
|
33
33
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mournmail
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shugo Maeda
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-09-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: textbringer
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 0.3.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.3.1
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: mail
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -95,7 +95,7 @@ dependencies:
|
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name: google-
|
98
|
+
name: google-apis-core
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - ">="
|