trust_me 0.1.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b27c6d276f92c43d1c327c45d95b3508639ef0fa
4
+ data.tar.gz: be8f2eb7a3910b92adeb1fbb3fab9403776357b6
5
+ SHA512:
6
+ metadata.gz: 08eb5e47d9fd3b79c0b644a018250fa46d6bd6e4070ce14b680e75a0b2217b714f09fe013104adab143b44e94e15813e5fcac38937e7883241731a66764aef8e
7
+ data.tar.gz: b02fa2bb5f7572097f3ce55a75daa365422b634c6a8fedae4508833a40e25b5962efa1d3a3dca4617669e179bc6eb244a4349d02abc5852665c4f48fe39c8f89
data/README.markdown ADDED
@@ -0,0 +1,82 @@
1
+ # TrustMe
2
+
3
+ This library is a wrapper for the TeleSign REST API. Currently the Verify Call
4
+ and Verify SMS web services are supported. The Verify Call web service sends a
5
+ verification code to a user in a voice message with a phone call. The Verify
6
+ SMS web service sends a verification code to a user in a text message via SMS.
7
+ The user enters this code in a web application to verify their identity.
8
+
9
+ See also:
10
+ - <http://docs.telesign.com/rest/content/verify-call.html>
11
+ - <http://docs.telesign.com/rest/content/verify-sms.html>
12
+
13
+ ## Configuration
14
+
15
+ Set global credentials:
16
+
17
+ ```ruby
18
+ TrustMe.config do |c|
19
+ c.customer_id = "1234"
20
+ c.secret_key = "secret"
21
+ end
22
+ ```
23
+
24
+ If you need different credentials per-instance:
25
+
26
+ ```ruby
27
+ trust_me = TrustMe.new "5678", "secret2"
28
+ ```
29
+
30
+ ## Usage
31
+
32
+ Send a verification call to a customer and save the verification code:
33
+
34
+ ```ruby
35
+ class VerifyController < ApplicationController
36
+ def create
37
+ trust_me = TrustMe.new
38
+ call = trust_me.send_verification_call! current_user.phone
39
+
40
+ current_user.update_attribute! :verification_code, call[:code]
41
+ end
42
+ end
43
+ ```
44
+
45
+ Or send a verification SMS to a customer:
46
+
47
+ ```ruby
48
+ class VerifyController < ApplicationController
49
+ def create
50
+ trust_me = TrustMe.new
51
+ sms = trust_me.send_verification_sms! current_user.phone
52
+
53
+ current_user.update_attribute! :verification_code, sms[:code]
54
+ end
55
+ end
56
+ ```
57
+
58
+ The customer verifies the code:
59
+
60
+ ```ruby
61
+ class VerifyController < ApplicationController
62
+ def update
63
+ if params[:code] == current_user.verification_code
64
+ current_user.set_verified!
65
+ end
66
+ end
67
+ end
68
+ ```
69
+
70
+ ## Note on Patches/Pull Requests
71
+
72
+ * Fork the project.
73
+ * Make your feature addition or bug fix.
74
+ * Add tests for it. This is important so we don't break it in a future version
75
+ unintentionally.
76
+ * Commit, do not bump version. (If you want to have your own version, that is
77
+ fine but bump version in a commit by itself we can ignore when we pull).
78
+ * Send us a pull request. Bonus points for topic branches.
79
+
80
+ ## Copyright
81
+
82
+ Copyright (c) 2014 WWWH, LLC. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ $:.unshift "lib"
2
+
3
+ begin
4
+ require "rspec/core/rake_task"
5
+ require "bundler/gem_tasks"
6
+ require "rake-tomdoc"
7
+ rescue LoadError
8
+ abort "Please run `bundle install`"
9
+ end
10
+
11
+ RSpec::Core::RakeTask.new :spec
12
+ task :default => :spec
@@ -0,0 +1,3 @@
1
+ class TrustMe
2
+ VERSION = Version = "0.1.1"
3
+ end
data/lib/trust_me.rb ADDED
@@ -0,0 +1,220 @@
1
+ require "trust_me/version"
2
+ require "json"
3
+ require "uri"
4
+ require "net/http"
5
+ require "base64"
6
+ require "openssl"
7
+
8
+ class TrustMe
9
+ # Public: URL to the TeleSign REST API.
10
+ #
11
+ # Returns a URI::HTTPS instance.
12
+ API_URL = URI.parse("https://rest.telesign.com")
13
+
14
+ # Public: Gets/sets configuration info to connect to the TeleSign API.
15
+ #
16
+ # Example
17
+ #
18
+ # TrustMe.config do |c|
19
+ # c.customer_id = "1234"
20
+ # c.secret_key = "secret"
21
+ # end
22
+ #
23
+ # Returns a Struct.
24
+ def self.config
25
+ @config ||= Struct.new(:customer_id, :secret_key).new
26
+ yield @config if block_given?
27
+ @config
28
+ end
29
+
30
+ # Public: Creates a new TrustMe instance.
31
+ #
32
+ # customer_id - TeleSign customer ID
33
+ # secret_key - TeleSign secret key
34
+ #
35
+ # Raises RuntimeError if credentials aren't setup.
36
+ #
37
+ # Returns nothing.
38
+ def initialize(customer_id = nil, secret_key = nil)
39
+ @customer_id = customer_id || self.class.config.customer_id
40
+ @secret_key = secret_key || self.class.config.secret_key
41
+
42
+ unless @customer_id && @secret_key
43
+ raise "You must supply API credentials. Try `TrustMe.new " \
44
+ '"customer_id", "secret_key"` or `TrustMe.config`'
45
+ end
46
+ end
47
+
48
+ # Public: Send a verification call to the given phone number.
49
+ #
50
+ # number - The phone number to call
51
+ # options - Hash of options
52
+ # :verify_code - Code to send the user, if not supplied a 5-digit
53
+ # code is automatically generated
54
+ # :language - Language to use on the call, defaults to "en-US"
55
+ # :ucid - Use case ID, defaults to "TRVF"
56
+ # (Transaction Verification)
57
+ #
58
+ # See: http://docs.telesign.com/rest/content/verify-call.html#index-5
59
+ #
60
+ # Returns a Hash.
61
+ def send_verification_call!(number, options = {})
62
+ verify_code = options.fetch(:verify_code, generate_code)
63
+
64
+ output = api_request(
65
+ :resource => "/v1/verify/call",
66
+ :params => encode_hash(
67
+ :ucid => options.fetch(:ucid, "TRVF"),
68
+ :phone_number => number,
69
+ :language => options.fetch(:language, "en-US"),
70
+ :verify_code => verify_code
71
+ )
72
+ )
73
+
74
+ { :data => output, :code => verify_code }
75
+ end
76
+
77
+ # Public: Send a verification SMS to the given phone number.
78
+ #
79
+ # number - The phone number to message
80
+ # options - Hash of options
81
+ # :verify_code - Code to send the user, if not supplied a 5-digit
82
+ # code is automatically generated
83
+ # :language - Language to use on the call, defaults to "en-US"
84
+ # :ucid - Use case ID, defaults to "TRVF"
85
+ # (Transaction Verification)
86
+ # :template - Optional text template, must include "$$CODE$$"
87
+ #
88
+ # See: http://docs.telesign.com/rest/content/verify-sms.html#index-5
89
+ #
90
+ # Returns a Hash.
91
+ def send_verification_sms!(number, options = {})
92
+ verify_code = options.fetch(:verify_code, generate_code)
93
+
94
+ output = api_request(
95
+ :resource => "/v1/verify/sms",
96
+ :params => encode_hash(
97
+ :ucid => options.fetch(:ucid, "TRVF"),
98
+ :phone_number => number,
99
+ :language => options.fetch(:language, "en-US"),
100
+ :verify_code => verify_code,
101
+ :template => options[:template]
102
+ )
103
+ )
104
+
105
+ { :data => output, :code => verify_code }
106
+ end
107
+
108
+ # Public: Generates headers used to authenticate with the API.
109
+ #
110
+ # options - Hash of options
111
+ # :resource - API resource (required)
112
+ # :params - Params to send (required)
113
+ #
114
+ # Raises KeyError if any required keys are missing.
115
+ #
116
+ # See: http://docs.telesign.com/rest/content/rest-auth.html
117
+ #
118
+ # Returns a Hash.
119
+ def generate_headers(options = {})
120
+ content_type = "application/x-www-form-urlencoded"
121
+ date = Time.now.gmtime.strftime("%a, %d %b %Y %H:%M:%S GMT")
122
+ nonce = `uuidgen`.chomp
123
+
124
+ content = [
125
+ "POST",
126
+ content_type,
127
+ "", # Blank spot for "Date" header, which is overridden by x-ts-date
128
+ "x-ts-auth-method:HMAC-SHA256",
129
+ "x-ts-date:#{date}",
130
+ "x-ts-nonce:#{nonce}",
131
+ options.fetch(:params),
132
+ options.fetch(:resource)
133
+ ].join("\n")
134
+
135
+ hash = OpenSSL::Digest::SHA256.new rand.to_s
136
+ key = Base64.decode64(@secret_key)
137
+ digest = OpenSSL::HMAC.digest(hash, key, content)
138
+ auth = Base64.encode64(digest)
139
+
140
+ {
141
+ "Authorization" => "TSA #{@customer_id}:#{auth}",
142
+ "Content-Type" => content_type,
143
+ "x-ts-date" => date,
144
+ "x-ts-auth-method" => "HMAC-SHA256",
145
+ "x-ts-nonce" => nonce
146
+ }
147
+ end
148
+
149
+ private
150
+
151
+ # Private: Generates a random 5 digit code.
152
+ #
153
+ # Returns a String.
154
+ def generate_code
155
+ (0..4).map { (48 + rand(10)).chr }.join
156
+ end
157
+
158
+ # Private: URL-encodes a hash to a string for submission via HTTP.
159
+ #
160
+ # hash - A Hash to encode
161
+ #
162
+ # Returns a String.
163
+ def encode_hash(hash)
164
+ URI.encode_www_form hash
165
+ end
166
+
167
+ # Private: CA certificate file to verify SSL connection with `API_URL`
168
+ #
169
+ # Returns an OpenSSL::X509::Certificate instance.
170
+ def cacert
171
+ @cacert ||= OpenSSL::X509::Certificate.new \
172
+ File.read(File.expand_path("../../vendor/cacert.pem", __FILE__))
173
+ end
174
+
175
+ # Private: Parse the given JSON string.
176
+ #
177
+ # string - Raw JSON string
178
+ #
179
+ # Returns a Hash.
180
+ def parse_json(string)
181
+ JSON.parse string
182
+ end
183
+
184
+ # Private: Submits an API request via POST.
185
+ #
186
+ # options - Hash of options
187
+ # :resource - API resource (required)
188
+ # :params - Params to send (required)
189
+ #
190
+ # Raises KeyError if any required keys are missing.
191
+ # Raises a Net::HTTP exception if the request is not successful.
192
+ #
193
+ # Returns a Hash.
194
+ def api_request(options = {})
195
+ http = Net::HTTP.new(API_URL.host, API_URL.port)
196
+ http.use_ssl = API_URL.scheme == "https"
197
+
198
+ if http.use_ssl?
199
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER
200
+ http.cert_store = OpenSSL::X509::Store.new
201
+ http.cert_store.add_cert cacert
202
+ end
203
+
204
+ headers = generate_headers(options)
205
+ body = options.fetch(:params)
206
+ resource = options.fetch(:resource)
207
+ response = http.request_post resource, body, headers
208
+ output = parse_json(response.body)
209
+
210
+ if response.is_a? Net::HTTPSuccess
211
+ output
212
+ else
213
+ raise response.error_type.new(
214
+ "#{response.code} #{response.message.dump}\n" \
215
+ "Response body: #{output.inspect}",
216
+ response
217
+ )
218
+ end
219
+ end
220
+ end
@@ -0,0 +1,19 @@
1
+ {
2
+ "reference_id" : "ABCDEF0123456789ABCDEF0123456789",
3
+ "resource_uri" : "/v1/verify/ABCDEF0123456789ABCDEF0123456789",
4
+ "sub_resource" : "call",
5
+ "errors": [],
6
+ "status" : {
7
+ "updated_on" : "2012-04-17T22:26:43.784963Z",
8
+ "code" : 103,
9
+ "description" : "Call in progress"
10
+ },
11
+ "call_forwarding": {
12
+ "mode": "FLAG",
13
+ "status": "FORWARDED"
14
+ },
15
+ "verify" : {
16
+ "code_state" : "UNKNOWN",
17
+ "code_entered" : ""
18
+ }
19
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "reference_id" : "ABCDEF0123456789ABCDEF0123456789",
3
+ "resource_uri" : "/v1/verify/ABCDEF0123456789ABCDEF0123456789",
4
+ "sub_resource" : "sms",
5
+ "errors": [],
6
+ "status" : {
7
+ "updated_on" : "2012-04-17T22:26:43.784963Z",
8
+ "code" : 290,
9
+ "description" : "Message in progress"
10
+ },
11
+ "verify" : {
12
+ "code_state" : "UNKNOWN",
13
+ "code_entered" : ""
14
+ }
15
+ }
@@ -0,0 +1,14 @@
1
+ require "rspec"
2
+ require "webmock/rspec"
3
+ require "trust_me"
4
+
5
+ RSpec.configure do |config|
6
+ config.color = true
7
+ config.order = "rand"
8
+ config.formatter = "progress"
9
+ end
10
+
11
+ TrustMe.config do |c|
12
+ c.customer_id = "custid"
13
+ c.secret_key = Base64.encode64("secret")
14
+ end
@@ -0,0 +1,141 @@
1
+ require "spec_helper"
2
+
3
+ describe TrustMe do
4
+ let :trust_me do
5
+ TrustMe.new
6
+ end
7
+
8
+ let :now do
9
+ Time.utc 2014, 11, 13, 12, 20, 00
10
+ end
11
+
12
+ let :now_rfc1123 do
13
+ "Thu, 13 Nov 2014 12:20:00 GMT"
14
+ end
15
+
16
+ let :uuid do
17
+ "3846B06C-C3C1-4C36-9426-2317B5C96C78"
18
+ end
19
+
20
+ before do
21
+ allow(Time).to receive(:now) { now }
22
+ allow(trust_me).to receive(:`).with("uuidgen") { uuid }
23
+ end
24
+
25
+ shared_examples_for "api_call" do |method, extra_request_params = {}|
26
+ let :response_body do
27
+ File.read("spec/fixtures/verify-#{method}-success.json")
28
+ end
29
+
30
+ let :request_headers do
31
+ {
32
+ "Authorization" => /TSA custid:.*/,
33
+ "x-ts-date" => now_rfc1123,
34
+ "x-ts-auth-method" => "HMAC-SHA256",
35
+ "x-ts-nonce" => uuid,
36
+ "Content-Type" => "application/x-www-form-urlencoded",
37
+
38
+ # Set automatically by Net::HTTP
39
+ "Accept" => "*/*",
40
+ "Accept-Encoding" => "gzip;q=1.0,deflate;q=0.6,identity;q=0.3",
41
+ "User-Agent" => "Ruby"
42
+ }
43
+ end
44
+
45
+ let :request_body do
46
+ {
47
+ "language" => "en-US",
48
+ "phone_number" => "15554443333",
49
+ "ucid" => "TRVF",
50
+ "verify_code" => "12345"
51
+ }.merge(extra_request_params)
52
+ end
53
+
54
+ before do
55
+ allow(trust_me).to receive(:generate_code) { "12345" }
56
+ end
57
+
58
+ let! :stub do
59
+ stub_request(:post, "#{TrustMe::API_URL}/v1/verify/#{method}")
60
+ .with(:headers => request_headers, :body => request_body)
61
+ .to_return(:body => response_body)
62
+ end
63
+ end
64
+
65
+ describe "#send_verification_call!" do
66
+ it_behaves_like "api_call", "call" do
67
+ it "submits the request" do
68
+ trust_me.send_verification_call! "15554443333"
69
+
70
+ expect(stub).to have_been_made
71
+ end
72
+
73
+ it "returns the the data and code" do
74
+ response = trust_me.send_verification_call! "15554443333"
75
+
76
+ expect(response[:code]).to eq("12345")
77
+ expect(response[:data]).to eq(JSON.parse(response_body))
78
+ end
79
+ end
80
+ end
81
+
82
+ describe "#send_verification_sms!" do
83
+ it_behaves_like "api_call", "sms", { :template => "CODE: $$CODE$$" } do
84
+ it "submits the request" do
85
+ trust_me.send_verification_sms! "15554443333", :template => "CODE: $$CODE$$"
86
+
87
+ expect(stub).to have_been_made
88
+ end
89
+
90
+ it "returns the the data and code" do
91
+ response = trust_me.send_verification_sms! "15554443333", :template => "CODE: $$CODE$$"
92
+
93
+ expect(response[:code]).to eq("12345")
94
+ expect(response[:data]).to eq(JSON.parse(response_body))
95
+ end
96
+ end
97
+ end
98
+
99
+ describe "#generate_headers" do
100
+ let :hash do
101
+ OpenSSL::Digest.new("sha256", "abc")
102
+ end
103
+
104
+ let :params do
105
+ "a=1&b=2"
106
+ end
107
+
108
+ let :resource do
109
+ "/some/resource"
110
+ end
111
+
112
+ before do
113
+ allow(OpenSSL::Digest::SHA256).to receive(:digest) { hash }
114
+ end
115
+
116
+ let :auth do
117
+ content = [
118
+ "POST",
119
+ "application/x-www-form-urlencoded",
120
+ "",
121
+ "x-ts-auth-method:HMAC-SHA256",
122
+ "x-ts-date:#{now_rfc1123}",
123
+ "x-ts-nonce:#{uuid}",
124
+ params,
125
+ resource
126
+ ].join("\n")
127
+
128
+ Base64.encode64 OpenSSL::HMAC.digest(hash, "secret", content)
129
+ end
130
+
131
+ it "returns proper headers" do
132
+ headers = trust_me.generate_headers(:params => params, :resource => resource)
133
+
134
+ expect(headers["Authorization"]).to eq "TSA custid:#{auth}"
135
+ expect(headers["Content-Type"]).to eq "application/x-www-form-urlencoded"
136
+ expect(headers["x-ts-date"]).to eq now_rfc1123
137
+ expect(headers["x-ts-auth-method"]).to eq "HMAC-SHA256"
138
+ expect(headers["x-ts-nonce"]).to eq uuid
139
+ end
140
+ end
141
+ end
data/vendor/cacert.pem ADDED
@@ -0,0 +1,22 @@
1
+ # https://www.thawte.com/roots/thawte_Premium_Server_CA.pem
2
+
3
+ -----BEGIN CERTIFICATE-----
4
+ MIIDNjCCAp+gAwIBAgIQNhIilsXjOKUgodJfTNcJVDANBgkqhkiG9w0BAQUFADCB
5
+ zjELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJ
6
+ Q2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE
7
+ CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhh
8
+ d3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNl
9
+ cnZlckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIxMDEwMTIzNTk1OVow
10
+ gc4xCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcT
11
+ CUNhcGUgVG93bjEdMBsGA1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNV
12
+ BAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRo
13
+ YXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1z
14
+ ZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2
15
+ aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560
16
+ ZXUCTe/LCaIhUdib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j
17
+ +ao6hnO2RlNYyIkFvYMRuHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/
18
+ BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQBlkKyID1bZ5jA01CbH0FDxkt5r1DmI
19
+ CSLGpmODA/eZd9iy5Ri4XWPz1HP7bJyZePFLeH0ZJMMrAoT4vCLZiiLXoPxx7JGH
20
+ IPG47LHlVYCsPVLIOQ7C8MAFT9aCdYy9X9LcdpoFEsmvcsPcJX6kTY4XpeCHf+Ga
21
+ WuFg3GQjPEIuTQ==
22
+ -----END CERTIFICATE-----
metadata ADDED
@@ -0,0 +1,112 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: trust_me
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Joshua Priddle
8
+ - Justin Mazzi
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-11-26 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - '='
19
+ - !ruby/object:Gem::Version
20
+ version: '3.1'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - '='
26
+ - !ruby/object:Gem::Version
27
+ version: '3.1'
28
+ - !ruby/object:Gem::Dependency
29
+ name: webmock
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - '='
33
+ - !ruby/object:Gem::Version
34
+ version: 1.20.4
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - '='
40
+ - !ruby/object:Gem::Version
41
+ version: 1.20.4
42
+ - !ruby/object:Gem::Dependency
43
+ name: rake-tomdoc
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - '='
47
+ - !ruby/object:Gem::Version
48
+ version: 0.0.2
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - '='
54
+ - !ruby/object:Gem::Version
55
+ version: 0.0.2
56
+ - !ruby/object:Gem::Dependency
57
+ name: rake
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ description:
71
+ email:
72
+ - jpriddle@site5.com
73
+ - jmazzi@gmail.com
74
+ executables: []
75
+ extensions: []
76
+ extra_rdoc_files: []
77
+ files:
78
+ - README.markdown
79
+ - Rakefile
80
+ - lib/trust_me.rb
81
+ - lib/trust_me/version.rb
82
+ - spec/fixtures/verify-call-success.json
83
+ - spec/fixtures/verify-sms-success.json
84
+ - spec/spec_helper.rb
85
+ - spec/trust_me_spec.rb
86
+ - vendor/cacert.pem
87
+ homepage: https://github.com/site5/trust_me
88
+ licenses:
89
+ - MIT
90
+ metadata: {}
91
+ post_install_message:
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ requirements: []
106
+ rubyforge_project:
107
+ rubygems_version: 2.2.2
108
+ signing_key:
109
+ specification_version: 4
110
+ summary: 'TrustMe: Wrapper for the TeleSign REST API'
111
+ test_files: []
112
+ has_rdoc: