Quellcode durchsuchen

Improved callback urls

Edgard vor 6 Jahren
Ursprung
Commit
2996451516
6 geänderte Dateien mit 129 neuen und 56 gelöschten Zeilen
  1. 5 24
      front/callback.php
  2. 10 10
      hook.php
  3. 62 0
      inc/provider.class.php
  4. 18 8
      locales/en_GB.po
  5. 17 7
      locales/pt_BR.po
  6. 17 7
      locales/singlesignon.pot

+ 5 - 24
front/callback.php

@@ -5,33 +5,12 @@
 
 include ('../../../inc/includes.php');
 
-$params = [];
+$provider_id = PluginSinglesignonProvider::getCallbackParameters('provider');
 
-if (isset($_SERVER['PATH_INFO'])) {
-   $path_info = trim($_SERVER['PATH_INFO'], '/');
-
-   $parts = explode('/', $path_info);
-
-   $key = null;
-
-   foreach ($parts as $part) {
-      $part = str_replace('~', '/', $part);
-      if ($key === null) {
-         $key = $part;
-      } else {
-         $params[$key] = $part;
-         $key = null;
-      }
-   }
-}
-
-if (!isset($params['provider'])) {
+if (!$provider_id) {
    Html::displayErrorAndDie(__sso("Provider not defined."), false);
 }
 
-$provider_id = (int) $params['provider'];
-
-
 $signon_provider = new PluginSinglesignonProvider();
 
 if (!$signon_provider->getFromDB($provider_id)) {
@@ -55,6 +34,9 @@ $signon_provider->prepareProviderInstance([], $collaborators);
 $signon_provider->checkAuthorization();
 
 if ($signon_provider->login()) {
+
+   $params = PluginSinglesignonProvider::getCallbackParameters('q');
+
    $url_redirect = '';
 
    $REDIRECT = "";
@@ -92,7 +74,6 @@ if ($signon_provider->login()) {
    exit();
 }
 
-
 // we have done at least a good login? No, we exit.
 Html::nullHeader("Login", $CFG_GLPI["root_doc"] . '/index.php');
 echo '<div class="center b">' . __('User not authorized to connect in GLPI') . '<br><br>';

+ 10 - 10
hook.php

@@ -3,15 +3,6 @@
 function plugin_singlesignon_display_login() {
    global $CFG_GLPI;
 
-   $url_prefix = $CFG_GLPI['root_doc'] . '/plugins/singlesignon/front/callback.php';
-   $url_sufix = '';
-
-   if (isset($_POST['redirect']) && (strlen($_POST['redirect']) > 0)) {
-      $url_sufix = "/redirect/" . str_replace('/', '~', $_POST['redirect']);
-   } else if (isset($_GET['redirect']) && strlen($_GET['redirect']) > 0) {
-      $url_sufix = "/redirect/" . str_replace('/', '~', $_GET['redirect']);
-   }
-
    $signon_provider = new PluginSinglesignonProvider();
 
    $rows = $signon_provider->find('`is_active` = 1');
@@ -19,7 +10,16 @@ function plugin_singlesignon_display_login() {
    $html = [];
 
    foreach ($rows as $row) {
-      $html[] = '<a href="' . $url_prefix . '/provider/' . $row['id'] . $url_sufix . '" class="singlesignon" style="color: #CFCFCF">[ Login with ' . $row['name'] . ' ]</a>';
+      $query = [];
+
+      if (isset($_REQUEST['redirect'])) {
+         $query['redirect'] = $_REQUEST['redirect'];
+      }
+
+      $url = PluginSinglesignonProvider::getCallbackUrl($row['id'], $query);
+
+      $html[] = '<a href="' . $url . '" class="singlesignon" style="color: #CFCFCF">' .
+            sprintf(__sso('[ Login with %s ]'), $row['name']) . '</a>';
    }
 
    echo implode("<br />\n", $html);

+ 62 - 0
inc/provider.class.php

@@ -718,4 +718,66 @@ class PluginSinglesignonProvider extends CommonDBTM {
       return $auth->auth_succeded;
    }
 
+   /**
+    * Generate a URL to callback
+    * Some providers don't accept query string, it convert to PATH
+    * @global array $CFG_GLPI
+    * @param integer $id
+    * @param array $query
+    * @return string
+    */
+   public static function getCallbackUrl($id, $query = []) {
+      global $CFG_GLPI;
+
+      $url = $CFG_GLPI['root_doc'] . '/plugins/singlesignon/front/callback.php';
+
+      $url .= "/provider/$id";
+
+      http_build_query($url);
+
+      if (!empty($query)) {
+         $url .= "/q/" . base64_encode(http_build_query($query));
+      }
+
+      return $url;
+   }
+
+   public static function getCallbackParameters($name = null) {
+      $data = [];
+
+      if (isset($_SERVER['PATH_INFO'])) {
+         $path_info = trim($_SERVER['PATH_INFO'], '/');
+
+         $parts = explode('/', $path_info);
+
+         $key = null;
+
+         foreach ($parts as $part) {
+            if ($key === null) {
+               $key = $part;
+            } else {
+               if ($key === "provider") {
+                  $part = intval($part);
+               } else {
+                  $tmp = base64_decode($part);
+                  parse_str($tmp, $part);
+               }
+
+               if ($key === $name) {
+                  return $part;
+               }
+
+               $data[$key] = $part;
+               $key = null;
+            }
+         }
+      }
+
+      if (!isset($data[$name])) {
+         return null;
+      }
+
+      return $data;
+   }
+
 }

+ 18 - 8
locales/en_GB.po

@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-04-26 11:06-0300\n"
-"PO-Revision-Date: 2019-04-26 11:06-0300\n"
+"POT-Creation-Date: 2019-04-26 14:41-0300\n"
+"PO-Revision-Date: 2019-04-26 14:41-0300\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
 "MIME-Version: 1.0\n"
@@ -16,28 +16,38 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: setup.php:29 front/provider.form.php:59 front/provider.form.php:61
+#: hook.php:22
+#, php-format
+msgid "[ Login with %s ]"
+msgstr "[ Login with %s ]"
+
+#: setup.php:8
+#, php-format
+msgid "Please, rename the plugin folder \"%s\" to \"singlesignon\""
+msgstr "Please, rename the plugin folder \"%s\" to \"singlesignon\""
+
+#: setup.php:36 front/provider.form.php:59 front/provider.form.php:61
 #: front/provider.php:6 front/provider.php:8 inc/provider.class.php:53
 msgid "Single Sign-on"
 msgstr "Single Sign-on"
 
-#: setup.php:42
+#: setup.php:49
 msgid "Run first: composer install"
 msgstr "Run first: composer install"
 
-#: setup.php:46
+#: setup.php:53
 msgid "This plugin requires GLPI >= 0.85"
 msgstr "This plugin requires GLPI >= 0.85"
 
-#: front/callback.php:29
+#: front/callback.php:11
 msgid "Provider not defined."
 msgstr "Provider not defined."
 
-#: front/callback.php:38
+#: front/callback.php:17
 msgid "Provider not found."
 msgstr "Provider not found."
 
-#: front/callback.php:42
+#: front/callback.php:21
 msgid "Provider not active."
 msgstr "Provider not active."
 

+ 17 - 7
locales/pt_BR.po

@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-04-26 10:56-0300\n"
+"POT-Creation-Date: 2019-04-26 14:37-0300\n"
 "PO-Revision-Date: 2019-04-26 11:04-0300\n"
 "Last-Translator: Edgard Lorraine Messias <edgardmessias@gmail.com>\n"
 "Language-Team: none\n"
@@ -16,28 +16,38 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
-#: setup.php:29 front/provider.form.php:59 front/provider.form.php:61
+#: hook.php:22
+#, php-format
+msgid "[ Login with %s ]"
+msgstr "[ Entrar com %s ]"
+
+#: setup.php:8
+#, php-format
+msgid "Please, rename the plugin folder \"%s\" to \"singlesignon\""
+msgstr "Por favor, renomeie a pasta do plugin \"%s\" para \"singlesignon\""
+
+#: setup.php:36 front/provider.form.php:59 front/provider.form.php:61
 #: front/provider.php:6 front/provider.php:8 inc/provider.class.php:53
 msgid "Single Sign-on"
 msgstr "Single Sign-on"
 
-#: setup.php:42
+#: setup.php:49
 msgid "Run first: composer install"
 msgstr "Execute primeiro: composer install"
 
-#: setup.php:46
+#: setup.php:53
 msgid "This plugin requires GLPI >= 0.85"
 msgstr "Este plugin requer GLPI >= 0.85"
 
-#: front/callback.php:29
+#: front/callback.php:11
 msgid "Provider not defined."
 msgstr "Provedor não definido."
 
-#: front/callback.php:38
+#: front/callback.php:17
 msgid "Provider not found."
 msgstr "Provedor não encontrado."
 
-#: front/callback.php:42
+#: front/callback.php:21
 msgid "Provider not active."
 msgstr "Provedor não ativo."
 

+ 17 - 7
locales/singlesignon.pot

@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-04-26 11:06-0300\n"
+"POT-Creation-Date: 2019-04-26 14:41-0300\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,28 +16,38 @@ msgstr ""
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: setup.php:29 front/provider.form.php:59 front/provider.form.php:61
+#: hook.php:22
+#, php-format
+msgid "[ Login with %s ]"
+msgstr ""
+
+#: setup.php:8
+#, php-format
+msgid "Please, rename the plugin folder \"%s\" to \"singlesignon\""
+msgstr ""
+
+#: setup.php:36 front/provider.form.php:59 front/provider.form.php:61
 #: front/provider.php:6 front/provider.php:8 inc/provider.class.php:53
 msgid "Single Sign-on"
 msgstr ""
 
-#: setup.php:42
+#: setup.php:49
 msgid "Run first: composer install"
 msgstr ""
 
-#: setup.php:46
+#: setup.php:53
 msgid "This plugin requires GLPI >= 0.85"
 msgstr ""
 
-#: front/callback.php:29
+#: front/callback.php:11
 msgid "Provider not defined."
 msgstr ""
 
-#: front/callback.php:38
+#: front/callback.php:17
 msgid "Provider not found."
 msgstr ""
 
-#: front/callback.php:42
+#: front/callback.php:21
 msgid "Provider not active."
 msgstr ""