diff --git a/Modules/File/classes/Versions/class.ilFileVersionsGUI.php b/Modules/File/classes/Versions/class.ilFileVersionsGUI.php index 36b8f780c327..cd33f91be485 100644 --- a/Modules/File/classes/Versions/class.ilFileVersionsGUI.php +++ b/Modules/File/classes/Versions/class.ilFileVersionsGUI.php @@ -28,6 +28,7 @@ use ILIAS\Services\WOPI\Embed\EmbeddedApplication; use ILIAS\Data\URI; use ILIAS\UI\Component\Modal\Modal; +use ILIAS\Services\WOPI\Discovery\ActionTarget; /** * @author Fabian Schmid @@ -200,7 +201,8 @@ public function executeCommand(): void return; case strtolower(ilWOPIEmbeddedApplicationGUI::class): $action = $this->action_repo->getActionForSuffix( - $this->current_revision->getInformation()->getSuffix() + $this->current_revision->getInformation()->getSuffix(), + ActionTarget::EDIT ); $embeded_application = new EmbeddedApplication( @@ -329,7 +331,8 @@ private function index(): void $suffix = $this->current_revision?->getInformation()?->getSuffix(); if ($this->action_repo->hasActionForSuffix( - $this->current_revision->getInformation()->getSuffix() + $this->current_revision->getInformation()->getSuffix(), + ActionTarget::EDIT )) { $external_editor = $this->ui->factory() ->button() diff --git a/Modules/File/classes/class.ilObjFileGUI.php b/Modules/File/classes/class.ilObjFileGUI.php index d7715662e56f..6618d12cb422 100755 --- a/Modules/File/classes/class.ilObjFileGUI.php +++ b/Modules/File/classes/class.ilObjFileGUI.php @@ -30,6 +30,7 @@ use ILIAS\Services\WOPI\Discovery\ActionDBRepository; use ILIAS\Services\WOPI\Embed\EmbeddedApplication; use ILIAS\Data\URI; +use ILIAS\Services\WOPI\Discovery\ActionTarget; /** * GUI class for file objects. @@ -241,7 +242,8 @@ public function executeCommand(): void return; } $action = $this->action_repo->getActionForSuffix( - $this->object->getFileExtension() + $this->object->getFileExtension(), + ActionTarget::EDIT ); if (null === $action) { $this->error->raiseError($this->lng->txt("no_action_avaliable"), $this->error->MESSAGE); @@ -784,7 +786,8 @@ public function infoScreenForward(): void if ( $this->checkPermissionBool("edit_file") && $this->action_repo->hasActionForSuffix( - $this->object->getFileExtension() + $this->object->getFileExtension(), + ActionTarget::EDIT )) { $external_editor = $this->ui->factory() ->button() diff --git a/Modules/File/classes/class.ilObjFileListGUI.php b/Modules/File/classes/class.ilObjFileListGUI.php index bee44d7e736c..86045e235cd9 100644 --- a/Modules/File/classes/class.ilObjFileListGUI.php +++ b/Modules/File/classes/class.ilObjFileListGUI.php @@ -23,6 +23,7 @@ use ILIAS\ResourceStorage\Services; use ILIAS\Data\DataSize; use ILIAS\Services\WOPI\Discovery\ActionDBRepository; +use ILIAS\Services\WOPI\Discovery\ActionTarget; /** * Class ilObjFileListGUI @@ -252,7 +253,7 @@ public function checkCommandAccess( $additional_check = match ($cmd) { ilFileVersionsGUI::CMD_UNZIP_CURRENT_REVISION => ilObjFileAccess::isZIP($data['mime'] ?? null), - 'editExternal' => $this->action_repo->hasActionForSuffix($data['suffix'] ?? ''), + 'editExternal' => $this->action_repo->hasActionForSuffix($data['suffix'] ?? '', ActionTarget::EDIT), default => true, }; diff --git a/Services/Authentication/classes/class.ilSession.php b/Services/Authentication/classes/class.ilSession.php index c4aa082c9e3a..02a33ffe32be 100755 --- a/Services/Authentication/classes/class.ilSession.php +++ b/Services/Authentication/classes/class.ilSession.php @@ -228,9 +228,9 @@ public static function _exists(string $a_session_id): bool /** * Destroy session * - * @param string|array session id|s - * @param int closing context - * @param int|bool expired at timestamp + * @param string|array $a_session_id session id|s + * @param int|null $a_closing_context closing context + * @param int|bool $a_expired_at expired at timestamp */ public static function _destroy($a_session_id, ?int $a_closing_context = null, $a_expired_at = null): bool { @@ -260,6 +260,18 @@ public static function _destroy($a_session_id, ?int $a_closing_context = null, $ $ilDB->manipulate($q); + try { + // only delete session cookie if it is set in the current request + if ($DIC->http()->wrapper()->cookie()->has(session_name()) && + $DIC->http()->wrapper()->cookie()->retrieve(session_name(), $DIC->refinery()->kindlyTo()->string()) === $a_session_id) { + $cookieJar = $DIC->http()->cookieJar()->without(session_name()); + $cookieJar->renderIntoResponseHeader($DIC->http()->response()); + } + } catch (\Throwable $e) { + // ignore + // this is needed for "header already" sent errors when the random cleanup of expired sessions is triggered + } + return true; } diff --git a/Services/Init/classes/class.ilInitialisation.php b/Services/Init/classes/class.ilInitialisation.php index 47a5f3508231..cd207f3a1de2 100644 --- a/Services/Init/classes/class.ilInitialisation.php +++ b/Services/Init/classes/class.ilInitialisation.php @@ -945,11 +945,12 @@ protected static function goToLogin(): void { global $DIC; - $a_auth_stat = ""; + $session_expired = false; ilLoggerFactory::getLogger('init')->debug('Redirecting to login page.'); if ($DIC['ilAuthSession']->isExpired()) { ilSession::setClosingContext(ilSession::SESSION_CLOSE_EXPIRE); + $session_expired = true; } if (!$DIC['ilAuthSession']->isAuthenticated()) { ilSession::setClosingContext(ilSession::SESSION_CLOSE_LOGIN); @@ -974,8 +975,8 @@ protected static function goToLogin(): void ]) ); - $script = "login.php?" . $target . "client_id=" . $client_id . - "&auth_stat=" . $a_auth_stat; + $script = "login.php?" . $target . "client_id=" . $client_id; + $script .= $session_expired ? "&session_expired=1" : ""; self::redirect( $script, @@ -1342,6 +1343,10 @@ public static function resumeUserSession(): void !$DIC['ilAuthSession']->isAuthenticated() or $DIC['ilAuthSession']->isExpired() ) { + if ($GLOBALS['DIC']['ilAuthSession']->isExpired()) { + ilSession::_destroy($_COOKIE[session_name()], ilSession::SESSION_CLOSE_EXPIRE); + } + ilLoggerFactory::getLogger('init')->debug('Current session is invalid: ' . $GLOBALS['DIC']['ilAuthSession']->getId()); $current_script = substr(strrchr($_SERVER["PHP_SELF"], "/"), 1); if (self::blockedAuthentication($current_script)) { diff --git a/Services/Init/classes/class.ilStartUpGUI.php b/Services/Init/classes/class.ilStartUpGUI.php index f926722cfb03..e1ac040af75d 100755 --- a/Services/Init/classes/class.ilStartUpGUI.php +++ b/Services/Init/classes/class.ilStartUpGUI.php @@ -272,7 +272,7 @@ private function showLoginPage(ILIAS\UI\Component\Input\Container\Form\Form $for $page_editor_html = $this->purgePlaceholders($page_editor_html); // check expired session and send message - if ($this->authSession->isExpired()) { + if ($this->authSession->isExpired() || $this->http->wrapper()->query()->has('session_expired')) { $this->mainTemplate->setOnScreenMessage('failure', $this->lng->txt('auth_err_expired')); } elseif ($this->http->wrapper()->query()->has('reg_confirmation_msg')) { $this->lng->loadLanguageModule('registration'); diff --git a/Services/Mail/classes/class.ilObjMailGUI.php b/Services/Mail/classes/class.ilObjMailGUI.php index ca2a490a635a..1075d996a671 100755 --- a/Services/Mail/classes/class.ilObjMailGUI.php +++ b/Services/Mail/classes/class.ilObjMailGUI.php @@ -636,7 +636,7 @@ protected function saveExternalSettingsFormObject(): void return; } - // If all forms in ILIAS use the UI/KS forms (here and in Services/Mail), we should move this to a propert constraint/trafo + // If all forms in ILIAS use the UI/KS forms (here and in Services/Mail), we should move this to a proper constraint/trafo $is_valid_template_syntax = $this->refinery->custom()->constraint(function ($value): bool { try { $this->mustache_factory->getBasicEngine()->render((string) $value, []); diff --git a/Services/Registration/classes/class.ilAccountRegistrationGUI.php b/Services/Registration/classes/class.ilAccountRegistrationGUI.php index ee714511c7c3..44211f4ed0c4 100644 --- a/Services/Registration/classes/class.ilAccountRegistrationGUI.php +++ b/Services/Registration/classes/class.ilAccountRegistrationGUI.php @@ -446,7 +446,7 @@ protected function createUser(int $a_role): string case "relative": $rel = unserialize($code_data["alimitdt"], ['allowed_classes' => false]); - $access_limit = $rel["d"] * 86400 + $rel["m"] * 2592000 + $rel["y"] * 31536000 + time(); + $access_limit = (int) ($rel["d"] * 86400 + $rel["m"] * 2592000 + $rel["y"] * 31536000 + time()); break; } } diff --git a/Services/Skill/Node/class.ilBasicSkill.php b/Services/Skill/Node/class.ilBasicSkill.php index 1ede2942ee01..2690dc2ea6ce 100644 --- a/Services/Skill/Node/class.ilBasicSkill.php +++ b/Services/Skill/Node/class.ilBasicSkill.php @@ -19,13 +19,13 @@ ******************************************************************** */ -use ILIAS\Skill\Usage\SkillUsageManager; +use ILIAS\Skill\Usage; /** * Basic Skill * @author Alex Killing */ -class ilBasicSkill extends ilSkillTreeNode implements ilSkillUsageInfo +class ilBasicSkill extends ilSkillTreeNode implements Usage\SkillUsageInfo { protected ilObjUser $user; protected ilSkillLevelRepository $bsc_skl_lvl_db_rep; @@ -598,7 +598,7 @@ public static function getUsageInfo(array $a_cskill_ids): array return $usage_manager->getUsageInfoGeneric( $a_cskill_ids, - SkillUsageManager::USER_ASSIGNED, + Usage\SkillUsageManager::USER_ASSIGNED, "skl_user_skill_level", "user_id" ); diff --git a/Services/Skill/Personal/class.AssignedMaterialManager.php b/Services/Skill/Personal/class.AssignedMaterialManager.php index 377e36914df5..fff9b8df74b2 100644 --- a/Services/Skill/Personal/class.AssignedMaterialManager.php +++ b/Services/Skill/Personal/class.AssignedMaterialManager.php @@ -21,12 +21,12 @@ namespace ILIAS\Skill\Personal; -use ILIAS\Skill\Usage\SkillUsageManager; +use ILIAS\Skill\Usage; /** * @author Thomas Famula */ -class AssignedMaterialManager implements \ilSkillUsageInfo +class AssignedMaterialManager implements Usage\SkillUsageInfo { protected AssignedMaterialDBRepository $ass_mat_repo; protected PersonalSkillDBRepository $personal_repo; @@ -116,7 +116,7 @@ public static function getUsageInfo(array $a_cskill_ids): array // material $usages = $usage_manager->getUsageInfoGeneric( $a_cskill_ids, - SkillUsageManager::USER_MATERIAL, + Usage\SkillUsageManager::USER_MATERIAL, "skl_assigned_material", "user_id" ); diff --git a/Services/Skill/Profile/class.SkillProfileManager.php b/Services/Skill/Profile/class.SkillProfileManager.php index 2ad1d7a8b7fb..7c826ed2aade 100644 --- a/Services/Skill/Profile/class.SkillProfileManager.php +++ b/Services/Skill/Profile/class.SkillProfileManager.php @@ -21,12 +21,12 @@ namespace ILIAS\Skill\Profile; -use ILIAS\Skill\Usage\SkillUsageManager; +use ILIAS\Skill\Usage; /** * @author Thomas Famula */ -class SkillProfileManager implements \ilSkillUsageInfo +class SkillProfileManager implements Usage\SkillUsageInfo { protected SkillProfileDBRepository $profile_repo; protected SkillProfileLevelsDBRepository $profile_levels_repo; @@ -462,7 +462,7 @@ public static function getUsageInfo(array $a_cskill_ids): array return $usage_manager->getUsageInfoGeneric( $a_cskill_ids, - SkillUsageManager::PROFILE, + Usage\SkillUsageManager::PROFILE, "skl_profile_level", "profile_id", "base_skill_id" diff --git a/Services/Skill/Resource/class.SkillResourcesManager.php b/Services/Skill/Resource/class.SkillResourcesManager.php index f2a36f428321..64b02fea4754 100644 --- a/Services/Skill/Resource/class.SkillResourcesManager.php +++ b/Services/Skill/Resource/class.SkillResourcesManager.php @@ -21,7 +21,7 @@ namespace ILIAS\Skill\Resource; -use ILIAS\Skill\Usage\SkillUsageManager; +use ILIAS\Skill\Usage; /** * Manages resources for skills. This is not about user assigned materials, @@ -34,7 +34,7 @@ * * @author Thomas Famula */ -class SkillResourcesManager implements \ilSkillUsageInfo +class SkillResourcesManager implements Usage\SkillUsageInfo { protected SkillResourceDBRepository $skill_res_repo; protected \ilSkillLevelRepository $level_repo; @@ -227,7 +227,7 @@ public static function getUsageInfo(array $a_cskill_ids): array return $usage_manager->getUsageInfoGeneric( $a_cskill_ids, - SkillUsageManager::RESOURCE, + Usage\SkillUsageManager::RESOURCE, "skl_skill_resource", "rep_ref_id", "base_skill_id" diff --git a/Services/Skill/Service/classes/class.SkillService.php b/Services/Skill/Service/classes/class.SkillService.php index 815ea3e61463..7f495a5f50eb 100644 --- a/Services/Skill/Service/classes/class.SkillService.php +++ b/Services/Skill/Service/classes/class.SkillService.php @@ -92,6 +92,14 @@ public function personal(): SkillPersonalService return new SkillPersonalService($this->internal()); } + /** + * External usage service facade + */ + public function usage(): SkillUsageService + { + return new SkillUsageService($this->internal()); + } + /** * @inheritDoc */ diff --git a/Services/Skill/Service/classes/class.SkillUsageService.php b/Services/Skill/Service/classes/class.SkillUsageService.php new file mode 100644 index 000000000000..bd284a598cf6 --- /dev/null +++ b/Services/Skill/Service/classes/class.SkillUsageService.php @@ -0,0 +1,47 @@ +usage_manager = $internal_service->manager()->getUsageManager(); + } + + public function addUsage(int $obj_id, int $skill_id, int $tref_id): void + { + $this->usage_manager->addUsage($obj_id, $skill_id, $tref_id); + } + + public function removeUsage(int $obj_id, int $skill_id, int $tref_id): void + { + $this->usage_manager->removeUsage($obj_id, $skill_id, $tref_id); + } +} diff --git a/Services/Skill/Usage/class.SkillUsageManager.php b/Services/Skill/Usage/class.SkillUsageManager.php index e04485d736ba..c79dea34dde1 100644 --- a/Services/Skill/Usage/class.SkillUsageManager.php +++ b/Services/Skill/Usage/class.SkillUsageManager.php @@ -43,7 +43,7 @@ * * @author Alex Killing */ -class SkillUsageManager implements \ilSkillUsageInfo +class SkillUsageManager implements SkillUsageInfo { public const TYPE_GENERAL = "gen"; public const USER_ASSIGNED = "user"; @@ -54,7 +54,7 @@ class SkillUsageManager implements \ilSkillUsageInfo public const RESOURCE = "res"; /** - * @var \ilSkillUsageInfo[] + * @var SkillUsageInfo[] */ protected array $classes = [\ilBasicSkill::class, AssignedMaterialManager::class, SkillProfileManager::class, SkillResourcesManager::class, SkillUsageManager::class]; diff --git a/Services/Skill/interfaces/interface.ilSkillUsageInfo.php b/Services/Skill/Usage/interfaces/interface.SkillUsageInfo.php similarity index 94% rename from Services/Skill/interfaces/interface.ilSkillUsageInfo.php rename to Services/Skill/Usage/interfaces/interface.SkillUsageInfo.php index 0c42ce5976dc..ec71a83766e1 100644 --- a/Services/Skill/interfaces/interface.ilSkillUsageInfo.php +++ b/Services/Skill/Usage/interfaces/interface.SkillUsageInfo.php @@ -17,6 +17,8 @@ * ********************************************************************/ +namespace ILIAS\Skill\Usage; + /** * Get info on usages of skills * @@ -25,7 +27,7 @@ * * @ingroup ServicesSkill */ -interface ilSkillUsageInfo +interface SkillUsageInfo { /** * Get title of an assigned item diff --git a/Services/User/classes/class.ilObjUserFolderGUI.php b/Services/User/classes/class.ilObjUserFolderGUI.php index 7842bed647fb..3469b358464a 100755 --- a/Services/User/classes/class.ilObjUserFolderGUI.php +++ b/Services/User/classes/class.ilObjUserFolderGUI.php @@ -3084,13 +3084,15 @@ protected function initNewAccountMailForm(): ilPropertyFormGUI return $form; } - public function newAccountMailObject(): void + public function newAccountMailObject(ilPropertyFormGUI $form = null): void { $this->setSubTabs('settings'); $this->tabs_gui->setTabActive('settings'); $this->tabs_gui->setSubTabActive('user_new_account_mail'); - $form = $this->initNewAccountMailForm(); + if ($form === null) { + $form = $this->initNewAccountMailForm(); + } $ftpl = new ilTemplate( 'tpl.usrf_new_account_mail.html', @@ -3102,7 +3104,6 @@ public function newAccountMailObject(): void 'FORM', $form->getHTML() ); - unset($form); // placeholder help text $ftpl->setVariable( @@ -3191,7 +3192,47 @@ public function cancelNewAccountMailObject(): void public function saveNewAccountMailObject(): void { + $form = $this->initNewAccountMailForm(); + + // If all forms in ILIAS use the UI/KS forms (here and in Services/Mail), we should move this to a proper constraint/trafo + $is_valid_template_syntax = $this->dic->refinery()->custom()->constraint(function ($value): bool { + try { + $this->dic->mail()->mustacheFactory()->getBasicEngine()->render((string) $value, []); + return true; + } catch (Exception) { + return false; + } + }, $this->dic->language()->txt('mail_template_invalid_tpl_syntax')); + + $valid_templates = true; $langs = $this->lng->getInstalledLanguages(); + foreach ($langs as $lang_key) { + $subject = $this->user_request->getMailSubject($lang_key); + try { + $is_valid_template_syntax->check($subject); + } catch (Exception) { + $form->getItemByPostVar('subject_' . $lang_key)->setAlert( + $is_valid_template_syntax->problemWith($subject) + ); + $valid_templates = false; + } + + $body = $this->user_request->getMailBody($lang_key); + try { + $is_valid_template_syntax->check($body); + } catch (Exception) { + $form->getItemByPostVar('body_' . $lang_key)->setAlert( + $is_valid_template_syntax->problemWith($body) + ); + $valid_templates = false; + } + } + if (!$valid_templates) { + $this->tpl->setOnScreenMessage('failure', $this->lng->txt('form_input_not_valid')); + $this->newAccountMailObject($form); + return; + } + foreach ($langs as $lang_key) { ilObjUserFolder::_writeNewAccountMail( $lang_key, diff --git a/Services/User/templates/default/tpl.usrf_new_account_mail.html b/Services/User/templates/default/tpl.usrf_new_account_mail.html index e9e13203991a..9e1ad8534c6e 100644 --- a/Services/User/templates/default/tpl.usrf_new_account_mail.html +++ b/Services/User/templates/default/tpl.usrf_new_account_mail.html @@ -12,7 +12,7 @@ {{#IF_NO_PASSWORD}}...{{/IF_NO_PASSWORD}}: {TXT_NOPASSWORD_BLOCK}
{{ADMIN_MAIL}}: {TXT_ADMIN_MAIL}
{{ILIAS_URL}}: {TXT_ILIAS_URL}
-{{INSTALLATION_NAME}}: {TXT_INSTALLATION_NAME}
+{{INSTALLATION_NAME}}: {TXT_INSTALLATION_NAME}
{{TARGET}}: {TXT_TARGET}
{{TARGET_TITLE}}: {TXT_TARGET_TITLE}
{{TARGET_TYPE}}: {TXT_TARGET_TYPE}
diff --git a/Services/WOPI/classes/Discovery/ActionDBRepository.php b/Services/WOPI/classes/Discovery/ActionDBRepository.php index d71936621200..63e3fc4c36ea 100644 --- a/Services/WOPI/classes/Discovery/ActionDBRepository.php +++ b/Services/WOPI/classes/Discovery/ActionDBRepository.php @@ -34,21 +34,25 @@ public function __construct( ) { } - public function hasActionForSuffix(string $suffix): bool - { - $query = 'SELECT * FROM ' . self::TABLE_NAME . ' WHERE ext = %s'; - $result = $this->db->queryF($query, ['text'], [strtolower($suffix)]); + public function hasActionForSuffix( + string $suffix, + ActionTarget $action_target + ): bool { + $query = 'SELECT * FROM ' . self::TABLE_NAME . ' WHERE ext = %s AND name = %s'; + $result = $this->db->queryF($query, ['text', 'text'], [strtolower($suffix), $action_target->value]); return $result->numRows() > 0; } - public function getActionForSuffix(string $suffix): ?Action - { - if (!$this->hasActionForSuffix($suffix)) { + public function getActionForSuffix( + string $suffix, + ActionTarget $action_target + ): ?Action { + if (!$this->hasActionForSuffix($suffix, $action_target)) { return null; } - $query = 'SELECT * FROM ' . self::TABLE_NAME . ' WHERE ext = %s'; - $result = $this->db->queryF($query, ['text'], [$suffix]); + $query = 'SELECT * FROM ' . self::TABLE_NAME . ' WHERE ext = %s AND name = %s'; + $result = $this->db->queryF($query, ['text', 'text'], [strtolower($suffix), $action_target->value]); $row = $this->db->fetchAssoc($result); return $this->fromDBRow($row); } diff --git a/Services/WOPI/classes/Discovery/ActionRepository.php b/Services/WOPI/classes/Discovery/ActionRepository.php index 4ca3bf4d8207..ec8f2c5566fd 100644 --- a/Services/WOPI/classes/Discovery/ActionRepository.php +++ b/Services/WOPI/classes/Discovery/ActionRepository.php @@ -25,9 +25,15 @@ */ interface ActionRepository { - public function hasActionForSuffix(string $suffix): bool; - - public function getActionForSuffix(string $suffix): ?Action; + public function hasActionForSuffix( + string $suffix, + ActionTarget $action_target + ): bool; + + public function getActionForSuffix( + string $suffix, + ActionTarget $action_target + ): ?Action; public function getActions(): array; diff --git a/Services/WOPI/classes/Discovery/ActionTarget.php b/Services/WOPI/classes/Discovery/ActionTarget.php new file mode 100644 index 000000000000..77911417c325 --- /dev/null +++ b/Services/WOPI/classes/Discovery/ActionTarget.php @@ -0,0 +1,30 @@ + + */ +enum ActionTarget: string +{ + case EDIT = 'edit'; + case VIEW = 'view'; +} diff --git a/Services/WOPI/classes/Discovery/Crawler.php b/Services/WOPI/classes/Discovery/Crawler.php index c65f15b77867..108bc6269d56 100644 --- a/Services/WOPI/classes/Discovery/Crawler.php +++ b/Services/WOPI/classes/Discovery/Crawler.php @@ -27,10 +27,9 @@ */ class Crawler { - private const ACTION_EDIT = 'edit'; - private const ACTION_VIEW = 'view'; private const XPATH = '/wopi-discovery/net-zone/app'; - private array $crawl_actions = [self::ACTION_EDIT]; + private array $crawl_actions = [] + ; private ?string $content = null; private ?\SimpleXMLElement $discovery = null; /** @@ -38,6 +37,14 @@ class Crawler */ private ?array $xml_app_elements = null; + public function __construct() + { + $this->crawl_actions = [ + ActionTarget::VIEW->value, + ActionTarget::EDIT->value, + ]; + } + public function validate(URI $discovery_url): bool { try { diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 5c93193a8c07..338b57c50d8d 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -13555,7 +13555,7 @@ pwassist#:#pwassist_enter_username_and_email#:#Geben Sie einen Anmeldenamen und pwassist#:#pwassist_enter_username_and_new_password#:#Tragen Sie den Anmeldenamen ein, und vergeben Sie ein neues Passwort.###Modified as part of gender mainstreaming activities for ILIAS 8 pwassist#:#pwassist_login_not_match#:#Der eingegebene Anmeldename stimmt nicht überein mit dem Anmeldenamen, für den Sie die Passwort-Unterstützung angefordert hatten. Bitte geben Sie den korrekten Anmeldenamen ein.###Modified as part of gender mainstreaming activities for ILIAS 8 pwassist#:#pwassist_mail_body#:#Tragen Sie ein neues Passwort ein für Ihr Anmeldekonto %1$s

Diese Nachricht wurde automatisch generiert von der ILIAS-Installation: %2$s

Sie (oder jemand mit der Adresse %3$s) hat Passwort-Unterstützung für den Anmeldenamen "%4$s" angefordert. Bitte prüfen Sie sorgfältig die nachfolgend aufgeführten Fälle, und handeln Sie wie vorgeschlagen:

• Sie haben die Passwort-Unterstützung versehentlich benutzt: Löschen Sie diese Mail.

• Sie sind sicher, dass Sie nie Passwort-Unterstützung für den angegebenen ILIAS-Server angefordert haben: Bitte nehmen Sie mit %5$s Kontakt auf.

Sie haben um Passwort-Unterstützung angefragt. Bitte gehen Sie wie folgt vor:

1. Starten Sie Ihren Browser.
2. Geben Sie folgende Adresse in Ihrem Browser ein: %6$s Wichtig: Die Adresse besteht aus einer einzigen Zeile. Wenn Sie die Adresse aufgetrennt in mehrere Zeilen sehen, dann hat Ihr E-Mail-Programm diese Zeilenumbrüche eingefügt.
3. Ihr Browser zeigt nun eine Seite an, mit der Sie ein neues Passwort an das Anmeldekonto zuweisen können.

Bitte beachten Sie: Aus Sicherheitsgründen können Sie diese drei Schritte nur exakt einmal und innerhalb einer begrenzten Zeit ausführen. Danach wird die Adresse ungültig, und Sie müssen die Passwort-Unterstützung auf dem ILIAS-Server erneut anfordern. -pwassist#:#pwassist_mail_sent#:#ILIAS hat eine E-Mail an die Adresse %1$s versandt. Weitere Anweisungen finden Sie in dieser Mail. +pwassist#:#pwassist_mail_sent#:#ILIAS hat eine E-Mail an die Adresse %1$s versandt, sofern ein ILIAS-Konto mit dem angegebenen Anmeldenamen und der E-Mail-Adresse existiert. Weitere Anweisungen finden Sie in dieser Mail. pwassist#:#pwassist_mail_sent_generic#:#ILIAS hat eine E-Mail an die hinterlegte Adresse versandt. Weitere Anweisungen finden Sie in dieser Mail. pwassist#:#pwassist_mail_subject#:#ILIAS-Passwort-Unterstützung pwassist#:#pwassist_password_assigned#:#Das Passwort für den Anmeldenamen %1$s wurde erfolgreich gespeichert. diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 43674066a11c..ab4e1c8d8742 100644 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -1268,8 +1268,8 @@ assessment#:#toplist_col_wtime#:#Working Time assessment#:#true#:#True assessment#:#tst_access_code_created#:#To provide you with permanent access to your test results and to offer you a possibility to resume this test, a unique test access code was created. Please make a note of this code so that you can continue the test later. assessment#:#tst_activate_skill_service#:#Competence Service -assessment#:#tst_activate_skill_service_desc#:#Before and after the period during which the test is available, the test's title will be displayed, but participants won’t be able to take the test. Access, including to tests already in progress, will be prevented once the period of availability has ended. -assessment#:#tst_activation_limited_visibility_info#:#Before and after the indicated period it is only the test's title that will be displayed. The participants cannot take the test. Further access, including to tests already in progress, will be prevented at the end of the period. +assessment#:#tst_activate_skill_service_desc#:#Supports the assignment of questions to competences and the definition of thresholds for reaching a specific competence level. +assessment#:#tst_activation_limited_visibility_info#:#Before and after the period during which the test is available, the test's title will be displayed, but participants won’t be able to take the test. Access, including to tests already in progress, will be prevented once the period of availability has ended. assessment#:#tst_activation_online_info#:#Participants can take the test if it is ‘Online’. assessment#:#tst_add_quest_cont_edit_mode#:#Editor assessment#:#tst_add_quest_cont_edit_mode_IPE#:#Use plain text for questions and answers and ILIAS page editor for feedback and hints @@ -13545,7 +13545,7 @@ pwassist#:#pwassist_enter_username_and_email#:#Enter a username and the associat pwassist#:#pwassist_enter_username_and_new_password#:#Enter the username and the new password in the fields below. pwassist#:#pwassist_login_not_match#:#Please enter another username. The username you have entered does not match the username for which you had asked for password assistance. pwassist#:#pwassist_mail_body#:#Register a new password for your user account: %1$s

This message has been generated automatically by the ILIAS server %2$s

You (or someone at %3$s) has asked for password assistance for the user account "%4$s". Please check carefully the conditions listed below and proceed accordingly:

• If you have used the password assistance form on the ILIAS server by accident: Delete this mail.

• If you are certain, that you never asked for password assistance at this ILIAS server: Please contact %5$s.

• If you asked for password assistance, please proceed as follows:
1. Open your browser.
2. Enter the following address in your browser: %6$s
Important: The address is a single line. If you see this address split into multiple lines, then your e-mail program has inserted these line breaks.
3. On the web page shown by your browser, enter a new password for your user account.

Please note, that for security reasons, you can perform the three steps above only exactly once and for a limited time only. Afterwards the address becomes invalid, and you have to use the password assistance page on the ILIAS server again. -pwassist#:#pwassist_mail_sent#:#A message has been sent to %1$s. Please check your mail box. +pwassist#:#pwassist_mail_sent#:#A message has been sent to %1$s, if a user account with the entered username and email address could be found. Please check your mail box for further instructions. pwassist#:#pwassist_mail_sent_generic#:#A message has been sent to the email address defined in ILIAS. Please check your mail box. pwassist#:#pwassist_mail_subject#:#ILIAS Password Assistance pwassist#:#pwassist_password_assigned#:#The password has been successfully assigned to user "%1$s". diff --git a/templates/default/images/standard/icon_accs.svg b/templates/default/images/standard/icon_accs.svg index e1949aaec0ab..7507dc655171 100644 --- a/templates/default/images/standard/icon_accs.svg +++ b/templates/default/images/standard/icon_accs.svg @@ -1,45 +1,29 @@ - + - + - + - - - - - - - - - - - - - - - - - - - + + diff --git a/templates/default/images/standard/icon_ddp.svg b/templates/default/images/standard/icon_ddp.svg new file mode 100644 index 000000000000..a9c3276be342 --- /dev/null +++ b/templates/default/images/standard/icon_ddp.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + diff --git a/templates/default/images/standard/icon_edtr.svg b/templates/default/images/standard/icon_edtr.svg index e7e51ee3e47a..f2aae38aebc8 100644 --- a/templates/default/images/standard/icon_edtr.svg +++ b/templates/default/images/standard/icon_edtr.svg @@ -1,21 +1 @@ - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/templates/default/images/standard/icon_lglntc.svg b/templates/default/images/standard/icon_lglntc.svg new file mode 100644 index 000000000000..8f8f853306b0 --- /dev/null +++ b/templates/default/images/standard/icon_lglntc.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + diff --git a/templates/default/images/standard/icon_lreg.svg b/templates/default/images/standard/icon_lreg.svg new file mode 100644 index 000000000000..0ee9f750e6ab --- /dev/null +++ b/templates/default/images/standard/icon_lreg.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + diff --git a/templates/default/images/standard/icon_pg.svg b/templates/default/images/standard/icon_pg.svg index ebbcd561f7a3..1fd1fe31cdd1 100644 --- a/templates/default/images/standard/icon_pg.svg +++ b/templates/default/images/standard/icon_pg.svg @@ -1,22 +1,21 @@ - + - - - - - - - - - + + + + + + + - + diff --git a/templates/default/images/standard/icon_pg_d.svg b/templates/default/images/standard/icon_pg_d.svg index 53b003438789..25d2349f98f9 100644 --- a/templates/default/images/standard/icon_pg_d.svg +++ b/templates/default/images/standard/icon_pg_d.svg @@ -1,23 +1,21 @@ - + + - - - - - - - - - + + + + + + + - diff --git a/templates/default/images/standard/icon_pg_del.svg b/templates/default/images/standard/icon_pg_del.svg index f7758440af49..8306471c574e 100644 --- a/templates/default/images/standard/icon_pg_del.svg +++ b/templates/default/images/standard/icon_pg_del.svg @@ -1,23 +1,21 @@ - + + - - - - - - - - - + + + + + + + - diff --git a/templates/default/images/standard/icon_tos.svg b/templates/default/images/standard/icon_tos.svg index 28d36734e5b1..d298b0aefea9 100644 --- a/templates/default/images/standard/icon_tos.svg +++ b/templates/default/images/standard/icon_tos.svg @@ -1,24 +1,46 @@ - + - - - - - - - - - + + + + + + + +