ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5f
class.ilSoapUtils.php
Go to the documentation of this file.
1<?php
2 /*
3 +-----------------------------------------------------------------------------+
4 | ILIAS open source |
5 +-----------------------------------------------------------------------------+
6 | Copyright (c) 1998-2001 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
33include_once './webservice/soap/classes/class.ilSoapAdministration.php';
34
36{
37 function ilSoapUtils()
38 {
39 parent::ilSoapAdministration();
40 }
41
42 function ignoreUserAbort()
43 {
44 return ignore_user_abort(true);
45 }
46
48 {
49 $this->soap_check = false;
50 }
51
52 function sendMail($sid,$to,$cc,$bcc,$sender,$subject,$message,$attach)
53 {
54 $this->initAuth($sid);
55 $this->initIlias();
56
57 if(!$this->__checkSession($sid))
58 {
59 return $this->__raiseError($this->__getMessage(),$this->__getMessageCode());
60 }
61
62 include_once 'Services/Mail/classes/class.ilMimeMail.php';
63
64 if(strpos($sender, '#:#') !== false)
65 {
66 $sender = explode('#:#', $sender);
67 }
68
69 $mmail = new ilMimeMail();
70 $mmail->autoCheck(false);
71 $mmail->From($sender);
72 $mmail->To(explode(',',$to));
73 $mmail->Subject($subject);
74 $mmail->Body($message);
75
76 if($cc)
77 {
78 $mmail->Cc(explode(',',$cc));
79 }
80
81 if($bcc)
82 {
83 $mmail->Bcc(explode(',',$bcc));
84 }
85 if($attach)
86 {
87 // mjansen: switched separator from "," to "#:#" because of mantis bug #6039
88 // for backward compatibility we have to check if the substring "#:#" exists as leading separator
89 // otherwise we should use ";"
90 if(strpos($attach, '#:#') === 0)
91 {
92 $attach = substr($attach, strlen('#:#'));
93 $attachments = explode('#:#', $attach);
94 }
95 else
96 {
97 $attachments = explode(',', $attach);
98 }
99
100 foreach($attachments as $attachment)
101 {
102 $final_filename = null;
103 $filename = basename($attachment);
104 if(strlen($filename) > 0)
105 {
106 // #17740
107 $final_filename = preg_replace('/^(\d+?_)(.*)/', '$2', $filename);
108 }
109 $mmail->Attach($attachment, '', 'inline', $final_filename);
110 }
111 }
112
113 $mmail->Send();
114
115 return true;
116 }
117
124 public function distributeMails($sid, $a_mail_xml)
125 {
126 $this->initAuth($sid);
127 $this->initIlias();
128
129 if(!$this->__checkSession($sid))
130 {
131 return $this->__raiseError($this->__getMessage(),$this->__getMessageCode());
132 }
133
134 include_once 'Services/Mail/classes/class.ilMail.php';
135 include_once 'webservice/soap/classes/class.ilSoapMailXmlParser.php';
136
137 $parser = new ilSoapMailXmlParser($a_mail_xml);
138 try
139 {
140 // Check if wellformed
141 libxml_use_internal_errors(true);
142 $ok = simplexml_load_string($a_mail_xml);
143 if(!$ok)
144 {
145 foreach(libxml_get_errors() as $err)
146 {
147 $error .= ($err->message.' ');
148 }
149 return $this->__raiseError($error, 'CLIENT');
150 }
151 $parser->start();
152 }
153 catch(InvalidArgumentException $e)
154 {
155 $GLOBALS['ilLog']->write(__METHOD__.' '.$e->getMessage());
156 return $this->__raiseError($e->getMessage(),'CLIENT');
157 }
158 catch(ilSaxParserException $e)
159 {
160 $GLOBALS['ilLog']->write(__METHOD__.' '.$e->getMessage());
161 return $this->__raiseError($e->getMessage(), 'CLIENT');
162 }
163
164 $mails = $parser->getMails();
165
166 global $ilUser;
167
168 foreach($mails as $mail)
169 {
170 // Prepare attachments
171 include_once './Services/Mail/classes/class.ilFileDataMail.php';
172 $file = new ilFileDataMail($ilUser->getId());
173 foreach((array) $mail['attachments'] as $attachment)
174 {
175 // TODO: Error handling
176 $file->storeAsAttachment($attachment['name'], $attachment['content']);
177 $attachments[] = ilUtil::_sanitizeFilemame($attachment['name']);
178 }
179
180 $mail_obj = new ilMail($ilUser->getId());
181 $mail_obj->setSaveInSentbox(true);
182 $mail_obj->saveAttachments((array) $attachments);
183 $mail_obj->sendMail(
184 implode(',',(array) $mail['to']),
185 implode(',',(array) $mail['cc']),
186 implode(',',(array) $mail['bcc']),
187 $mail['subject'],
188 implode("\n", (array)$mail['body']),
189 (array) $attachments,
190 array($mail['type']),
191 (bool) $mail['usePlaceholders']
192 );
193
194 // Finally unlink attachments
195 foreach((array) $attachments as $att)
196 {
197 $file->unlinkFile($att);
198 }
199 $mail_obj->savePostData(
200 $ilUser->getId(),
201 array(),
202 '',
203 '',
204 '',
205 '',
206 '',
207 '',
208 '',
209 ''
210 );
211 }
212 return true;
213 }
214
215 function saveTempFileAsMediaObject($sid, $name, $tmp_name)
216 {
217 $this->initAuth($sid);
218 $this->initIlias();
219
220 if(!$this->__checkSession($sid))
221 {
222 return $this->__raiseError($this->__getMessage(),$this->__getMessageCode());
223 }
224
225 include_once "./Services/MediaObjects/classes/class.ilObjMediaObject.php";
226 return ilObjMediaObject::_saveTempFileAsMediaObject($name, $tmp_name);
227 }
228
229 function getMobsOfObject($sid, $a_type, $a_id)
230 {
231 $this->initAuth($sid);
232 $this->initIlias();
233
234 if(!$this->__checkSession($sid))
235 {
236 return $this->__raiseError($this->__getMessage(),$this->__getMessageCode());
237 }
238
239 include_once "./Services/MediaObjects/classes/class.ilObjMediaObject.php";
240 return ilObjMediaObject::_getMobsOfObject($a_type, $a_id);
241 }
242
250 public function ilCloneDependencies($sid,$copy_identifier)
251 {
252 $this->initAuth($sid);
253 $this->initIlias();
254
255 if(!$this->__checkSession($sid))
256 {
257 return $this->__raiseError($this->__getMessage(),$this->__getMessageCode());
258 }
259
260 global $ilLog,$ilUser;
261
262 include_once('Services/CopyWizard/classes/class.ilCopyWizardOptions.php');
263 $cp_options = ilCopyWizardOptions::_getInstance($copy_identifier);
264
265 // Check owner of copy procedure
266 if(!$cp_options->checkOwner($ilUser->getId()))
267 {
268 ilLoggerFactory::getLogger('obj')->error('Permission check failed for user id: '.$ilUser->getId().', copy id: '.$copy_identifier);
269 return false;
270 }
271
272 // Fetch first node
273 if(($node = $cp_options->fetchFirstDependenciesNode()) === false)
274 {
275 $cp_options->deleteAll();
276 ilLoggerFactory::getLogger('obj')->info('Finished copy step 2. Copy completed');
277 return true;
278 }
279
280 // Check options of this node
281 $options = $cp_options->getOptions($node['child']);
282 $new_ref_id = 0;
283 switch($options['type'])
284 {
286 ilLoggerFactory::getLogger('obj')->debug(': Omitting node: '.$node['obj_id'].', '.$node['title'].', '.$node['type']);
287 $this->callNextDependency($sid,$cp_options);
288 break;
289
291 ilLoggerFactory::getLogger('obj')->debug(': Nothing to do for node: '.$node['obj_id'].', '.$node['title'].', '.$node['type']);
292 $this->callNextDependency($sid,$cp_options);
293 break;
294
296 ilLoggerFactory::getLogger('obj')->debug(': Start cloning dependencies: '.$node['obj_id'].', '.$node['title'].', '.$node['type']);
297 $this->cloneDependencies($node,$cp_options);
298 $this->callNextDependency($sid,$cp_options);
299 break;
300
301 default:
302 ilLoggerFactory::getLogger('obj')->warning('No valid action type given for node: '.$node['obj_id'].', '.$node['title'].', '.$node['type']);
303 $this->callNextDependency($sid,$cp_options);
304 break;
305 }
306 return true;
307 }
308
317 public function ilClone($sid,$copy_identifier)
318 {
319 $this->initAuth($sid);
320 $this->initIlias();
321
322 if(!$this->__checkSession($sid))
323 {
324 ilLoggerFactory::getLogger('obj')->error('Object cloning failed. Invalid session given: '. $this->__getMessage());
325 }
326
327 global $ilLog,$ilUser;
328
329 include_once('Services/CopyWizard/classes/class.ilCopyWizardOptions.php');
330 $cp_options = ilCopyWizardOptions::_getInstance($copy_identifier);
331
332 // Check owner of copy procedure
333 if(!$cp_options->checkOwner($ilUser->getId()))
334 {
335 ilLoggerFactory::getLogger('obj')->error('Permission check failed for user id: '.$ilUser->getId().', copy id: '.$copy_identifier);
336 return false;
337 }
338
339
340 // Fetch first node
341 if(($node = $cp_options->fetchFirstNode()) === false)
342 {
343 ilLoggerFactory::getLogger('obj')->info('Finished copy step 1. Starting copying of object dependencies...');
344 return $this->ilCloneDependencies($sid,$copy_identifier);
345 }
346
347 // Check options of this node
348 $options = $cp_options->getOptions($node['child']);
349
350 $new_ref_id = 0;
351 switch($options['type'])
352 {
354 ilLoggerFactory::getLogger('obj')->debug(': Omitting node: '.$node['obj_id'].', '.$node['title'].', '.$node['type']);
355 // set mapping to zero
356 $cp_options->appendMapping($node['child'],0);
357 $this->callNextNode($sid,$cp_options);
358 break;
359
361
362 ilLoggerFactory::getLogger('obj')->debug('Start cloning node: '.$node['obj_id'].', '.$node['title'].', '.$node['type']);
363 $new_ref_id = $this->cloneNode($node,$cp_options);
364 $this->callNextNode($sid,$cp_options);
365 break;
366
368 ilLoggerFactory::getLogger('obj')->debug('Start linking node: '.$node['obj_id'].', '.$node['title'].', '.$node['type']);
369 $new_ref_id = $this->linkNode($node,$cp_options);
370 $this->callNextNode($sid,$cp_options);
371 break;
372
373 default:
374 ilLoggerFactory::getLogger('obj')->warning('No valid action type given for: '.$node['obj_id'].', '.$node['title'].', '.$node['type']);
375 $this->callNextNode($sid,$cp_options);
376 break;
377
378 }
379 return $new_ref_id;
380 }
381
388 private function callNextNode($sid,$cp_options)
389 {
390 global $ilLog;
391
392 $cp_options->dropFirstNode();
393
394 if($cp_options->isSOAPEnabled())
395 {
396 // Start next soap call
397 include_once 'Services/WebServices/SOAP/classes/class.ilSoapClient.php';
398 $soap_client = new ilSoapClient();
399 $soap_client->setResponseTimeout(1);
400 $soap_client->enableWSDL(true);
401 $soap_client->init();
402 $soap_client->call('ilClone',array($sid,$cp_options->getCopyId()));
403 }
404 else
405 {
406 ilLoggerFactory::getLogger('obj')->warning('SOAP clone call failed. Calling clone method manually');
407 $cp_options->read();
408 include_once('./webservice/soap/include/inc.soap_functions.php');
409 $res = ilSoapFunctions::ilClone($sid,$cp_options->getCopyId());
410 }
411 return true;
412 }
413
414 private function callNextDependency($sid,$cp_options)
415 {
416 global $ilLog;
417
418 $cp_options->dropFirstDependenciesNode();
419
420 if($cp_options->isSOAPEnabled())
421 {
422 // Start next soap call
423 include_once 'Services/WebServices/SOAP/classes/class.ilSoapClient.php';
424 $soap_client = new ilSoapClient();
425 $soap_client->setResponseTimeout(1);
426 $soap_client->enableWSDL(true);
427 $soap_client->init();
428 $soap_client->call('ilCloneDependencies',array($sid,$cp_options->getCopyId()));
429 }
430 else
431 {
432 ilLoggerFactory::getLogger('obj')->warning('SOAP clone call failed. Calling clone method manually');
433 $cp_options->read();
434 include_once('./webservice/soap/include/inc.soap_functions.php');
435 $res = ilSoapFunctions::ilCloneDependencies($sid,$cp_options->getCopyId());
436 }
437 return true;
438 }
439
447 private function cloneNode($node,$cp_options)
448 {
449 global $ilLog,$tree,$ilAccess,$rbacreview;
450
451 #sleep(20);
452
453 $source_id = $node['child'];
454 $parent_id = $node['parent'];
455 $options = $cp_options->getOptions($node['child']);
456 $mappings = $cp_options->getMappings();
457
458 if(!$ilAccess->checkAccess('copy','',$node['child']))
459 {
460 ilLoggerFactory::getLogger('obj')->error('No copy permission granted: '.$source_id.', '.$node['title'].', '.$node['type']);
461 return false;
462
463 }
464 if(!isset($mappings[$parent_id]))
465 {
466 ilLoggerFactory::getLogger('obj')->info('Omitting node '.$source_id.', '.$node['title'].', '.$node['type']. '. No target found.');
467 return true;
468 }
469 $target_id = $mappings[$parent_id];
470
471 if(!$tree->isInTree($target_id))
472 {
473 ilLoggerFactory::getLogger('obj')->notice('Omitting node '.$source_id.', '.$node['title'].', '.$node['type']. '. Object has been deleted.');
474 return false;
475 }
476
477 $orig = ilObjectFactory::getInstanceByRefId((int) $source_id);
478 $new_obj = $orig->cloneObject((int) $target_id,$cp_options->getCopyId());
479
480 if(!is_object($new_obj))
481 {
482 ilLoggerFactory::getLogger('obj')->error('Error copying '.$source_id.', '.$node['title'].', '.$node['type'].'. No target found.');
483 return false;
484 }
485
486 // rbac log
487 include_once "Services/AccessControl/classes/class.ilRbacLog.php";
488 $rbac_log_roles = $rbacreview->getParentRoleIds($new_obj->getRefId(), false);
489 $rbac_log = ilRbacLog::gatherFaPa($new_obj->getRefId(), array_keys($rbac_log_roles), true);
490 ilRbacLog::add(ilRbacLog::COPY_OBJECT, $new_obj->getRefId(), $rbac_log, (int)$source_id);
491
492 // Finally add new mapping entry
493 $cp_options->appendMapping($source_id,$new_obj->getRefId());
494 return $new_obj->getRefId();
495 }
496
504 private function cloneDependencies($node,$cp_options)
505 {
506 global $ilLog;
507
508 $source_id = $node['child'];
509 $mappings = $cp_options->getMappings();
510
511 if(!isset($mappings[$source_id]))
512 {
513 ilLoggerFactory::getLogger('obj')->debug('Omitting node '.$source_id.', '.$node['title'].', '.$node['type']. '. No mapping found.');
514 return true;
515 }
516 $target_id = $mappings[$source_id];
517
518 $orig = ilObjectFactory::getInstanceByRefId((int) $source_id);
519 $orig->cloneDependencies($target_id,$cp_options->getCopyId());
520 return true;
521 }
522
530 private function linkNode($node,$cp_options)
531 {
532 global $ilLog,$ilAccess,$rbacreview;
533
534 $source_id = $node['child'];
535 $parent_id = $node['parent'];
536 $options = $cp_options->getOptions($node['child']);
537 $mappings = $cp_options->getMappings();
538
539 if(!$ilAccess->checkAccess('delete','',$node['child']))
540 {
541 ilLoggerFactory::getLogger('obj')->warning('No delete permission granted: '.$source_id.', '.$node['title'].', '.$node['type']);
542 return false;
543
544 }
545 if(!isset($mappings[$parent_id]))
546 {
547 ilLoggerFactory::getLogger('obj')->warning('Omitting node '.$source_id.', '.$node['title'].', '.$node['type']. '. No target found.');
548 return true;
549 }
550 $target_id = $mappings[$parent_id];
551
552 $orig = ilObjectFactory::getInstanceByRefId((int) $source_id);
553 $new_ref_id = $orig->createReference();
554 $orig->putInTree($target_id);
555 $orig->setPermissions($target_id);
556
557 if(!($new_ref_id))
558 {
559 ilLoggerFactory::getLogger('obj')->error('Error linking '.$source_id.', '.$node['title'].', '.$node['type'].'. No target found.');
560 return false;
561 }
562
563 // rbac log
564 include_once "Services/AccessControl/classes/class.ilRbacLog.php";
565 $rbac_log_roles = $rbacreview->getParentRoleIds($new_ref_id, false);
566 $rbac_log = ilRbacLog::gatherFaPa($new_ref_id, array_keys($rbac_log_roles), true);
567 ilRbacLog::add(ilRbacLog::LINK_OBJECT, $new_ref_id, $rbac_log, (int)$source_id);
568
569 // Finally add new mapping entry
570 $cp_options->appendMapping($source_id,$new_ref_id);
571 return $new_ref_id;
572 }
573
580 static function validateXML ($xml) {
581 // validate to prevent wrong XMLs
582 $dom = @domxml_open_mem($xml, DOMXML_LOAD_VALIDATING, $error);
583 if ($error)
584 {
585 $msg = array();
586 if (is_array($error))
587 {
588 foreach ($error as $err) {
589 $msg []= "(".$err["line"].",".$err["col"]."): ".$err["errormessage"];
590 }
591 }
592 else
593 {
594 $msg[] = $error;
595 }
596 $msg = join("\n",$msg);
597 return $msg;
598 }
599 return true;
600 }
601
602 public function handleECSTasks($sid,$a_server_id)
603 {
604 $this->initAuth($sid);
605 $this->initIlias();
606
607 if(!$this->__checkSession($sid))
608 {
609 return $this->__raiseError($this->__getMessage(),$this->__getMessageCode());
610 }
611
612 include_once('./Services/WebServices/ECS/classes/class.ilECSTaskScheduler.php');
613
614 global $ilLog;
615
616 $ilLog->write(__METHOD__.': Starting task execution...');
617 $scheduler = ilECSTaskScheduler::_getInstanceByServerId($a_server_id);
618 $scheduler->startTaskExecution();
619
620 return true;
621 }
622
635 public function deleteExpiredDualOptInUserObjects($sid, $usr_id)
636 {
637 $this->initAuth($sid);
638 $this->initIlias();
639
640 // Session check not possible -> anonymous user is the trigger
641
642 global $ilDB, $ilLog;
643
644 $ilLog->write(__METHOD__.': Started deletion of inactive user objects with expired confirmation hash values (dual opt in) ...');
645
646 require_once 'Services/Registration/classes/class.ilRegistrationSettings.php';
647 $oRegSettigs = new ilRegistrationSettings();
648
649 $query = '';
650
651 /*
652 * Fetch the current actuator user object first, because this user will try to perform very probably
653 * a new registration with the same login name in a few seconds ;-)
654 *
655 */
656 if((int)$usr_id > 0)
657 {
658 $query .= 'SELECT usr_id, create_date, reg_hash FROM usr_data '
659 . 'WHERE active = 0 '
660 . 'AND reg_hash IS NOT NULL '
661 . 'AND usr_id = '.$ilDB->quote($usr_id, 'integer').' ';
662 $query .= 'UNION ';
663 }
664
665 $query .= 'SELECT usr_id, create_date, reg_hash FROM usr_data '
666 . 'WHERE active = 0 '
667 . 'AND reg_hash IS NOT NULL '
668 . 'AND usr_id != '.$ilDB->quote($usr_id, 'integer').' ';
669
670 $res = $ilDB->query($query);
671
672 $ilLog->write(__METHOD__.': '.$ilDB->numRows($res).' inactive user objects with confirmation hash values (dual opt in) found ...');
673
674 /*
675 * mjansen: 15.12.2010:
676 * I perform the expiration check in php because of multi database support (mysql, postgresql).
677 * I did not find an oracle equivalent for mysql: UNIX_TIMESTAMP()
678 */
679
680 $num_deleted_users = 0;
681 while($row = $ilDB->fetchAssoc($res))
682 {
683 if($row['usr_id'] == ANONYMOUS_USER_ID || $row['usr_id'] == SYSTEM_USER_ID) continue;
684 if(!strlen($row['reg_hash'])) continue;
685
686 if((int)$oRegSettigs->getRegistrationHashLifetime() > 0 &&
687 $row['create_date'] != '' &&
688 time() - $oRegSettigs->getRegistrationHashLifetime() > strtotime($row['create_date']))
689 {
690 $user = ilObjectFactory::getInstanceByObjId($row['usr_id'], false);
691 if($user instanceof ilObjUser)
692 {
693 $ilLog->write(__METHOD__.': User '.$user->getLogin().' (obj_id: '.$user->getId().') will be deleted due to an expired registration hash ...');
694 $user->delete();
695 ++$num_deleted_users;
696 }
697 }
698 }
699
700 $ilLog->write(__METHOD__.': '.$num_deleted_users.' inactive user objects with expired confirmation hash values (dual opt in) deleted ...');
701
702 $ilLog->write(__METHOD__.': Finished deletion of inactive user objects with expired confirmation hash values (dual opt in) ...');
703
704 return true;
705 }
706}
707?>
print $file
$filename
Definition: buildRTE.php:89
static _getInstance($a_copy_id)
Get instance of copy wizard options.
static _getInstanceByServerId($a_server_id)
get singleton instance Private access use ilECSTaskScheduler::start() or ilECSTaskScheduler::startTas...
This class handles all operations on files (attachments) in directory ilias_data/mail.
static getLogger($a_component_id)
Get component logger.
Class Mail this class handles base functions for mail handling.
this class encapsulates the PHP mail() function.
static _saveTempFileAsMediaObject($name, $tmp_name, $upload=TRUE)
Create new media object and update page in db and return new media object.
_getMobsOfObject($a_type, $a_id, $a_usage_hist_nr=0, $a_lang="-")
get mobs of object
getInstanceByObjId($a_obj_id, $stop_on_error=true)
get an instance of an Ilias object by object id
getInstanceByRefId($a_ref_id, $stop_on_error=true)
get an instance of an Ilias object by reference id
const COPY_OBJECT
static add($a_action, $a_ref_id, array $a_diff, $a_source_ref_id=false)
const LINK_OBJECT
static gatherFaPa($a_ref_id, array $a_role_ids, $a_add_action=false)
Class ilObjAuthSettingsGUI.
SaxParserException thrown by ilSaxParser if property throwException is set.
__raiseError($a_message, $a_code)
static ilCloneDependencies($sid, $copy_identifier)
static ilClone($sid, $copy_identifier)
XML parser for soap mails.
callNextNode($sid, $cp_options)
Call next node using soap.
linkNode($node, $cp_options)
Link node.
ilCloneDependencies($sid, $copy_identifier)
clone object dependencies (e.g.
deleteExpiredDualOptInUserObjects($sid, $usr_id)
Method for soap webservice: deleteExpiredDualOptInUserObjects.
handleECSTasks($sid, $a_server_id)
saveTempFileAsMediaObject($sid, $name, $tmp_name)
sendMail($sid, $to, $cc, $bcc, $sender, $subject, $message, $attach)
distributeMails($sid, $a_mail_xml)
mail via soap
getMobsOfObject($sid, $a_type, $a_id)
static validateXML($xml)
validates an xml file, if dtd is attached
ilClone($sid, $copy_identifier)
Clone object.
cloneDependencies($node, $cp_options)
cloneDependencies
cloneNode($node, $cp_options)
Clone node.
callNextDependency($sid, $cp_options)
static _sanitizeFilemame($a_filename)
const DOMXML_LOAD_VALIDATING
$target_id
Definition: goto.php:88
$GLOBALS['PHPCAS_CLIENT']
This global variable is used by the interface class phpCAS.
Definition: CAS.php:276
domxml_open_mem($str, $mode=DOMXML_LOAD_PARSING, &$error=NULL)
global $ilDB
if(!is_array($argv)) $options
global $ilUser
Definition: imgupload.php:15