tsig_api 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/MIT-LICENSE +20 -0
- data/README.md +4 -0
- data/Rakefile +23 -0
- data/init.rb +4 -0
- data/install.rb +1 -0
- data/lib/tsig_api.rb +30 -0
- data/lib/tsig_api/authorize.rb +15 -0
- data/lib/tsig_api/base.rb +108 -0
- data/lib/tsig_api/carrier.rb +16 -0
- data/lib/tsig_api/contact.rb +79 -0
- data/lib/tsig_api/group.rb +15 -0
- data/lib/tsig_api/message.rb +116 -0
- data/lib/tsig_api/remote_actions.rb +71 -0
- data/lib/tsig_api/team.rb +79 -0
- data/test/test_helper.rb +18 -0
- data/test/tsig_api_authorize_test.rb +71 -0
- data/test/tsig_api_carrier_test.rb +124 -0
- data/test/tsig_api_contact_test.rb +148 -0
- data/test/tsig_api_group_test.rb +90 -0
- data/test/tsig_api_message_test.rb +167 -0
- data/test/tsig_api_team_test.rb +182 -0
- data/test/tsig_api_test.rb +37 -0
- data/tsig_api.gemspec +21 -0
- data/tsig_api.yml +13 -0
- data/uninstall.rb +1 -0
- metadata +79 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5502843ccb8a98114e81d8b945e1dc074bbb504b
|
4
|
+
data.tar.gz: d88a64b06000bbe3dc81df4ee65509cd6351aaa2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e5af2390f1f4a2bfd636798e7b01d72180f3aab1155dd46f646f6b4511e8bd580cb3f14270a090f887f121377913c1d03e624efa11b2e484f9c5e6b33f50e0e8
|
7
|
+
data.tar.gz: 1b307ea2d86adb3b441d2206d633a3b4e9e286f69e59e6b611361edb443eeae5bbaafd85991afa0fe1d4635bd757c73d7c6ce95ccea3a4e8ab27c1fd4036eaac
|
data/.gitignore
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 [name of plugin creator]
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rake/rdoctask'
|
4
|
+
|
5
|
+
desc 'Default: run unit tests.'
|
6
|
+
task :default => :test
|
7
|
+
|
8
|
+
desc 'Test the tsig_api plugin.'
|
9
|
+
Rake::TestTask.new(:test) do |t|
|
10
|
+
t.libs << 'lib'
|
11
|
+
t.libs << 'test'
|
12
|
+
t.pattern = 'test/**/*_test.rb'
|
13
|
+
t.verbose = true
|
14
|
+
end
|
15
|
+
|
16
|
+
desc 'Generate documentation for the tsig_api plugin.'
|
17
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
18
|
+
rdoc.rdoc_dir = 'rdoc'
|
19
|
+
rdoc.title = 'TSIG API'
|
20
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
21
|
+
rdoc.rdoc_files.include('README')
|
22
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
23
|
+
end
|
data/init.rb
ADDED
data/install.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# Install hook code here
|
data/lib/tsig_api.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
|
2
|
+
def build_global_element(elem)
|
3
|
+
txtsig_api_config = YAML::load_file(File.join(Rails.root, "config/tsig_api.yml"))
|
4
|
+
rails_env = Rails.env.to_s || "development"
|
5
|
+
return txtsig_api_config[rails_env.to_sym][elem]
|
6
|
+
end
|
7
|
+
|
8
|
+
module TsigApi
|
9
|
+
|
10
|
+
# extracts just the text from a tsig flash message
|
11
|
+
#
|
12
|
+
def self.text_from_flash(str)
|
13
|
+
matches = /\<li\>(.+)\<\/li\>/im.match(str)
|
14
|
+
messages = []
|
15
|
+
if matches
|
16
|
+
messages = matches[1].split(/\<\/li\>\s*\<li\>/)
|
17
|
+
end
|
18
|
+
return messages
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
require 'rexml/document'
|
24
|
+
require 'tsig_api/authorize'
|
25
|
+
require 'tsig_api/base'
|
26
|
+
require 'tsig_api/carrier'
|
27
|
+
require 'tsig_api/contact'
|
28
|
+
require 'tsig_api/group'
|
29
|
+
require 'tsig_api/message'
|
30
|
+
require 'tsig_api/team'
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'tsig_api/base'
|
2
|
+
|
3
|
+
module TsigApi
|
4
|
+
|
5
|
+
class Authorize < TsigApi::Base
|
6
|
+
|
7
|
+
self.remote_type = :authorize
|
8
|
+
|
9
|
+
def query
|
10
|
+
TsigApi::RemoteActions::Request.new(:body => request_xml(:authorize, nil), :url => '/api/authorize')
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'tsig_api/remote_actions'
|
2
|
+
|
3
|
+
module TsigApi
|
4
|
+
|
5
|
+
class Base
|
6
|
+
|
7
|
+
class << self
|
8
|
+
attr_accessor :remote_type
|
9
|
+
|
10
|
+
def establish_connection(clientid, username, password)
|
11
|
+
@TXTSIG_CLIENT_ID = clientid
|
12
|
+
@TXTSIG_API_USERNAME = username
|
13
|
+
@TXTSIG_API_PASSWORD = password
|
14
|
+
|
15
|
+
TsigApi.send(:const_set, "TXTSIG_HOST", build_global_element(:host)) unless TsigApi.const_defined?(:TXTSIG_HOST)
|
16
|
+
TsigApi.send(:const_set, "TXTSIG_PORT", build_global_element(:port)) unless TsigApi.const_defined?(:TXTSIG_PORT)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
attr_accessor :group_id
|
22
|
+
|
23
|
+
def initialize(group_id=nil)
|
24
|
+
self.group_id = group_id
|
25
|
+
end
|
26
|
+
|
27
|
+
def list
|
28
|
+
raise 'Abstract, subclass'
|
29
|
+
end
|
30
|
+
|
31
|
+
def create
|
32
|
+
raise "Abstract, subclass"
|
33
|
+
end
|
34
|
+
|
35
|
+
def query
|
36
|
+
raise "Abstract, subclass"
|
37
|
+
end
|
38
|
+
|
39
|
+
def update
|
40
|
+
raise "Abstract, subclass"
|
41
|
+
end
|
42
|
+
|
43
|
+
def destroy
|
44
|
+
raise "Abstract, subclass"
|
45
|
+
end
|
46
|
+
|
47
|
+
def parse_response(response)
|
48
|
+
begin
|
49
|
+
doc = REXML::Document.new(response.body)
|
50
|
+
rescue
|
51
|
+
return nil
|
52
|
+
end
|
53
|
+
content_type = doc.root.elements[1].attributes["type"]
|
54
|
+
response_hash = {}
|
55
|
+
doc.root.elements[1].elements[1].elements.each do |e|
|
56
|
+
if e.attributes["name"] == self.class.remote_type.to_s.pluralize
|
57
|
+
response_hash[e.attributes["name"]] = e.elements.collect do |ne|
|
58
|
+
if ne.cdatas.empty?
|
59
|
+
ne.get_text.to_s.gsub(/^\s+/, "").gsub(/\s+$/, "")
|
60
|
+
else
|
61
|
+
ne.cdatas[0].to_s.gsub(/^\s+/, "").gsub(/\s+$/, "")
|
62
|
+
end
|
63
|
+
end
|
64
|
+
else
|
65
|
+
if e.cdatas.empty?
|
66
|
+
response_hash[e.attributes["name"]] = e.get_text.to_s.gsub(/^\s+/, "").gsub(/\s+$/, "")
|
67
|
+
else
|
68
|
+
response_hash[e.attributes["name"]] = e.cdatas[0].to_s.gsub(/^\s+/, "").gsub(/\s+$/, "")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
return [content_type, response_hash]
|
73
|
+
end
|
74
|
+
|
75
|
+
protected
|
76
|
+
|
77
|
+
def credentials_xml
|
78
|
+
xml = <<-EOS
|
79
|
+
<credentials>
|
80
|
+
<api_username><![CDATA[#{TsigApi::Base.instance_variable_get('@TXTSIG_API_USERNAME')}]]></api_username>
|
81
|
+
<api_password><![CDATA[#{TsigApi::Base.instance_variable_get('@TXTSIG_API_PASSWORD')}]]></api_password>
|
82
|
+
<client_id><![CDATA[#{TsigApi::Base.instance_variable_get('@TXTSIG_CLIENT_ID')}]]></client_id>
|
83
|
+
</credentials>
|
84
|
+
EOS
|
85
|
+
end
|
86
|
+
|
87
|
+
def group_id_node
|
88
|
+
param_node('group', group_id)
|
89
|
+
end
|
90
|
+
|
91
|
+
def param_node(name, value)
|
92
|
+
%Q{<param name="#{name}"><![CDATA[#{value}]]></param>}
|
93
|
+
end
|
94
|
+
|
95
|
+
def request_xml(action, body)
|
96
|
+
xml = <<-EOS
|
97
|
+
<?xml version='1.0'?>
|
98
|
+
<txtsig_request version='1.0'>
|
99
|
+
#{credentials_xml}
|
100
|
+
<action type="#{action.to_s.downcase}_#{self.class.remote_type}">
|
101
|
+
#{body}
|
102
|
+
</action>
|
103
|
+
</txtsig_request>
|
104
|
+
EOS
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'rexml/document'
|
2
|
+
require 'tsig_api/base'
|
3
|
+
|
4
|
+
module TsigApi
|
5
|
+
|
6
|
+
class Carrier < TsigApi::Base
|
7
|
+
|
8
|
+
self.remote_type = :carriers
|
9
|
+
|
10
|
+
def query
|
11
|
+
TsigApi::RemoteActions::Request.new(:body => request_xml(:list, "<param name='group'>#{group_id}</param>"))
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'tsig_api/base'
|
2
|
+
|
3
|
+
module TsigApi
|
4
|
+
class Contact < TsigApi::Base
|
5
|
+
self.remote_type = :contact
|
6
|
+
|
7
|
+
def create(options={:first_name => nil, :last_name => nil, :cell_carrier => nil, :cell_number => nil, :receive_messages => nil, :add_teams => nil})
|
8
|
+
team_xml = ""
|
9
|
+
if options[:add_teams]
|
10
|
+
team_xml += "<param name='add_teams'>"
|
11
|
+
options[:add_teams].each do |at|
|
12
|
+
team_xml += "<team>#{at}</team>"
|
13
|
+
end
|
14
|
+
team_xml += "</param>"
|
15
|
+
end
|
16
|
+
remsg = 0
|
17
|
+
remsg = 1 if options[:receive_messages]
|
18
|
+
xml = "
|
19
|
+
<param name='group'>#{group_id}</param>
|
20
|
+
<param name='first_name'>#{options[:first_name]}</param>
|
21
|
+
<param name='last_name'>#{options[:last_name]}</param>
|
22
|
+
<param name='cell_number'>#{options[:cell_number]}</param>
|
23
|
+
<param name='cell_carrier'>#{options[:cell_carrier]}</param>
|
24
|
+
<param name='receive_messages'>#{remsg}</param>
|
25
|
+
#{team_xml}
|
26
|
+
"
|
27
|
+
TsigApi::RemoteActions::Request.new(:body => request_xml(:create, xml))
|
28
|
+
end
|
29
|
+
|
30
|
+
def query(options={:first_name => nil, :last_name => nil, :cell_carrier => nil, :cell_number => nil, :contact_id => nil})
|
31
|
+
xml = "<param name='group'>#{group_id}</param>"
|
32
|
+
if options[:contact_id]
|
33
|
+
xml += "<param name='contact_id'>#{options[:contact_id]}</param>"
|
34
|
+
else
|
35
|
+
use_options = options.reject { |o, k| o == :contact_id }
|
36
|
+
use_options.each do |arg, val|
|
37
|
+
xml += "<param name='#{arg.to_s}'>#{val}</param>" if val
|
38
|
+
end
|
39
|
+
end
|
40
|
+
TsigApi::RemoteActions::Request.new(:body => request_xml(:query, xml))
|
41
|
+
end
|
42
|
+
|
43
|
+
def update(contact_id, options = {:first_name => nil, :last_name => nil, :cell_carrier => nil, :cell_number => nil, :receive_messages => nil, :add_teams => nil, :del_teams => nil})
|
44
|
+
xml = "<param name='group'>#{group_id}</param>"
|
45
|
+
xml += "<param name='contact_id'>#{contact_id}</param>"
|
46
|
+
use_options = options.reject { |o, v| [:add_teams, :del_teams].include?(o) }
|
47
|
+
use_options.each do |arg, val|
|
48
|
+
xml += "<param name='#{arg.to_s}'>#{val}</param>" if val
|
49
|
+
end
|
50
|
+
if options[:add_teams]
|
51
|
+
add_team_xml = "<param name='add_teams'>"
|
52
|
+
options[:add_teams].each do |at|
|
53
|
+
add_team_xml += "<team>#{at}</team>"
|
54
|
+
end
|
55
|
+
add_team_xml += "</param>"
|
56
|
+
xml += add_team_xml
|
57
|
+
end
|
58
|
+
if options[:del_teams]
|
59
|
+
del_team_xml = "<param name='del_teams'>"
|
60
|
+
options[:del_teams].each do |at|
|
61
|
+
del_team_xml += "<team>#{at}</team>"
|
62
|
+
end
|
63
|
+
del_team_xml += "</param>"
|
64
|
+
xml += del_team_xml
|
65
|
+
end
|
66
|
+
TsigApi::RemoteActions::Request.new(:body => request_xml(:update, xml))
|
67
|
+
end
|
68
|
+
|
69
|
+
def delete(contact_id)
|
70
|
+
xml = <<-EOS
|
71
|
+
<param name='group'>#{group_id}</param>
|
72
|
+
<param name='contact_id'>#{contact_id}</param>
|
73
|
+
EOS
|
74
|
+
|
75
|
+
TsigApi::RemoteActions::Request.new(:body => request_xml(:delete, xml))
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'tsig_api/base'
|
2
|
+
|
3
|
+
module TsigApi
|
4
|
+
|
5
|
+
class Message < TsigApi::Base
|
6
|
+
self.remote_type = :message
|
7
|
+
|
8
|
+
def create(options={:broadcast_type => nil, :date_sent => nil, :send_now => nil, :message => nil, :has_contacts => nil, :has_teams => nil})
|
9
|
+
date_sent = (options[:date_sent] || options[:send_at])
|
10
|
+
date_sent = parse_date(date_sent) if date_sent
|
11
|
+
sndnow = %w(1 true).include?(options[:send_now].to_s)
|
12
|
+
|
13
|
+
xml = <<-EOS
|
14
|
+
<param name='group'><![CDATA[#{group_id}]]></param>
|
15
|
+
<param name='broadcast_type'>#{options[:broadcast_type]}</param>
|
16
|
+
<param name='send_at'>#{date_sent}</param>
|
17
|
+
<param name='send_now'>#{sndnow}</param>
|
18
|
+
<param name='message'><![CDATA[#{options[:message]}]]></param>
|
19
|
+
EOS
|
20
|
+
|
21
|
+
if options[:has_contacts]
|
22
|
+
has_contact_xml = "<param name='has_contacts'>"
|
23
|
+
options[:has_contacts].each do |at|
|
24
|
+
has_contact_xml += "<contact>#{at}</contact>"
|
25
|
+
end
|
26
|
+
has_contact_xml += "</param>"
|
27
|
+
xml += has_contact_xml
|
28
|
+
end
|
29
|
+
if options[:has_teams]
|
30
|
+
has_team_xml = "<param name='has_teams'>"
|
31
|
+
options[:has_teams].each do |at|
|
32
|
+
has_team_xml += "<team><![CDATA[#{at}]]></team>"
|
33
|
+
end
|
34
|
+
has_team_xml += "</param>"
|
35
|
+
xml += has_team_xml
|
36
|
+
end
|
37
|
+
TsigApi::RemoteActions::Request.new(:body => request_xml(:create, xml))
|
38
|
+
end
|
39
|
+
|
40
|
+
def query(options={:broadcast_type => nil, :date_sent => nil, :send_now => nil, :message => nil, :sent_before => nil, :sent_after => nil, :message_id => nil, :message_by_team => nil })
|
41
|
+
xml = "<param name='group'>#{group_id}</param>"
|
42
|
+
if options[:message_id]
|
43
|
+
xml += "<param name='message_id'>#{options[:message_id]}</param>"
|
44
|
+
else
|
45
|
+
if options[:send_now]
|
46
|
+
sndnow = 0
|
47
|
+
sndnow = 1 if options[:send_now]
|
48
|
+
end
|
49
|
+
options[:send_now] = sndnow
|
50
|
+
options[:date_sent] = parse_date(options[:date_sent]) if options[:date_sent]
|
51
|
+
options[:sent_after] = parse_date(options[:sent_after]) if options[:sent_after]
|
52
|
+
options[:sent_before] = parse_date(options[:sent_before]) if options[:sent_before]
|
53
|
+
use_options = options.reject { |o, k| o == :message }
|
54
|
+
use_options.each do |arg, val|
|
55
|
+
xml += "<param name='#{arg.to_s}'>#{val}</param>" if val
|
56
|
+
end
|
57
|
+
if options[:message]
|
58
|
+
xml += "<param name='message'><![CDATA[#{option[:message]}]]></param>"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
TsigApi::RemoteActions::Request.new(:body => request_xml(:query, xml))
|
62
|
+
end
|
63
|
+
|
64
|
+
def update(message_id, options={:broadcast_type => nil, :date_sent => nil, :send_now => nil, :message => nil, :has_contacts => nil, :has_teams => nil})
|
65
|
+
xml = "<param name='group'>#{group_id}</param>"
|
66
|
+
xml += "<param name='message_id'>#{message_id}</param>"
|
67
|
+
sndnow = 0
|
68
|
+
sndnow = 1 if options[:send_now]
|
69
|
+
options[:send_now] = sndnow
|
70
|
+
options[:date_sent] = parse_date(options[:date_sent]) if options[:date_sent]
|
71
|
+
[:broadcast_type, :date_sent, :send_now].each do |arg|
|
72
|
+
xml += "<param name='#{arg}'>#{options[arg]}</param>" if options[arg]
|
73
|
+
end
|
74
|
+
xml += "<param name='message'><![CDATA[#{options[:message]}]]></param>" if options[:message]
|
75
|
+
if options[:has_contacts]
|
76
|
+
has_contact_xml = "<param name='has_contacts'>"
|
77
|
+
options[:has_contacts].each do |at|
|
78
|
+
has_contact_xml += "<contact>#{at}</contact>"
|
79
|
+
end
|
80
|
+
has_contact_xml += "</param>"
|
81
|
+
xml += has_contact_xml
|
82
|
+
end
|
83
|
+
if options[:has_teams]
|
84
|
+
has_team_xml = "<param name='has_teams'>"
|
85
|
+
options[:has_teams].each do |at|
|
86
|
+
has_team_xml += "<team>#{at}</team>"
|
87
|
+
end
|
88
|
+
has_team_xml += "</param>"
|
89
|
+
xml += has_team_xml
|
90
|
+
end
|
91
|
+
TsigApi::RemoteActions::Request.new(:body => request_xml(:update, xml))
|
92
|
+
end
|
93
|
+
|
94
|
+
def delete(message_id)
|
95
|
+
xml = "
|
96
|
+
<param name='group'>#{group_id}</param>
|
97
|
+
<param name='message_id'>#{message_id}</param>
|
98
|
+
"
|
99
|
+
TsigApi::RemoteActions::Request.new(:body => request_xml(:delete, xml))
|
100
|
+
end
|
101
|
+
|
102
|
+
private
|
103
|
+
|
104
|
+
def parse_date(d)
|
105
|
+
if not d.is_a?(String)
|
106
|
+
begin
|
107
|
+
d = d.strftime("%m/%d/%Y %H:%M %p")
|
108
|
+
rescue
|
109
|
+
raise "Date for message to be sent must be a string in MM-DD-YYYY HH:MM [am/pm] or a DateTime object"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
d
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
end
|