From 7bdeb341efea0ca705cdff59a83169df2e9f8741 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Arne=20Schr=C3=B6der=2C=20M=2E=20A?=
 <schroeder@data-quest.de>
Date: Fri, 17 Dec 2021 13:12:14 +0000
Subject: [PATCH] =?UTF-8?q?Resolve=20"Anpassung=20der=20ILIAS-Schnittstell?=
 =?UTF-8?q?e=20f=C3=BCr=20Nutzung=20mit=20ILIAS-seitiger=20LDAP/Shibboleth?=
 =?UTF-8?q?-Anbindung"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/controllers/admin/ilias_interface.php     |  4 ++-
 app/controllers/my_ilias_accounts.php         | 36 +++++++++++--------
 .../admin/ilias_interface/edit_content.php    |  2 +-
 .../admin/ilias_interface/edit_server.php     | 14 +++++---
 app/views/my_ilias_accounts/index.php         | 12 +++++++
 lib/ilias_interface/ConnectedIlias.class.php  | 19 ++++++++++
 6 files changed, 65 insertions(+), 22 deletions(-)

diff --git a/app/controllers/admin/ilias_interface.php b/app/controllers/admin/ilias_interface.php
index 383fe391a6a..c718e1c51a6 100755
--- a/app/controllers/admin/ilias_interface.php
+++ b/app/controllers/admin/ilias_interface.php
@@ -134,6 +134,7 @@ class Admin_IliasInterfaceController extends AuthenticatedController
                             'url' => _('https://<URL zur ILIAS-Installation>'),
                             'client' => '',
                             'ldap_enable' => '',
+                            'no_account_updates' => false,
                             'admin' => 'ilias_soap_admin',
                             'admin_pw' => '',
 
@@ -211,7 +212,7 @@ class Admin_IliasInterfaceController extends AuthenticatedController
             $this->ilias_config = $this->ilias_configs[$index];
             $ldap_options = [];
             foreach (StudipAuthAbstract::GetInstance() as $plugin) {
-                if ($plugin instanceof StudipAuthLdap) {
+                if (!($plugin instanceof StudipAuthStandard)) {
                     $ldap_options[] = '<option '.($plugin->plugin_name == $this->ilias_config['ldap_enable'] ? 'selected' : '').'>' . $plugin->plugin_name . '</option>';
                 }
             }
@@ -291,6 +292,7 @@ class Admin_IliasInterfaceController extends AuthenticatedController
                 if (Request::getInstance()->offsetExists('ilias_ldap_enable')) {
                     $this->ilias_configs[$index]['ldap_enable'] = Request::get('ilias_ldap_enable');
                 }
+                $this->ilias_configs[$index]['no_account_updates'] = Request::get('ilias_no_account_updates');
                 $this->ilias_configs[$index]['admin'] = Request::get('ilias_admin');
                 $this->ilias_configs[$index]['admin_pw'] = Request::get('ilias_admin_pw');
 
diff --git a/app/controllers/my_ilias_accounts.php b/app/controllers/my_ilias_accounts.php
index ca97da767a1..cc1a77a5f14 100755
--- a/app/controllers/my_ilias_accounts.php
+++ b/app/controllers/my_ilias_accounts.php
@@ -85,7 +85,7 @@ class MyIliasAccountsController extends AuthenticatedController
             PageLayout::setTitle($this->module->getTitle());
             $this->ilias_index = $index;
         } else {
-            PageLayout::postError(_("Diese ILIAS-Installation ist nicht aktiv."));
+            PageLayout::postError(_('Diese ILIAS-Installation ist nicht aktiv.'));
         }
     }
 
@@ -100,7 +100,7 @@ class MyIliasAccountsController extends AuthenticatedController
             $this->ilias_ref_id = $this->ilias->user->getCategory();
             $this->ilias_index = $index;
         } else {
-            PageLayout::postError(_("Diese ILIAS-Installation ist nicht aktiv."));
+            PageLayout::postError(_('Diese ILIAS-Installation ist nicht aktiv.'));
         }
     }
 
@@ -131,7 +131,7 @@ class MyIliasAccountsController extends AuthenticatedController
                 case 'update' :
                     // update user account
                     if ($this->ilias->updateUser($GLOBALS['user'])) {
-                        PageLayout::postSuccess(_("ILIAS-Account aktualisiert."));
+                        PageLayout::postSuccess(_('ILIAS-Account aktualisiert.'));
                     }
                     break;
                 case 'add' :
@@ -144,17 +144,17 @@ class MyIliasAccountsController extends AuthenticatedController
                             $this->ilias->user->setPassword('');
                             $this->ilias->user->setId($user_id);
                             $this->ilias->user->setConnection(IliasUser::USER_TYPE_ORIGINAL);
-                            PageLayout::postSuccess(_("ILIAS-Account zugeordnet."));
+                            PageLayout::postSuccess(_('ILIAS-Account zugeordnet.'));
                             $this->ilias->soap_client->clearCache();
                         }
                     } else {
                         // wrong login
-                        PageLayout::postError(_("Login fehlgeschlagen. Die Zuordnung konnte nicht geändert werden."));
+                        PageLayout::postError(_('Login fehlgeschlagen. Die Zuordnung konnte nicht geändert werden.'));
                     }
                     break;
                 case 'remove' :
                     $this->ilias->user->unsetConnection();
-                    PageLayout::postSuccess(_("Account-Zuordnung entfernt."));
+                    PageLayout::postSuccess(_('Account-Zuordnung entfernt.'));
                     break;
             }
         }
@@ -177,16 +177,22 @@ class MyIliasAccountsController extends AuthenticatedController
                 $module_id = $this->ilias->user->category;
             }
             // display error message if session is invalid
-            if (!$session_id) {
-                PageLayout::postError(sprintf(_("Automatischer Login für %s-Installation (Nutzername %s) fehlgeschlagen."),
+            if (! $this->ilias->user->isConnected() && $this->ilias->ilias_config['no_account_updates']) {
+                PageLayout::postError(sprintf(
+                    _('Sie haben im System %s noch keinen Account. Loggen Sie sich zuerst in %s ein, um ILIAS-Lernobjekte in Stud.IP nutzen zu können.'),
+                    htmlReady($this->ilias->getName()),
+                    '<a href="'.$this->ilias->getAbsolutePath().'">'.htmlReady($this->ilias->getName()).'</a>'
+                ));
+            } elseif (!$session_id) {
+                PageLayout::postError(sprintf(_('Automatischer Login für %s-Installation (Nutzername %s) fehlgeschlagen.'),
                         htmlReady($this->ilias->getName()),
                         htmlReady($this->ilias->user->getUsername())));
             } elseif (($target == 'new') AND ! $module_id) {
-                PageLayout::postError(sprintf(_("Keine Kategorie zum Anlegen neuer Lernobjekte in der %s-Installation vorhanden."),
+                PageLayout::postError(sprintf(_('Keine Kategorie zum Anlegen neuer Lernobjekte in der %s-Installation vorhanden.'),
                         htmlReady($this->ilias->getName())));
             } else {
                 // remove client id from session id
-                $session_array = explode("::", $session_id);
+                $session_array = explode('::', $session_id);
                 $session_id = $session_array[0];
 
                 if (Request::get('ilias_module_type')) $module_type = Request::get('ilias_module_type');
@@ -194,19 +200,19 @@ class MyIliasAccountsController extends AuthenticatedController
                 // build target link
                 $parameters = '?sess_id='.$session_id;
                 if (!empty($this->ilias->getClientId())) {
-                    $parameters .= "&client_id=".$this->ilias->getClientId();
+                    $parameters .= '&client_id='.$this->ilias->getClientId();
                     if ($target) {
-                        $parameters .= "&target=".$target;
+                        $parameters .= '&target='.$target;
                     }
                     if ($module_id) {
-                        $parameters .= "&ref_id=".$module_id;
+                        $parameters .= '&ref_id='.$module_id;
                     }
                     if ($module_type) {
-                        $parameters .= "&type=".$module_type;
+                        $parameters .= '&type='.$module_type;
                     }
 
                     // refer to ILIAS target file
-                    header("Location: ". $this->ilias->getTargetFile() . $parameters);
+                    header('Location: '. $this->ilias->getTargetFile() . $parameters);
                     $this->render_nothing();
                 }
             }
diff --git a/app/views/admin/ilias_interface/edit_content.php b/app/views/admin/ilias_interface/edit_content.php
index 4e0c51b3b7e..908e1936ece 100755
--- a/app/views/admin/ilias_interface/edit_content.php
+++ b/app/views/admin/ilias_interface/edit_content.php
@@ -28,7 +28,7 @@
         <span><?= _('Beim Löschen von Stud.IP-Accounts ILIAS-Accounts ebenfalls löschen (alle zugehörigen Objekte werden gelöscht!)') ?></span>
     </label>
     <label>
-        <span class="required"><?= _('Prefix für automatisch angelegte Usernamen') ?></span>
+        <span><?= _('Prefix für automatisch angelegte Usernamen') ?></span>
         <? if ($ilias_config['is_active']) : ?>
             <div><?=$ilias_config['user_prefix'] ? htmlReady($ilias_config['user_prefix']) : _('Kein Präfix')?></div>
         <? else : ?>
diff --git a/app/views/admin/ilias_interface/edit_server.php b/app/views/admin/ilias_interface/edit_server.php
index 50c859ae145..b8b47bfe1be 100755
--- a/app/views/admin/ilias_interface/edit_server.php
+++ b/app/views/admin/ilias_interface/edit_server.php
@@ -55,18 +55,22 @@
             <? endif ?>
         </label>
         <label>
-            <span><?= _('LDAP-Einstellung') ?></span>
+            <span><?= _('Externe Authentifizierung') ?></span>
             <? if ($ldap_options) : ?>
                 <select name="ilias_ldap_enable">
                 <?=$ldap_options;?>
                 </select><br>
-                <?=_("Authentifizierungsplugin (nur LDAP) beim Anlegen von externen Accounts übernehmen.");?>
-                <?=Icon::create('info-circle', 'inactive', ['title' => _("Wählen Sie hier ein Authentifizierungsplugin, damit neu angelegte ILIAS-Accounts den Authentifizierungsmodus LDAP erhalten, wenn dieser Modus auch für den vorhandenen Stud.IP-Account gilt. Andernfalls erhalten alle ILIAS-Accounts den default-Modus")])->asImg(16);?>
+                <?=_("Authentifizierungsplugin (nur LDAP/Shibboleth) beim Anlegen von externen Accounts übernehmen.");?>
+                <?=Icon::create('info-circle', 'inactive', ['title' => _("Wählen Sie hier ein Authentifizierungsplugin, damit neu angelegte ILIAS-Accounts den entsprechenden Authentifizierungsmodus erhalten, wenn dieser Modus auch für den vorhandenen Stud.IP-Account gilt. Andernfalls erhalten alle ILIAS-Accounts den default-Modus")])->asImg(16);?>
             <? else : ?>
-                <br><?=_("(Um diese Einstellung zu nutzen muss zumindest ein LDAP Authentifizierungsplugin aktiviert sein.)");?>
+                <br><?=_("(Um diese Einstellung zu nutzen muss zumindest ein Authentifizierungsplugin aktiviert sein.)");?>
                 <input type="hidden" name="ilias_ldap_enable" value="">
             <? endif ?>
         </label>
+        <label>
+            <input type="checkbox" name="ilias_no_account_updates" value="1" <?= $ilias_config['no_account_updates'] ? 'checked' : '' ?>>
+            <span><?= _('Keine Accounts aus Stud.IP in ILIAS anlegen oder aktualisieren') ?></span>
+        </label>
         <label>
             <span class="required">  <?= _('Admin-Account') ?></span>
             <input type="text" name="ilias_admin" size="50" maxlength="255" value="<?= $ilias_config['admin'] ?>" required>
@@ -84,4 +88,4 @@
         <? endif ?>
         <?= Studip\Button::createCancel(_('Abbrechen'), 'cancel', ['data-dialog' => 'close']) ?>
     </footer>
-</form>
\ No newline at end of file
+</form>
diff --git a/app/views/my_ilias_accounts/index.php b/app/views/my_ilias_accounts/index.php
index 1dd77d6ed15..a8d1a802f13 100755
--- a/app/views/my_ilias_accounts/index.php
+++ b/app/views/my_ilias_accounts/index.php
@@ -98,6 +98,7 @@
         </thead>
         <tbody>
         <? foreach($ilias_list as $ilias_index => $ilias) : ?>
+        <? if ($ilias->user->getUserName()) : ?>
             <tr id="ilias-account-<?= htmlReady($ilias_index)?>">
                 <td><?=Icon::create('person', Icon::ROLE_INFO, [
                                 'title'        => $ilias->user->getUserName()
@@ -143,6 +144,17 @@
                     <?= $actionMenu->render() ?>
                 </td>
             </tr>
+        <? else : ?>
+        <tr>
+            <td colspan="4">
+                 <?= sprintf(
+                     _("Sie haben im System %s noch keinen Account. Loggen Sie sich zuerst in %s ein, um ILIAS-Lernobjekte in Stud.IP nutzen zu können."),
+                     htmlReady($ilias->getName()),
+                     "<a href=\"".$ilias->getAbsolutePath()."\">".htmlReady($ilias->getName())."</a>"
+                 )?>
+            </td>
+        </tr>
+        <? endif ?>
         <? endforeach ?>
         </tbody>
     </table>
diff --git a/lib/ilias_interface/ConnectedIlias.class.php b/lib/ilias_interface/ConnectedIlias.class.php
index 3aed79242fe..2ac9589e3b8 100644
--- a/lib/ilias_interface/ConnectedIlias.class.php
+++ b/lib/ilias_interface/ConnectedIlias.class.php
@@ -324,6 +324,7 @@ class ConnectedIlias
         }
         $user_data = $this->user->getUserArray();
         $user_data["login"] = $this->ilias_config['user_prefix'].$user_data["login"];
+        $user_data['auth_mode'] = 'default';
 
         $user_exists = $this->soap_client->lookupUser($user_data["login"]);
         //automatische Zuordnung von bestehenden Ilias Accounts
@@ -339,6 +340,14 @@ class ConnectedIlias
         } elseif ($user_exists) {
             $this->error[] = sprintf(_('Externer Account konnte nicht angelegt werden. Es existiert bereits ein User mit dem Login %s in %s'), $user_data["login"], $this->ilias_config['name']);
             return false;
+        } elseif ($this->ilias_config['no_account_updates']) {
+            $this->error[] = sprintf(_('Sie haben noch keinen ILIAS-Account. Loggen Sie sich zuerst in %s ein, um ILIAS-Lernobjekte in Stud.IP nutzen zu können.'), "<a href=\"".$this->ilias_config['url']."\">".$this->ilias_config['name']."</a>");
+            return false;
+        } elseif (! $this->ilias_config['user_prefix'] &&
+            $this->ilias_config['ldap_enable'] &&
+            ($this->user->auth_plugin != 'standard') &&
+            ($this->user->auth_plugin == $this->ilias_config['ldap_enable'])) {
+            $user_data['external_account'] = $this->user->studip_login;
         }
 
         // set role according to Stud.IP perm
@@ -376,6 +385,15 @@ class ConnectedIlias
             return false;
         }
         $update_user = new IliasUser($this->index, $this->ilias_config['version'], $user->id);
+      // don't update ldap user
+        if (! $this->ilias_config['user_prefix'] &&
+            $this->ilias_config['ldap_enable'] &&
+            ($update_user->auth_plugin != 'standard') &&
+            ($update_user->auth_plugin == $this->ilias_config['ldap_enable'])) {
+            return true;
+        } elseif ($this->ilias_config['no_account_updates']) {
+            return true;
+        }
         // if user is manually connected don't update user data
         if ($update_user->getUserType() == IliasUser::USER_TYPE_ORIGINAL) {
             return true;
@@ -385,6 +403,7 @@ class ConnectedIlias
         if ($update_user->isConnected() && $update_user->id && $this->soap_client->lookupUser($update_user->login)) {
             $user_data = $update_user->getUserArray();
             $user_data["login"] = $this->ilias_config['user_prefix'].$user_data["login"];
+            $user_data['auth_mode'] = 'default';
 
             // set role according to Stud.IP perm
             if ($user->perms == "root") {
-- 
GitLab