ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5f
class.ilSoapAdministration.php
Go to the documentation of this file.
1<?php
2 /*
3 +-----------------------------------------------------------------------------+
4 | ILIAS open source |
5 +-----------------------------------------------------------------------------+
6 | Copyright (c) 1998-2009 ILIAS open source, University of Cologne |
7 | |
8 | This program is free software; you can redistribute it and/or |
9 | modify it under the terms of the GNU General Public License |
10 | as published by the Free Software Foundation; either version 2 |
11 | of the License, or (at your option) any later version. |
12 | |
13 | This program is distributed in the hope that it will be useful, |
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | GNU General Public License for more details. |
17 | |
18 | You should have received a copy of the GNU General Public License |
19 | along with this program; if not, write to the Free Software |
20 | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
21 +-----------------------------------------------------------------------------+
22 */
23
24
35include_once './webservice/soap/lib/nusoap.php';
36include_once ("./Services/Authentication/classes/class.ilAuthUtils.php"); // to get auth mode constants
37
38define ('SOAP_CLIENT_ERROR', 1);
39define ('SOAP_SERVER_ERROR', 2);
40
42{
43 protected $soap_check = true;
44
45
46 /*
47 * object which handles php's authentication
48 * @var object
49 */
50 var $sauth = null;
51
52 /*
53 * Defines type of error handling (PHP5 || NUSOAP)
54 * @var object
55 */
56 var $error_method = null;
57
58
59 function ilSoapAdministration($use_nusoap = true)
60 {
61 define('USER_FOLDER_ID',7);
62 define('NUSOAP',1);
63 define('PHP5',2);
64
66 {
67 $this->error_method = NUSOAP;
68 }
69 else
70 {
71 $this->error_method = PHP5;
72 }
73 #echo ("SOAP: using soap mode ".IL_SOAPMODE == IL_SOAPMODE_NUSOAP ? "NUSOAP": "PHP5");
75 }
76
77 // PROTECTED
78 function __checkSession($sid)
79 {
84 global $ilAuth, $ilUser;
85
86 list($sid,$client) = $this->__explodeSid($sid);
87
88 if(!strlen($sid))
89 {
90 $this->__setMessage('No session id given');
91 $this->__setMessageCode('Client');
92 return false;
93 }
94 if(!$client)
95 {
96 $this->__setMessage('No client given');
97 $this->__setMessageCode('Client');
98 return false;
99 }
100 if(!$ilAuth->getAuth())
101 {
102 switch($ilAuth->getStatus())
103 {
104 case AUTH_EXPIRED:
105 $this->__setMessage('Session expired');
106 $this->__setMessageCode('Server');
107 return false;
108
109 case AUTH_IDLED:
110 $this->__setMessage('Session idled');
111 $this->__setMessageCode('Server');
112 return false;
113
114 case AUTH_WRONG_LOGIN:
115 $this->__setMessage('Wrong Login or Password');
116 $this->__setMessageCode('Client');
117 return false;
118
119 default:
120 $this->__setMessage('Session invalid');
121 $this->__setMessageCode('Client');
122 return false;
123 }
124 }
125
126 if($ilUser->hasToAcceptTermsOfService())
127 {
128 $this->__setMessage('User agreement no accepted.');
129 $this->__setMessageCode('Server');
130 return false;
131 }
132
133 if($this->soap_check)
134 {
135 $set = new ilSetting();
136 $this->__setMessage('SOAP is not enabled in ILIAS administration for this client');
137 $this->__setMessageCode('Server');
138 return ($set->get("soap_user_administration") == 1);
139 }
140
141 return true;
142 }
143
151 public function initErrorWriter()
152 {
153 include_once('./Services/Init/classes/class.ilErrorHandling.php');
154
155 set_error_handler(array('ilErrorHandling','_ilErrorWriter'),E_ALL);
156 }
157
158
159 function __explodeSid($sid)
160 {
161 $exploded = explode('::',$sid);
162
163 return is_array($exploded) ? $exploded : array('sid' => '','client' => '');
164 }
165
166
167 function __setMessage($a_str)
168 {
169 $this->message = $a_str;
170 }
171 function __getMessage()
172 {
173 return $this->message;
174 }
175 function __appendMessage($a_str)
176 {
177 $this->message .= isset($this->message) ? ' ' : '';
178 $this->message .= $a_str;
179 }
180
181 public function __setMessageCode($a_code)
182 {
183 $this->message_code = $a_code;
184 }
185
186 public function __getMessageCode()
187 {
188 return $this->message_code;
189 }
190
191 public function initAuth($sid)
192 {
193 list($sid,$client) = $this->__explodeSid($sid);
194 define('CLIENT_ID',$client);
195 $_COOKIE['ilClientId'] = $client;
196 $_COOKIE['PHPSESSID'] = $sid;
197 #$_SESSION['_authhttp'.md5(CLIENT_ID)] = true;
198 #$_SESSION['PHPSESSID'] = $sid;
199 }
200
201 public function initIlias()
202 {
204 {
205 try
206 {
207 require_once("Services/Init/classes/class.ilInitialisation.php");
209 }
210 catch(Exception $e)
211 {
212 // #10608
213 // no need to do anything here, see __checkSession() below
214 }
215 }
216 }
217
218
219 function __initAuthenticationObject($a_auth_mode = AUTH_LOCAL)
220 {
221 include_once './Services/Authentication/classes/class.ilAuthFactory.php';
223 }
224
225
226 function __raiseError($a_message,$a_code)
227 {
228 #echo $a_message, $a_code;
229 switch($this->error_method)
230 {
231 case NUSOAP:
232 return new soap_fault($a_code,'',$a_message);
233 case PHP5:
234 return new SoapFault($a_code, $a_message);
235 }
236 }
237
245 function getNIC($sid)
246 {
247 $this->initAuth($sid);
248 $this->initIlias();
249
250 if(!$this->__checkSession($sid))
251 {
252 return $this->__raiseError($this->__getMessage(),$this->__getMessageCode());
253 }
254
255 global $rbacsystem, $rbacreview, $ilLog, $rbacadmin,$ilSetting, $ilClientIniFile;
256
257 if (!is_object($ilClientIniFile)) {
258 return $this->__raiseError("Client ini is not initialized","Server");
259 }
260
261 $auth_modes = ilAuthUtils::_getActiveAuthModes();
262 $auth_mode_default = strtoupper(ilAuthUtils::_getAuthModeName(array_shift($auth_modes)));
263 $auth_mode_names = array();
264 foreach ($auth_modes as $mode) {
265 $auth_mode_names[] = strtoupper(ilAuthUtils::_getAuthModeName($mode));
266 }
267
268 include_once 'Services/AdvancedMetaData/classes/class.ilAdvancedMDRecord.php';
269 include_once 'Services/AdvancedMetaData/classes/class.ilAdvancedMDRecordXMLWriter.php';
270
271 // create advanced meta data record xml
272 $record_ids = array();
274 foreach($record_types as $type) {
276 foreach ($records as $record){
277 $record_ids [] = $record->getRecordId();
278 }
279 }
280 $record_ids = array_unique($record_ids);
281 $advmwriter = new ilAdvancedMDRecordXMLWriter($record_ids);
282 $advmwriter->write();
283
284 // create user defined fields record xml, simulate empty user records
285 include_once ("./Services/User/classes/class.ilUserXMLWriter.php");
286 $udfWriter = new ilUserXMLWriter();
287 $users = array();
288 $udfWriter->setObjects($users);
289 $udfWriter->start();
290
291 // todo: get information from client id, read from ini file specificied
292 $client_details[] = array ("installation_id" => IL_INST_ID,
293 "installation_version" => ILIAS_VERSION,
294 "installation_url" => ILIAS_HTTP_PATH,
295 "installation_description" => $ilClientIniFile->readVariable("client","description"),
296 "installation_language_default" => $ilClientIniFile->readVariable("language","default"),
297 "installation_session_expire" => $ilClientIniFile->readVariable("session","expire"),
298 "installation_php_postmaxsize" => $this->return_bytes(ini_get("post_max_size")),
299 "authentication_methods" => join(",", $auth_mode_names),
300 "authentication_default_method" => $auth_mode_default,
301 "installation_udf_xml" => $udfWriter ->getXML(),
302 "installation_advmd_xml" => $advmwriter->xmlDumpMem(false)
303
304 );
305
306 // store into xml result set
307 include_once './webservice/soap/classes/class.ilXMLResultSet.php';
308
309
310 $xmlResult = new ilXMLResultSet();
311 $xmlResult->addArray($client_details, true);
312
313 // create writer and return xml
314 include_once './webservice/soap/classes/class.ilXMLResultSetWriter.php';
315 $xmlResultWriter = new ilXMLResultSetWriter($xmlResult);
316 $xmlResultWriter->start();
317 return $xmlResultWriter->getXML();
318 }
319
324 public static function return_bytes($val) {
325 $val = trim($val);
326 $last = strtolower($val{strlen($val)-1});
327 switch($last) {
328 // The 'G' modifier is available since PHP 5.1.0
329 case 'g':
330 $val *= 1024;
331 case 'm':
332 $val *= 1024;
333 case 'k':
334 $val *= 1024;
335 }
336 return $val;
337 }
338
339 public function isFault($object) {
340 switch($this->error_method)
341 {
342 case NUSOAP:
343 return $object instanceof soap_fault;
344 case PHP5:
345 return $object instanceof SoapFault;
346 }
347 return true;
348 }
349
359 public function checkObjectAccess($ref_id, $expected_type, $permission, $returnObject = false) {
360 global $rbacsystem;
361 if(!is_numeric($ref_id))
362 {
363 return $this->__raiseError('No valid id given.',
364 'Client');
365 }
366 if (!ilObject::_exists($ref_id, true)) {
367 return $this->__raiseError('No object for id.',
368 'CLIENT_OBJECT_NOT_FOUND');
369 }
370
372 return $this->__raiseError('Object is already trashed.',
373 'CLIENT_OBJECT_DELETED');
374 }
375
377 if ((is_array($expected_type) && !in_array($type, $expected_type))
378 ||
379 (!is_array($expected_type) && $type != $expected_type)
380 )
381 {
382 return $this->__raiseError("Wrong type $type for id. Expected: ".(is_array($expected_type) ? join (",",$expected_type) : $expected_type), 'CLIENT_OBJECT_WRONG_TYPE');
383 }
384
385 if (!$rbacsystem->checkAccess($permission, $ref_id, $type))
386 {
387 return $this->__raiseError('Missing permission $permission for type $type.', 'CLIENT_OBJECT_WRONG_PERMISSION');
388 }
389
390 if ($returnObject) {
392 }
393
394 return $type;
395 }
396
397 public function getInstallationInfoXML()
398 {
399 include_once "Services/Context/classes/class.ilContext.php";
401
402 require_once("Services/Init/classes/class.ilInitialisation.php");
404
405 $clientdirs = glob(ILIAS_WEB_DIR."/*",GLOB_ONLYDIR);
406 require_once ("webservice/soap/classes/class.ilSoapInstallationInfoXMLWriter.php");
407 $writer = new ilSoapInstallationInfoXMLWriter ();
408 $writer->start();
409 if (is_array($clientdirs))
410 {
411 foreach ($clientdirs as $clientdir)
412 {
413 if (is_object($clientInfo= $this->getClientInfo($init, $clientdir)))
414 {
415 $writer->addClient ($clientInfo);
416 }
417 }
418 }
419 $writer->end();
420
421 return $writer->getXML();
422 }
423
424 public function getClientInfoXML($clientid)
425 {
426 include_once "Services/Context/classes/class.ilContext.php";
428
429 require_once("Services/Init/classes/class.ilInitialisation.php");
431
432 $clientdir = ILIAS_WEB_DIR."/".$clientid;
433 require_once ("webservice/soap/classes/class.ilSoapInstallationInfoXMLWriter.php");
434 $writer = new ilSoapInstallationInfoXMLWriter ();
435 $writer->setExportAdvancedMetaDataDefinitions (true);
436 $writer->setExportUDFDefinitions (true);
437 $writer->start();
438 if (is_object($client = $this->getClientInfo($init, $clientdir)))
439 {
440 $writer->addClient($client);
441 }
442 else
443 return $this->__raiseError("Client ID $clientid does not exist!", 'Client');
444 $writer->end();
445 return $writer->getXML();
446 }
447
448 private function getClientInfo ($init, $client_dir)
449 {
450 global $ilDB;
451 $ini_file = "./".$client_dir."/client.ini.php";
452
453 // get settings from ini file
454 require_once("./Services/Init/classes/class.ilIniFile.php");
455
456 $ilClientIniFile = new ilIniFile($ini_file);
457 $ilClientIniFile->read();
458 if ($ilClientIniFile->ERROR != "")
459 {
460 return false;
461 }
462 $client_id = $ilClientIniFile->readVariable('client','name');
463 if ($ilClientIniFile->variableExists('client', 'expose'))
464 {
465 $client_expose = $ilClientIniFile->readVariable('client','expose');
466 if ($client_expose == "0")
467 return false;
468 }
469
470 // build dsn of database connection and connect
471 require_once("./Services/Database/classes/class.ilDBWrapperFactory.php");
472 $ilDB = ilDBWrapperFactory::getWrapper($ilClientIniFile->readVariable("db","type"),
473 $ilClientIniFile->readVariable("db","inactive_mysqli"));
474 $ilDB->initFromIniFile($ilClientIniFile);
475 if ($ilDB->connect(true))
476 {
477 $GLOBALS['ilDB'] = $ilDB;
478
479 require_once("Services/Administration/classes/class.ilSetting.php");
480 $settings = new ilSetting();
481 $GLOBALS["ilSetting"] = $settings;
482 // workaround to determine http path of client
483 define ("IL_INST_ID", $settings->get("inst_id",0));
484 $settings->access = $ilClientIniFile->readVariable("client", "access");
485 $settings->description = $ilClientIniFile->readVariable("client","description");
486 $settings->session = min((int) ini_get("session.gc_maxlifetime"), (int) $ilClientIniFile->readVariable("session","expire"));
487 $settings->language = $ilClientIniFile->readVariable("language","default");
488 $settings->clientid = basename($client_dir); //pathinfo($client_dir, PATHINFO_FILENAME);
489 $settings->default_show_users_online = $settings->get("show_users_online");
490 $settings->default_hits_per_page = $settings->get("hits_per_page");
491 $skin = $ilClientIniFile->readVariable("layout","skin");
492 $style = $ilClientIniFile->readVariable("layout","style");
493 $settings->default_skin_style = $skin.":".$style;
494 return $settings;
495 }
496 return null;
497 }
498
499
500}
501?>
const AUTH_EXPIRED
Returned if session has expired.
Definition: Auth.php:34
const AUTH_WRONG_LOGIN
Returned if container is unable to authenticate user/password pair.
Definition: Auth.php:38
const AUTH_IDLED
Returned if session exceeds idle time.
Definition: Auth.php:30
const AUTH_LOCAL
static _getActivatedRecordsByObjectType($a_obj_type, $a_sub_type="", $a_only_optional=false)
Get activated records by object type.
static _getAssignableObjectTypes($a_include_text=false)
Get assignable object type.
static setContext($a_context)
set context
static _getAuthModeName($a_auth_key)
const CONTEXT_SOAP_WITHOUT_CLIENT
static init($a_type)
Init context by type.
static getType()
Get context type.
const CONTEXT_SOAP
static getWrapper($a_type, $a_inactive_mysqli=null)
INIFile Parser.
static initILIAS()
ilias initialisation
getTypeByRefId($a_ref_id, $stop_on_error=true)
get object type by reference id
getInstanceByRefId($a_ref_id, $stop_on_error=true)
get an instance of an Ilias object by reference id
_isInTrash($a_ref_id)
checks wether object is in trash
static _exists($a_id, $a_reference=false, $a_type=null)
checks if an object exists in object_data@access public
ILIAS Setting Class.
__initAuthenticationObject($a_auth_mode=AUTH_LOCAL)
__raiseError($a_message, $a_code)
checkObjectAccess($ref_id, $expected_type, $permission, $returnObject=false)
check access for ref id: expected type, permission, return object instance if returnobject is true
initErrorWriter()
Overwrite error handler.
static return_bytes($val)
calculate bytes from K,M,G modifiers e.g: 8M = 8 * 1024 * 1024 bytes
ilSoapAdministration($use_nusoap=true)
getNIC($sid)
get client information from current as xml result set
XML writer class.
XML Writer for XMLResultSet.
soap_fault class, allows for creation of faults mainly used for returning faults from deployed functi...
Definition: nusoap.php:669
$_COOKIE["ilClientId"]
Definition: cron.php:11
$style
Definition: example_012.php:70
$GLOBALS['PHPCAS_CLIENT']
This global variable is used by the interface class phpCAS.
Definition: CAS.php:276
$client_id
const ILIAS_VERSION
global $ilSetting
Definition: privfeed.php:40
$ref_id
Definition: sahs_server.php:39
$records
Definition: simple_test.php:17
global $ilDB
global $ilUser
Definition: imgupload.php:15
const ILIAS_WEB_DIR
const IL_SOAPMODE
Definition: server.php:49
const IL_SOAPMODE_NUSOAP
Definition: server.php:36