talktome 1.3.0 → 1.3.4

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 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.