1 <!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2 <html xmlns
="http://www.w3.org/1999/xhtml" xml
:lang
="fr" lang
="fr">
4 <title
>ImmaeEu Account
</title
>
5 <meta http
-equiv
="Content-Type" content
="text/html; charset=utf-8"/>
6 <meta name
="viewport" content
="width=device-width, initial-scale=1" />
7 <link rel
="stylesheet" href
="https://assets.immae.eu/skeleton/2.0.4/skeleton.min.css" integrity
="sha256-2YQRJMXD7pIAPHiXr0s+vlRWA7GYJEK0ARns7k2sbHY=" crossorigin
="anonymous" />
8 <style type
="text/css">
10 font
-family
: Verdana
,Arial
,Courier
New;
13 table
#ssh_keys_list textarea {
17 table
#ssh_keys_list tbody tr.sshkeyrow {
20 table
#ssh_keys_list tbody tr.headrow th {
21 border
-bottom
: 0px
!important
;
22 padding
-bottom
: 0px
!important
;
24 table
#ssh_keys_list tbody tr.mainrow td:not(.delete-button) {
25 border
-bottom
: 0px
!important
;
26 padding
-bottom
: 0px
!important
;
28 table
#ssh_keys_list td.sshkey {
31 padding
-top
: 0px
!important
;
34 table
#ssh_keys_list td.comment {
41 <div
class="container">
42 <h1
>Gestion des clés SSH
</h1
>
49 // Liste des applications gérées
58 function checkSshKey($sshKey)
60 $exploded = explode(' ', $sshKey);
61 if (count($exploded) != 2) {
64 if (!in_array($exploded[0], array('ssh-rsa', 'ssh-ed25519'))) {
67 $decoded = base64_decode($exploded[1], true);
68 if ($decoded === FALSE) {
71 $decoded = preg_replace("/[^\w\-]/","", (string) $decoded);
72 if (substr($decoded, 0, strlen($exploded[0])) !== $exploded[0]) {
79 function isUserLogged()
81 return (isset($_SESSION["login"]) && doConnect() !== NULL);
87 $server = "ldaps://ldap.immae.eu";
89 if ($connection === NULL) {
90 $connection = ldap_connect($server);
91 ldap_set_option($connection, LDAP_OPT_PROTOCOL_VERSION
, 3);
92 if (isset($_SESSION["user_dn"]) && isset($_SESSION["password"])) {
93 if (ldap_bind($connection, $_SESSION["user_dn"], $_SESSION["password"]) === false) {
95 unset($_SESSION["user_dn"]);
96 unset($_SESSION["password"]);
97 unset($_SESSION["login"]);
105 function checkLogin($user, $password)
109 $user_dn = "uid=$user,ou=users,dc=immae,dc=eu";
111 if (ldap_bind($con, $user_dn, $password) === false) {
114 $_SESSION["user_dn"] = $user_dn;
115 $_SESSION["password"] = $password;
117 $user_search = ldap_search($con,"dc=immae,dc=eu","(uid=$user)");
118 $auth_entry = ldap_first_entry($con, $user_search);
123 function getLdapInfo()
126 if (!isset($_SESSION["user_dn"])) {
129 $user_read = ldap_read($con, $_SESSION["user_dn"], "(objectclass=*)", array("uid","immaeSshKey"));
130 $user_entry = ldap_first_entry($con, $user_read);
131 $sortieLdap = ldap_get_values($con, $user_entry, "immaeSshKey");
132 unset($sortieLdap["count"]);
136 foreach ($sortieLdap as $line) {
137 $exploded = explode(' ', $line);
139 $apps = explode('|', $exploded[0]);
140 $publicKey = $exploded[1] . ' ' . $exploded[2];
146 $comment = implode(' ', $exploded);
150 'public_key' => $publicKey,
151 'comment' => $comment,
158 function pushLdapInfos($keys)
161 if (!isset($_SESSION["user_dn"]))
164 return ldap_mod_replace($con, $_SESSION["user_dn"], array("immaeSshKey" => $keys));
169 if (isset($_POST['deconnexion'])) {
173 if (isset($_POST['sauvegarder'])) {
177 foreach($_POST['keys'] as $id => $key) {
178 $editedKeys[$id] = $key;
179 if (!checkSshKey($key['public_key'])) {
180 $editedKeys[$id]['error'] = true;
184 if (!isset($key['apps'])) {
185 $editedKeys[$id]['apps'] = $key['apps'] = [];
188 foreach ($key['apps'] as $app) {
189 if (!in_array($app, apps
)) {
194 if (!isset($editedKeys[$id]['error']) || $editedKeys[$id]['error'] !== true) {
195 $keysToSave[] = implode('|', $key['apps']) . ' ' . $key['public_key'] . ' ' . $key['comment'];
200 $successSave = pushLdapInfos($keysToSave);
205 if (isset($_POST['login'])) {
206 if (empty($_POST['username']) || empty($_POST['password'])) {
207 $loginErrors = "Le nom d'utilisateur et le mot de passe sont requis.";
208 } elseif (!checkLogin($_POST['username'], $_POST['password'])) {
209 $loginErrors = "Identifiants incorrects.";
211 $_SESSION['login'] = $_POST['username'];
215 if (isUserLogged()) :
216 $keys = isset($editedKeys) ? $editedKeys : getLdapInfo();
218 <p
>Connecté en tant que
<b
><?= $_SESSION['login']; ?></b
></p
>
221 <input type
="submit" name
="deconnexion" value
="Déconnexion">
224 <?php
if (isset($successSave) && $successSave === true) : ?>
225 <p style
="color: green;">Clés enregistrées avec succès
.</p
>
229 <table id
="ssh_keys_list">
232 foreach ($keys as $id => $sshKey) :
236 <?php
foreach (apps
as $app) : ?>
242 <td
class="comment"><textarea name
="keys[<?= $id ?>][comment]"><?= $sshKey['comment'] ?></textarea
></td
>
244 foreach (apps
as $app) :
245 $checked = in_array($app, $sshKey['apps']);
247 <td
><input type
="checkbox" name
="keys[<?= $id ?>][apps][]" value
="<?= $app ?>"<?= $checked ? ' checked' : '' ?>></td
>
249 <td
class="delete-button" rowspan
="2"><button
class="delete">Suppr
.</button
></td
>
251 <tr
class="sshkeyrow">
252 <td colspan
="<?php echo 1+count(apps); ?>" class="sshkey"><textarea name
="keys[<?= $id ?>][public_key]" <?php
if (isset($sshKey['error']) && $sshKey['error'] === true) :?>style
="color: red"<?php
endif; ?>><?= $sshKey['public_key'] ?></textarea
></td
>
260 <button id
="add">Ajouter
</button
>
264 <input type
="submit" value
="Sauvegarder" name
="sauvegarder">
267 function deleteLine(element
) {
268 element
.addEventListener('click', function(e
) {
270 e
.target
.closest('tr').remove();
274 var suppr
= document
.getElementsByClassName('delete');
275 var add
= document
.getElementById('add');
276 var list = document
.querySelector('#ssh_keys_list > tbody');
278 for (var i
= 0; i
< suppr
.length
; i++
) {
279 deleteLine(suppr
[i
]);
282 add
.addEventListener('click', function (e
) {
289 <?php
foreach (apps
as $app) : ?>
295 <td
class="comment"><textarea name
="keys[${i}][comment]"></textarea
></td
>
300 foreach (apps
as $app) :
302 newLine +
= `
<td
><input type
="checkbox" name
="keys[${i}][apps][]" value
="<?= $app ?>"></td
>`
;
305 newLine +
= `
<td
class="delete-button" rowspan
="2"><button
class="delete" id
="delete-${i}">Suppr
.</button
></td
>
308 newLine +
= `
<tr
class="sshkeyrow">
309 <td colspan
="<?php echo 1+count(apps); ?>" class="sshkey"><textarea name
="keys[$[i}][public_key]"></textarea
></td
>
313 list.insertAdjacentHTML('beforeend', newLine
);
315 deleteLine(document
.getElementById("delete-" + i
));
322 <form action
="" method
="post">
326 if (!empty($loginErrors)):
328 <p style
="color: red;"><?= $loginErrors; ?></p
>
333 <label
for="username">Utilisateur
:</label
>
334 <input type
="text" id
="username" name
="username"/>
336 <label
for="password">Mot de passe
:</label
>
337 <input type
="password" id
="password" name
="password"/>
339 <input type
="submit" value
="OK" name
="login" />