tsig_api 1.0.5
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 +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
|