adobe_connect_api 0.0.9.alpha → 0.0.9
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/filter_definition.rb +2 -1
- 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 +184 -79
- data/spec/adobe_connect_api_spec.rb +206 -0
- data/spec/spec_helper.rb +8 -0
- metadata +36 -9
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
|
+
|
@@ -1,9 +1,10 @@
|
|
1
|
-
# A filter
|
1
|
+
# A filter definition can be added to some actions to filter the results
|
2
2
|
# server-side. Example:
|
3
3
|
# filter = AdobeConnectAPI::FilterDefinition.new
|
4
4
|
# filter["sco-id"].greater_than 25
|
5
5
|
# filter["date-created"] <= Time.now
|
6
6
|
|
7
|
+
# TODO KG: rename to AdobeConnectAPI since the class is also named API
|
7
8
|
class AdobeConnectApi::FilterDefinition
|
8
9
|
attr_accessor :rows
|
9
10
|
attr_accessor :start
|
@@ -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,8 +1,10 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
|
2
|
-
# Copyright (c) 2010 SWITCH - Serving Swiss Universities
|
3
|
+
# Copyright (c) 2010 - 2013 SWITCH - Serving Swiss Universities
|
3
4
|
# Author: Mischael Schill <me@mschill.ch>
|
4
5
|
# Martin Kos <martin@kos.li>
|
5
6
|
# Christian Rohrer <christian.rohrer@switch.ch>
|
7
|
+
# Katja Gräfenhain <katja.graefenhain@switch.ch>
|
6
8
|
# $Id$
|
7
9
|
|
8
10
|
require 'rubygems'
|
@@ -14,10 +16,11 @@ require "cgi"
|
|
14
16
|
require "yaml"
|
15
17
|
#require 'logger'
|
16
18
|
|
17
|
-
require
|
19
|
+
require 'adobe_connect_api/version'
|
18
20
|
require 'adobe_connect_api/filter_definition'
|
19
21
|
require 'adobe_connect_api/sort_definition'
|
20
22
|
require 'adobe_connect_api/result'
|
23
|
+
require 'adobe_connect_api/xml_parser'
|
21
24
|
|
22
25
|
|
23
26
|
# This class is a simple utility to acces the adobe connect api. Before
|
@@ -27,30 +30,43 @@ require 'adobe_connect_api/result'
|
|
27
30
|
# All the actions are defined in the Adobe Connect Pro API documentation
|
28
31
|
# some of the actions are accepting filter- and/or sorting-definitions.
|
29
32
|
|
30
|
-
#
|
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
|
+
|
31
38
|
class AdobeConnectAPI
|
39
|
+
include XMLParser
|
32
40
|
|
33
41
|
attr :url
|
34
42
|
attr :pointconfig
|
35
43
|
|
44
|
+
def self.version_string
|
45
|
+
"AdobeConnectAPI version #{AdobeConnectApi::VERSION}"
|
46
|
+
end
|
47
|
+
|
36
48
|
# return BREEZESESSION id
|
37
49
|
def sessionid
|
38
50
|
@sessionid
|
39
51
|
end
|
40
52
|
|
53
|
+
def pointconfig=(pointconfig)
|
54
|
+
if pointconfig == nil
|
55
|
+
pointconfig = YAML::load_file("#{root_directory}/config/config.breeze.yml")[environment]
|
56
|
+
else
|
57
|
+
@pointconfig = pointconfig
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
41
61
|
#The URL is the base URL of the Connect-Server, without the trailing slash
|
42
62
|
def initialize (url = nil, environment, root_directory)
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
# environment = Sinatra.env
|
49
|
-
# end
|
50
|
-
|
51
|
-
@pointconfig = YAML::load_file("#{root_directory}/config/config.breeze.yml")[environment]
|
63
|
+
begin
|
64
|
+
@pointconfig = YAML::load_file("#{root_directory}/config/config.breeze.yml")[environment]
|
65
|
+
rescue
|
66
|
+
# should not occur except when running tests
|
67
|
+
end
|
52
68
|
if (url == nil)
|
53
|
-
@url = pointconfig["url"]
|
69
|
+
@url = @pointconfig["url"]
|
54
70
|
else
|
55
71
|
@url = url
|
56
72
|
end
|
@@ -61,11 +77,11 @@ class AdobeConnectAPI
|
|
61
77
|
|
62
78
|
if (login != nil && password == nil)
|
63
79
|
# user given --> use generic user password
|
64
|
-
# TODO
|
65
|
-
password = pointconfig["generic_user_password"]
|
80
|
+
# TODO: generate password (see https://forge.switch.ch/redmine/issues/2355)
|
81
|
+
password = @pointconfig["generic_user_password"]
|
66
82
|
elsif (login == nil) && (password == nil)
|
67
|
-
login = pointconfig["username"]
|
68
|
-
password = pointconfig["password"]
|
83
|
+
login = @pointconfig["username"]
|
84
|
+
password = @pointconfig["password"]
|
69
85
|
end
|
70
86
|
|
71
87
|
res = query("login",
|
@@ -75,9 +91,6 @@ class AdobeConnectAPI
|
|
75
91
|
"external-auth" => external_auth,
|
76
92
|
"domain" => domain)
|
77
93
|
|
78
|
-
# TODO: debug
|
79
|
-
puts res.body.inspect
|
80
|
-
|
81
94
|
cookies = res.response["set-cookie"]
|
82
95
|
puts cookies.inspect
|
83
96
|
cookies.split(";").each{|s|
|
@@ -86,28 +99,22 @@ class AdobeConnectAPI
|
|
86
99
|
@sessionid = array[1]
|
87
100
|
end
|
88
101
|
}
|
89
|
-
|
102
|
+
puts "ACS: Logged in"
|
90
103
|
return res.body
|
91
104
|
end
|
92
105
|
|
93
106
|
#makes a logout and removes the cookie
|
94
107
|
def logout
|
95
|
-
res = query("logout")
|
108
|
+
res = query("logout")
|
96
109
|
@sessionid = nil
|
97
110
|
puts "ACS: Logged out"
|
98
|
-
return res
|
111
|
+
return res.body
|
99
112
|
end
|
100
113
|
|
101
114
|
# creates a new user in Adobe Connect
|
102
115
|
def create_user(email = nil, login = nil, password = nil, first_name = nil, last_name = nil)
|
103
|
-
# ?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
|
104
|
-
|
105
|
-
# send-email: true
|
106
|
-
# has-children: 0
|
107
|
-
# type: user
|
108
|
-
|
109
116
|
if password == nil
|
110
|
-
password = pointconfig["generic_user_password"]
|
117
|
+
password = @pointconfig["generic_user_password"]
|
111
118
|
end
|
112
119
|
|
113
120
|
res = query("principal-update",
|
@@ -116,7 +123,7 @@ class AdobeConnectAPI
|
|
116
123
|
"password" => password,
|
117
124
|
"first-name" => first_name,
|
118
125
|
"last-name" => last_name,
|
119
|
-
"send-email" =>
|
126
|
+
"send-email" => false,
|
120
127
|
"has-children" => 0,
|
121
128
|
"type" => "user")
|
122
129
|
|
@@ -124,6 +131,133 @@ class AdobeConnectAPI
|
|
124
131
|
return res.body
|
125
132
|
end
|
126
133
|
|
134
|
+
def delete_user(principal_id)
|
135
|
+
puts "ACS delete user with id: " + principal_id
|
136
|
+
|
137
|
+
res = query("principals-delete", "principal-id" => principal_id)
|
138
|
+
|
139
|
+
puts "ACS: user deleted"
|
140
|
+
return res.body
|
141
|
+
end
|
142
|
+
|
143
|
+
# create a new meeting in Adobe Connect
|
144
|
+
# 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"
|
145
|
+
def create_meeting(name, folder_id, url_path)
|
146
|
+
puts "ACS create meeting with name '#{name}', folder_id '#{folder_id.to_s}' and url_path '#{url_path}'"
|
147
|
+
|
148
|
+
res = query("sco-update",
|
149
|
+
"type" => "meeting",
|
150
|
+
"name" => name,
|
151
|
+
"folder-id" => folder_id,
|
152
|
+
"url-path" => url_path)
|
153
|
+
|
154
|
+
puts "ACS: meeting created"
|
155
|
+
return res.body
|
156
|
+
end
|
157
|
+
|
158
|
+
def delete_meeting(sco_id)
|
159
|
+
puts "ACS delete meeting with sco_id: " + sco_id
|
160
|
+
|
161
|
+
res = query("sco-delete",
|
162
|
+
"sco-id" => sco_id)
|
163
|
+
|
164
|
+
puts "ACS: meeting deleted"
|
165
|
+
return res.body
|
166
|
+
end
|
167
|
+
|
168
|
+
# searches the user with the given email address
|
169
|
+
# e.g. "https://collab-test.switch.ch/api/xml?action=principal-list&filter-email=rfurter@ethz.ch"
|
170
|
+
def get_principal(filter = nil, sort = nil)
|
171
|
+
puts "ACS: get_principal"
|
172
|
+
res = query("principal-list",
|
173
|
+
"filter" => filter,
|
174
|
+
"sort" => sort)
|
175
|
+
|
176
|
+
return res.body
|
177
|
+
end
|
178
|
+
|
179
|
+
def get_my_meetings_folder(email)
|
180
|
+
# NOTE: this id does not change unless we set up AC new
|
181
|
+
# tree_id = 14
|
182
|
+
# since we migrated to the new hardware, the tree_id changed
|
183
|
+
# i.e. sco-id of the user content folder, see: https://collab-test.switch.ch/api/xml?action=sco-shortcuts
|
184
|
+
tree_id = 11
|
185
|
+
|
186
|
+
filter = AdobeConnectApi::FilterDefinition.new
|
187
|
+
filter["name"] == email
|
188
|
+
|
189
|
+
res = query("sco-contents", "sco-id" => tree_id, "filter" => filter)
|
190
|
+
return res.body
|
191
|
+
end
|
192
|
+
|
193
|
+
# e.g. "https://collab-test.switch.ch/api/xml?action=permissions-update&principal-id=12578066&acl-id=13112626&permission-id=host"
|
194
|
+
def permissions_update(principal_id, acl_id, permission_id)
|
195
|
+
res = query("permissions-update",
|
196
|
+
"principal-id" => principal_id,
|
197
|
+
"acl-id" => acl_id,
|
198
|
+
"permission-id" => permission_id)
|
199
|
+
|
200
|
+
return res.body
|
201
|
+
end
|
202
|
+
|
203
|
+
#returns SCO information of sco-id
|
204
|
+
def sco_info(sco_id)
|
205
|
+
res = query("sco-info", "sco-id" => sco_id)
|
206
|
+
return res.body
|
207
|
+
end
|
208
|
+
|
209
|
+
# sco-search-by-field&query=TB_ac_test&field=name
|
210
|
+
def search_meeting(name)
|
211
|
+
filter = AdobeConnectApi::FilterDefinition.new
|
212
|
+
filter["type"] == "meeting"
|
213
|
+
res = query("sco-search-by-field",
|
214
|
+
"query" => name,
|
215
|
+
"field" => "name",
|
216
|
+
"filter" => filter)
|
217
|
+
# data = XmlSimple.xml_in(res.body)
|
218
|
+
# scos = []
|
219
|
+
# if data["sco-search-by-field-info"]
|
220
|
+
# results = data["sco-search-by-field-info"][0]
|
221
|
+
# scos = results["sco"]
|
222
|
+
# end
|
223
|
+
return res.body
|
224
|
+
end
|
225
|
+
|
226
|
+
#action=group-membership-update&group-id=integer&principal-id=integer&is-member=boolean
|
227
|
+
def group_membership_update(group_id, principal_id, is_member)
|
228
|
+
res = query("group-membership-update",
|
229
|
+
"group-id" => group_id,
|
230
|
+
"principal-id" => principal_id,
|
231
|
+
"is-member" => is_member)
|
232
|
+
|
233
|
+
return res.body
|
234
|
+
end
|
235
|
+
|
236
|
+
|
237
|
+
# TODO KG: test
|
238
|
+
def update_meeting(sco_id, description, language)
|
239
|
+
"action = sco-update&sco-id=&description=&lang="
|
240
|
+
res = query("sco-update",
|
241
|
+
"sco-id" => sco_id,
|
242
|
+
"description" => description,
|
243
|
+
"lang" => language)
|
244
|
+
|
245
|
+
return res.body
|
246
|
+
end
|
247
|
+
|
248
|
+
|
249
|
+
# TODO KG: test statistic functions
|
250
|
+
# e.g. acl-field-update&acl-id=13117741&field-id=meeting-passcode&value=12345
|
251
|
+
def set_passcode(acl_id, passcode)
|
252
|
+
res = query("acl-field-update",
|
253
|
+
"acl-id" => acl_id,
|
254
|
+
"field-id" => "meeting-passcode",
|
255
|
+
"value" => passcode)
|
256
|
+
|
257
|
+
data = XmlSimple.xml_in(res.body)
|
258
|
+
return AdobeConnectAPI::Result.new(data["status"][0]["code"], nil)
|
259
|
+
end
|
260
|
+
|
127
261
|
#Returns all defined quotas (untested)
|
128
262
|
def report_quotas
|
129
263
|
res = query("report-quota")
|
@@ -180,36 +314,17 @@ class AdobeConnectAPI
|
|
180
314
|
|
181
315
|
end
|
182
316
|
|
183
|
-
#
|
184
|
-
def sco_contents(sco_id, filter = nil, sort = nil)
|
185
|
-
res = query("sco-contents", "sco-id" => sco_id, "filter" => filter, "sort" => sort)
|
186
|
-
data = XmlSimple.xml_in(res.body)
|
187
|
-
scos = []
|
188
|
-
# puts YAML::dump(data)
|
189
|
-
if data["scos"]
|
190
|
-
data["scos"].each do |trans|
|
191
|
-
# puts YAML::dump(trans)
|
192
|
-
# puts "-------"
|
193
|
-
scos = trans["sco"]
|
194
|
-
end
|
195
|
-
end
|
196
|
-
return AdobeConnectAPI::Result.new(data["status"][0]["code"], scos)
|
197
|
-
end
|
198
|
-
|
199
|
-
#returns SCO information of sco-id
|
200
|
-
def sco_info(sco_id)
|
201
|
-
res = query("sco-info", "sco-id" => sco_id)
|
202
|
-
data = XmlSimple.xml_in(res.body)
|
203
|
-
if data["sco"][0]
|
204
|
-
return data["sco"][0]
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
317
|
+
# TODO KG: refactor (return res.body) and test
|
208
318
|
#returns permission information of an sco-id
|
209
319
|
def permissions_info(sco_id, filter = nil)
|
210
320
|
res = query("permissions-info", "acl-id" => sco_id, "filter" => filter)
|
321
|
+
|
322
|
+
return res.body
|
211
323
|
data = XmlSimple.xml_in(res.body)
|
212
|
-
|
324
|
+
if data['permissions'][0]
|
325
|
+
return data['permissions'][0]
|
326
|
+
end
|
327
|
+
#puts YAML::dump(data)
|
213
328
|
# if data["sco"][0]
|
214
329
|
# return data["sco"][0]
|
215
330
|
# end
|
@@ -255,27 +370,6 @@ class AdobeConnectAPI
|
|
255
370
|
return AdobeConnectAPI::Result.new(data["status"][0]["code"], rows)
|
256
371
|
end
|
257
372
|
|
258
|
-
def search_meeting(name)
|
259
|
-
action = "sco-search-by-field&query=" + name + "&field=name"
|
260
|
-
uri = URI.parse(AC_HOST + "/api/xml?action=#{action}")
|
261
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
262
|
-
if uri.scheme == "https"
|
263
|
-
http.use_ssl=true
|
264
|
-
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
265
|
-
end
|
266
|
-
request = Net::HTTP::Get.new(uri.request_uri)
|
267
|
-
if @sessionid
|
268
|
-
request.add_field("Cookie", "BREEZESESSION="+@sessionid)
|
269
|
-
end
|
270
|
-
puts request.path
|
271
|
-
response = http.request(request)
|
272
|
-
|
273
|
-
puts response.body
|
274
|
-
data = XmlSimple.xml_in(response.body)
|
275
|
-
if data["sco-search-by-field-info"]
|
276
|
-
results = data["sco-search-by-field-info"][0]
|
277
|
-
return results["sco"]
|
278
|
-
end
|
279
373
|
|
280
374
|
#sends a query to the server and returns the http response. Parameters,
|
281
375
|
#filter- and sort-definitions can be added. The filter as "filter" => ... and
|
@@ -313,9 +407,20 @@ class AdobeConnectAPI
|
|
313
407
|
if @sessionid
|
314
408
|
request.add_field("Cookie", "BREEZESESSION="+@sessionid)
|
315
409
|
end
|
316
|
-
puts request.path
|
410
|
+
puts "ACS query - request: " + request.path
|
317
411
|
response = http.request(request)
|
412
|
+
puts "ACS query - response: " + response.body.inspect
|
318
413
|
return response
|
319
414
|
end
|
320
415
|
|
416
|
+
|
417
|
+
|
418
|
+
### ADMIN FUNCTIONS (FOR STATISTICS) ###
|
419
|
+
|
420
|
+
# def report-active-meetings
|
421
|
+
# res = query("report-active-meetings")
|
422
|
+
# data = XmlSimple.xml_in(res.body)
|
423
|
+
# return AdobeConnectAPI::Result.new(data)
|
424
|
+
# end
|
425
|
+
|
321
426
|
end
|
@@ -0,0 +1,206 @@
|
|
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
|
+
E_MAIL_2 = 'testuser2@switch.ch'
|
15
|
+
|
16
|
+
# API return values
|
17
|
+
STATUS_OK = 'ok'
|
18
|
+
NO_DATA = 'no-data'
|
19
|
+
STATUS_INVALID = 'invalid'
|
20
|
+
STATUS_NO_ACCESS = 'no-access'
|
21
|
+
CODE_DUPLICATE = 'duplicate'
|
22
|
+
|
23
|
+
describe AdobeConnectAPI do
|
24
|
+
|
25
|
+
before(:each) do
|
26
|
+
@interactconfig = YAML::load_file('./config/config.breeze.yml')[ENV["RAILS_ENV"]]
|
27
|
+
url = @interactconfig['url']
|
28
|
+
|
29
|
+
# open AdobeConnectAPI (use URL from config file)
|
30
|
+
@acs = AdobeConnectAPI.new(url, ENV['RAILS_ENV'], nil)
|
31
|
+
end
|
32
|
+
|
33
|
+
describe 'GemVersion' do
|
34
|
+
# standard test for gem version, see http://nithinbekal.com/2011/writing-ruby-gems-part-5-setting-up-rspec/
|
35
|
+
it 'should return correct version string' do
|
36
|
+
AdobeConnectAPI.version_string.should == "AdobeConnectAPI version #{AdobeConnectApi::VERSION}"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe 'Login & logout' do
|
41
|
+
it 'should login admin' do
|
42
|
+
@acs.pointconfig=(@interactconfig)
|
43
|
+
# login to Adobe Connect
|
44
|
+
res = @acs.login()
|
45
|
+
@acs.get_status_code(res).should match STATUS_OK
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should logout' do
|
49
|
+
res = @acs.logout()
|
50
|
+
@acs.get_status_code(res).should include(STATUS_OK)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should not login admin with wrong password' do
|
54
|
+
login = @interactconfig['username']
|
55
|
+
res = @acs.login(login, 'password')
|
56
|
+
@acs.get_status_code(res).should match NO_DATA
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe 'normal user' do
|
61
|
+
before(:each) do
|
62
|
+
# login normal user (no admin)
|
63
|
+
login = @interactconfig['test_user']
|
64
|
+
password = @interactconfig['generic_user_password']
|
65
|
+
@acs.login(login, password)
|
66
|
+
|
67
|
+
# delete the meeting if it already exists
|
68
|
+
res = @acs.search_meeting(MEETING_NAME)
|
69
|
+
sco_id = @acs.get_sco_id_for_unique_name(res, MEETING_NAME)
|
70
|
+
@acs.delete_meeting(sco_id) unless sco_id.nil?
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'should return the id of my-meetings folder' do
|
74
|
+
folder = @acs.get_my_meetings_folder(@interactconfig['test_user'])
|
75
|
+
@acs.get_folder_id(folder).to_i.should_not be 0
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'should be able to create a meeting' do
|
79
|
+
folder = @acs.get_my_meetings_folder(@interactconfig['test_user'])
|
80
|
+
folder_id = @acs.get_folder_id(folder)
|
81
|
+
res = @acs.create_meeting(MEETING_NAME, folder_id, URL_PATH)
|
82
|
+
|
83
|
+
puts res.inspect
|
84
|
+
|
85
|
+
@acs.get_status_code(res).should include(STATUS_OK)
|
86
|
+
@acs.get_sco_id(res).to_i.should_not be 0
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should not be able to create a user' do
|
90
|
+
password = @interactconfig['generic_user_password']
|
91
|
+
res = @acs.create_user(E_MAIL, E_MAIL, password, FIRST_NAME, LAST_NAME)
|
92
|
+
@acs.get_status_code(res).should include(STATUS_NO_ACCESS)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
|
97
|
+
describe 'admin user' do
|
98
|
+
before(:each) do
|
99
|
+
# login normal admin user
|
100
|
+
login = @interactconfig['username']
|
101
|
+
password = @interactconfig['password']
|
102
|
+
@acs.login(login, password)
|
103
|
+
|
104
|
+
# delete the users if they already exist
|
105
|
+
filter = AdobeConnectApi::FilterDefinition.new
|
106
|
+
filter["email"] == E_MAIL
|
107
|
+
principal = @acs.get_principal(filter)
|
108
|
+
sco_id = @acs.get_principal_id(principal)
|
109
|
+
@acs.delete_user(sco_id) unless sco_id.nil?
|
110
|
+
|
111
|
+
filter2 = AdobeConnectApi::FilterDefinition.new
|
112
|
+
filter2["email"] == E_MAIL_2
|
113
|
+
principal2 = @acs.get_principal(filter2)
|
114
|
+
sco_id2 = @acs.get_principal_id(principal2)
|
115
|
+
@acs.delete_user(sco_id2) unless sco_id2.nil?
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'should be able to create a user' do
|
119
|
+
password = @interactconfig['generic_user_password']
|
120
|
+
res = @acs.create_user(E_MAIL, E_MAIL, password, FIRST_NAME, LAST_NAME)
|
121
|
+
|
122
|
+
# should contain the status code OK
|
123
|
+
@acs.get_status_code(res).should include(STATUS_OK)
|
124
|
+
|
125
|
+
# should return the sco-id of the new user
|
126
|
+
@acs.get_principal_id(res).to_i.should_not be 0
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'should be able to update the group membership' do
|
130
|
+
# get id of the authors group
|
131
|
+
filter_authors = AdobeConnectApi::FilterDefinition.new
|
132
|
+
filter_authors["type"] == "authors"
|
133
|
+
res = @acs.get_principal(filter_authors)
|
134
|
+
authors_group_id = @acs.get_principal_id(res)
|
135
|
+
authors_group_id.to_i.should_not be 0
|
136
|
+
|
137
|
+
# create user
|
138
|
+
password = @interactconfig['generic_user_password']
|
139
|
+
res = @acs.create_user(E_MAIL_2, E_MAIL_2, password, FIRST_NAME, LAST_NAME)
|
140
|
+
sco_id = @acs.get_principal_id(res)
|
141
|
+
|
142
|
+
@acs.group_membership_update(authors_group_id, sco_id, true).should include(STATUS_OK)
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
146
|
+
|
147
|
+
|
148
|
+
describe 'creation and deletion of meeting' do
|
149
|
+
before(:each) do
|
150
|
+
# login normal user
|
151
|
+
login = @interactconfig['test_user']
|
152
|
+
password = @interactconfig['generic_user_password']
|
153
|
+
@acs.login(login, password)
|
154
|
+
|
155
|
+
# get folder id
|
156
|
+
@folder_id = @acs.get_folder_id(@acs.get_my_meetings_folder(@interactconfig['test_user']))
|
157
|
+
|
158
|
+
# check if meeting already exists
|
159
|
+
res = @acs.search_meeting(MEETING_NAME)
|
160
|
+
@sco_id = @acs.get_sco_id_for_unique_name(res, MEETING_NAME)
|
161
|
+
|
162
|
+
if @sco_id.nil?
|
163
|
+
# create meeting
|
164
|
+
res = @acs.create_meeting(MEETING_NAME, @folder_id, URL_PATH)
|
165
|
+
@sco_id = @acs.get_sco_id(res)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
it 'should not be able to create a meeting with the same url-path again' do
|
170
|
+
res = @acs.create_meeting(MEETING_NAME, @folder_id, URL_PATH)
|
171
|
+
|
172
|
+
status = @acs.get_status_code(res)
|
173
|
+
status.should include(STATUS_INVALID)
|
174
|
+
|
175
|
+
subcode = @acs.get_invalid_subcode(res)
|
176
|
+
subcode.should include(CODE_DUPLICATE)
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'should delete the meeting' do
|
180
|
+
# delete meeting
|
181
|
+
res = @acs.delete_meeting(@sco_id)
|
182
|
+
@acs.get_status_code(res).should include(STATUS_OK)
|
183
|
+
|
184
|
+
# try to find meeting again
|
185
|
+
res = @acs.search_meeting(MEETING_NAME)
|
186
|
+
sco_id = @acs.get_sco_id_for_unique_name(res, MEETING_NAME)
|
187
|
+
sco_id.should be_nil
|
188
|
+
end
|
189
|
+
|
190
|
+
it 'should be able to add another host' do
|
191
|
+
filter = AdobeConnectApi::FilterDefinition.new
|
192
|
+
filter["email"] == @interactconfig['username']
|
193
|
+
principal = @acs.get_principal(filter)
|
194
|
+
principal_id = @acs.get_principal_id(principal)
|
195
|
+
res = @acs.permissions_update(principal_id, @sco_id, "host") unless (principal_id.nil? || @sco_id.nil?)
|
196
|
+
@acs.get_status_code(res).should include(STATUS_OK)
|
197
|
+
end
|
198
|
+
|
199
|
+
it 'should return the sco-info' do
|
200
|
+
res = @acs.sco_info(@sco_id)
|
201
|
+
@acs.get_sco_id(res).should eq @sco_id
|
202
|
+
end
|
203
|
+
|
204
|
+
end
|
205
|
+
|
206
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: adobe_connect_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.9
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.9
|
5
|
+
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Christian Rohrer
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-05-02 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:
|
@@ -56,13 +81,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
56
81
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
82
|
none: false
|
58
83
|
requirements:
|
59
|
-
- - ! '
|
84
|
+
- - ! '>='
|
60
85
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
86
|
+
version: '0'
|
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
|