diff --git a/mymodule/templates/.gitkeep b/mymodule/templates/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/mymodule/templates/selectsource.tpl.php b/mymodule/templates/selectsource.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..f520ef802370a35f4b5c590538f49c6418ce5f4a --- /dev/null +++ b/mymodule/templates/selectsource.tpl.php @@ -0,0 +1,28 @@ +<?php +$this->data['header'] = $this->t('{multiauth:multiauth:select_source_header}'); +$this->includeAtTemplateBase('includes/header.php'); +?> + +<h2><?php echo 'Benutzerkonto auswählen' ?></h2> + +<p><?php echo 'Bitte wählen Sie ein Benutzerkonto aus, mit dem Sie sich authentifizieren wollen:' ?></p> + +<form action="/idp/module.php/multiauth/selectsource.php" method="get"> + <input type="hidden" name="AuthState" value="<?php echo htmlspecialchars($this->data['authstate']); ?>" /> +<?php +echo '<div>'; +foreach ($this->data['sources'] as $source) { + if ($source['source'] === $this->data['preferred']) { + $autofocus = ' autofocus="autofocus"'; + } else { + $autofocus = ''; + } + $name = 'src-'.base64_encode($source['source']); + echo '<input type="submit" class="'.htmlspecialchars($source['css_class']).'" name="'.htmlspecialchars($name).'"'.$autofocus.' '. + 'id="button-'.htmlspecialchars($source['source']).'" '. + 'value="'.htmlspecialchars($source['text']).'" ></input>'; +} +echo '</div>'; +?> +</form> +<?php $this->includeAtTemplateBase('includes/footer.php'); diff --git a/mymodule/themes/fancytheme/core/loginuserpass.php b/mymodule/themes/fancytheme/core/loginuserpass.php new file mode 100644 index 0000000000000000000000000000000000000000..0e4b87fb061d4952cfdb04bbba207b7334652679 --- /dev/null +++ b/mymodule/themes/fancytheme/core/loginuserpass.php @@ -0,0 +1,82 @@ +<?php +$this->data['header'] = $this->t('{login:user_pass_header}'); + +if (strlen($this->data['username']) > 0) { + $this->data['autofocus'] = 'password'; +} else { + $this->data['autofocus'] = 'username'; +} +$this->includeAtTemplateBase('includes/header.php'); +?> + <div> + <div class="container"> + <div class="row"> + <div class="col-md-12" style="margin-bottom: 40px;"><img class="mx-auto" src="/img/Anmelden.png" width="100%"></div> + </div> + </div> + +<?php +if ($this->data['errorcode'] !== null) { +?> + <div style="border-left: 1px solid #e8e8e8; border-bottom: 1px solid #e8e8e8; background: #f5f5f5"> + <img src="/<?php echo $this->data['baseurlpath']; ?>resources/icons/experience/gtk-dialog-error.48x48.png" + class="float-l erroricon" style="margin: 15px" alt=""/> + + <h2><?php echo $this->t('{login:error_header}'); ?></h2> + + <p><strong> + <?php + echo htmlspecialchars( + $this->t( + $this->data['errorcodes']['title'][$this->data['errorcode']], + $this->data['errorparams'] + ) + ); + ?> + </strong></p> + <p> + <?php + echo htmlspecialchars( + $this->t( + $this->data['errorcodes']['descr'][$this->data['errorcode']], + $this->data['errorparams'] + ) + ); + ?> + </p> + </div> +<?php +} +?> + + <div class="login-clean" style="background-color: rgb(234,234,234);"> + <form method="post"> + <h2 class="sr-only">Login Form</h2> + <div class="illustration"><img src="/img/M4_LAB_LOGO.png" width="130"></div> + <?php if (strpos($_GET['AuthState'], 'admin') !== false) : ?> + <div class="form-group"><input id="username" class="form-control" type="text" name="username" placeholder="Administrator"></div> + <?php else : ?> + <div class="form-group"><input id="username" class="form-control" type="email" name="username" placeholder="E-Mail-Adresse"></div> + <?php endif; ?> + <div class="form-group"><input id="password" class="form-control" type="password" name="password" placeholder="Passwort"></div><a class="text-right forgot" href="/account/forgotPwd">Passwort vergessen?</a> + <div class="form-group"><button class="btn btn-primary btn-block" type="submit" style="background-color: #8a348b;"><strong>Anmelden</strong></button><a class="btn btn-primary btn-block" type="" style="background-color: rgb(234,234,234);color: rgb(0,0,0);" href="/account/registration"><strong>Neues Benutzerkonto anlegen</strong></a></div> + <input type="hidden" id="processing_trans" value="<?php echo $this->t('{login:processing}'); ?>" /> + <?php + foreach ($this->data['stateparams'] as $name => $value) { + echo '<input type="hidden" name="'.htmlspecialchars($name).'" value="'.htmlspecialchars($value).'" />'; + } + ?> + </form> + </div> + </div> +<?php +if (!empty($this->data['links'])) { + echo '<ul class="links" style="margin-top: 2em">'; + foreach ($this->data['links'] as $l) { + echo '<li><a href="'.htmlspecialchars($l['href']).'">'.htmlspecialchars($this->t($l['text'])).'</a></li>'; + } + echo '</ul>'; +} + +$this->includeAtTemplateBase('includes/footer.php'); + diff --git a/mymodule/themes/fancytheme/default/includes/footer.php b/mymodule/themes/fancytheme/default/includes/footer.php new file mode 100644 index 0000000000000000000000000000000000000000..f9da9a2fd00372e6e66504566184addb0daccc98 --- /dev/null +++ b/mymodule/themes/fancytheme/default/includes/footer.php @@ -0,0 +1,23 @@ +<?php +if (!empty($this->data['htmlinject']['htmlContentPost'])) { + foreach ($this->data['htmlinject']['htmlContentPost'] as $c) { + echo $c; + } +} +?> + + <script src="/js/headfoot.js"></script> + + + </div><!-- #content --> + <div id="footer"> + <hr /> + <img src="/<?php echo $this->data['baseurlpath']; ?>resources/icons/ssplogo-fish-small.png" alt="Small fish logo" style="float: right" /> + simplesamlphp Copyright © 2007-2019 <a href="http://uninett.no/">UNINETT AS</a> + + <br style="clear: right" /> + + </div><!-- #footer --> + </div><!-- #wrap --> + </body> +</html> diff --git a/mymodule/themes/fancytheme/default/includes/header.php b/mymodule/themes/fancytheme/default/includes/header.php new file mode 100644 index 0000000000000000000000000000000000000000..150b0ffe9de6df343fb5236efadd2b1076e3440a --- /dev/null +++ b/mymodule/themes/fancytheme/default/includes/header.php @@ -0,0 +1,124 @@ +<?php + +/** + * Support the htmlinject hook, which allows modules to change header, pre and post body on all pages. + */ +$this->data['htmlinject'] = [ + 'htmlContentPre' => [], + 'htmlContentPost' => [], + 'htmlContentHead' => [], +]; + +$jquery = []; +if (array_key_exists('jquery', $this->data)) { + $jquery = $this->data['jquery']; +} + +if (array_key_exists('pageid', $this->data)) { + $hookinfo = [ + 'pre' => &$this->data['htmlinject']['htmlContentPre'], + 'post' => &$this->data['htmlinject']['htmlContentPost'], + 'head' => &$this->data['htmlinject']['htmlContentHead'], + 'jquery' => &$jquery, + 'page' => $this->data['pageid'] + ]; + + SimpleSAML\Module::callHooks('htmlinject', $hookinfo); +} +// - o - o - o - o - o - o - o - o - o - o - o - o - + +/** + * Do not allow to frame SimpleSAMLphp pages from another location. + * This prevents clickjacking attacks in modern browsers. + * + * If you don't want any framing at all you can even change this to + * 'DENY', or comment it out if you actually want to allow foreign + * sites to put SimpleSAMLphp in a frame. The latter is however + * probably not a good security practice. + */ +header('X-Frame-Options: SAMEORIGIN'); + +?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> +<script type="text/javascript" src="/<?php echo $this->data['baseurlpath']; ?>resources/script.js"></script> +<!-- <link rel="stylesheet" type="text/css" href="/<?php echo $this->data['baseurlpath']; ?>resources/default.css" /> --> +<link rel="icon" type="image/icon" href="/<?php echo $this->data['baseurlpath']; ?>resources/icons/favicon.ico" /> +<title>M4_LAB: User Login</title> +<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" /> +<link rel="stylesheet" type="text/css" href="/css/bootstrap.css"/> +<link rel="stylesheet" type="text/css" href="/css/Login-Form-Clean.css"/> +<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.2/css/all.css" integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay" crossorigin="anonymous"> +<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> +<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script> + +<?php + +if (!empty($jquery)) { + $version = '1.8'; + if (array_key_exists('version', $jquery)) { + $version = $jquery['version']; + } + + if ($version == '1.8') { + if (isset($jquery['core']) && $jquery['core']) { + echo '<script type="text/javascript" src="/'.$this->data['baseurlpath'].'resources/jquery-1.8.js"></script>'."\n"; + } + + if (isset($jquery['ui']) && $jquery['ui']) { + echo '<script type="text/javascript" src="/'.$this->data['baseurlpath'].'resources/jquery-ui-1.8.js"></script>'."\n"; + } + + if (isset($jquery['css']) && $jquery['css']) { + echo '<link rel="stylesheet" media="screen" type="text/css" href="/'.$this->data['baseurlpath']. + 'resources/uitheme1.8/jquery-ui.css" />'."\n"; + } + } +} + +if (isset($this->data['clipboard.js'])) { + echo '<script type="text/javascript" src="/'.$this->data['baseurlpath'].'resources/clipboard.min.js"></script>'."\n"; +} + +if (!empty($this->data['htmlinject']['htmlContentHead'])) { + foreach ($this->data['htmlinject']['htmlContentHead'] as $c) { + echo $c; + } +} + +if ($this->isLanguageRTL()) { + ?> + <link rel="stylesheet" type="text/css" href="/<?php echo $this->data['baseurlpath']; ?>resources/default-rtl.css" /> +<?php +} +?> + <meta name="robots" content="noindex, nofollow" /> + +<?php +if (array_key_exists('head', $this->data)) { + echo '<!-- head -->'.$this->data['head'].'<!-- /head -->'; +} +?> +</head> +<?php +$onLoad = ''; +if (array_key_exists('autofocus', $this->data)) { + $onLoad .= ' onload="SimpleSAML_focus(\''.$this->data['autofocus'].'\');"'; +} +?> +<body class="text-center" <?php echo $onLoad; ?>> + + <div id="content"> + +<?php + +if (!empty($this->data['htmlinject']['htmlContentPre'])) { + foreach ($this->data['htmlinject']['htmlContentPre'] as $c) { + echo $c; + } +} +$config = \SimpleSAML\Configuration::getInstance(); +if(! $config->getBoolean('production', true)) { + echo '<div class="caution">' . $this->t('{preprodwarning:warning:warning}'). '</div>'; +} diff --git a/mymodule/themes/fancytheme/multiauth/selectsource.php b/mymodule/themes/fancytheme/multiauth/selectsource.php new file mode 100644 index 0000000000000000000000000000000000000000..e6952065ee11a3aa0f76df9591f28c576bd10177 --- /dev/null +++ b/mymodule/themes/fancytheme/multiauth/selectsource.php @@ -0,0 +1,85 @@ +<?php + +/** + * This page shows a list of authentication sources. When the user selects + * one of them if pass this information to the + * \SimpleSAML\Module\multiauth\Auth\Source\MultiAuth class and call the + * delegateAuthentication method on it. + * + * @author Lorenzo Gil, Yaco Sistemas S.L. + * @package SimpleSAMLphp + */ + +// Retrieve the authentication state +if (!array_key_exists('AuthState', $_REQUEST)) { + throw new \SimpleSAML\Error\BadRequest('Missing AuthState parameter.'); +} +$authStateId = $_REQUEST['AuthState']; + +/** @var array $state */ +$state = \SimpleSAML\Auth\State::loadState($authStateId, \SimpleSAML\Module\multiauth\Auth\Source\MultiAuth::STAGEID); + +if (array_key_exists("\SimpleSAML\Auth\Source.id", $state)) { + $authId = $state["\SimpleSAML\Auth\Source.id"]; + /** @var \SimpleSAML\Module\multiauth\Auth\Source\MultiAuth $as */ + $as = \SimpleSAML\Auth\Source::getById($authId); +} else { + $as = null; +} + +$source = null; +if (array_key_exists('source', $_REQUEST)) { + $source = $_REQUEST['source']; +} else { + foreach ($_REQUEST as $k => $v) { + $k = explode('-', $k, 2); + if (count($k) === 2 && $k[0] === 'src') { + $source = base64_decode($k[1]); + } + } +} +if ($source !== null) { + if ($as !== null) { + $as->setPreviousSource($source); + } + \SimpleSAML\Module\multiauth\Auth\Source\MultiAuth::delegateAuthentication($source, $state); +} + +if (array_key_exists('multiauth:preselect', $state)) { + $source = $state['multiauth:preselect']; + \SimpleSAML\Module\multiauth\Auth\Source\MultiAuth::delegateAuthentication($source, $state); +} + +$globalConfig = \SimpleSAML\Configuration::getInstance(); +$t = new \SimpleSAML\XHTML\Template($globalConfig, 'mymodule:selectsource.tpl.php'); + +$defaultLanguage = $globalConfig->getString('language.default', 'en'); +$language = $t->getTranslator()->getLanguage()->getLanguage(); + +$sources = $state[\SimpleSAML\Module\multiauth\Auth\Source\MultiAuth::SOURCESID]; +foreach ($sources as $key => $source) { + $sources[$key]['source64'] = base64_encode($sources[$key]['source']); + if (isset($sources[$key]['text'][$language])) { + $sources[$key]['text'] = $sources[$key]['text'][$language]; + } else { + $sources[$key]['text'] = $sources[$key]['text'][$defaultLanguage]; + } + + if (isset($sources[$key]['help'][$language])) { + $sources[$key]['help'] = $sources[$key]['help'][$language]; + } else { + $sources[$key]['help'] = $sources[$key]['help'][$defaultLanguage]; + } +} + +$t->data['authstate'] = $authStateId; +$t->data['sources'] = $sources; +$t->data['selfUrl'] = $_SERVER['PHP_SELF']; + +if ($as !== null) { + $t->data['preferred'] = $as->getPreviousSource(); +} else { + $t->data['preferred'] = null; +} +$t->show(); +exit(); diff --git a/mymodule/www/stylesheet.css b/mymodule/www/stylesheet.css new file mode 100644 index 0000000000000000000000000000000000000000..9de1914dca68a1135e142a98bfe759be2ccd3d52 --- /dev/null +++ b/mymodule/www/stylesheet.css @@ -0,0 +1,3 @@ +header{ + background: none; +}