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.
@@ -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: