mournmail 1.0.1 → 1.0.2
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 +42 -13
- data/lib/mournmail/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 140daea6492012b5093229b435fdbe2c98548430b8b8a74a0714483dd039c085
|
4
|
+
data.tar.gz: cb3fb9f8bd0a43fce73f3bd2d3e1d9515acaf74c1a3246c429c027ea7f9db140
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dbfe86922c8b715349fd6d22443e0222b58b6b4c6ea64e78a3cfc01b1caa8f9b4852796a381556f536a9cc8608db8203e69de17c7ce47d4172e03392c34a0847
|
7
|
+
data.tar.gz: 4437171b2b8baa965d829c30f1807d0c23b459dd0b5c5756b54fd728177d0e3af2df6702939b155f80913fb254d49303aee6123047509a0f44643e471feb03d0
|
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,6 +11,7 @@ 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)
|
@@ -225,6 +226,41 @@ module Mournmail
|
|
225
226
|
end
|
226
227
|
end
|
227
228
|
|
229
|
+
class GoogleAuthCallbackServer
|
230
|
+
def initialize
|
231
|
+
@servers = Socket.tcp_server_sockets("127.0.0.1", 0)
|
232
|
+
end
|
233
|
+
|
234
|
+
def port
|
235
|
+
@servers.first.local_address.ip_port
|
236
|
+
end
|
237
|
+
|
238
|
+
def receive_code
|
239
|
+
Socket.accept_loop(@servers) do |sock, addr|
|
240
|
+
line = sock.gets
|
241
|
+
query_string = line.slice(%r'\AGET [^?]*\?(.*) HTTP/1.1\r\n', 1)
|
242
|
+
params = CGI.parse(query_string)
|
243
|
+
code = params["code"][0]
|
244
|
+
while line = sock.gets
|
245
|
+
break if line == "\r\n"
|
246
|
+
end
|
247
|
+
sock.print("HTTP/1.1 200 OK\r\n")
|
248
|
+
sock.print("Content-Type: text/plain\r\n")
|
249
|
+
sock.print("\r\n")
|
250
|
+
if code
|
251
|
+
sock.print("Authenticated!")
|
252
|
+
else
|
253
|
+
sock.print("Authentication failed!")
|
254
|
+
end
|
255
|
+
return code
|
256
|
+
ensure
|
257
|
+
sock.close
|
258
|
+
end
|
259
|
+
ensure
|
260
|
+
@servers.each(&:close)
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
228
264
|
def self.google_access_token(account = current_account)
|
229
265
|
auth_path = File.expand_path("cache/#{account}/google_auth.json",
|
230
266
|
CONFIG[:mournmail_directory])
|
@@ -236,28 +272,21 @@ module Mournmail
|
|
236
272
|
conf = CONFIG[:mournmail_accounts][account]
|
237
273
|
path = File.expand_path(conf[:client_secret_path])
|
238
274
|
client_secrets = Google::APIClient::ClientSecrets.load(path)
|
275
|
+
callback_server = GoogleAuthCallbackServer.new
|
239
276
|
auth_client = client_secrets.to_authorization
|
240
277
|
auth_client.update!(
|
241
278
|
:scope => 'https://mail.google.com/',
|
242
|
-
:redirect_uri =>
|
279
|
+
:redirect_uri => "http://127.0.0.1:#{callback_server.port}/"
|
243
280
|
)
|
244
281
|
auth_uri = auth_client.authorization_uri.to_s
|
245
|
-
|
282
|
+
foreground! do
|
246
283
|
begin
|
247
284
|
Launchy.open(auth_uri)
|
248
285
|
rescue Launchy::CommandNotFoundError
|
249
|
-
|
286
|
+
show_google_auth_uri(auth_uri)
|
250
287
|
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
|
-
}
|
288
|
+
end
|
289
|
+
auth_client.code = callback_server.receive_code
|
261
290
|
auth_client.fetch_access_token!
|
262
291
|
old_umask = File.umask(077)
|
263
292
|
begin
|
data/lib/mournmail/version.rb
CHANGED
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.2
|
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-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: textbringer
|