firstmiler_sms_oauth 0.0.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.
- data/lib/firstmiler_sms_oauth.rb +17 -0
- data/lib/firstmiler_sms_oauth/config.rb +9 -0
- data/lib/firstmiler_sms_oauth/fm_sms.rb +52 -0
- data/lib/firstmiler_sms_oauth/fm_sms_exception.rb +17 -0
- data/lib/firstmiler_sms_oauth/fm_sms_response.rb +45 -0
- data/lib/firstmiler_sms_oauth/otp.rb +17 -0
- data/lib/firstmiler_sms_oauth/sms_oauth.rb +70 -0
- data/lib/firstmiler_sms_oauth/sms_oauth_token.rb +7 -0
- data/lib/firstmiler_sms_oauth/version.rb +3 -0
- data/lib/generators/firstmiler_sms_oauth/firstmiler_sms_oauth_generator.rb +9 -0
- data/lib/generators/firstmiler_sms_oauth/templates/sms_oauth_token.rb +9 -0
- metadata +176 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
require 'active_record/version'
|
3
|
+
require 'active_support/core_ext/module'
|
4
|
+
require "firstmiler_sms_oauth/version"
|
5
|
+
require "firstmiler_sms_oauth/fm_sms"
|
6
|
+
require "firstmiler_sms_oauth/otp"
|
7
|
+
require "firstmiler_sms_oauth/fm_sms_response"
|
8
|
+
require "firstmiler_sms_oauth/fm_sms_exception"
|
9
|
+
require "firstmiler_sms_oauth/config"
|
10
|
+
require "firstmiler_sms_oauth/sms_oauth_token"
|
11
|
+
require "firstmiler_sms_oauth/sms_oauth"
|
12
|
+
|
13
|
+
|
14
|
+
# module FirstmilerSmsOauth
|
15
|
+
# # Your code goes here...
|
16
|
+
|
17
|
+
# end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require "firstmiler_sms_oauth/otp"
|
2
|
+
require "firstmiler_sms_oauth/fm_sms_response"
|
3
|
+
require "firstmiler_sms_oauth/fm_sms_exception"
|
4
|
+
|
5
|
+
|
6
|
+
module FirstmilerSmsOauth
|
7
|
+
class FmSms
|
8
|
+
def send(to_number, content = nil)
|
9
|
+
from_number = FirstmilerSmsOauth.from_number
|
10
|
+
content = CGI.escape(content)
|
11
|
+
url = build_url
|
12
|
+
response = send_sms_command(url,from_number, to_number, content)
|
13
|
+
handle_response(response)
|
14
|
+
end
|
15
|
+
|
16
|
+
def send_sms_command(url, from_number, to_number, content)
|
17
|
+
%x{curl -X POST -G \
|
18
|
+
"#{url}" \
|
19
|
+
-d 'From'="#{from_number}" \
|
20
|
+
-d 'To'="#{to_number}" \
|
21
|
+
-d 'Body'="#{content}"
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
def build_url
|
27
|
+
"https://#{FirstmilerSmsOauth.exotel_sid}:#{FirstmilerSmsOauth.exotel_token}@twilix.exotel.in/v1/Accounts/#{FirstmilerSmsOauth.exotel_sid}/Sms/send"
|
28
|
+
end
|
29
|
+
|
30
|
+
def handle_response(response)
|
31
|
+
flag, msg = FirstmilerSmsOauth::FmSmsException.check_response(response)
|
32
|
+
if flag
|
33
|
+
FirstmilerSmsOauth::FmSmsResponse.new(response)
|
34
|
+
else
|
35
|
+
raise msg
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def exotel_sid
|
40
|
+
FirstmilerSmsOauth.exotel_sid
|
41
|
+
end
|
42
|
+
|
43
|
+
def raise_blank_sms_template_exception
|
44
|
+
raise "Sms Template content should not be blank."
|
45
|
+
end
|
46
|
+
class << self
|
47
|
+
def send_otp(number, content)
|
48
|
+
new.send(number, content)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'active_support/core_ext/hash'
|
2
|
+
|
3
|
+
module FirstmilerSmsOauth
|
4
|
+
module FmSmsException
|
5
|
+
module_function
|
6
|
+
def check_response(response)
|
7
|
+
exotel_hash=Hash.from_xml(response.gsub("\n", ""))
|
8
|
+
if exotel_hash["TwilioResponse"].has_key?("SMSMessage")
|
9
|
+
return true
|
10
|
+
elsif exotel_hash["TwilioResponse"].has_key?("RestException")
|
11
|
+
return false, exotel_hash["TwilioResponse"]["RestException"]["Message"]
|
12
|
+
else
|
13
|
+
return false , "Some unknown exception occured"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
module FirstmilerSmsOauth
|
3
|
+
class FmSmsResponse
|
4
|
+
|
5
|
+
def initialize(response)
|
6
|
+
#To handle unexpected parsing from httparty
|
7
|
+
response = MultiXml.parse(response) unless response.is_a?(Hash)
|
8
|
+
response_base = response['TwilioResponse']
|
9
|
+
unless response_base.include?('RestException')
|
10
|
+
set_response_data(response_base)
|
11
|
+
else
|
12
|
+
set_response_error(response_base)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def set_response_data(response_base)
|
17
|
+
(response_base['Call'] or response_base['SMSMessage']).each do |key, value|
|
18
|
+
set_variable(key, value)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def set_response_error(response_base)
|
23
|
+
response_base['RestException'].each do |key, value|
|
24
|
+
set_variable(key, value)
|
25
|
+
instance_variable_set('@status', 'DND') #Override
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def set_variable(key, value)
|
30
|
+
attr_name = underscore_format(key)
|
31
|
+
self.class.send(:attr_accessor, attr_name) #Set accessors dynamically
|
32
|
+
instance_variable_set("@#{attr_name}", value)
|
33
|
+
end
|
34
|
+
|
35
|
+
protected
|
36
|
+
|
37
|
+
#TODO: CamelCase to underscore: check if we have to add this to string class.
|
38
|
+
def underscore_format(string)
|
39
|
+
string.gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
40
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
41
|
+
tr("-", "_").
|
42
|
+
downcase
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module FirstmilerSmsOauth
|
2
|
+
module Otp
|
3
|
+
module_function
|
4
|
+
def generate_key
|
5
|
+
rand_key = [*1000...9999].sample
|
6
|
+
"#{FirstmilerSmsOauth.code}#{rand_key}"
|
7
|
+
end
|
8
|
+
|
9
|
+
def build_otp_content(key)
|
10
|
+
sms_template % {key: key}
|
11
|
+
end
|
12
|
+
|
13
|
+
def sms_template
|
14
|
+
FirstmilerSmsOauth.sms_template
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module FirstmilerSmsOauth
|
2
|
+
module SmsOauth
|
3
|
+
def self.included(receiver)
|
4
|
+
receiver.extend ClassMethods
|
5
|
+
receiver.send :include, InstanceMethods
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
def acts_as_sms_oauth
|
10
|
+
send :include, InstanceMethods
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
module InstanceMethods
|
15
|
+
def send_otp
|
16
|
+
content = sms_content
|
17
|
+
begin
|
18
|
+
FirstmilerSmsOauth::FmSms.send_otp(self.phone_no, content)
|
19
|
+
rescue Exception => e
|
20
|
+
delete_user_sms_oauth_tokens
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def delete_user_sms_oauth_tokens
|
25
|
+
SmsOauthToken.where("tokner_id = ? and tokner_type = ?", self.id, self.class.name).delete_all
|
26
|
+
end
|
27
|
+
|
28
|
+
def all_tokens
|
29
|
+
tokens = SmsOauthToken.where("tokner_id = ? and tokner_type = ?", self.id, self.class.name).collect(&:sms_oauth_token)
|
30
|
+
tokens
|
31
|
+
end
|
32
|
+
|
33
|
+
def sms_content
|
34
|
+
key = token_key
|
35
|
+
FirstmilerSmsOauth::Otp.build_otp_content(key)
|
36
|
+
end
|
37
|
+
|
38
|
+
def token_key
|
39
|
+
key = FirstmilerSmsOauth::Otp.generate_key
|
40
|
+
build_sms_oauth_token(key)
|
41
|
+
key
|
42
|
+
end
|
43
|
+
|
44
|
+
def varify_sms_token?(token)
|
45
|
+
flag = all_tokens.include?(token.to_s)
|
46
|
+
delete_user_sms_oauth_tokens
|
47
|
+
flag
|
48
|
+
end
|
49
|
+
|
50
|
+
def build_sms_oauth_token(key)
|
51
|
+
s = SmsOauthToken.create(sms_oauth_token: key)
|
52
|
+
s.tokner = self
|
53
|
+
s.save
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
module ActsAsSmsOauth
|
58
|
+
if defined?(Rails::Railtie)
|
59
|
+
class Railtie < Rails::Railtie
|
60
|
+
initializer 'acts_as_sms_oauth.insert_into_active_record' do
|
61
|
+
ActiveSupport.on_load :active_record do
|
62
|
+
ActiveRecord::Base.send(:include, SmsOauth)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
else
|
67
|
+
ActiveRecord::Base.send(:include, SmsOauth) #if defined?(ActiveRecord)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'rails/generators/base'
|
2
|
+
class FirstmilerSmsOauthGenerator < Rails::Generators::Base
|
3
|
+
source_root File.expand_path('../templates', __FILE__)
|
4
|
+
|
5
|
+
def migration
|
6
|
+
template 'sms_oauth_token.rb',
|
7
|
+
File.join('db', 'migrate', "#{Time.now.getutc.strftime("%Y%m%d%H%M%S")}_create_sms_oauth_token.rb")
|
8
|
+
end
|
9
|
+
end
|
metadata
ADDED
@@ -0,0 +1,176 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: firstmiler_sms_oauth
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- raudra
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2015-03-09 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activerecord
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.2'
|
22
|
+
- - <
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: '5'
|
25
|
+
type: :runtime
|
26
|
+
prerelease: false
|
27
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '3.2'
|
33
|
+
- - <
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '5'
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: sqlite3
|
38
|
+
requirement: !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: !ruby/object:Gem::Requirement
|
47
|
+
none: false
|
48
|
+
requirements:
|
49
|
+
- - ! '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
name: mysql2
|
54
|
+
requirement: !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ~>
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: 0.3.7
|
60
|
+
type: :development
|
61
|
+
prerelease: false
|
62
|
+
version_requirements: !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ~>
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 0.3.7
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
name: ruby-oci8
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
none: false
|
80
|
+
requirements:
|
81
|
+
- - ! '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: bundler
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
none: false
|
88
|
+
requirements:
|
89
|
+
- - ~>
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '1.3'
|
92
|
+
type: :development
|
93
|
+
prerelease: false
|
94
|
+
version_requirements: !ruby/object:Gem::Requirement
|
95
|
+
none: false
|
96
|
+
requirements:
|
97
|
+
- - ~>
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '1.3'
|
100
|
+
- !ruby/object:Gem::Dependency
|
101
|
+
name: rake
|
102
|
+
requirement: !ruby/object:Gem::Requirement
|
103
|
+
none: false
|
104
|
+
requirements:
|
105
|
+
- - ! '>='
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '0'
|
108
|
+
type: :development
|
109
|
+
prerelease: false
|
110
|
+
version_requirements: !ruby/object:Gem::Requirement
|
111
|
+
none: false
|
112
|
+
requirements:
|
113
|
+
- - ! '>='
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: '0'
|
116
|
+
- !ruby/object:Gem::Dependency
|
117
|
+
name: rspec
|
118
|
+
requirement: !ruby/object:Gem::Requirement
|
119
|
+
none: false
|
120
|
+
requirements:
|
121
|
+
- - ! '>='
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '0'
|
124
|
+
type: :development
|
125
|
+
prerelease: false
|
126
|
+
version_requirements: !ruby/object:Gem::Requirement
|
127
|
+
none: false
|
128
|
+
requirements:
|
129
|
+
- - ! '>='
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
description: Common library for sending sms and OTP verification
|
133
|
+
email:
|
134
|
+
- raudrachamp10@gmail.com
|
135
|
+
executables: []
|
136
|
+
extensions: []
|
137
|
+
extra_rdoc_files: []
|
138
|
+
files:
|
139
|
+
- lib/firstmiler_sms_oauth/config.rb
|
140
|
+
- lib/firstmiler_sms_oauth/fm_sms.rb
|
141
|
+
- lib/firstmiler_sms_oauth/fm_sms_exception.rb
|
142
|
+
- lib/firstmiler_sms_oauth/fm_sms_response.rb
|
143
|
+
- lib/firstmiler_sms_oauth/otp.rb
|
144
|
+
- lib/firstmiler_sms_oauth/sms_oauth.rb
|
145
|
+
- lib/firstmiler_sms_oauth/sms_oauth_token.rb
|
146
|
+
- lib/firstmiler_sms_oauth/version.rb
|
147
|
+
- lib/firstmiler_sms_oauth.rb
|
148
|
+
- lib/generators/firstmiler_sms_oauth/firstmiler_sms_oauth_generator.rb
|
149
|
+
- lib/generators/firstmiler_sms_oauth/templates/sms_oauth_token.rb
|
150
|
+
homepage: ''
|
151
|
+
licenses:
|
152
|
+
- MIT
|
153
|
+
post_install_message:
|
154
|
+
rdoc_options: []
|
155
|
+
require_paths:
|
156
|
+
- lib
|
157
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
158
|
+
none: false
|
159
|
+
requirements:
|
160
|
+
- - ! '>='
|
161
|
+
- !ruby/object:Gem::Version
|
162
|
+
version: '0'
|
163
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
164
|
+
none: false
|
165
|
+
requirements:
|
166
|
+
- - ! '>='
|
167
|
+
- !ruby/object:Gem::Version
|
168
|
+
version: '0'
|
169
|
+
requirements: []
|
170
|
+
rubyforge_project:
|
171
|
+
rubygems_version: 1.8.19
|
172
|
+
signing_key:
|
173
|
+
specification_version: 3
|
174
|
+
summary: ''
|
175
|
+
test_files: []
|
176
|
+
has_rdoc:
|