From 21c62672b8bb5226a6fc18a22d090b26f18b9eda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arne=20Schr=C3=B6der=2C=20M=2E=20A=2E?= <schroeder@data-quest.de> Date: Mon, 4 Dec 2023 11:53:12 +0000 Subject: [PATCH] Resolve "ILIAS-Schnittstelle: verwendete SOAP-Methoden getUser und deleteUser existieren in ILIAS 8 nicht mehr" Closes #3279 Merge request studip/studip!2213 --- ...ip_referrer.php => studip_referrer_7x.php} | 8 +- lib/elearning/studip_referrer_8x.php | 126 ++++++++++++++++++ lib/ilias_interface/ConnectedIlias.class.php | 4 +- lib/ilias_interface/IliasSoap.class.php | 110 +++++++++++---- lib/soap/StudipSoapClient_PHP5.class.php | 6 +- 5 files changed, 220 insertions(+), 34 deletions(-) rename lib/elearning/{studip_referrer.php => studip_referrer_7x.php} (96%) create mode 100644 lib/elearning/studip_referrer_8x.php diff --git a/lib/elearning/studip_referrer.php b/lib/elearning/studip_referrer_7x.php similarity index 96% rename from lib/elearning/studip_referrer.php rename to lib/elearning/studip_referrer_7x.php index 7a0257cc046..e3675692cbf 100644 --- a/lib/elearning/studip_referrer.php +++ b/lib/elearning/studip_referrer_7x.php @@ -9,14 +9,14 @@ * */ -/* ILIAS Version 4.4.x */ +/* ILIAS Version 7.x */ if(file_exists("./ilias.ini.php")){ require_once("./Services/Init/classes/class.ilIniFile.php"); $ilIliasIniFile = new ilIniFile("./ilias.ini.php"); $ilIliasIniFile->read(); $serverSettings = $ilIliasIniFile->readGroup("server"); - if ($serverSettings["studip"] != 1) + if (isset($serverSettings["studip"]) && $serverSettings["studip"] != 1) { echo 'Option "studip" in ilias.ini.php is not enabled. You need to add studip = "1" to the server section.'; exit(); @@ -40,7 +40,7 @@ if(file_exists("./ilias.ini.php")){ require_once "./include/inc.header.php"; - $base_url= "ilias.php?baseClass=ilPersonalDesktopGUI"; + $base_url= "ilias.php?baseClass=ilDashboardGUI"; // redirect to specified page @@ -121,4 +121,4 @@ if(file_exists("./ilias.ini.php")){ exit(); } } -?> \ No newline at end of file + diff --git a/lib/elearning/studip_referrer_8x.php b/lib/elearning/studip_referrer_8x.php new file mode 100644 index 00000000000..f7552afb46f --- /dev/null +++ b/lib/elearning/studip_referrer_8x.php @@ -0,0 +1,126 @@ +<?php +/* Copyright (c) 1998-2014 ILIAS open source, Extended GPL, see docs/LICENSE */ + +/** +* redirect script for studip-users +* +* @author Arne Schroeder <schroeder@data-quest.de> +* @author Andre Noack <noack@data-quest.de> +* +*/ + +/* ILIAS Version 8.x */ + +if(file_exists("./ilias.ini.php")){ + require_once("./Services/Init/classes/class.ilIniFile.php"); + $ilIliasIniFile = new ilIniFile("./ilias.ini.php"); + $ilIliasIniFile->read(); + $serverSettings = $ilIliasIniFile->readGroup("server"); + if (isset($serverSettings["studip"]) && $serverSettings["studip"] != 1) + { + echo 'Option "studip" in ilias.ini.php is not enabled. You need to add studip = "1" to the server section.'; + exit(); + } + + $cookie_path = dirname($_SERVER['PHP_SELF']); + if (substr($cookie_path,-1) != "/") { + $cookie_path .= "/"; + } + if (isset($_GET['sess_id'])) + { + setcookie('PHPSESSID',$_GET['sess_id'],0, $cookie_path); + $_COOKIE['PHPSESSID'] = $_GET['sess_id']; + } + + if (isset($_GET['client_id'])) + { + setcookie('ilClientId',$_GET['client_id'],0, $cookie_path); + $_COOKIE['ilClientId'] = $_GET['client_id']; + } + + require_once "./include/inc.header.php"; + + $base_url= "ilias.php?baseClass=ilDashboardGUI"; + + + // redirect to specified page + $redirect = false; + switch($_GET['target']) + { + case 'start': + switch($_GET['type']) + { + case 'lm': + $base_url= "ilias.php?baseClass=ilLMPresentationGUI"; + break; + case 'tst': + $base_url= "ilias.php?cmd=infoScreen&cmdClass=ilobjtestgui&baseClass=ilRepositoryGUI"; + break; + case 'svy': + $base_url= "ilias.php?cmd=infoScreen&cmdClass=ilObjSurveyGUI&baseClass=ilRepositoryGUI"; + break; + case 'exc': + $base_url= "ilias.php?cmd=infoScreen&cmdClass=ilExerciseHandlerGUI&baseClass=ilRepositoryGUI"; + break; + case 'sahs': + $base_url = "ilias.php?baseClass=ilSAHSPresentationGUI"; + break; + case 'htlm': + $base_url = "ilias.php?baseClass=ilHTLMPresentationGUI"; + break; + case 'glo': + $base_url = "ilias.php?baseClass=ilGlossaryPresentationGUI"; + break; + case 'cat': + case 'crs': + $base_url= "ilias.php?cmd=render&cmdClass=ilrepositorygui&baseClass=ilRepositoryGUI"; + break; + case 'webr': + $base_url= "ilias.php?cmd=calldirectlink&baseClass=ilLinkResourceHandlerGUI"; + break; + } + break; + case 'new': + $base_url = "ilias.php?baseClass=ilRepositoryGUI&cmd=create&new_type=".preg_replace('/[^a-z]/', '', $_GET['type']); + break; + case 'edit': + switch($_GET['type']) + { + case 'lm': + $base_url = "ilias.php?baseClass=ilLMEditorGUI"; + break; + case 'tst': + $base_url = "ilias.php?baseClass=ilObjTestGUI"; + break; + case 'sahs': + $base_url = "ilias.php?baseClass=ilSAHSEditGUI"; + break; + case 'htlm': + $base_url = "ilias.php?baseClass=ilHTLMEditorGUI"; + break; + case 'glo': + $base_url = "ilias.php?baseClass=ilGlossaryEditorGUI"; + break; + case 'svy': + $base_url = "ilias.php?baseClass=ilObjSurveyGUI"; + break; + case 'exc': + $base_url = "ilias.php?baseClass=ilExerciseHandlerGUI"; + break; + case 'webr': + $base_url = "ilias.php?baseClass=ilLinkResourceHandlerGUI"; + break; + } + break; + } + if ($base_url) + { + $base_url .= "&ref_id=".(int)$_GET['ref_id']; + $token_repository = new ilCtrlTokenRepository(); + $token = $token_repository->getToken(); + $base_url .= '&' . ilCtrlInterface::PARAM_CSRF_TOKEN . '=' . $token->getToken(); + header("Location: " . $base_url); + exit(); + } +} + diff --git a/lib/ilias_interface/ConnectedIlias.class.php b/lib/ilias_interface/ConnectedIlias.class.php index e2d63275087..4303c2e5a43 100644 --- a/lib/ilias_interface/ConnectedIlias.class.php +++ b/lib/ilias_interface/ConnectedIlias.class.php @@ -217,13 +217,13 @@ class ConnectedIlias public function getConnectionSettingsStatus() { // check ILIAS version - if (($this->ilias_int_version < 30000) || ($this->ilias_int_version > 80000)) { + if (($this->ilias_int_version < 30000)) { $this->error[] = _('Die ILIAS-Version ist ungültig.'); return false; } // check if url exists - $check = @get_headers($this->ilias_config['url'] . 'login.php'); + $check = @get_headers($this->ilias_config['url'] . 'webservice/soap/server.php'); if (strpos($check[0], '200') === false) { $this->error[] = sprintf(_('Die URL "%s" ist nicht erreichbar.'), $this->ilias_config['url']); return false; diff --git a/lib/ilias_interface/IliasSoap.class.php b/lib/ilias_interface/IliasSoap.class.php index 0ba7dd3d719..32aadd6dd38 100644 --- a/lib/ilias_interface/IliasSoap.class.php +++ b/lib/ilias_interface/IliasSoap.class.php @@ -372,10 +372,10 @@ class IliasSoap extends StudipSoapClient 'sid' => $this->getSID(), 'types' => $types, 'key' => $key, - 'combination' => $combination + 'combination' => $combination, + 'user_id' => (int)$user_id ]; - if ($user_id != "") - $param["user_id"] = $user_id; + $result = $this->call('searchObjects', $param); if ($result) { @@ -398,10 +398,10 @@ class IliasSoap extends StudipSoapClient { $param = [ 'sid' => $this->getSID(), - 'reference_id' => $ref + 'reference_id' => $ref, + 'user_id' => (int)$user_id ]; - if ($user_id != "") - $param["user_id"] = $user_id; + $result = $this->call('getObjectByReference', $param); if ($result != false) { @@ -425,7 +425,8 @@ class IliasSoap extends StudipSoapClient { $param = [ 'sid' => $this->getSID(), - 'title' => $key + 'title' => $key, + 'user_id' => 0 ]; $result = $this->call('getObjectsByTitle', $param); if ($result != false) @@ -459,9 +460,11 @@ class IliasSoap extends StudipSoapClient { $param = [ 'sid' => $this->getSID(), - 'title' => $key + 'title' => $key, + 'user_id' => 0 ]; $result = $this->call('getObjectsByTitle', $param); + if ($result != false) { $objects = $this->parseIliasObject($result); @@ -501,7 +504,7 @@ class IliasSoap extends StudipSoapClient $xml = "<!DOCTYPE Objects SYSTEM \"http://www.ilias.uni-koeln.de/download/dtd/ilias_object_0_1.dtd\"> <Objects> - <Object type=\"$type\"> + <Object type=\"$type\" obj_id=\"\" > <Title> $title </Title> @@ -594,11 +597,10 @@ class IliasSoap extends StudipSoapClient $param = [ 'sid' => $this->getSID(), 'ref_id' => $ref_id, - 'types' => $types + 'types' => $types, + 'user_id' => (int)$user_id ]; - if ($user_id != "") { - $param["user_id"] = $user_id; - } + $result = $this->call('getTreeChilds', $param); $tree_childs = []; if ($result != false) { @@ -897,17 +899,47 @@ class IliasSoap extends StudipSoapClient * * gets user-data for given user-id * @access public - * @param string user_id user-id + * @param string $user_id user-id * @return array user-data */ function getUser($user_id) { - $param = [ - 'sid' => $this->getSID(), - 'user_id' => $user_id, + if ($this->ilias_version < 80000) { + $param = [ + 'sid' => $this->getSID(), + 'user_id' => $user_id ]; - $result = $this->call('getUser', $param); // returns user data array - return $result; + $result = $this->call('getUser', $param); // returns user data array + return $result; + } else { + $param = [ + 'sid' => $this->getSID(), + 'user_ids' => [$user_id], + 'attach_roles' => 0, + ]; + $result = $this->call('getUserXML', $param); // returns user xml data + if ($result) { + $s = simplexml_load_string($result); + $user_array = []; + + foreach ($s->User as $user) { + $id_parts = explode('usr_', $user->attributes()->Id); + if ($id_parts[1] == $user_id) { + $user_array['usr_id'] = $user_id; + $user_array['user_language'] = (string)$user->attributes()->Language; + $user_array['login'] = (string)$user->Login; + $user_array['firstname'] = (string)$user->Firstname; + $user_array['lastname'] = (string)$user->Lastname; + $user_array['title'] = (string)$user->Title; + $user_array['email'] = (string)$user->Email; + $user_array['active'] = (string)$user->Active; + $user_array['authmode'] = (string)$user->AuthMode->attributes()->type; + return $user_array; + } + } + } + return false; + } } /** @@ -1227,17 +1259,45 @@ class IliasSoap extends StudipSoapClient * * deletes user-account * @access public - * @param string user_id user-id + * @param string $user_id user-id * @return string result */ function deleteUser($user_id) { $this->clearCache(); - $param = [ - 'sid' => $this->getSID(), - 'user_id' => $user_id + if ($this->ilias_version < 80000) { + $param = [ + 'sid' => $this->getSID(), + 'user_id' => $user_id + ]; + return $this->call('deleteUser', $param); // returns boolean + } else { + $user_data = $this->getUser($user_id); + if (!$user_data['login']) { + return false; + } + $usr_xml = '<Users> + <User Id="il_0_usr_' . $user_id . '" Action="Delete"> + <UDFDefinitions></UDFDefinitions><Login>' . $user_data['login'] . '</Login> + </User> + </Users>'; + + $param = [ + 'sid' => $this->getSID(), + 'folder_id' => -1, + 'usr_xml' => $usr_xml, + 'conflict_rule' => 1, + 'send_account_mail' => 0 ]; - return $this->call('deleteUser', $param); // returns boolean + $result = $this->call('importUsers', $param); + + $s = simplexml_load_string($result); + + if ((string)$s->rows->row->column[3] == "successful") { + return (string)$s->rows->row->column[0]; + } + return false; + } } //////////////////////////// @@ -1453,7 +1513,7 @@ class IliasSoap extends StudipSoapClient <Course> <MetaData> <General Structure=\"Hierarchical\"> - <Identifier Catalog=\"ILIAS\"/> + <Identifier Catalog=\"ILIAS\" Entry=\"\"/> <Title Language=\"$crs_language\"> $crs_title </Title> diff --git a/lib/soap/StudipSoapClient_PHP5.class.php b/lib/soap/StudipSoapClient_PHP5.class.php index 23bfa9c47d8..0aafd4af567 100644 --- a/lib/soap/StudipSoapClient_PHP5.class.php +++ b/lib/soap/StudipSoapClient_PHP5.class.php @@ -19,7 +19,7 @@ class StudipSoapClient try { $this->soap_client = new SoapClient($path, ['trace' => 0]); } catch (SoapFault $fault) { - $this->error = "<b>Soap Constructor Error</b><br>" . $fault->faultcode . ": ".$fault->faultstring."<br><br>"; + $this->error = "Soap Constructor Error " . $fault->faultcode . ": ".$fault->faultstring; } } @@ -33,7 +33,8 @@ class StudipSoapClient } catch (SoapFault $fault) { $this->faultstring = $fault->faultstring; if (!in_array(mb_strtolower($this->faultstring), ["session not valid","session invalid", "session idled"])) { - $this->error .= "<hr><font size=\"-1\"><b>" . sprintf(_("SOAP-Fehler, Funktion \"%s\":"), $method) . "</b> " . $fault->faultstring . " (" . $fault->faultcode . ")<br>".print_r($params,1).'</font><hr>'; + unset($params['password']); + $this->error .= sprintf(_("SOAP-Fehler, Funktion \"%s\":"), $method) . " " . $fault->faultstring . " (" . $fault->faultcode . ")".print_r($params,1); error_log($this->error); } $this->soap_client->fault = true; @@ -60,4 +61,3 @@ class StudipSoapClient return false; } } -?> -- GitLab