adobe_connect_api 0.0.69.alpha → 0.0.70.alpha
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/.rvmrc +1 -1
- data/adobe_connect_api.gemspec +1 -0
- data/config/config.breeze.yml +30 -0
- data/lib/adobe_connect_api/version.rb +1 -1
- data/lib/adobe_connect_api/xml_parser.rb +77 -0
- data/lib/adobe_connect_api.rb +90 -146
- data/spec/adobe_connect_api_spec.rb +181 -0
- data/spec/spec_helper.rb +8 -0
- metadata +33 -6
data/.rvmrc
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
rvm 1.9.
|
|
1
|
+
rvm 1.9.3@adobe_connect_api
|
data/adobe_connect_api.gemspec
CHANGED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Copyright (c) 2010 SWITCH - Serving Swiss Universities
|
|
2
|
+
# Author: Christian Rohrer <christian.rohrer@switch.ch>
|
|
3
|
+
# $Id$
|
|
4
|
+
|
|
5
|
+
# Configuration of the breeze / adobe connect connection
|
|
6
|
+
|
|
7
|
+
development:
|
|
8
|
+
url : https://collab-test.switch.ch
|
|
9
|
+
username: interactAdmin@switch.ch
|
|
10
|
+
password: CqxV4pi0WUyqAq5G
|
|
11
|
+
|
|
12
|
+
test_user: interact-support@switch.ch
|
|
13
|
+
generic_user_password: gu4nolico
|
|
14
|
+
|
|
15
|
+
test:
|
|
16
|
+
url : https://collab-test.switch.ch
|
|
17
|
+
username: interactAdmin@switch.ch
|
|
18
|
+
password: CqxV4pi0WUyqAq5G
|
|
19
|
+
|
|
20
|
+
test_user: interact-support@switch.ch
|
|
21
|
+
generic_user_password: gu4nolico
|
|
22
|
+
|
|
23
|
+
production:
|
|
24
|
+
url : https://collab.switch.ch
|
|
25
|
+
username: interactAdmin@switch.ch
|
|
26
|
+
password: CqxV4pi0WUyqAq5G
|
|
27
|
+
|
|
28
|
+
generic_user_password: gu4nolico
|
|
29
|
+
|
|
30
|
+
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Copyright (c) 2010 - 2013 SWITCH - Serving Swiss Universities
|
|
2
|
+
# Author: Katja Gräfenhain <katja.graefenhain@switch.ch>
|
|
3
|
+
|
|
4
|
+
# This class is a simple utility to parse the result from querying the
|
|
5
|
+
# adobe connect api. All methods accept a String containing XML, that is
|
|
6
|
+
# returned from the AdobeConnectAPI methods.
|
|
7
|
+
# For queries and returned results see the API documentation:
|
|
8
|
+
# http://help.adobe.com/en_US/connect/8.0/webservices/connect_8_webservices.pdf
|
|
9
|
+
module XMLParser
|
|
10
|
+
|
|
11
|
+
# used for all actions, e.g. 'login' and 'logout'
|
|
12
|
+
def get_status_code(xml)
|
|
13
|
+
data = XmlSimple.xml_in(xml)
|
|
14
|
+
data['status'].first['code']
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# used if the returned status contains an invalid value
|
|
18
|
+
def get_invalid_subcode(xml)
|
|
19
|
+
data = XmlSimple.xml_in(xml)
|
|
20
|
+
data['status'].first['invalid'].first['subcode']
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# supported actions: 'principal-update' or 'principal-list'
|
|
24
|
+
# NOTE: does not handle more than one result, so use only for 'principal-list' that returns a unique result e.g. when querying users by e-mail
|
|
25
|
+
def get_principal_id(xml)
|
|
26
|
+
data = XmlSimple.xml_in(xml)
|
|
27
|
+
if data.keys.include?('principal-list')
|
|
28
|
+
return data['principal-list'].first['principal'].first['principal-id'] unless data['principal-list'].first.empty?
|
|
29
|
+
elsif data.keys.include?('principal')
|
|
30
|
+
return data['principal'].first['principal-id']
|
|
31
|
+
else
|
|
32
|
+
raise "XMLParser does not support result of this format. No principal information found."
|
|
33
|
+
end
|
|
34
|
+
return nil
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# supported actions: 'sco-update', 'sco-info'
|
|
38
|
+
def get_sco_id(xml)
|
|
39
|
+
data = XmlSimple.xml_in(xml)
|
|
40
|
+
if data['sco']
|
|
41
|
+
return data['sco'].first['sco-id']
|
|
42
|
+
else
|
|
43
|
+
raise "XMLParser does not support result of this format. No sco information found."
|
|
44
|
+
end
|
|
45
|
+
return nil
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# supported action: 'sco-search-by-field'
|
|
49
|
+
# gets the first result that name EXACTLY matches the given name
|
|
50
|
+
def get_sco_id_for_unique_name(xml, name)
|
|
51
|
+
data = XmlSimple.xml_in(xml)
|
|
52
|
+
if data['sco-search-by-field-info'] && !data['sco-search-by-field-info'].first.empty?
|
|
53
|
+
data['sco-search-by-field-info'].first['sco'].each do |sco|
|
|
54
|
+
if sco['name'].first == name
|
|
55
|
+
return sco['sco-id']
|
|
56
|
+
else
|
|
57
|
+
raise "No correct match for name #{name} found"
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
return nil
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# supported actions: 'sco-contents' but only with filter-name and the user's e-mail-address (does not consider multiple sco results)
|
|
65
|
+
# e.g. action=sco-contents&sco-id=11&filter-name=interact-support%40switch.ch
|
|
66
|
+
def get_folder_id(xml)
|
|
67
|
+
data = XmlSimple.xml_in(xml)
|
|
68
|
+
|
|
69
|
+
if data['scos']
|
|
70
|
+
return data['scos'].first['sco'].first['sco-id'] unless data['scos'].first.empty?
|
|
71
|
+
else
|
|
72
|
+
raise "XMLParser does not support result of this format. No sco information found."
|
|
73
|
+
end
|
|
74
|
+
return nil
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
end
|
data/lib/adobe_connect_api.rb
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
|
|
3
|
-
# Copyright (c) 2010 SWITCH - Serving Swiss Universities
|
|
3
|
+
# Copyright (c) 2010 - 2013 SWITCH - Serving Swiss Universities
|
|
4
4
|
# Author: Mischael Schill <me@mschill.ch>
|
|
5
5
|
# Martin Kos <martin@kos.li>
|
|
6
6
|
# Christian Rohrer <christian.rohrer@switch.ch>
|
|
7
|
+
# Katja Gräfenhain <katja.graefenhain@switch.ch>
|
|
7
8
|
# $Id$
|
|
8
9
|
|
|
9
10
|
require 'rubygems'
|
|
@@ -15,10 +16,11 @@ require "cgi"
|
|
|
15
16
|
require "yaml"
|
|
16
17
|
#require 'logger'
|
|
17
18
|
|
|
18
|
-
require
|
|
19
|
+
require 'adobe_connect_api/version'
|
|
19
20
|
require 'adobe_connect_api/filter_definition'
|
|
20
21
|
require 'adobe_connect_api/sort_definition'
|
|
21
22
|
require 'adobe_connect_api/result'
|
|
23
|
+
require 'adobe_connect_api/xml_parser'
|
|
22
24
|
|
|
23
25
|
|
|
24
26
|
# This class is a simple utility to acces the adobe connect api. Before
|
|
@@ -28,12 +30,21 @@ require 'adobe_connect_api/result'
|
|
|
28
30
|
# All the actions are defined in the Adobe Connect Pro API documentation
|
|
29
31
|
# some of the actions are accepting filter- and/or sorting-definitions.
|
|
30
32
|
|
|
31
|
-
#
|
|
33
|
+
# NOTE KG: refactored so that all methods return the body of the query result, e.g.
|
|
34
|
+
# "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<results><status code=\"ok\"/><sco account-id=\"7\" disabled=\"\" display-seq=\"0\" folder-id=\"14152063\"
|
|
35
|
+
# icon=\"meeting\" lang=\"en\" max-retries=\"\" sco-id=\"14153596\" source-sco-id=\"\" type=\"meeting\" version=\"0\"><date-created>2013-03-27T17:55:36.403+01:00</date-created><
|
|
36
|
+
# date-modified>2013-03-27T17:55:36.403+01:00</date-modified><name>Testmeeting from RSpec</name><url-path>/rspec_testmeeting/</url-path></sco></results>"
|
|
37
|
+
|
|
32
38
|
class AdobeConnectAPI
|
|
39
|
+
include XMLParser
|
|
33
40
|
|
|
34
41
|
attr :url
|
|
35
42
|
attr :pointconfig
|
|
36
43
|
|
|
44
|
+
def self.version_string
|
|
45
|
+
"AdobeConnectAPI version #{AdobeConnectApi::VERSION}"
|
|
46
|
+
end
|
|
47
|
+
|
|
37
48
|
# return BREEZESESSION id
|
|
38
49
|
def sessionid
|
|
39
50
|
@sessionid
|
|
@@ -41,17 +52,9 @@ class AdobeConnectAPI
|
|
|
41
52
|
|
|
42
53
|
#The URL is the base URL of the Connect-Server, without the trailing slash
|
|
43
54
|
def initialize (url = nil, environment, root_directory)
|
|
44
|
-
#TODO ChR: Get this from the application config/initializer/abobe_connect_api.rb
|
|
45
|
-
# begin
|
|
46
|
-
# environment = Rails.env
|
|
47
|
-
# # KG: we need the rescue blog since belt does not know Rails, but instead uses Sinatra.env
|
|
48
|
-
# rescue
|
|
49
|
-
# environment = Sinatra.env
|
|
50
|
-
# end
|
|
51
|
-
|
|
52
55
|
@pointconfig = YAML::load_file("#{root_directory}/config/config.breeze.yml")[environment]
|
|
53
56
|
if (url == nil)
|
|
54
|
-
@url = pointconfig["url"]
|
|
57
|
+
@url = @pointconfig["url"]
|
|
55
58
|
else
|
|
56
59
|
@url = url
|
|
57
60
|
end
|
|
@@ -62,11 +65,11 @@ class AdobeConnectAPI
|
|
|
62
65
|
|
|
63
66
|
if (login != nil && password == nil)
|
|
64
67
|
# user given --> use generic user password
|
|
65
|
-
# TODO
|
|
66
|
-
password = pointconfig["generic_user_password"]
|
|
68
|
+
# TODO: generate password (see https://forge.switch.ch/redmine/issues/2355)
|
|
69
|
+
password = @pointconfig["generic_user_password"]
|
|
67
70
|
elsif (login == nil) && (password == nil)
|
|
68
|
-
login = pointconfig["username"]
|
|
69
|
-
password = pointconfig["password"]
|
|
71
|
+
login = @pointconfig["username"]
|
|
72
|
+
password = @pointconfig["password"]
|
|
70
73
|
end
|
|
71
74
|
|
|
72
75
|
res = query("login",
|
|
@@ -76,9 +79,6 @@ class AdobeConnectAPI
|
|
|
76
79
|
"external-auth" => external_auth,
|
|
77
80
|
"domain" => domain)
|
|
78
81
|
|
|
79
|
-
# TODO: debug
|
|
80
|
-
puts res.body.inspect
|
|
81
|
-
|
|
82
82
|
cookies = res.response["set-cookie"]
|
|
83
83
|
puts cookies.inspect
|
|
84
84
|
cookies.split(";").each{|s|
|
|
@@ -87,28 +87,22 @@ class AdobeConnectAPI
|
|
|
87
87
|
@sessionid = array[1]
|
|
88
88
|
end
|
|
89
89
|
}
|
|
90
|
-
|
|
90
|
+
puts "ACS: Logged in"
|
|
91
91
|
return res.body
|
|
92
92
|
end
|
|
93
93
|
|
|
94
94
|
#makes a logout and removes the cookie
|
|
95
95
|
def logout
|
|
96
|
-
res = query("logout")
|
|
96
|
+
res = query("logout")
|
|
97
97
|
@sessionid = nil
|
|
98
98
|
puts "ACS: Logged out"
|
|
99
|
-
return res
|
|
99
|
+
return res.body
|
|
100
100
|
end
|
|
101
101
|
|
|
102
102
|
# creates a new user in Adobe Connect
|
|
103
103
|
def create_user(email = nil, login = nil, password = nil, first_name = nil, last_name = nil)
|
|
104
|
-
# ?action=principal-update&email=string&first-name=string&has-children=boolean&last-name=string&login=string&password=string&send-email=boolean&type=allowedValue&session=BreezeSessionCookieValue
|
|
105
|
-
|
|
106
|
-
# send-email: true
|
|
107
|
-
# has-children: 0
|
|
108
|
-
# type: user
|
|
109
|
-
|
|
110
104
|
if password == nil
|
|
111
|
-
password = pointconfig["generic_user_password"]
|
|
105
|
+
password = @pointconfig["generic_user_password"]
|
|
112
106
|
end
|
|
113
107
|
|
|
114
108
|
res = query("principal-update",
|
|
@@ -117,21 +111,27 @@ class AdobeConnectAPI
|
|
|
117
111
|
"password" => password,
|
|
118
112
|
"first-name" => first_name,
|
|
119
113
|
"last-name" => last_name,
|
|
120
|
-
"send-email" =>
|
|
114
|
+
"send-email" => false,
|
|
121
115
|
"has-children" => 0,
|
|
122
116
|
"type" => "user")
|
|
123
117
|
|
|
124
118
|
puts "ACS: user created"
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
119
|
+
return res.body
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def delete_user(principal_id)
|
|
123
|
+
puts "ACS delete user with id: " + principal_id
|
|
124
|
+
|
|
125
|
+
res = query("principals-delete", "principal-id" => principal_id)
|
|
126
|
+
|
|
127
|
+
puts "ACS: user deleted"
|
|
128
|
+
return res.body
|
|
129
129
|
end
|
|
130
130
|
|
|
131
131
|
# create a new meeting in Adobe Connect
|
|
132
132
|
# e.g. "https://collab-test.switch.ch/api/xml?action=sco-update&type=meeting&name=API-Test&folder-id=12578070&date-begin=2012-06-15T17:00&date-end=2012-06-15T23:00&url-path=apitest"
|
|
133
133
|
def create_meeting(name, folder_id, url_path)
|
|
134
|
-
puts "ACS create meeting with name, folder_id
|
|
134
|
+
puts "ACS create meeting with name '#{name}', folder_id '#{folder_id.to_s}' and url_path '#{url_path}'"
|
|
135
135
|
|
|
136
136
|
res = query("sco-update",
|
|
137
137
|
"type" => "meeting",
|
|
@@ -140,9 +140,7 @@ class AdobeConnectAPI
|
|
|
140
140
|
"url-path" => url_path)
|
|
141
141
|
|
|
142
142
|
puts "ACS: meeting created"
|
|
143
|
-
|
|
144
|
-
data = XmlSimple.xml_in(res.body)
|
|
145
|
-
data["sco"].first['sco-id']
|
|
143
|
+
return res.body
|
|
146
144
|
end
|
|
147
145
|
|
|
148
146
|
def delete_meeting(sco_id)
|
|
@@ -155,51 +153,29 @@ class AdobeConnectAPI
|
|
|
155
153
|
return res.body
|
|
156
154
|
end
|
|
157
155
|
|
|
158
|
-
# searches the user with the given email address
|
|
156
|
+
# searches the user with the given email address
|
|
159
157
|
# e.g. "https://collab-test.switch.ch/api/xml?action=principal-list&filter-email=rfurter@ethz.ch"
|
|
160
|
-
def
|
|
161
|
-
puts "ACS:
|
|
158
|
+
def get_principal(filter = nil, sort = nil)
|
|
159
|
+
puts "ACS: get_principal"
|
|
162
160
|
res = query("principal-list",
|
|
163
161
|
"filter" => filter,
|
|
164
162
|
"sort" => sort)
|
|
165
163
|
|
|
166
|
-
|
|
167
|
-
data = XmlSimple.xml_in(res.body)
|
|
168
|
-
rows = []
|
|
169
|
-
if data["principal-list"]
|
|
170
|
-
data["principal-list"].each do |trans|
|
|
171
|
-
rows = trans["principal"]
|
|
172
|
-
end
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
# can only contain one result, since each email adress is used only once in AC
|
|
176
|
-
rows.first["principal-id"] unless rows.nil?
|
|
164
|
+
return res.body
|
|
177
165
|
end
|
|
178
166
|
|
|
179
|
-
def
|
|
180
|
-
# res = query("sco-shortcuts")
|
|
181
|
-
# data = XmlSimple.xml_in(res.body)
|
|
182
|
-
# if data["shortcuts"]
|
|
183
|
-
# data["shortcuts"].each do |trans|
|
|
184
|
-
# if trans["sco"]["type"] == "user-meetings"
|
|
185
|
-
# tree_id = trans["sco"]["sco-id"]
|
|
186
|
-
# break
|
|
187
|
-
# end
|
|
188
|
-
# end
|
|
189
|
-
|
|
167
|
+
def get_my_meetings_folder(email)
|
|
190
168
|
# NOTE: this id does not change unless we set up AC new
|
|
191
|
-
tree_id = 14
|
|
169
|
+
# tree_id = 14
|
|
170
|
+
# since we migrated to the new hardware, the tree_id changed
|
|
171
|
+
# i.e. sco-id of the user content folder, see: https://collab-test.switch.ch/api/xml?action=sco-shortcuts
|
|
172
|
+
tree_id = 11
|
|
192
173
|
|
|
193
174
|
filter = AdobeConnectApi::FilterDefinition.new
|
|
194
175
|
filter["name"] == email
|
|
195
176
|
|
|
196
|
-
res =
|
|
197
|
-
|
|
198
|
-
return nil
|
|
199
|
-
else
|
|
200
|
-
# should not contain more than 1 result
|
|
201
|
-
return res.rows.first["sco-id"]
|
|
202
|
-
end
|
|
177
|
+
res = query("sco-contents", "sco-id" => tree_id, "filter" => filter)
|
|
178
|
+
return res.body
|
|
203
179
|
end
|
|
204
180
|
|
|
205
181
|
# e.g. "https://collab-test.switch.ch/api/xml?action=permissions-update&principal-id=12578066&acl-id=13112626&permission-id=host"
|
|
@@ -209,16 +185,54 @@ class AdobeConnectAPI
|
|
|
209
185
|
"acl-id" => acl_id,
|
|
210
186
|
"permission-id" => permission_id)
|
|
211
187
|
|
|
212
|
-
|
|
213
|
-
|
|
188
|
+
return res.body
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
#returns SCO information of sco-id
|
|
192
|
+
def sco_info(sco_id)
|
|
193
|
+
res = query("sco-info", "sco-id" => sco_id)
|
|
194
|
+
return res.body
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
# sco-search-by-field&query=TB_ac_test&field=name
|
|
198
|
+
def search_meeting(name)
|
|
199
|
+
filter = AdobeConnectApi::FilterDefinition.new
|
|
200
|
+
filter["type"] == "meeting"
|
|
201
|
+
res = query("sco-search-by-field",
|
|
202
|
+
"query" => name,
|
|
203
|
+
"field" => "name",
|
|
204
|
+
"filter" => filter)
|
|
205
|
+
# data = XmlSimple.xml_in(res.body)
|
|
206
|
+
# scos = []
|
|
207
|
+
# if data["sco-search-by-field-info"]
|
|
208
|
+
# results = data["sco-search-by-field-info"][0]
|
|
209
|
+
# scos = results["sco"]
|
|
210
|
+
# end
|
|
211
|
+
return res.body
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
# TODO KG: test
|
|
215
|
+
def update_meeting(sco_id, description, language)
|
|
216
|
+
"action = sco-update&sco-id=&description=&lang="
|
|
217
|
+
res = query("sco-update",
|
|
218
|
+
"sco-id" => sco_id,
|
|
219
|
+
"description" => description,
|
|
220
|
+
"lang" => language)
|
|
221
|
+
|
|
222
|
+
return res.body
|
|
214
223
|
end
|
|
215
224
|
|
|
225
|
+
|
|
226
|
+
# TODO KG: test statistic functions
|
|
227
|
+
|
|
216
228
|
#action=group-membership-update&group-id=integer&principal-id=integer&is-member=boolean
|
|
217
229
|
def group_membership_update(group_id, principal_id, is_member)
|
|
218
230
|
res = query("group-membership-update",
|
|
219
231
|
"group-id" => group_id,
|
|
220
232
|
"principal-id" => principal_id,
|
|
221
233
|
"is-member" => is_member)
|
|
234
|
+
|
|
235
|
+
return res.body
|
|
222
236
|
end
|
|
223
237
|
|
|
224
238
|
# e.g. acl-field-update&acl-id=13117741&field-id=meeting-passcode&value=12345
|
|
@@ -288,34 +302,12 @@ class AdobeConnectAPI
|
|
|
288
302
|
|
|
289
303
|
end
|
|
290
304
|
|
|
291
|
-
#
|
|
292
|
-
def sco_contents(sco_id, filter = nil, sort = nil)
|
|
293
|
-
res = query("sco-contents", "sco-id" => sco_id, "filter" => filter, "sort" => sort)
|
|
294
|
-
data = XmlSimple.xml_in(res.body)
|
|
295
|
-
scos = []
|
|
296
|
-
# puts YAML::dump(data)
|
|
297
|
-
if data["scos"]
|
|
298
|
-
data["scos"].each do |trans|
|
|
299
|
-
# puts YAML::dump(trans)
|
|
300
|
-
# puts "-------"
|
|
301
|
-
scos = trans["sco"]
|
|
302
|
-
end
|
|
303
|
-
end
|
|
304
|
-
return AdobeConnectAPI::Result.new(data["status"][0]["code"], scos)
|
|
305
|
-
end
|
|
306
|
-
|
|
307
|
-
#returns SCO information of sco-id
|
|
308
|
-
def sco_info(sco_id)
|
|
309
|
-
res = query("sco-info", "sco-id" => sco_id)
|
|
310
|
-
data = XmlSimple.xml_in(res.body)
|
|
311
|
-
if data["sco"][0]
|
|
312
|
-
return data["sco"][0]
|
|
313
|
-
end
|
|
314
|
-
end
|
|
315
|
-
|
|
305
|
+
# TODO KG: refactor (return res.body) and test
|
|
316
306
|
#returns permission information of an sco-id
|
|
317
307
|
def permissions_info(sco_id, filter = nil)
|
|
318
308
|
res = query("permissions-info", "acl-id" => sco_id, "filter" => filter)
|
|
309
|
+
|
|
310
|
+
return res.body
|
|
319
311
|
data = XmlSimple.xml_in(res.body)
|
|
320
312
|
if data['permissions'][0]
|
|
321
313
|
return data['permissions'][0]
|
|
@@ -366,54 +358,6 @@ class AdobeConnectAPI
|
|
|
366
358
|
return AdobeConnectAPI::Result.new(data["status"][0]["code"], rows)
|
|
367
359
|
end
|
|
368
360
|
|
|
369
|
-
# sco-search-by-field&query=TB_ac_test&field=name
|
|
370
|
-
def search_meeting(name)
|
|
371
|
-
res = query("sco-search-by-field",
|
|
372
|
-
"query" => name,
|
|
373
|
-
"field" => "name")
|
|
374
|
-
data = XmlSimple.xml_in(res.body)
|
|
375
|
-
scos = []
|
|
376
|
-
if data["sco-search-by-field-info"]
|
|
377
|
-
results = data["sco-search-by-field-info"][0]
|
|
378
|
-
scos = results["sco"]
|
|
379
|
-
end
|
|
380
|
-
return AdobeConnectAPI::Result.new(data["status"][0]["code"], scos)
|
|
381
|
-
end
|
|
382
|
-
|
|
383
|
-
# sco-search-by-field&query=TB_ac_test&field=name and additionally check that the name is exactly the same (what is not done in Adobe Connect)
|
|
384
|
-
def search_unique_name(name)
|
|
385
|
-
res = query("sco-search-by-field",
|
|
386
|
-
"query" => name,
|
|
387
|
-
"field" => "name")
|
|
388
|
-
data = XmlSimple.xml_in(res.body)
|
|
389
|
-
scos = []
|
|
390
|
-
if data["sco-search-by-field-info"]
|
|
391
|
-
results = data["sco-search-by-field-info"][0]
|
|
392
|
-
scos = results["sco"]
|
|
393
|
-
end
|
|
394
|
-
result = AdobeConnectAPI::Result.new(data["status"][0]["code"], scos)
|
|
395
|
-
|
|
396
|
-
if result.rows.empty?
|
|
397
|
-
nil
|
|
398
|
-
else
|
|
399
|
-
result.rows.each do |sco|
|
|
400
|
-
if sco["name"] == name
|
|
401
|
-
return sco["sco-id"]
|
|
402
|
-
end
|
|
403
|
-
end
|
|
404
|
-
end
|
|
405
|
-
return nil
|
|
406
|
-
end
|
|
407
|
-
|
|
408
|
-
def update_meeting(sco_id, description, language)
|
|
409
|
-
"action = sco-update&sco-id=&description=&lang="
|
|
410
|
-
res = query("sco-update",
|
|
411
|
-
"sco-id" => sco_id,
|
|
412
|
-
"description" => description,
|
|
413
|
-
"lang" => language)
|
|
414
|
-
data = XmlSimple.xml_in(res.body)
|
|
415
|
-
return AdobeConnectAPI::Result.new(data["status"][0]["code"], nil)
|
|
416
|
-
end
|
|
417
361
|
|
|
418
362
|
#sends a query to the server and returns the http response. Parameters,
|
|
419
363
|
#filter- and sort-definitions can be added. The filter as "filter" => ... and
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# Copyright (c) 2010 - 2013 SWITCH - Serving Swiss Universities
|
|
2
|
+
# Author: Katja Gräfenhain <katja.graefenhain@switch.ch>
|
|
3
|
+
|
|
4
|
+
require 'spec_helper'
|
|
5
|
+
#include '../lib/adobe_connect_api/xml_parser'
|
|
6
|
+
|
|
7
|
+
# testdata:
|
|
8
|
+
MEETING_NAME = 'Testmeeting from RSpec'
|
|
9
|
+
URL_PATH = 'rspec_testmeeting'
|
|
10
|
+
E_MAIL = 'testuser@switch.ch'
|
|
11
|
+
FIRST_NAME = 'Test'
|
|
12
|
+
LAST_NAME = 'User'
|
|
13
|
+
|
|
14
|
+
# API return values
|
|
15
|
+
STATUS_OK = 'ok'
|
|
16
|
+
NO_DATA = 'no-data'
|
|
17
|
+
STATUS_INVALID = 'invalid'
|
|
18
|
+
STATUS_NO_ACCESS = 'no-access'
|
|
19
|
+
CODE_DUPLICATE = 'duplicate'
|
|
20
|
+
|
|
21
|
+
describe AdobeConnectAPI do
|
|
22
|
+
|
|
23
|
+
before(:each) do
|
|
24
|
+
@interactconfig = YAML::load_file("./config/config.breeze.yml")[ENV["RAILS_ENV"]]
|
|
25
|
+
url = @interactconfig['url']
|
|
26
|
+
|
|
27
|
+
# open AdobeConnectAPI (use URL from config file)
|
|
28
|
+
@acs = AdobeConnectAPI.new(url, ENV['RAILS_ENV'], nil)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
describe 'GemVersion' do
|
|
32
|
+
# standard test for gem version, see http://nithinbekal.com/2011/writing-ruby-gems-part-5-setting-up-rspec/
|
|
33
|
+
it 'should return correct version string' do
|
|
34
|
+
AdobeConnectAPI.version_string.should == "AdobeConnectAPI version #{AdobeConnectApi::VERSION}"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
describe 'Login & logout' do
|
|
39
|
+
it 'should login admin' do
|
|
40
|
+
@acs.pointconfig=(@interactconfig)
|
|
41
|
+
# login to Adobe Connect
|
|
42
|
+
res = @acs.login()
|
|
43
|
+
@acs.get_status_code(res).should match STATUS_OK
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'should logout' do
|
|
47
|
+
res = @acs.logout()
|
|
48
|
+
@acs.get_status_code(res).should include(STATUS_OK)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it 'should not login admin with wrong password' do
|
|
52
|
+
login = @interactconfig['username']
|
|
53
|
+
res = @acs.login(login, 'password')
|
|
54
|
+
@acs.get_status_code(res).should match NO_DATA
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
describe 'normal user' do
|
|
59
|
+
before(:each) do
|
|
60
|
+
# login normal user (no admin)
|
|
61
|
+
login = @interactconfig['test_user']
|
|
62
|
+
password = @interactconfig['generic_user_password']
|
|
63
|
+
@acs.login(login, password)
|
|
64
|
+
|
|
65
|
+
# delete the meeting if it already exists
|
|
66
|
+
res = @acs.search_meeting(MEETING_NAME)
|
|
67
|
+
sco_id = @acs.get_sco_id_for_unique_name(res, MEETING_NAME)
|
|
68
|
+
@acs.delete_meeting(sco_id) unless sco_id.nil?
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it 'should return the id of my-meetings folder' do
|
|
72
|
+
folder = @acs.get_my_meetings_folder(@interactconfig['test_user'])
|
|
73
|
+
@acs.get_folder_id(folder).to_i.should_not be 0
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it 'should be able to create a meeting' do
|
|
77
|
+
folder = @acs.get_my_meetings_folder(@interactconfig['test_user'])
|
|
78
|
+
folder_id = @acs.get_folder_id(folder)
|
|
79
|
+
res = @acs.create_meeting(MEETING_NAME, folder_id, URL_PATH)
|
|
80
|
+
|
|
81
|
+
puts res.inspect
|
|
82
|
+
|
|
83
|
+
@acs.get_status_code(res).should include(STATUS_OK)
|
|
84
|
+
@acs.get_sco_id(res).to_i.should_not be 0
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it 'should not be able to create a user' do
|
|
88
|
+
password = @interactconfig['generic_user_password']
|
|
89
|
+
res = @acs.create_user(E_MAIL, E_MAIL, password, FIRST_NAME, LAST_NAME)
|
|
90
|
+
@acs.get_status_code(res).should include(STATUS_NO_ACCESS)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
describe 'admin user' do
|
|
96
|
+
before(:each) do
|
|
97
|
+
# login normal admin user
|
|
98
|
+
login = @interactconfig['username']
|
|
99
|
+
password = @interactconfig['password']
|
|
100
|
+
@acs.login(login, password)
|
|
101
|
+
|
|
102
|
+
# delete the user if it already exists
|
|
103
|
+
filter = AdobeConnectApi::FilterDefinition.new
|
|
104
|
+
filter["email"] == E_MAIL
|
|
105
|
+
principal = @acs.get_principal(filter)
|
|
106
|
+
sco_id = @acs.get_principal_id(principal)
|
|
107
|
+
@acs.delete_user(sco_id) unless sco_id.nil?
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
it 'should be able to create a user' do
|
|
111
|
+
password = @interactconfig['generic_user_password']
|
|
112
|
+
res = @acs.create_user(E_MAIL, E_MAIL, password, FIRST_NAME, LAST_NAME)
|
|
113
|
+
|
|
114
|
+
# should contain the status code OK
|
|
115
|
+
@acs.get_status_code(res).should include(STATUS_OK)
|
|
116
|
+
|
|
117
|
+
# should return the sco-id of the new user
|
|
118
|
+
@acs.get_principal_id(res).to_i.should_not be 0
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
describe 'creation and deletion of meeting' do
|
|
124
|
+
before(:each) do
|
|
125
|
+
# login normal user
|
|
126
|
+
login = @interactconfig['test_user']
|
|
127
|
+
password = @interactconfig['generic_user_password']
|
|
128
|
+
@acs.login(login, password)
|
|
129
|
+
|
|
130
|
+
# get folder id
|
|
131
|
+
@folder_id = @acs.get_folder_id(@acs.get_my_meetings_folder(@interactconfig['test_user']))
|
|
132
|
+
|
|
133
|
+
# check if meeting already exists
|
|
134
|
+
res = @acs.search_meeting(MEETING_NAME)
|
|
135
|
+
@sco_id = @acs.get_sco_id_for_unique_name(res, MEETING_NAME)
|
|
136
|
+
|
|
137
|
+
if @sco_id.nil?
|
|
138
|
+
# create meeting
|
|
139
|
+
res = @acs.create_meeting(MEETING_NAME, @folder_id, URL_PATH)
|
|
140
|
+
@sco_id = @acs.get_sco_id(res)
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
it 'should not be able to create a meeting with the same url-path again' do
|
|
145
|
+
res = @acs.create_meeting(MEETING_NAME, @folder_id, URL_PATH)
|
|
146
|
+
|
|
147
|
+
status = @acs.get_status_code(res)
|
|
148
|
+
status.should include(STATUS_INVALID)
|
|
149
|
+
|
|
150
|
+
subcode = @acs.get_invalid_subcode(res)
|
|
151
|
+
subcode.should include(CODE_DUPLICATE)
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
it 'should delete the meeting' do
|
|
155
|
+
# delete meeting
|
|
156
|
+
res = @acs.delete_meeting(@sco_id)
|
|
157
|
+
@acs.get_status_code(res).should include(STATUS_OK)
|
|
158
|
+
|
|
159
|
+
# try to find meeting again
|
|
160
|
+
res = @acs.search_meeting(MEETING_NAME)
|
|
161
|
+
sco_id = @acs.get_sco_id_for_unique_name(res, MEETING_NAME)
|
|
162
|
+
sco_id.should be_nil
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
it 'should be able to add another host' do
|
|
166
|
+
filter = AdobeConnectApi::FilterDefinition.new
|
|
167
|
+
filter["email"] == @interactconfig['username']
|
|
168
|
+
principal = @acs.get_principal(filter)
|
|
169
|
+
principal_id = @acs.get_principal_id(principal)
|
|
170
|
+
res = @acs.permissions_update(principal_id, @sco_id, "host") unless (principal_id.nil? || @sco_id.nil?)
|
|
171
|
+
@acs.get_status_code(res).should include(STATUS_OK)
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
it 'should return the sco-info' do
|
|
175
|
+
res = @acs.sco_info(@sco_id)
|
|
176
|
+
@acs.get_sco_id(res).should eq @sco_id
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: adobe_connect_api
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.70.alpha
|
|
5
5
|
prerelease: 7
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,11 +9,11 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2013-04-29 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: xml-simple
|
|
16
|
-
requirement:
|
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
|
17
17
|
none: false
|
|
18
18
|
requirements:
|
|
19
19
|
- - ! '>='
|
|
@@ -21,7 +21,28 @@ dependencies:
|
|
|
21
21
|
version: '0'
|
|
22
22
|
type: :runtime
|
|
23
23
|
prerelease: false
|
|
24
|
-
version_requirements:
|
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
+
none: false
|
|
26
|
+
requirements:
|
|
27
|
+
- - ! '>='
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
version: '0'
|
|
30
|
+
- !ruby/object:Gem::Dependency
|
|
31
|
+
name: rspec
|
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
|
33
|
+
none: false
|
|
34
|
+
requirements:
|
|
35
|
+
- - ! '>='
|
|
36
|
+
- !ruby/object:Gem::Version
|
|
37
|
+
version: '0'
|
|
38
|
+
type: :development
|
|
39
|
+
prerelease: false
|
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
41
|
+
none: false
|
|
42
|
+
requirements:
|
|
43
|
+
- - ! '>='
|
|
44
|
+
- !ruby/object:Gem::Version
|
|
45
|
+
version: '0'
|
|
25
46
|
description: Wrapper to the Adobe Connect API
|
|
26
47
|
email:
|
|
27
48
|
- christian.rohrer@switch.ch
|
|
@@ -36,11 +57,15 @@ files:
|
|
|
36
57
|
- README.md
|
|
37
58
|
- Rakefile
|
|
38
59
|
- adobe_connect_api.gemspec
|
|
60
|
+
- config/config.breeze.yml
|
|
39
61
|
- lib/adobe_connect_api.rb
|
|
40
62
|
- lib/adobe_connect_api/filter_definition.rb
|
|
41
63
|
- lib/adobe_connect_api/result.rb
|
|
42
64
|
- lib/adobe_connect_api/sort_definition.rb
|
|
43
65
|
- lib/adobe_connect_api/version.rb
|
|
66
|
+
- lib/adobe_connect_api/xml_parser.rb
|
|
67
|
+
- spec/adobe_connect_api_spec.rb
|
|
68
|
+
- spec/spec_helper.rb
|
|
44
69
|
homepage: ''
|
|
45
70
|
licenses: []
|
|
46
71
|
post_install_message:
|
|
@@ -61,8 +86,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
61
86
|
version: 1.3.1
|
|
62
87
|
requirements: []
|
|
63
88
|
rubyforge_project:
|
|
64
|
-
rubygems_version: 1.8.
|
|
89
|
+
rubygems_version: 1.8.25
|
|
65
90
|
signing_key:
|
|
66
91
|
specification_version: 3
|
|
67
92
|
summary: Wrapper to the Adobe Connect API written in Ruby
|
|
68
|
-
test_files:
|
|
93
|
+
test_files:
|
|
94
|
+
- spec/adobe_connect_api_spec.rb
|
|
95
|
+
- spec/spec_helper.rb
|