mote_sms 1.2.0 → 1.3.0.rc1

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
  SHA1:
3
- metadata.gz: aa3389d15777fe985df01520946936f312159e7a
4
- data.tar.gz: 97403d989d152d3831143ccdfe5256016f4de8bc
3
+ metadata.gz: 7750e3f3a9303ab306187ab9e35755f7a7fa5abe
4
+ data.tar.gz: 1108d8459f1672a55f189cadcb1df22aea9ecb04
5
5
  SHA512:
6
- metadata.gz: 9fec2df96da06ca537d46d6b9ed475e20bbb214a21e8b0812a79e52a6ef66b6aa9a22d8d884dc73bca27a84ac431853f241c5ddc87abb473c4970a1ce2cb1aa0
7
- data.tar.gz: ef5545a08c802021fb84e294fd7c14d0cae743381f9e4871886bc6b7109e8ba54267dc75eb0ef4579c70d85432671715786c7f081cdbf011fa1fadc4a8ea452c
6
+ metadata.gz: 4c6133b43af1691dd57eca6043c81419b77021b4dd83e7c1b39324e21f42cb8efeb4e05f3a0ebe34719ac755b79a72b87982c98d3177d1d32bb3d82e5dbd8b67
7
+ data.tar.gz: bdba91cfc834a07026afba68f9ad6bdb7bc046a7093db9300e4a3f01be93e474789892c67df9aa89cdf00cf51f01f9137ef51175b0fd332f054807cb0b826064
data/README.md CHANGED
@@ -21,23 +21,16 @@ Or install it yourself as:
21
21
  ## Usage
22
22
 
23
23
  ```ruby
24
- # Using global transport (quick and dirty)
24
+ # Transport configuration
25
25
  MoteSMS.transport = MoteSMS::MobileTechnicsTransport.new 'https://endpoint.com:1234', 'username', 'password'
26
+
27
+ # Create a message and deliver it
26
28
  sms = MoteSMS::Message.new do
27
29
  to '+41 79 111 22 33'
28
30
  from 'ARUBYGEM'
29
31
  body 'Hello world, you know.'
30
32
  end
31
- sms.deliver
32
- ```
33
-
34
- ```ruby
35
- # Using client instance
36
- transport = MoteSMS::MobileTechnicsTransport.new 'https://endpoint.com:1234', 'username', 'password'
37
- sms = MoteSMS::Message.new do
38
- # create message
39
- end
40
- sms.deliver(transport: transport)
33
+ sms.deliver_now # OR: deliver_later
41
34
  ```
42
35
 
43
36
  ## Contributing
@@ -0,0 +1,16 @@
1
+ require 'active_job'
2
+ require 'mote_sms/message'
3
+
4
+ module MoteSMS
5
+ class DeliveryJob < ActiveJob::Base
6
+ queue_as { MoteSMS.delayed_delivery_queue }
7
+
8
+ def perform(from, to, body, options)
9
+ Message.new do
10
+ from from
11
+ to to
12
+ body body
13
+ end.deliver_now options
14
+ end
15
+ end
16
+ end
@@ -28,6 +28,7 @@ module MoteSMS
28
28
  #
29
29
  # Returns a new instance.
30
30
  def initialize(transport = nil, &block)
31
+ Kernel.warn 'Message#new(transport) is deprecated and will be removed from MoteSMS' if transport
31
32
  @transport = transport
32
33
  @to = MoteSMS::NumberList.new
33
34
  instance_eval(&block) if block_given?
@@ -60,7 +61,7 @@ module MoteSMS
60
61
  # Public: Asign an instance of Number instead of the direct
61
62
  # string, so only vanity numbers are allowed.
62
63
  def from=(val)
63
- @from = val ? Number.new(val, :vanity => true) : nil
64
+ @from = val ? Number.new(val, vanity: true) : nil
64
65
  end
65
66
 
66
67
  # Public: Set to multiple arguments or array, or whatever.
@@ -86,6 +87,11 @@ module MoteSMS
86
87
  @to
87
88
  end
88
89
 
90
+ def transport=(trans)
91
+ Kernel.warn 'Message#transport= is deprecated and will be removed from MoteSMS'
92
+ @transport = trans
93
+ end
94
+
89
95
  # Public: Deliver message using defined transport, to select the correct
90
96
  # transport method uses any of these values:
91
97
  #
@@ -95,8 +101,19 @@ module MoteSMS
95
101
  #
96
102
  # Returns result of transport#deliver.
97
103
  def deliver(options = {})
104
+ Kernel.warn 'Message#deliver is deprecated and will be removed from MoteSMS. Please use #deliver_now'
105
+ deliver_now options
106
+ end
107
+
108
+ def deliver_now(options = {})
109
+ Kernel.warn 'options[:transport] in Message#deliver_now is deprecated and will be removed from MoteSMS' if options[:transport]
98
110
  transport = options.delete(:transport) || self.transport || MoteSMS.transport
99
111
  transport.deliver(self, options)
100
112
  end
113
+
114
+ def deliver_later(options = {})
115
+ return Kernel.warn 'options[:transport] is not supported in Message#deliveer_later' if options.delete(:transport)
116
+ DeliveryJob.set(options).perform_later @from.to_s, @to.normalized_numbers, @body, options
117
+ end
101
118
  end
102
119
  end
@@ -0,0 +1,25 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB
3
+ rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
4
+ Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
5
+ MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV
6
+ BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa
7
+ Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl
8
+ LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u
9
+ MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl
10
+ ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz
11
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm
12
+ gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8
13
+ YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf
14
+ b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9
15
+ 9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S
16
+ zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk
17
+ OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV
18
+ HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA
19
+ 2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW
20
+ oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
21
+ t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c
22
+ KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM
23
+ m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu
24
+ MdRAGmI0Nj81Aa6sY6A=
25
+ -----END CERTIFICATE-----
@@ -0,0 +1,101 @@
1
+ Certificate:
2
+ Data:
3
+ Version: 3 (0x2)
4
+ Serial Number:
5
+ 16:87:d6:88:6d:e2:30:06:85:23:3d:bf:11:bf:65:97
6
+ Signature Algorithm: sha256WithRSAEncryption
7
+ Issuer: C=US, O=thawte, Inc., OU=Certification Services Division, OU=(c) 2006 thawte, Inc. - For authorized use only, CN=thawte Primary Root CA
8
+ Validity
9
+ Not Before: Oct 31 00:00:00 2013 GMT
10
+ Not After : Oct 30 23:59:59 2023 GMT
11
+ Subject: C=US, O=thawte, Inc., CN=thawte SSL CA - G2
12
+ Subject Public Key Info:
13
+ Public Key Algorithm: rsaEncryption
14
+ RSA Public Key: (2048 bit)
15
+ Modulus (2048 bit):
16
+ 00:b2:fc:06:fb:04:93:d2:ea:59:20:3b:44:85:97:
17
+ 52:39:e7:10:f0:7a:e0:b0:94:40:da:46:f8:0c:28:
18
+ bb:b9:ce:60:38:3f:d2:d8:11:42:1b:91:ad:49:ee:
19
+ 8f:c7:de:6c:de:37:6f:fd:8b:20:3c:6d:e7:74:d3:
20
+ dc:d5:24:88:41:80:89:ee:36:be:c4:d5:be:8d:53:
21
+ 13:aa:e4:a5:b8:93:0a:be:ec:da:cd:3c:d4:32:56:
22
+ ef:d0:4e:a0:b8:97:bb:39:50:1e:6e:65:c3:fd:b2:
23
+ ce:e0:59:a9:48:09:c6:fe:be:ae:fc:3e:3b:81:20:
24
+ 97:8b:8f:46:df:60:64:07:75:bb:1b:86:38:9f:47:
25
+ 7b:34:ce:a1:d1:97:ad:76:d8:9f:b7:26:db:79:80:
26
+ 36:48:f2:c5:37:f8:d9:32:ae:7c:a4:53:81:c7:99:
27
+ a1:54:38:2f:4f:75:a0:bb:5a:a5:bb:cd:ac:02:5b:
28
+ 19:02:d5:13:18:a7:ce:ac:74:55:12:05:8b:9b:a2:
29
+ 95:46:64:72:38:cd:5a:1b:3a:16:a7:be:71:99:8c:
30
+ 54:03:b8:96:6c:01:d3:3e:06:98:3f:21:81:3b:02:
31
+ 7e:00:47:53:01:1e:0e:46:43:fb:4b:2d:dc:0b:1a:
32
+ e8:2f:98:f8:7e:d1:99:ab:13:6c:a4:17:de:6f:f6:
33
+ 15:f5
34
+ Exponent: 65537 (0x10001)
35
+ X509v3 extensions:
36
+ X509v3 Basic Constraints: critical
37
+ CA:TRUE, pathlen:0
38
+ X509v3 Key Usage: critical
39
+ Certificate Sign, CRL Sign
40
+ X509v3 CRL Distribution Points:
41
+ URI:http://t1.symcb.com/ThawtePCA.crl
42
+
43
+ Authority Information Access:
44
+ OCSP - URI:http://t2.symcb.com
45
+
46
+ X509v3 Certificate Policies:
47
+ Policy: 2.16.840.1.113733.1.7.54
48
+ CPS: https://www.thawte.com/cps
49
+
50
+ X509v3 Subject Alternative Name:
51
+ DirName:/CN=SymantecPKI-1-537
52
+ X509v3 Subject Key Identifier:
53
+ C2:4F:48:57:FC:D1:4F:9A:C0:5D:38:7D:0E:05:DB:D9:2E:B5:52:60
54
+ X509v3 Authority Key Identifier:
55
+ keyid:7B:5B:45:CF:AF:CE:CB:7A:FD:31:92:1A:6A:B6:F3:46:EB:57:48:50
56
+
57
+ Signature Algorithm: sha256WithRSAEncryption
58
+ 8d:06:de:43:c9:76:02:ca:d9:23:97:5e:f3:63:d7:7d:44:c2:
59
+ 0f:6b:0a:f5:07:e5:8b:b8:fa:e0:a3:fa:6b:80:92:b5:03:2c:
60
+ c5:37:e0:c2:e5:95:b5:92:70:18:28:42:94:ee:4b:77:6a:01:
61
+ 0f:8b:23:ec:56:4d:f4:00:69:e5:84:c8:e2:ea:de:5b:3e:f6:
62
+ 3c:07:3a:94:ca:6c:27:b1:cc:83:1a:60:71:27:d2:bf:02:f5:
63
+ 1e:44:d3:48:d5:a6:d3:76:21:00:9c:fa:98:64:eb:17:36:3f:
64
+ eb:1b:3c:3e:a6:b1:d9:58:06:0e:72:d9:68:be:f1:a7:20:d7:
65
+ 52:e4:a4:77:1f:71:70:9d:55:35:85:37:e1:1d:4d:94:c2:70:
66
+ 7f:95:40:6e:4b:7d:b2:b4:29:2a:03:79:c8:b9:4c:67:61:04:
67
+ a0:8b:27:ff:59:00:eb:55:7f:c6:b7:33:35:2d:5e:4e:ac:b8:
68
+ ea:12:c5:e8:f7:b9:ab:be:74:92:2c:b7:d9:4d:ca:84:2f:1c:
69
+ c2:f0:72:7c:b2:31:6e:cf:80:e5:88:07:36:51:7b:ba:61:af:
70
+ 6d:8d:23:5b:34:a3:95:bc:a2:31:7f:f2:f5:e7:b7:e8:ef:c4:
71
+ b5:27:32:e9:f7:9e:69:c7:2b:e8:be:bb:0c:aa:e7:ea:60:12:
72
+ ea:26:8a:78
73
+
74
+ -----BEGIN CERTIFICATE-----
75
+ MIIEsjCCA5qgAwIBAgIQFofWiG3iMAaFIz2/Eb9llzANBgkqhkiG9w0BAQsFADCB
76
+ qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
77
+ Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
78
+ MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
79
+ BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMTMxMDMxMDAwMDAwWhcNMjMx
80
+ MDMwMjM1OTU5WjBBMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3RlLCBJbmMu
81
+ MRswGQYDVQQDExJ0aGF3dGUgU1NMIENBIC0gRzIwggEiMA0GCSqGSIb3DQEBAQUA
82
+ A4IBDwAwggEKAoIBAQCy/Ab7BJPS6lkgO0SFl1I55xDweuCwlEDaRvgMKLu5zmA4
83
+ P9LYEUIbka1J7o/H3mzeN2/9iyA8bed009zVJIhBgInuNr7E1b6NUxOq5KW4kwq+
84
+ 7NrNPNQyVu/QTqC4l7s5UB5uZcP9ss7gWalICcb+vq78PjuBIJeLj0bfYGQHdbsb
85
+ hjifR3s0zqHRl6122J+3Jtt5gDZI8sU3+NkyrnykU4HHmaFUOC9PdaC7WqW7zawC
86
+ WxkC1RMYp86sdFUSBYubopVGZHI4zVobOhanvnGZjFQDuJZsAdM+Bpg/IYE7An4A
87
+ R1MBHg5GQ/tLLdwLGugvmPh+0ZmrE2ykF95v9hX1AgMBAAGjggE7MIIBNzASBgNV
88
+ HRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjAyBgNVHR8EKzApMCegJaAj
89
+ hiFodHRwOi8vdDEuc3ltY2IuY29tL1RoYXd0ZVBDQS5jcmwwLwYIKwYBBQUHAQEE
90
+ IzAhMB8GCCsGAQUFBzABhhNodHRwOi8vdDIuc3ltY2IuY29tMEEGA1UdIAQ6MDgw
91
+ NgYKYIZIAYb4RQEHNjAoMCYGCCsGAQUFBwIBFhpodHRwczovL3d3dy50aGF3dGUu
92
+ Y29tL2NwczApBgNVHREEIjAgpB4wHDEaMBgGA1UEAxMRU3ltYW50ZWNQS0ktMS01
93
+ MzcwHQYDVR0OBBYEFMJPSFf80U+awF04fQ4F29kutVJgMB8GA1UdIwQYMBaAFHtb
94
+ Rc+vzst6/TGSGmq280brV0hQMA0GCSqGSIb3DQEBCwUAA4IBAQCNBt5DyXYCytkj
95
+ l17zY9d9RMIPawr1B+WLuPrgo/prgJK1AyzFN+DC5ZW1knAYKEKU7kt3agEPiyPs
96
+ Vk30AGnlhMji6t5bPvY8BzqUymwnscyDGmBxJ9K/AvUeRNNI1abTdiEAnPqYZOsX
97
+ Nj/rGzw+prHZWAYOctlovvGnINdS5KR3H3FwnVU1hTfhHU2UwnB/lUBuS32ytCkq
98
+ A3nIuUxnYQSgiyf/WQDrVX/GtzM1LV5OrLjqEsXo97mrvnSSLLfZTcqELxzC8HJ8
99
+ sjFuz4DliAc2UXu6Ya9tjSNbNKOVvKIxf/L157fo78S1JzLp955pxyvovrsMqufq
100
+ YBLqJop4
101
+ -----END CERTIFICATE-----
@@ -0,0 +1,29 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIE9jCCA96gAwIBAgIQN/ny0e5nZXXyLLuK7lQGBDANBgkqhkiG9w0BAQsFADBD
3
+ MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3RlLCBJbmMuMR0wGwYDVQQDExR0
4
+ aGF3dGUgU0hBMjU2IFNTTCBDQTAeFw0xNDEwMDMwMDAwMDBaFw0xNzA5MjQyMzU5
5
+ NTlaMHkxCzAJBgNVBAYTAkNIMQ0wCwYDVQQIDARCZXJuMRMwEQYDVQQHDApXb3Ji
6
+ bGF1ZmVuMR4wHAYDVQQKDBVTd2lzc2NvbSAoU2Nod2VpeikgQUcxCzAJBgNVBAsM
7
+ AklUMRkwFwYDVQQDDBBhcGkuc3dpc3Njb20uY29tMIIBIjANBgkqhkiG9w0BAQEF
8
+ AAOCAQ8AMIIBCgKCAQEA+RyG/DP70zYEmmQ2pIXuZH312V8X3HHwR3uPJwVqehBt
9
+ FuPUDz9/mLe8ZKrS+03ei/OR6p11LxCcxwUzhehZzUP/k1Dx7Bb2BSGgKaCZqL1w
10
+ zWA87MSyude0VdblklQ50yfsAdPuYlxTUnmXZHU8OPEARd7n0Tovk+5tuXYQ3kTs
11
+ XSPqYqYPuCqbYyqiIEfEoqu9fb5NKQSE6Z58ehAGEZQazkeUuFbgTo20BN3XE/mm
12
+ IDD+nb7NSHSqTjkTlm2nyMMgBE7Vjh1J0vGd3dyKvd+Stuv21tbb51AqjSxwovUW
13
+ DkZjxbg51A5szjW8hdvx/RaplAKN6qsFOpwjjXsY8QIDAQABo4IBrjCCAaowUwYD
14
+ VR0RBEwwSoISKi5hcGkuc3dpc3Njb20uY29tghEqLmFwaS5zd2lzc2NvbS5jaIIP
15
+ YXBpLnN3aXNzY29tLmNoghBhcGkuc3dpc3Njb20uY29tMAkGA1UdEwQCMAAwcgYD
16
+ VR0gBGswaTBnBgpghkgBhvhFAQc2MFkwJgYIKwYBBQUHAgEWGmh0dHBzOi8vd3d3
17
+ LnRoYXd0ZS5jb20vY3BzMC8GCCsGAQUFBwICMCMMIWh0dHBzOi8vd3d3LnRoYXd0
18
+ ZS5jb20vcmVwb3NpdG9yeTAOBgNVHQ8BAf8EBAMCBaAwHwYDVR0jBBgwFoAUK5o1
19
+ rgEYODDhcHoF4BF2o869kBQwKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3RnLnN5
20
+ bWNiLmNvbS90Zy5jcmwwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMFcG
21
+ CCsGAQUFBwEBBEswSTAfBggrBgEFBQcwAYYTaHR0cDovL3RnLnN5bWNkLmNvbTAm
22
+ BggrBgEFBQcwAoYaaHR0cDovL3RnLnN5bWNiLmNvbS90Zy5jcnQwDQYJKoZIhvcN
23
+ AQELBQADggEBACZQ4hiOTadCS7hexL9BHE7hzyj0u9lFOs6ND6AdVOT2SWqvQY+H
24
+ yQkehQOcNPoO9yX/nrcirY6i6nBejY4wMQ7m7keXpuiDW60h+3aZw+YNyHmnjeLv
25
+ ppCnOStprLl2/TTmQoYV0Ztt6zYF9P2SJuVTM6Q1Y1OJqTIaoeBsPAdX+wes87ot
26
+ iYZts546c5AHCRLEFg8PeqV8qwSLWvRMEWhY4RKbnOTvEFdhOjnwzaNA98SbnXFR
27
+ c2OQ/uX5PSADiz0jmEI/2PfBcpXR8bmYCCujjcK7IpcAfQb2VGyTAeyxO1/M7dzm
28
+ zcvWJ/MiFXwsthFAqfujNHDtMDduZIktGug=
29
+ -----END CERTIFICATE-----
@@ -2,99 +2,113 @@ Certificate:
2
2
  Data:
3
3
  Version: 3 (0x2)
4
4
  Serial Number:
5
- 49:7d:ec:fe:9b:e3:53:0d:dc:0f:ba:f7:c4:8f:b7:79
6
- Signature Algorithm: sha1WithRSAEncryption
7
- Issuer: C=US, O=Thawte, Inc., CN=Thawte SSL CA
5
+ 5d:b1:18:24:b0:85:61:d6:98:40:be:85:dd:a2:ad:fa
6
+ Signature Algorithm: sha256WithRSAEncryption
7
+ Issuer: C=US, O=thawte, Inc., CN=thawte SSL CA - G2
8
8
  Validity
9
- Not Before: Jan 15 00:00:00 2014 GMT
10
- Not After : Mar 19 23:59:59 2016 GMT
11
- Subject: C=CH, ST=Biel, L=Biel, O=NTH AG, CN=bulk.mobile-gw.com
9
+ Not Before: Feb 3 00:00:00 2016 GMT
10
+ Not After : Feb 2 23:59:59 2019 GMT
11
+ Subject: C=CH, ST=Biel, L=Biel, O=NTH AG, CN=*.mobile-gw.com
12
12
  Subject Public Key Info:
13
13
  Public Key Algorithm: rsaEncryption
14
14
  RSA Public Key: (2048 bit)
15
15
  Modulus (2048 bit):
16
- 00:f5:d8:2b:43:73:e4:68:4d:3d:70:45:0b:d2:3e:
17
- 2e:de:ef:f3:38:47:87:e4:fa:37:b7:6e:45:0b:e4:
18
- 00:01:f6:8f:dc:64:54:36:19:b1:b0:84:dc:2e:24:
19
- 2d:cd:61:86:ac:87:7b:57:52:31:85:2a:f7:e1:78:
20
- 1c:db:20:2e:c2:34:ed:44:de:1e:87:89:b2:b9:d7:
21
- e6:a2:da:48:a3:db:a0:03:3a:44:42:71:2e:6f:5b:
22
- e6:09:23:07:28:e3:cf:a6:04:d1:e5:bb:cf:fa:5e:
23
- 52:b5:45:64:80:c6:22:58:1e:62:25:39:81:f5:d9:
24
- ef:2e:31:1e:68:64:99:b1:32:83:e0:5d:40:98:31:
25
- 9a:1d:f8:b9:9e:cb:c2:14:6d:8e:b6:7b:c0:a4:12:
26
- ae:e8:1b:20:2b:ba:78:52:5e:e2:be:ba:4e:41:06:
27
- 87:be:56:a2:5b:cc:14:83:ad:0d:86:14:4e:46:f4:
28
- 0a:b9:35:57:64:18:df:34:40:60:7c:ff:eb:16:d5:
29
- d5:d1:08:01:85:82:cc:b5:77:34:a5:cc:6d:02:60:
30
- 97:0e:b2:a0:4d:50:bd:8e:ab:14:92:68:ea:78:61:
31
- 70:9e:8d:65:30:f7:06:fe:5c:15:f7:d5:c4:a5:0f:
32
- c0:a9:26:89:57:bb:41:f4:f9:d6:1b:54:1f:2c:0d:
33
- 88:6d
16
+ 00:f0:85:d6:fe:aa:b0:05:81:3b:21:0a:5d:65:88:
17
+ f9:fc:d0:4f:00:d4:11:eb:8e:a2:f4:a9:7e:52:8d:
18
+ 22:12:d4:5a:ff:1c:3b:f6:e8:74:30:6f:32:75:02:
19
+ b1:92:ce:d1:24:06:75:00:46:38:a8:97:17:4d:61:
20
+ d0:7f:e6:01:18:6e:14:d9:68:65:fc:f8:ee:4f:35:
21
+ 31:2e:9d:bd:7c:6e:87:89:1d:c9:c6:b7:f1:09:9a:
22
+ 22:1d:ce:b9:7a:9f:46:27:98:1d:d5:e2:7e:f6:2b:
23
+ 0b:b6:c0:ef:92:20:c3:dc:d0:a4:65:f0:f6:32:d8:
24
+ 90:f5:c0:14:95:7f:2a:f8:ca:c2:06:1a:63:3d:81:
25
+ 5f:de:c2:9a:d7:27:69:e0:58:0d:da:90:11:86:97:
26
+ d3:04:a6:e6:4e:6b:25:77:02:4c:c3:65:5e:50:f2:
27
+ 38:18:cc:40:cc:3c:77:9c:5f:79:ce:57:14:89:17:
28
+ f5:00:95:7b:e1:bd:be:e0:fb:2c:c2:e6:b2:89:1c:
29
+ d3:17:30:17:91:bb:c5:2b:f7:df:e9:79:86:94:a7:
30
+ 21:c8:15:73:d8:af:1d:ca:5c:bd:b3:ed:ba:19:c1:
31
+ 4a:11:e6:5a:9f:ca:f0:7e:d4:0b:bd:8c:e8:40:be:
32
+ a8:63:ad:66:8f:c1:72:c3:4f:65:c2:e6:f2:13:65:
33
+ c5:4b
34
34
  Exponent: 65537 (0x10001)
35
35
  X509v3 extensions:
36
- X509v3 Subject Alternative Name:
37
- DNS:bulk.mobile-gw.com
38
- X509v3 Basic Constraints:
36
+ X509v3 Subject Alternative Name:
37
+ DNS:*.mobile-gw.com, DNS:mobile-gw.com
38
+ X509v3 Basic Constraints:
39
39
  CA:FALSE
40
- X509v3 Certificate Policies:
41
- Policy: 2.16.840.1.113733.1.7.54
42
- CPS: https://www.thawte.com/cps/
40
+ X509v3 Certificate Policies:
41
+ Policy: 2.23.140.1.2.2
42
+ CPS: https://www.thawte.com/cps
43
+ User Notice:
44
+ Explicit Text: https://www.thawte.com/repository
43
45
 
44
46
  X509v3 Key Usage: critical
45
47
  Digital Signature, Key Encipherment
46
- X509v3 Authority Key Identifier:
47
- keyid:A7:A2:83:BB:34:45:40:3D:FC:D5:30:4F:12:B9:3E:A1:01:9F:F6:DB
48
+ X509v3 Authority Key Identifier:
49
+ keyid:C2:4F:48:57:FC:D1:4F:9A:C0:5D:38:7D:0E:05:DB:D9:2E:B5:52:60
48
50
 
49
- X509v3 CRL Distribution Points:
50
- URI:http://svr-ov-crl.thawte.com/ThawteOV.crl
51
+ X509v3 CRL Distribution Points:
52
+ URI:http://tj.symcb.com/tj.crl
51
53
 
52
- X509v3 Extended Key Usage:
54
+ X509v3 Extended Key Usage:
53
55
  TLS Web Server Authentication, TLS Web Client Authentication
54
- Authority Information Access:
55
- OCSP - URI:http://ocsp.thawte.com
56
- CA Issuers - URI:http://svr-ov-aia.thawte.com/ThawteOV.cer
56
+ Authority Information Access:
57
+ OCSP - URI:http://tj.symcd.com
58
+ CA Issuers - URI:http://tj.symcb.com/tj.crt
59
+
60
+ Signature Algorithm: sha256WithRSAEncryption
61
+ 89:48:ab:9d:2d:ba:b8:55:e3:75:dd:0d:26:c8:89:e9:bd:80:
62
+ 8e:9b:f6:f6:d5:8f:eb:81:ff:c6:bd:ba:9d:69:f5:76:e9:45:
63
+ d2:d8:13:6e:79:ba:37:ec:3e:a1:cb:e8:ce:65:28:1c:3e:57:
64
+ 1f:e3:15:83:d1:ce:97:89:1b:4f:5b:46:48:6b:de:52:3c:3b:
65
+ c5:0d:25:1e:11:04:d6:fc:84:e7:cd:bd:e0:82:96:0d:9f:5f:
66
+ 04:14:c7:75:db:8c:29:c5:bb:cd:16:7f:de:55:e8:c8:f7:95:
67
+ b7:f6:19:f1:96:e1:ad:21:50:90:8d:b1:dc:3c:ad:79:4c:bf:
68
+ 41:d6:da:24:8b:92:f1:41:1c:97:bd:66:56:70:8c:09:50:d8:
69
+ d3:75:59:92:8f:c7:1c:42:22:cf:ac:c0:59:63:92:21:f8:53:
70
+ e3:01:c7:69:90:10:5a:2e:45:24:51:d4:a6:a9:f3:84:bd:14:
71
+ ff:6f:85:fe:f5:59:69:f6:a4:18:68:40:86:9d:1e:ee:99:51:
72
+ 98:f8:11:88:ac:66:ad:b1:e0:e0:cc:c9:da:b2:c6:ed:01:67:
73
+ 62:17:ba:0e:83:7f:38:fa:77:94:31:32:7c:af:2d:3f:26:20:
74
+ 83:96:85:ad:8d:b8:cb:5e:d4:04:b1:f8:de:5f:e7:19:20:13:
75
+ 69:23:2f:7e
57
76
 
58
- Signature Algorithm: sha1WithRSAEncryption
59
- 98:cc:b7:c8:3c:24:cf:88:3a:fb:81:df:24:cc:3d:a0:1c:4e:
60
- 49:48:cd:ce:8d:81:13:bc:f1:72:fa:c5:ad:c4:86:f5:f9:e5:
61
- 91:38:6a:04:3f:61:ad:a8:3b:4b:ff:e6:38:63:30:c9:d3:08:
62
- ec:90:ed:e1:c1:c1:76:30:91:aa:58:87:b8:f7:f3:39:b1:d5:
63
- 66:6e:0a:cb:21:62:de:90:ff:98:5d:9b:e7:20:66:95:6b:cb:
64
- 08:51:43:66:39:31:4f:43:45:2e:b0:54:6c:96:59:1e:c9:9d:
65
- d2:76:98:e2:a6:df:1c:d0:64:2e:97:5c:26:e3:f7:9b:34:2c:
66
- 92:48:09:c4:09:0c:af:99:74:20:d1:40:e5:8b:9e:cd:a8:da:
67
- 87:d2:25:1e:7a:88:3c:91:34:05:3f:d6:ba:bd:39:97:4c:b4:
68
- 53:87:85:aa:8c:5d:9e:79:ae:e7:09:c7:4d:e2:cc:bc:01:3f:
69
- ee:9f:e0:4b:29:48:22:64:d4:fc:6e:0d:91:ed:09:c7:86:c6:
70
- bb:7c:5f:ab:d6:69:64:52:3c:70:13:25:04:7c:fc:73:aa:ea:
71
- 9d:41:c4:e9:a3:41:8b:77:68:63:80:1c:16:f6:db:b4:eb:6d:
72
- 89:c2:94:e6:ae:13:e3:7d:f1:2b:62:87:2e:d4:bb:22:e0:2d:
73
- 06:61:c7:09
74
77
  -----BEGIN CERTIFICATE-----
75
- MIIEijCCA3KgAwIBAgIQSX3s/pvjUw3cD7r3xI+3eTANBgkqhkiG9w0BAQUFADA8
76
- MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMVGhhd3RlLCBJbmMuMRYwFAYDVQQDEw1U
77
- aGF3dGUgU1NMIENBMB4XDTE0MDExNTAwMDAwMFoXDTE2MDMxOTIzNTk1OVowWTEL
78
- MAkGA1UEBhMCQ0gxDTALBgNVBAgTBEJpZWwxDTALBgNVBAcUBEJpZWwxDzANBgNV
79
- BAoUBk5USCBBRzEbMBkGA1UEAxQSYnVsay5tb2JpbGUtZ3cuY29tMIIBIjANBgkq
80
- hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9dgrQ3PkaE09cEUL0j4u3u/zOEeH5Po3
81
- t25FC+QAAfaP3GRUNhmxsITcLiQtzWGGrId7V1IxhSr34Xgc2yAuwjTtRN4eh4my
82
- udfmotpIo9ugAzpEQnEub1vmCSMHKOPPpgTR5bvP+l5StUVkgMYiWB5iJTmB9dnv
83
- LjEeaGSZsTKD4F1AmDGaHfi5nsvCFG2OtnvApBKu6BsgK7p4Ul7ivrpOQQaHvlai
84
- W8wUg60NhhRORvQKuTVXZBjfNEBgfP/rFtXV0QgBhYLMtXc0pcxtAmCXDrKgTVC9
85
- jqsUkmjqeGFwno1lMPcG/lwV99XEpQ/AqSaJV7tB9PnWG1QfLA2IbQIDAQABo4IB
86
- aTCCAWUwHQYDVR0RBBYwFIISYnVsay5tb2JpbGUtZ3cuY29tMAkGA1UdEwQCMAAw
87
- QgYDVR0gBDswOTA3BgpghkgBhvhFAQc2MCkwJwYIKwYBBQUHAgEWG2h0dHBzOi8v
88
- d3d3LnRoYXd0ZS5jb20vY3BzLzAOBgNVHQ8BAf8EBAMCBaAwHwYDVR0jBBgwFoAU
89
- p6KDuzRFQD381TBPErk+oQGf9tswOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovL3N2
90
- ci1vdi1jcmwudGhhd3RlLmNvbS9UaGF3dGVPVi5jcmwwHQYDVR0lBBYwFAYIKwYB
91
- BQUHAwEGCCsGAQUFBwMCMGkGCCsGAQUFBwEBBF0wWzAiBggrBgEFBQcwAYYWaHR0
92
- cDovL29jc3AudGhhd3RlLmNvbTA1BggrBgEFBQcwAoYpaHR0cDovL3N2ci1vdi1h
93
- aWEudGhhd3RlLmNvbS9UaGF3dGVPVi5jZXIwDQYJKoZIhvcNAQEFBQADggEBAJjM
94
- t8g8JM+IOvuB3yTMPaAcTklIzc6NgRO88XL6xa3EhvX55ZE4agQ/Ya2oO0v/5jhj
95
- MMnTCOyQ7eHBwXYwkapYh7j38zmx1WZuCsshYt6Q/5hdm+cgZpVrywhRQ2Y5MU9D
96
- RS6wVGyWWR7JndJ2mOKm3xzQZC6XXCbj95s0LJJICcQJDK+ZdCDRQOWLns2o2ofS
97
- JR56iDyRNAU/1rq9OZdMtFOHhaqMXZ55rucJx03izLwBP+6f4EspSCJk1PxuDZHt
98
- CceGxrt8X6vWaWRSPHATJQR8/HOq6p1BxOmjQYt3aGOAHBb227TrbYnClOauE+N9
99
- 8Stihy7UuyLgLQZhxwk=
78
+ MIIGnDCCBYSgAwIBAgIQXbEYJLCFYdaYQL6F3aKt+jANBgkqhkiG9w0BAQsFADBB
79
+ MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3RlLCBJbmMuMRswGQYDVQQDExJ0
80
+ aGF3dGUgU1NMIENBIC0gRzIwHhcNMTYwMjAzMDAwMDAwWhcNMTkwMjAyMjM1OTU5
81
+ WjBWMQswCQYDVQQGEwJDSDENMAsGA1UECAwEQmllbDENMAsGA1UEBwwEQmllbDEP
82
+ MA0GA1UECgwGTlRIIEFHMRgwFgYDVQQDDA8qLm1vYmlsZS1ndy5jb20wggEiMA0G
83
+ CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDwhdb+qrAFgTshCl1liPn80E8A1BHr
84
+ jqL0qX5SjSIS1Fr/HDv26HQwbzJ1ArGSztEkBnUARjiolxdNYdB/5gEYbhTZaGX8
85
+ +O5PNTEunb18boeJHcnGt/EJmiIdzrl6n0YnmB3V4n72Kwu2wO+SIMPc0KRl8PYy
86
+ 2JD1wBSVfyr4ysIGGmM9gV/ewprXJ2ngWA3akBGGl9MEpuZOayV3AkzDZV5Q8jgY
87
+ zEDMPHecX3nOVxSJF/UAlXvhvb7g+yzC5rKJHNMXMBeRu8Ur99/peYaUpyHIFXPY
88
+ rx3KXL2z7boZwUoR5lqfyvB+1Au9jOhAvqhjrWaPwXLDT2XC5vITZcVLAgMBAAGj
89
+ ggN5MIIDdTApBgNVHREEIjAggg8qLm1vYmlsZS1ndy5jb22CDW1vYmlsZS1ndy5j
90
+ b20wCQYDVR0TBAIwADBuBgNVHSAEZzBlMGMGBmeBDAECAjBZMCYGCCsGAQUFBwIB
91
+ FhpodHRwczovL3d3dy50aGF3dGUuY29tL2NwczAvBggrBgEFBQcCAjAjDCFodHRw
92
+ czovL3d3dy50aGF3dGUuY29tL3JlcG9zaXRvcnkwDgYDVR0PAQH/BAQDAgWgMB8G
93
+ A1UdIwQYMBaAFMJPSFf80U+awF04fQ4F29kutVJgMCsGA1UdHwQkMCIwIKAeoByG
94
+ Gmh0dHA6Ly90ai5zeW1jYi5jb20vdGouY3JsMB0GA1UdJQQWMBQGCCsGAQUFBwMB
95
+ BggrBgEFBQcDAjBXBggrBgEFBQcBAQRLMEkwHwYIKwYBBQUHMAGGE2h0dHA6Ly90
96
+ ai5zeW1jZC5jb20wJgYIKwYBBQUHMAKGGmh0dHA6Ly90ai5zeW1jYi5jb20vdGou
97
+ Y3J0MIIB9QYKKwYBBAHWeQIEAgSCAeUEggHhAd8AdQDd6x0reg1PpiCLga2BaHB+
98
+ Lo6dAdVciI09EcTNtuy+zAAAAVKmYNGgAAAEAwBGMEQCICEff8v1whmEcVtS9NvG
99
+ Gf8ADJNiNhvxqRF2GKHVz1xmAiBhrK8hWew6Mm8eGiK9C/Ng4dVfkB02v7LBHAng
100
+ r/n4wAB2AKS5CZC0GFgUh7sTosxncAo8NZgE+RvfuON3zQ7IDdwQAAABUqZg0dgA
101
+ AAQDAEcwRQIgURV5Nsr/ywy1HODZG079z603p0nicJwGrHrpWeeUuu0CIQDhw82F
102
+ RbGA5ulPadFoYCXJZAF6Lu9h3eG0jaqNsNUgxQB2AGj2mPgfZIK+OozuuSgdTPxx
103
+ UV1nk9RE0QpnrLtPT/vEAAABUqZg0dcAAAQDAEcwRQIgVf9hp30TKcEOjJu8lFEz
104
+ uc8LuL0xV3BOIQaLtT/kKkgCIQDpZ5jOj2p1tamrJRf/tSyX7v6+DKKRnsfdMoiC
105
+ V3I2uAB2AO5Lvbd1zmC64UJpH6vhnmajD35fsHLYgwDEe4l6qP3LAAABUqZg06AA
106
+ AAQDAEcwRQIhAM5fmYR2CsP2p+RydqVoWTYnrRnIsEEk1d+gqQ28T4T7AiB6dDfW
107
+ hGcbubfGhicI4XUwqq/jasCJi7RrS8qoCq+o1DANBgkqhkiG9w0BAQsFAAOCAQEA
108
+ iUirnS26uFXjdd0NJsiJ6b2Ajpv29tWP64H/xr26nWn1dulF0tgTbnm6N+w+ocvo
109
+ zmUoHD5XH+MVg9HOl4kbT1tGSGveUjw7xQ0lHhEE1vyE58294IKWDZ9fBBTHdduM
110
+ KcW7zRZ/3lXoyPeVt/YZ8ZbhrSFQkI2x3DyteUy/QdbaJIuS8UEcl71mVnCMCVDY
111
+ 03VZko/HHEIiz6zAWWOSIfhT4wHHaZAQWi5FJFHUpqnzhL0U/2+F/vVZafakGGhA
112
+ hp0e7plRmPgRiKxmrbHg4MzJ2rLG7QFnYhe6DoN/OPp3lDEyfK8tPyYgg5aFrY24
113
+ y17UBLH43l/nGSATaSMvfg==
100
114
  -----END CERTIFICATE-----
@@ -42,7 +42,7 @@ module MoteSMS
42
42
  # Returns nothing.
43
43
  def deliver(message, options = {})
44
44
  to = self.recipient.respond_to?(:call) ? self.recipient.call(message) : self.recipient
45
- ActionMailerSMSMailer.forward_sms(to, message).deliver
45
+ ActionMailerSMSMailer.forward_sms(to, message).deliver_now
46
46
  end
47
47
  end
48
48
  end
@@ -0,0 +1,91 @@
1
+ require 'uri'
2
+ require 'net/https'
3
+ require 'digest/sha1'
4
+
5
+ require 'active_support/security_utils'
6
+ require 'mote_sms/version'
7
+
8
+ module Transports
9
+ # Small abstraction on top of Net::HTTP to handle things like public key pinning
10
+ # et all.
11
+ class HttpClient
12
+ CERTS_PATH = File.expand_path File.join(File.dirname(__FILE__), '..', 'ssl_certs')
13
+
14
+ def self.ssl_options
15
+ @ssl_options ||= ->(http) {
16
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER
17
+ http.verify_depth = 9
18
+ http.cert_store = self.default_cert_store
19
+ }
20
+ end
21
+
22
+ def self.default_cert_store
23
+ @default_cert_store ||= OpenSSL::X509::Store.new.tap do |store|
24
+ Dir["#{CERTS_PATH}/*CA.pem"].each { |c| store.add_file c }
25
+ end
26
+ end
27
+
28
+ def self.fingerprint_host(host)
29
+ pem = File.join(CERTS_PATH, "#{host}.pem")
30
+ return unless File.exist?(pem)
31
+ cert = OpenSSL::X509::Certificate.new(File.read(pem))
32
+ Digest::SHA1.hexdigest(cert.to_der)
33
+ end
34
+
35
+ def self.default_user_agent
36
+ "Ruby/mote_sms #{MoteSMS::VERSION}"
37
+ end
38
+
39
+ attr_reader :endpoint, :proxy_address, :proxy_port, :user_agent, :ssl, :fingerprint
40
+
41
+ def initialize(endpoint, enable_fingerprint: true, ssl: self.class.ssl_options,
42
+ proxy_address: nil, proxy_port: nil, user_agent: self.class.default_user_agent)
43
+ @endpoint = URI.parse(endpoint)
44
+ @proxy_address = proxy_address
45
+ @proxy_port = proxy_port
46
+ @user_agent = user_agent
47
+ @ssl = ssl || self.class.ssl_options
48
+ if enable_fingerprint
49
+ @fingerprint = ENV.fetch(
50
+ "MOTE_SMS_#{@endpoint.host.to_s.upcase.gsub(/[\.-]/, '_')}_FINGERPRINT",
51
+ self.class.fingerprint_host(@endpoint.host))
52
+ end
53
+ end
54
+
55
+ def https?
56
+ endpoint.scheme == 'https'
57
+ end
58
+
59
+ def request(request)
60
+ request['User-Agent'] = user_agent
61
+ build_http_client.request(request)
62
+ end
63
+
64
+ protected
65
+
66
+ def build_http_client
67
+ Net::HTTP.new(endpoint.host, endpoint.port, proxy_address, proxy_port).tap do |http|
68
+ if https?
69
+ http.use_ssl = true
70
+ http.verify_callback = ->(ok, store) { verify_fingerprint(ok, store) }
71
+ ssl.call(http) if ssl.respond_to?(:call)
72
+ end
73
+ end
74
+ end
75
+
76
+ def verify_fingerprint(ok, store)
77
+ cert_digest = Digest::SHA1.hexdigest(store.chain.first.to_der)
78
+ return ok if verify_fingerprint?(cert_digest)
79
+
80
+ logger.error(
81
+ format('[Transports::HttpClient] failed to verify %s fingerprint (ACTUAL: %s, EXPECTED: %s)',
82
+ endpoint, digest, fingerprint))
83
+ false
84
+ end
85
+
86
+ def verify_fingerprint?(digest)
87
+ return true unless fingerprint
88
+ ActiveSupport::SecurityUtils.secure_compare(digest, fingerprint)
89
+ end
90
+ end
91
+ end