mote_sms 1.2.0 → 1.3.0.rc1

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