From 3f24953f10063243a61eb2f9ddcb3e8888f96147 Mon Sep 17 00:00:00 2001
From: Robert Kaiser <kairo@kairo.at>
Date: Fri, 20 Jan 2017 04:09:09 +0100
Subject: [PATCH] KaiRo bug 375 - Make branding a configuration option

---
 .gitignore                       |   2 +
 app/KaiRoLogo-100x62.png         | Bin 9332 -> 0 bytes
 app/authorize.php                |   6 +-
 app/authsystem.css               |  21 ++--
 app/authutils.php-class          |  17 +++-
 app/index.php                    |  42 ++++----
 app/skin/default/authskin.css    |  30 ++++++
 app/skin/default/icon.svg        | 170 +++++++++++++++++++++++++++++++
 app/skin/default/icon32.png      | Bin 0 -> 314 bytes
 app/skin/default/logo-100x62.png | Bin 0 -> 536 bytes
 etc/kairo/auth_settings.json     |   6 +-
 11 files changed, 257 insertions(+), 37 deletions(-)
 delete mode 100644 app/KaiRoLogo-100x62.png
 create mode 100644 app/skin/default/authskin.css
 create mode 100644 app/skin/default/icon.svg
 create mode 100644 app/skin/default/icon32.png
 create mode 100644 app/skin/default/logo-100x62.png

diff --git a/.gitignore b/.gitignore
index 1533c81..cbc9833 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,5 @@
 composer.lock
 /vendor
 /php-utility-classes
+/app/skin/*
+!/app/skin/default
diff --git a/app/KaiRoLogo-100x62.png b/app/KaiRoLogo-100x62.png
deleted file mode 100644
index 6288ecb8cc7c14048a34eba8fe81661550b30b17..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 9332
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

diff --git a/app/authorize.php b/app/authorize.php
index a37bd4a..81f95b1 100644
--- a/app/authorize.php
+++ b/app/authorize.php
@@ -15,7 +15,8 @@ $errors = $utils->checkForSecureConnection();
 $utils->sendSecurityHeaders();
 
 // Initialize the HTML document with our basic elements.
-extract($utils->initHTMLDocument('Authorization Request | KaiRo.at', 'KaiRo.at Authentication Server')); // sets $document, $html, $head, $title, $body
+extract($utils->initHTMLDocument(sprintf(_('Authorization Request | %s'), $utils->settings['operator_name']),
+                                 sprintf(_('%s Authentication Server'), $utils->settings['operator_name']))); // sets $document, $html, $head, $title, $body
 
 if (!count($errors)) {
   $session = $utils->initSession(); // Read session or create new session and set cookie.
@@ -39,7 +40,8 @@ if (!count($errors)) {
     $user = array('id' => 0, 'email' => '');
   }
   if (is_null($session)) {
-    $errors[] = _('The session system is not working.').' '._('Please <a href="https://www.kairo.at/contact">contact KaiRo.at</a> and tell the team about this.');
+    $errors[] = _('The session system is not working.').' '
+                .sprintf(_('Please <a href="%s">contact %s</a> and tell the team about this.'), $utils->settings['operator_contact_url'], $utils->settings['operator_name']);
   }
   elseif ($session['logged_in']) {
     // We are logged in, process authorization request.
diff --git a/app/authsystem.css b/app/authsystem.css
index 4c8dd5f..bf0f490 100644
--- a/app/authsystem.css
+++ b/app/authsystem.css
@@ -5,7 +5,6 @@
 body {
   font-family: sans-serif;
 /*  margin: 0; */
-  background-color: #FFFFEE;
   padding-top: 5em; /* leave space for total height of h1: 4+1(r)em */
 }
 
@@ -21,9 +20,6 @@ h1 {
   height: 4rem;
   min-height: calc(70px - 1rem);
   font-size: 2em;
-  background-color: #003366;
-  color: #FFFFEE;
-  background-image: url("KaiRoLogo-100x62.png");
   background-repeat: no-repeat;
   background-position: 10px 50%;
   overflow: hidden;
@@ -47,10 +43,6 @@ h1 {
   }
 }
 
-a:link { color: #669999; }
-a:visited { color: #003366; }
-a:hover, a:active { color: #88BBBB; }
-
 ul.flat {
  list-style-type: none;
  margin: 0em;
@@ -75,12 +67,14 @@ table.border {
  border-spacing: 0px;
  border-collapse: collapse;
  empty-cells: show;
- border-left: 1px solid #336699;
- border-top: 1px solid #336699;
+ border-width: 0;
+ border-left: 1px solid;
+ border-top: 1px solid;
 }
 table.border th, table.border td {
- border-bottom: 1px solid #336699;
- border-right: 1px solid #336699;
+ border-width: 0;
+ border-bottom: 1px solid;
+ border-right: 1px solid;
 }
 table.border td {
  padding-left: 3px;
@@ -132,13 +126,10 @@ table.border td {
 }
 
 .otheremaillinks > a {
-  background-color: #EEEEDD;
   text-decoration: none;
   padding: .2em;
   border-radius: 3px;
 }
-.otheremaillinks > a:link, .otheremaillinks > a:visited { color: #BBBBBB; }
-.otheremaillinks > a:hover, .otheremaillinks > a:active { color: #808080; }
 
 .small {
   font-size: 0.75em;
diff --git a/app/authutils.php-class b/app/authutils.php-class
index e76098c..d901669 100755
--- a/app/authutils.php-class
+++ b/app/authutils.php-class
@@ -123,6 +123,10 @@ class AuthUtils {
     $this->settings['piwik_site_id'] = intval(@$this->settings['piwik_site_id']);
     $this->settings['piwik_url'] = strlen(@$this->settings['piwik_url']) ? $this->settings['piwik_url'] : '/piwik/';
     $this->settings['piwik_tracker_path'] = strlen(@$this->settings['piwik_tracker_path']) ? $this->settings['piwik_tracker_path'] : '../vendor/piwik/piwik-php-tracker/';
+    $this->settings['skin'] = (@$this->settings['skin'] && is_dir('skin/'.$this->settings['skin'])) ? $this->settings['skin'] : 'default';
+    $this->settings['operator_name'] = (@$this->settings['operator_name']) ? $this->settings['operator_name'] : 'AuthServer';
+    $this->settings['operator_contact_url'] = (@$this->settings['operator_contact_url']) ? $this->settings['operator_contact_url'] : 'https://github.com/KaiRo_at/authserver/';
+    $this->settings['info_from_email'] = (@$this->settings['info_from_email']) ? $this->settings['info_from_email'] : 'noreply@example.com';
 
     // Initialize database.
     $config = new \Doctrine\DBAL\Configuration();
@@ -252,14 +256,16 @@ class AuthUtils {
       }
       else {
         $utils->log('create_session_failure', 'at login, prev session: '.$session['id'].', new user: '.$userid);
-        $errors[] = _('The session system is not working.').' '._('Please <a href="https://www.kairo.at/contact">contact KaiRo.at</a> and tell the team about this.');
+        $errors[] = _('The session system is not working.').' '
+                    .sprintf(_('Please <a href="%s">contact %s</a> and tell the team about this.'), $this->settings['operator_contact_url'], $this->settings['operator_name']);
       }
     }
     else {
       $result = $this->db->prepare('UPDATE `auth_sessions` SET `sesskey` = :sesskey, `user` = :userid, `logged_in` = TRUE, `time_expire` = :expire WHERE `id` = :sessid;');
       if (!$result->execute(array(':sesskey' => $sesskey, ':userid' => $userid, ':expire' => gmdate('Y-m-d H:i:s', strtotime('+1 day')), ':sessid' => $session['id']))) {
         $utils->log('login_failure', 'session: '.$session['id'].', user: '.$userid);
-        $errors[] = _('Login failed unexpectedly.').' '._('Please <a href="https://www.kairo.at/contact">contact KaiRo.at</a> and tell the team about this.');
+        $errors[] = _('Login failed unexpectedly.').' '
+                    .sprintf(_('Please <a href="%s">contact %s</a> and tell the team about this.'), $this->settings['operator_contact_url'], $this->settings['operator_name']);
       }
       else {
         // After update, actually fetch the session row from the DB so we have all values.
@@ -510,12 +516,19 @@ class AuthUtils {
     $style = $head->appendElement('link');
     $style->setAttribute('rel', 'stylesheet');
     $style->setAttribute('href', 'authsystem.css');
+    $style = $head->appendElement('link');
+    $style->setAttribute('rel', 'stylesheet');
+    $style->setAttribute('href', 'skin/'.$settings['skin'].'/authskin.css');
     $head->appendJSFile('authsystem.js');
     if ($settings['piwik_enabled']) {
       $head->setAttribute('data-piwiksite', $settings['piwik_site_id']);
       $head->setAttribute('data-piwikurl', $settings['piwik_url']);
       $head->appendJSFile('piwik.js', true, true);
     }
+    $icon = $head->appendElement('link');
+    $icon->setAttribute('rel', 'shortcut icon');
+    $icon->setAttribute('href', 'skin/'.$settings['skin'].'/icon32.png');
+    $icon->setAttribute('type', 'image/png');
     $title->appendText($titletext);
     $h1 = $body->appendElement('h1', $headlinetext);
 
diff --git a/app/index.php b/app/index.php
index ba0d024..e1be02d 100644
--- a/app/index.php
+++ b/app/index.php
@@ -10,14 +10,15 @@ $errors = $utils->checkForSecureConnection();
 $utils->sendSecurityHeaders();
 
 // Initialize the HTML document with our basic elements.
-extract($utils->initHTMLDocument('KaiRo.at Authentication Server')); // sets $document, $html, $head, $title, $body
+extract($utils->initHTMLDocument(sprintf(_('%s Authentication Server'), $utils->settings['operator_name']))); // sets $document, $html, $head, $title, $body
 
 if (!count($errors)) {
   $session = $utils->initSession(); // Read session or create new session and set cookie.
   $user = array('id' => 0, 'email' => '');
   $pagetype = 'default';
   if (is_null($session)) {
-    $errors[] = _('The session system is not working.').' '._('Please <a href="https://www.kairo.at/contact">contact KaiRo.at</a> and tell the team about this.');
+    $errors[] = _('The session system is not working.').' '
+                .sprintf(_('Please <a href="%s">contact %s</a> and tell the team about this.'), $utils->settings['operator_contact_url'], $utils->settings['operator_name']);
   }
   elseif (array_key_exists('logout', $_GET)) {
     $result = $db->prepare('UPDATE `auth_sessions` SET `logged_in` = FALSE WHERE `id` = :sessid;');
@@ -87,7 +88,8 @@ if (!count($errors)) {
             $result = $db->prepare('INSERT INTO `auth_users` (`email`, `pwdhash`, `status`, `verify_hash`) VALUES (:email, :pwdhash, \'unverified\', :vcode);');
             if (!$result->execute(array(':email' => $_POST['email'], ':pwdhash' => $newHash, ':vcode' => $vcode))) {
               $utils->log('user_insert_failure', 'email: '.$_POST['email'].' - '.$result->errorInfo()[2]);
-              $errors[] = _('Could not add user.').' '._('Please <a href="https://www.kairo.at/contact">contact KaiRo.at</a> and tell the team about this.');
+              $errors[] = _('Could not add user.').' '
+                          .sprintf(_('Please <a href="%s">contact %s</a> and tell the team about this.'), $utils->settings['operator_contact_url'], $utils->settings['operator_name']);
             }
             $user = array('id' => $db->lastInsertId(),
                           'email' => $_POST['email'],
@@ -102,18 +104,18 @@ if (!count($errors)) {
             $mail->setCharset('utf-8');
             $mail->addHeader('X-KAIRO-AUTH', 'email_verification');
             $mail->addRecipient($user['email']);
-            $mail->setSender('noreply@auth.kairo.at', _('KaiRo.at Authentication Service'));
-            $mail->setSubject('Email Verification for KaiRo.at Authentication');
+            $mail->setSender($utils->settings['info_from_email'], sprintf(_('%s Authentication Service'), $utils->settings['operator_name']));
+            $mail->setSubject(sprintf(_('Email Verification for %s Authentication'), $utils->settings['operator_name']));
             $mail->addMailText(_('Welcome!')."\n\n");
             $mail->addMailText(sprintf(_('This email address, %s, has been used for registration on "%s".'),
-                                      $user['email'], _('KaiRo.at Authentication Service'))."\n\n");
+                                       $user['email'], sprintf(_('%s Authentication Service'), $utils->settings['operator_name']))."\n\n");
             $mail->addMailText(_('Please confirm that registration by clicking the following link (or calling it up in your browser):')."\n");
             $mail->addMailText($utils->getDomainBaseURL().strstr($_SERVER['REQUEST_URI'], '?', true)
                               .'?email='.rawurlencode($user['email']).'&verification_code='.rawurlencode($user['verify_hash'])."\n\n");
             $mail->addMailText(_('With this confirmation, you accept that we handle your data for the purpose of logging you into other websites when you request that.')."\n");
             $mail->addMailText(_('Those websites will get to know your email address but not your password, which we store securely.')."\n");
             $mail->addMailText(_('If you do not call this confirmation link within 72 hours, your data will be deleted from our database.')."\n\n");
-            $mail->addMailText(sprintf(_('The %s team'), 'KaiRo.at'));
+            $mail->addMailText(sprintf(_('The %s team'), $utils->settings['operator_name']));
             //$mail->setDebugAddress("robert@localhost");
             $mailsent = $mail->send();
             if ($mailsent) {
@@ -121,7 +123,8 @@ if (!count($errors)) {
             }
             else {
               $utils->log('verify_mail_failure', 'user: '.$user['id'].', email: '.$user['email']);
-              $errors[] = _('The confirmation email could not be sent to you.').' '._('Please <a href="https://www.kairo.at/contact">contact KaiRo.at</a> and tell the team about this.');
+              $errors[] = _('The confirmation email could not be sent to you.').' '
+                          .sprintf(_('Please <a href="%s">contact %s</a> and tell the team about this.'), $utils->settings['operator_contact_url'], $utils->settings['operator_name']);
             }
           }
           else {
@@ -130,7 +133,8 @@ if (!count($errors)) {
             $result = $db->prepare('UPDATE `auth_users` SET `verify_hash` = :vcode WHERE `id` = :userid;');
             if (!$result->execute(array(':vcode' => $vcode, ':userid' => $user['id']))) {
               $utils->log('vhash_set_failure', 'user: '.$user['id']);
-              $errors[] = _('Could not initiate reset request.').' '._('Please <a href="https://www.kairo.at/contact">contact KaiRo.at</a> and tell the team about this.');
+              $errors[] = _('Could not initiate reset request.').' '
+                          .sprintf(_('Please <a href="%s">contact %s</a> and tell the team about this.'), $utils->settings['operator_contact_url'], $utils->settings['operator_name']);
             }
             else {
               $utils->log('pwd_reset_request', 'user: '.$user['id'].', email: '.$user['email']);
@@ -140,16 +144,16 @@ if (!count($errors)) {
               $mail->setCharset('utf-8');
               $mail->addHeader('X-KAIRO-AUTH', 'password_reset');
               $mail->addRecipient($user['email']);
-              $mail->setSender('noreply@auth.kairo.at', _('KaiRo.at Authentication Service'));
-              $mail->setSubject('How to reset your password for KaiRo.at Authentication');
+              $mail->setSender($utils->settings['info_from_email'], sprintf(_('%s Authentication Service'), $utils->settings['operator_name']));
+              $mail->setSubject(sprintf(_('How to reset your password for %s Authentication'), $utils->settings['operator_name']));
               $mail->addMailText(_('Hi,')."\n\n");
               $mail->addMailText(sprintf(_('A request for setting a new password for this email address, %s, has been submitted on "%s".'),
-                                        $user['email'], _('KaiRo.at Authentication Service'))."\n\n");
+                                         $user['email'], sprintf(_('%s Authentication Service'), $utils->settings['operator_name']))."\n\n");
               $mail->addMailText(_('You can set a new password by clicking the following link (or calling it up in your browser):')."\n");
               $mail->addMailText($utils->getDomainBaseURL().strstr($_SERVER['REQUEST_URI'], '?', true)
                                 .'?email='.rawurlencode($user['email']).'&reset_code='.rawurlencode($resetcode)."\n\n");
               $mail->addMailText(_('If you do not call this confirmation link within 1 hour, this link expires and the existing password is being kept in place.')."\n\n");
-              $mail->addMailText(sprintf(_('The %s team'), 'KaiRo.at'));
+              $mail->addMailText(sprintf(_('The %s team'), $utils->settings['operator_name']));
               //$mail->setDebugAddress("robert@localhost");
               $mailsent = $mail->send();
               if ($mailsent) {
@@ -157,7 +161,8 @@ if (!count($errors)) {
               }
               else {
                 $utils->log('pwd_reset_mail_failure', 'user: '.$user['id'].', email: '.$user['email']);
-                $errors[] = _('The email with password reset instructions could not be sent to you.').' '._('Please <a href="https://www.kairo.at/contact">contact KaiRo.at</a> and tell the team about this.');
+                $errors[] = _('The email with password reset instructions could not be sent to you.').' '
+                            .sprintf(_('Please <a href="%s">contact %s</a> and tell the team about this.'), $utils->settings['operator_contact_url'], $utils->settings['operator_name']);
               }
             }
           }
@@ -216,7 +221,8 @@ if (!count($errors)) {
       $result = $db->prepare('UPDATE `auth_users` SET `verify_hash` = \'\', `status` = \'ok\' WHERE `id` = :userid;');
       if (!$result->execute(array(':userid' => $user['id']))) {
         $utils->log('verification_save_failure', 'user: '.$user['id']);
-        $errors[] = _('Could not save confirmation.').' '._('Please <a href="https://www.kairo.at/contact">contact KaiRo.at</a> and tell the team about this.');
+        $errors[] = _('Could not save confirmation.').' '
+                    .sprintf(_('Please <a href="%s">contact %s</a> and tell the team about this.'), $utils->settings['operator_contact_url'], $utils->settings['operator_name']);
       }
       $pagetype = 'verification_done';
     }
@@ -277,7 +283,8 @@ if (!count($errors)) {
                                     ':scope' => $scope,
                                     ':userid' => $user['id']))) {
           $utils->log('client_save_failure', 'client: '.$clientid);
-          $errors[] = _('Unexpectedly failed to save new client information.').' '._('Please <a href="https://www.kairo.at/contact">contact KaiRo.at</a> and tell the team about this.');
+          $errors[] = _('Unexpectedly failed to save new client information.').' '
+                      .sprintf(_('Please <a href="%s">contact %s</a> and tell the team about this.'), $utils->settings['operator_contact_url'], $utils->settings['operator_name']);
         }
       }
       if (!count($errors)) {
@@ -320,7 +327,8 @@ if (!count($errors)) {
         $result = $db->prepare('UPDATE `auth_users` SET `pwdhash` = :pwdhash, `verify_hash` = \'\' WHERE `id` = :userid;');
         if (!$result->execute(array(':pwdhash' => $newHash, ':userid' => $session['user']))) {
           $utils->log('pwd_reset_failure', 'user: '.$session['user']);
-          $errors[] = _('Password reset failed.').' '._('Please <a href="https://www.kairo.at/contact">contact KaiRo.at</a> and tell the team about this.');
+          $errors[] = _('Password reset failed.').' '
+                      .sprintf(_('Please <a href="%s">contact %s</a> and tell the team about this.'), $utils->settings['operator_contact_url'], $utils->settings['operator_name']);
         }
         else {
           $pagetype = 'reset_done';
diff --git a/app/skin/default/authskin.css b/app/skin/default/authskin.css
new file mode 100644
index 0000000..02906cb
--- /dev/null
+++ b/app/skin/default/authskin.css
@@ -0,0 +1,30 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+body {
+  background-color: #FFFFFF;
+}
+
+h1 {
+  background-color: #404040;
+  color: #FFFFFF;
+  background-image: url("logo-100x62.png");
+}
+
+a:link { color: #0000EE; }
+a:visited { color: #8000EE; }
+a:hover, a:active { color: #8080FF; }
+
+table.border {
+ border-color: #404040;
+}
+table.border th, table.border td {
+ border-color: #404040;
+}
+
+.otheremaillinks > a {
+  background-color: #EEEEEE;
+}
+.otheremaillinks > a:link, .otheremaillinks > a:visited { color: #BBBBBB; }
+.otheremaillinks > a:hover, .otheremaillinks > a:active { color: #808080; }
diff --git a/app/skin/default/icon.svg b/app/skin/default/icon.svg
new file mode 100644
index 0000000..3f9007e
--- /dev/null
+++ b/app/skin/default/icon.svg
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+    xmlns="http://www.w3.org/2000/svg"
+    xmlns:cc="http://web.resource.org/cc/"
+    xmlns:dc="http://purl.org/dc/elements/1.1/"
+    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+    xmlns:svg="http://www.w3.org/2000/svg"
+    xmlns:ns1="http://sozi.baierouge.fr"
+    xmlns:xlink="http://www.w3.org/1999/xlink"
+    id="svg18832"
+    sodipodi:docname="login_mini_icon_2.svg"
+    viewBox="0 0 212.6 212.6"
+    sodipodi:version="0.32"
+    version="1.0"
+    inkscape:output_extension="org.inkscape.output.svg.inkscape"
+    inkscape:version="0.45.1"
+    sodipodi:docbase="/home/andre/data/projekte_privat/wiesenschluempfe/bilder/icons"
+  >
+  <sodipodi:namedview
+      id="base"
+      inkscape:zoom="0.98994949"
+      borderopacity="1.0"
+      inkscape:current-layer="layer1"
+      inkscape:cx="116.8274"
+      inkscape:object-bbox="true"
+      inkscape:grid-points="true"
+      inkscape:guide-points="true"
+      showgrid="true"
+      inkscape:document-units="mm"
+      bordercolor="#666666"
+      inkscape:window-x="0"
+      inkscape:window-y="0"
+      objecttolerance="10000"
+      inkscape:object-nodes="true"
+      inkscape:window-width="858"
+      inkscape:pageopacity="0.0"
+      inkscape:pageshadow="2"
+      guidetolerance="10000"
+      pagecolor="#ffffff"
+      gridtolerance="10000"
+      inkscape:object-points="true"
+      inkscape:cy="160.64295"
+      inkscape:window-height="580"
+  />
+  <g
+      id="layer1"
+      inkscape:label="Layer 1"
+      inkscape:groupmode="layer"
+      transform="translate(-241.43 -409.02)"
+    >
+    <path
+        id="path15809"
+        style="fill-rule:evenodd;fill:#000000"
+        d="m295.02 409.02l-0.44 35.44h124.01v141.73h-124.01v35.43h159.45v-212.6h-159.01z"
+        inkscape:export-ydpi="52.360001"
+        sodipodi:nodetypes="ccccccccc"
+        inkscape:export-filename="/home/andre/data/projekte_privat/wiesenschluempfe/bilder/logout_mini_icon.png"
+        inkscape:export-xdpi="52.360001"
+    />
+    <path
+        id="path15815"
+        style="fill:#000000"
+        d="m241.43 533.04h88.58l-35.43 35.43h53.15l53.15-53.15-53.15-53.15h-53.15l35.43 35.44h-88.58v35.43z"
+        inkscape:export-ydpi="52.360001"
+        sodipodi:nodetypes="cccccccccc"
+        inkscape:export-filename="/home/andre/data/projekte_privat/wiesenschluempfe/bilder/logout_mini_icon.png"
+        inkscape:export-xdpi="52.360001"
+    />
+  </g
+  >
+  <metadata
+    >
+    <rdf:RDF
+      >
+      <cc:Work
+        >
+        <dc:format
+          >image/svg+xml</dc:format
+        >
+        <dc:type
+            rdf:resource="http://purl.org/dc/dcmitype/StillImage"
+        />
+        <cc:license
+            rdf:resource="http://creativecommons.org/licenses/publicdomain/"
+        />
+        <dc:publisher
+          >
+          <cc:Agent
+              rdf:about="http://openclipart.org/"
+            >
+            <dc:title
+              >Openclipart</dc:title
+            >
+          </cc:Agent
+          >
+        </dc:publisher
+        >
+        <dc:title
+          >login mini icon</dc:title
+        >
+        <dc:date
+          >2008-02-13T10:41:13</dc:date
+        >
+        <dc:description
+        />
+        <dc:source
+          >https://openclipart.org/detail/13847/login-mini-icon-by-artmaster</dc:source
+        >
+        <dc:creator
+          >
+          <cc:Agent
+            >
+            <dc:title
+              >artmaster</dc:title
+            >
+          </cc:Agent
+          >
+        </dc:creator
+        >
+        <dc:subject
+          >
+          <rdf:Bag
+            >
+            <rdf:li
+              >black</rdf:li
+            >
+            <rdf:li
+              >entry</rdf:li
+            >
+            <rdf:li
+              >icon</rdf:li
+            >
+            <rdf:li
+              >login</rdf:li
+            >
+            <rdf:li
+              >mini</rdf:li
+            >
+            <rdf:li
+              >sign</rdf:li
+            >
+          </rdf:Bag
+          >
+        </dc:subject
+        >
+      </cc:Work
+      >
+      <cc:License
+          rdf:about="http://creativecommons.org/licenses/publicdomain/"
+        >
+        <cc:permits
+            rdf:resource="http://creativecommons.org/ns#Reproduction"
+        />
+        <cc:permits
+            rdf:resource="http://creativecommons.org/ns#Distribution"
+        />
+        <cc:permits
+            rdf:resource="http://creativecommons.org/ns#DerivativeWorks"
+        />
+      </cc:License
+      >
+    </rdf:RDF
+    >
+  </metadata
+  >
+</svg
+>
diff --git a/app/skin/default/icon32.png b/app/skin/default/icon32.png
new file mode 100644
index 0000000000000000000000000000000000000000..f177927d24cf57126110a7d93c15d98fd9e935d3
GIT binary patch
literal 314
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI
zppNSx%;=;sy8<Z4UgGKN%Kng1go#rz_s5qupwMwo7srr@!*8eC@*OhZaf`1{+rekc
zsNPU*V7M&DmOF-T;{ma0eX28V__bW||McvH{-&=-Gk>hJ-f+}&t-|u-fkF*=tRGl1
zSS;BWM==+ilH4%+d1|zlH&X#ylF~Av1!4ln`O}X|O%=#u&~4#tU`rBQz`jmWfIngK
zjOo{Tw1P^yJa08ca3l#HxZN?&G+JPZ^Nhz|e;*NGig{LW@yFw{-BN)oGLIg-+_m*+
zD1+Eh-}_B5p@vG6{oAhw?K*w8EB5ynaqpL04_28oM?En;7xrxu&`S)Su6{1-oD!M<
Dd?0pP

literal 0
HcmV?d00001

diff --git a/app/skin/default/logo-100x62.png b/app/skin/default/logo-100x62.png
new file mode 100644
index 0000000000000000000000000000000000000000..8424a5dc98423b64d1d1b058ba6f1b00eb9d0010
GIT binary patch
literal 536
zcmeAS@N?(olHy`uVBq!ia0vp^DL`z;!3HGne&2T#NU<e(ySp&_2f+n<mrn+Ya29w(
z7Bes~$$~JWUDUc=Ktc8rPhVH|hm0ajin^A<V(bhIj7vRT978H@y}fPdci2Io^<lja
z7hhvQ%Zf?Un7r0Cu<)`jTDsWT#KAppLRV9tv%(S8ON~5_<eVonFX-JEzv=zgdn*6l
z+?*S$D&UzG$K<~zQAuf+)M~+BvC$T6h8>PPNfS2poOx(|L;=j(<TP3H%1Zx+l^6C}
zGOhdl?n-KynczkSF(>{L3jEoRl^$9iF+B0hC5`Xo8QBLlt%`9<i%dPrC;#$KW3mzB
zE1Wv>xZuZ^ldj61;@P3Or$)Tu^cmY`iPX*NUuOlTghzT$X`gj^dWz9!yVIXTyC%&{
zum3Bs_)9~QfT2ip$3h-fqgOxL{(e{a#naQ+eW>$a=}ntcWnW^;U&%kxzbR1>{_aKg
zotP<cLf3cQ*6t4a{B5_2*W2fcMH+SsicU^CWv;OGQC82wt$%WR9!^T_k+c5VEVu8o
zZb48*?(QQQduv`OnC9q79ai`y!6tavphKd~@rVJBQd^>cAy0EhA`j=HFXb(@3DPq}
z`3%e1_uX7tJi+`3dq@&6jOLWiyt4d&%Zqz5VZ2Opn9B7c`y6GOC5`~4z?8?;pRB*H
X%Dg*zq<R}L4jDXM{an^LB{Ts51byC{

literal 0
HcmV?d00001

diff --git a/etc/kairo/auth_settings.json b/etc/kairo/auth_settings.json
index fa4b58b..864ca60 100644
--- a/etc/kairo/auth_settings.json
+++ b/etc/kairo/auth_settings.json
@@ -8,8 +8,12 @@
  ""
 ],
 "client_reg_email_whitelist": ["you@example.com"],
+"skin": "default",
+"operator_name": "AuthServer",
+"operator_contact_url": "https://github.com/KaiRo_at/authserver/",
+"info_from_email": "noreply@example.com",
 "piwik_enabled": false,
 "piwik_url": "/piwik/",
 "piwik_site_id": 1,
-"piwik_tracker_path": "/srv/www/piwik/vendor/piwik/piwik-php-tracker/"
+"piwik_tracker_path": "/srv/www/piwik/vendor/piwik/piwik-php-tracker/",
 }
-- 
2.43.0