talktome 1.3.0 → 1.3.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8ca8cf300ad4144fd6336f1ff56e4fc97140742869f10397ce62c9d0fecd3c03
4
- data.tar.gz: 9d439309e79ebb3da0ea177af0606e882a643adc55e045cca5a56bb154ac6888
3
+ metadata.gz: f3b0e85edd98ed5039c0fdfd16a446ad289e79a2875b7ff7a39c3b9a555a0f3b
4
+ data.tar.gz: 757644a3507d6699bc27e4aeb59bf7b2c5d7738212edf7ebada24438200e2449
5
5
  SHA512:
6
- metadata.gz: d4bd93a6e3bde5390185ebd55844a0db7b48fd81ca0c0982289d67ca15c5866f402b645191f6ba1826a7c4b5147b67937e0d7c07cd9f08788a616b2f019751c4
7
- data.tar.gz: 9b255ab12108b8e37c024aff7bbe49b8ce85c543cc14fe62b797d64aadcbd59c2a9fe33530bdfa3e35872a7a3a553673ff064472e4fbf4cf4563377c2de4ad14
6
+ metadata.gz: 78e81c6c932b3163c490ded97eb78adeb8ab9af3592a3448629159f016ab93275da6306958f6fe473759eb29fe03f8121ffcdd55f0ba9f4fc5645ec8f4fb8c25
7
+ data.tar.gz: a889469fb5e7bdb3d544e3c215ee685b01fa4795a3356b004a34757bec636632d66262a904b84af82de09fc99dda446d9668fd37daa55ce5cef54eecef0cf3a9
data/lib/talktome/app.rb CHANGED
@@ -17,11 +17,20 @@ module Talktome
17
17
 
18
18
  VALIDATION_SCHEMA = ::Finitio.system(<<~FIO)
19
19
  @import finitio/data
20
+ Attachment = {
21
+ mime_type : String
22
+ content : .Object
23
+ encoding :? String
24
+ }
20
25
  Email = String(s | s =~ /^[^@]+@[^@]+$/ )
21
26
  {
22
- to :? Email
23
- reply_to :? Email
24
- ... : .Object
27
+ to :? Email
28
+ reply_to :? Email
29
+ in_reply_to :? String
30
+ attachments :? {
31
+ ... : Attachment
32
+ }
33
+ ... : .Object
25
34
  }
26
35
  FIO
27
36
 
@@ -34,14 +43,20 @@ module Talktome
34
43
  user = load_user_from_info!
35
44
  settings.talktome.talktome(action, user, info.merge(allvars: as_array, subject: subject, footer: footer), [:email]){|email|
36
45
  email.reply_to = info[:reply_to] if info.has_key?(:reply_to)
46
+ email.in_reply_to = info[:in_reply_to] if info.has_key?(:in_reply_to)
47
+ (info[:attachments] || {}).each do |name, att|
48
+ email.attachments[name.to_s] = att
49
+ end
37
50
  }
38
51
  [ 200, { "Content-Type" => "text/plain"}, ["Ok"] ]
39
52
  rescue JSON::ParserError
40
53
  fail!("Invalid data")
41
54
  rescue Finitio::Error => ex
42
55
  fail!(ex.message)
43
- rescue ::Talktome::InvalidEmailError => ex
56
+ rescue ::Talktome::InvalidEmailError
44
57
  fail!("Invalid email address")
58
+ rescue ::Talktome::TemplateNotFoundError
59
+ fail!("No such template", 404)
45
60
  end
46
61
  end
47
62
 
@@ -54,7 +69,8 @@ module Talktome
54
69
  end
55
70
 
56
71
  def load_user_from_info!
57
- if to = info[:to]
72
+ protected_fields = [:to, :in_reply_to, :attachments]
73
+ if (info.keys & protected_fields).any?
58
74
  secret = Talktome.env('TALKTOME_BEARER_SECRET')
59
75
  fail!("Missing secret", 400) unless secret
60
76
  fail!("Invalid secret", 401) unless "Bearer #{secret}" == env["HTTP_AUTHORIZATION"]
@@ -17,7 +17,7 @@ module Talktome
17
17
 
18
18
  def load_message!(identifier, strategies)
19
19
  folder = self.folder/identifier
20
- raise InvalidMessageError, "No such message `#{identifier}`" unless folder.exists?
20
+ raise TemplateNotFoundError, "No such message `#{identifier}`" unless folder.exists?
21
21
  raise InvalidMessageError, "Message `#{identifier}` should be a folder" unless folder.directory?
22
22
  strategies.each do |s|
23
23
  if (file = folder.glob("#{s}.*").first) && file.file?
@@ -2,4 +2,5 @@ module Talktome
2
2
  class Error < StandardError; end
3
3
  class InvalidMessageError < Error; end
4
4
  class InvalidEmailError < Error; end
5
+ class TemplateNotFoundError < Error; end
5
6
  end
@@ -16,6 +16,8 @@ module Talktome
16
16
  [
17
17
  :to,
18
18
  :reply_to,
19
+ :in_reply_to,
20
+ :attachments,
19
21
  :subject
20
22
  ].each do |which|
21
23
  if arg = message.metadata[which.to_s]
@@ -2,7 +2,7 @@ module Talktome
2
2
  module Version
3
3
  MAJOR = 1
4
4
  MINOR = 3
5
- TINY = 0
5
+ TINY = 4
6
6
  end
7
7
  VERSION = "#{Version::MAJOR}.#{Version::MINOR}.#{Version::TINY}"
8
8
  end
data/spec/app/test_app.rb CHANGED
@@ -163,6 +163,104 @@ module Talktome
163
163
  end
164
164
  end
165
165
 
166
+ context 'POST /support/, regarding the In-Reply-To' do
167
+ class ::Talktome::Message::Template
168
+ def raise_on_context_miss?
169
+ false
170
+ end
171
+ end
172
+
173
+ it 'forbids the usage of :in_reply_to unless a secret is provided' do
174
+ post "/support/", {
175
+ in_reply_to: '<F6E2D0B4-CC35-4A91-BA4C-C7C712B10C13@company.com>',
176
+ }.to_json, { "CONTENT_TYPE" => "application/json" }
177
+ expect(last_response.status).to eql(400)
178
+ expect(Mail::TestMailer.deliveries.length).to eql(0)
179
+ end
180
+
181
+ it 'does not allow setting the :in_reply_to without a valid AUTH token' do
182
+ Talktome.set_env('TALKTOME_BEARER_SECRET', "Invalid secret") do
183
+ post "/support/", {
184
+ in_reply_to: '<F6E2D0B4-CC35-4A91-BA4C-C7C712B10C13@company.com>',
185
+ }.to_json, { "CONTENT_TYPE" => "application/json" }
186
+ expect(last_response.status).to eql(401)
187
+ expect(Mail::TestMailer.deliveries.length).to eql(0)
188
+ end
189
+ end
190
+
191
+ it "lets override it by passing a inReplyTo field" do
192
+ Talktome.set_env('TALKTOME_BEARER_SECRET', "Some secret") do
193
+ header 'Authorization', 'Bearer Some secret'
194
+ post "/support/", {
195
+ to: 'client@company.com',
196
+ in_reply_to: '<F6E2D0B4-CC35-4A91-BA4C-C7C712B10C13@company.com>',
197
+ }.to_json, { "CONTENT_TYPE" => "application/json" }
198
+ expect(last_response).to be_ok
199
+ expect(Mail::TestMailer.deliveries.length).to eql(1)
200
+ expect(Mail::TestMailer.deliveries.first.in_reply_to).to eql('F6E2D0B4-CC35-4A91-BA4C-C7C712B10C13@company.com')
201
+ end
202
+ end
203
+ end
204
+
205
+ context 'POST /support/, regarding the attachments' do
206
+ class ::Talktome::Message::Template
207
+ def raise_on_context_miss?
208
+ false
209
+ end
210
+ end
211
+
212
+ it 'forbids the usage of :attachments unless a secret is provided' do
213
+ post "/support/", {
214
+ :to => 'client@company.com',
215
+ :attachments => {
216
+ "plain.txt" => {
217
+ "mime_type" => "plain/text",
218
+ "content" => Base64.encode64('Some plain/text attachment')
219
+ }
220
+ }
221
+ }.to_json, { "CONTENT_TYPE" => "application/json" }
222
+ expect(last_response.status).to eql(400)
223
+ expect(Mail::TestMailer.deliveries.length).to eql(0)
224
+ end
225
+
226
+ it 'does not allow setting the :attachments without a valid AUTH token' do
227
+ Talktome.set_env('TALKTOME_BEARER_SECRET', "Invalid secret") do
228
+ post "/support/", {
229
+ :to => 'client@company.com',
230
+ :attachments => {
231
+ "plain.txt" => {
232
+ "mime_type" => "plain/text",
233
+ "content" => Base64.encode64('Some plain/text attachment')
234
+ }
235
+ }
236
+ }.to_json, { "CONTENT_TYPE" => "application/json" }
237
+ expect(last_response.status).to eql(401)
238
+ expect(Mail::TestMailer.deliveries.length).to eql(0)
239
+ end
240
+ end
241
+
242
+ it "lets customize attachments by passing an array" do
243
+ Talktome.set_env('TALKTOME_BEARER_SECRET', "Some secret") do
244
+ header 'Authorization', 'Bearer Some secret'
245
+ post "/support/", {
246
+ :to => 'client@company.com',
247
+ :attachments => {
248
+ "plain.txt" => {
249
+ "mime_type" => "plain/text",
250
+ "content" => Base64.encode64('Some plain/text attachment')
251
+ }
252
+ }
253
+ }.to_json, { "CONTENT_TYPE" => "application/json" }
254
+ expect(last_response).to be_ok
255
+ expect(Mail::TestMailer.deliveries.length).to eql(1)
256
+ mail = Mail::TestMailer.deliveries.first
257
+ expect(mail.attachments['plain.txt']).to be_a_kind_of(Mail::Part)
258
+ file = mail.attachments['plain.txt']
259
+ expect(file).to be_a_kind_of(Mail::Part)
260
+ end
261
+ end
262
+ end
263
+
166
264
  context 'POST /multi-lingual/en/' do
167
265
 
168
266
  it 'works' do
@@ -182,5 +280,19 @@ module Talktome
182
280
  end
183
281
  end
184
282
 
283
+ context 'POST /xxx when the template does not exist' do
284
+
285
+ it 'return a 404 error when the template doesn\'t exist' do
286
+ post "/multi-lingual/fr/", {
287
+ reply_to: 'hello@visitor.com',
288
+ message: 'Hello from visitor',
289
+ key: 'value',
290
+ }.to_json, { "CONTENT_TYPE" => "application/json" }
291
+
292
+ expect(last_response.status).to eql(404)
293
+ expect(last_response.body).to match(/No such template/)
294
+ end
295
+ end
296
+
185
297
  end
186
298
  end
@@ -74,6 +74,7 @@ module Talktome
74
74
  client.talktome("welcome", user, tpldata, [:email])
75
75
  expect(strategy.last.message.to_html).to eql("<html><title>Hello Test user</title><body><h1>Hello Test user</h1>\n\n<p>Welcome to this email example!</p>\n\n<h3>Test user</h3>\n</body></html>\n")
76
76
  end
77
+
77
78
  end
78
79
 
79
80
  end
@@ -0,0 +1,6 @@
1
+ ---
2
+ subject: Regarding your support request
3
+ ---
4
+ Our support team will get back to you ASAP regarding your request.
5
+
6
+ Best regards
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: talktome
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bernard Lambeau
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-31 00:00:00.000000000 Z
11
+ date: 2021-12-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -194,6 +194,7 @@ files:
194
194
  - spec/fixtures/contact-us/email.md
195
195
  - spec/fixtures/layouts/email.html
196
196
  - spec/fixtures/multi-lingual/en/email.md
197
+ - spec/fixtures/support/email.md
197
198
  - spec/fixtures/welcome/email.md
198
199
  - spec/fixtures/welcome/footer.mustache
199
200
  - spec/message/test_initialize.rb
@@ -222,7 +223,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
222
223
  - !ruby/object:Gem::Version
223
224
  version: '0'
224
225
  requirements: []
225
- rubygems_version: 3.2.15
226
+ rubygems_version: 3.2.32
226
227
  signing_key:
227
228
  specification_version: 4
228
229
  summary: Talktome helps you talk to users by email, messaging, sms, etc.