firstmiler_sms_oauth 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,9 @@
1
+ module FirstmilerSmsOauth
2
+ class << self
3
+ attr_accessor :exotel_sid, :exotel_token, :sms_template, :code, :from_number
4
+
5
+ def configure
6
+ yield self
7
+ end
8
+ end
9
+ 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,7 @@
1
+ class SmsOauthToken < ::ActiveRecord::Base
2
+ attr_accessible :sms_oauth_token,
3
+ :tokner_type,
4
+ :tokner_id if defined?(ActiveModel::MassAssignmentSecurity)
5
+ belongs_to :tokner, polymorphic: true
6
+ end
7
+
@@ -0,0 +1,3 @@
1
+ module FirstmilerSmsOauth
2
+ VERSION = "0.0.1"
3
+ 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
@@ -0,0 +1,9 @@
1
+ class CreateSmsOauthToken < ActiveRecord::Migration
2
+ def change
3
+ create_table :sms_oauth_tokens do |t|
4
+ t.string :sms_oauth_token
5
+ t.references :tokner, polymorphic: true
6
+ t.timestamps
7
+ end
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: