Просмотр исходного кода

Merge pull request #1691 from causefx/v2-develop

V2 develop
causefx 4 лет назад
Родитель
Сommit
7404e5eb68

+ 3 - 2
.github/workflows/stale.yml

@@ -6,7 +6,6 @@ on:
 
 
 jobs:
 jobs:
   stale:
   stale:
-    if: github.event.label.name != 'bypass-activity'
     runs-on: ubuntu-latest
     runs-on: ubuntu-latest
     steps:
     steps:
       - uses: actions/stale@v3
       - uses: actions/stale@v3
@@ -17,4 +16,6 @@ jobs:
           close-issue-label: "closed-no-issue-activity"
           close-issue-label: "closed-no-issue-activity"
           stale-issue-label: "no-issue-activity"
           stale-issue-label: "no-issue-activity"
           days-before-stale: 15
           days-before-stale: 15
-          days-before-close: 90
+          days-before-close: 90
+          exempt-issue-labels: "bypass-activity"
+          exempt-pr-labels: "bypass-activity"

+ 61 - 3
api/classes/organizr.class.php

@@ -60,7 +60,7 @@ class Organizr
 	
 	
 	// ===================================
 	// ===================================
 	// Organizr Version
 	// Organizr Version
-	public $version = '2.1.426';
+	public $version = '2.1.446';
 	// ===================================
 	// ===================================
 	// Quick php Version check
 	// Quick php Version check
 	public $minimumPHP = '7.3';
 	public $minimumPHP = '7.3';
@@ -186,8 +186,11 @@ class Organizr
 	{
 	{
 		if ($this->hasDB()) {
 		if ($this->hasDB()) {
 			$currentIP = $this->userIP();
 			$currentIP = $this->userIP();
-			if (in_array($currentIP, $this->arrayIP($this->config['blacklisted']))) {
-				die($this->config['blacklistedMessage']);
+			if ($this->config['blacklisted'] !== '') {
+				if (in_array($currentIP, $this->arrayIP($this->config['blacklisted']))) {
+					$this->debug('User was sent to blackhole - Blacklisted IPs: ' . $this->config['blacklisted']);
+					die($this->config['blacklistedMessage']);
+				}
 			}
 			}
 		}
 		}
 	}
 	}
@@ -287,6 +290,28 @@ class Organizr
 		return true;
 		return true;
 	}
 	}
 	
 	
+	public function getIpInfo($ip = null)
+	{
+		if (!$ip) {
+			$this->setResponse(422, 'No IP Address supplied');
+			return false;
+		}
+		try {
+			$options = array('verify' => false);
+			$response = Requests::get('https://ipinfo.io/' . $ip . '/?token=ddd0c072ad5021', array(), $options);
+			if ($response->success) {
+				$api = json_decode($response->body, true);
+				$this->setResponse(200, null, $api);
+				return true;
+			} else {
+				$this->setResponse(500, 'An error occurred', null);
+			}
+		} catch (Requests_Exception $e) {
+			$this->setResponse(500, 'An error occurred', $e->getMessage());
+		}
+		return false;
+	}
+	
 	public function setAPIResponse($result = null, $message = null, $responseCode = null, $data = null)
 	public function setAPIResponse($result = null, $message = null, $responseCode = null, $data = null)
 	{
 	{
 		if ($result) {
 		if ($result) {
@@ -303,6 +328,32 @@ class Organizr
 		}
 		}
 	}
 	}
 	
 	
+	public function setResponse($responseCode = 200, $message = null, $data = null)
+	{
+		switch ($responseCode) {
+			case 200:
+			case 201:
+			case 204:
+				$result = 'success';
+				break;
+			default:
+				$result = 'error';
+				break;
+		}
+		if ($result) {
+			$GLOBALS['api']['response']['result'] = $result;
+		}
+		if ($message) {
+			$GLOBALS['api']['response']['message'] = $message;
+		}
+		if ($responseCode) {
+			$GLOBALS['responseCode'] = $responseCode;
+		}
+		if ($data) {
+			$GLOBALS['api']['response']['data'] = $data;
+		}
+	}
+	
 	public function checkRoute($request)
 	public function checkRoute($request)
 	{
 	{
 		$route = '/api/v2/' . explode('api/v2/', $request->getUri()->getPath())[1];
 		$route = '/api/v2/' . explode('api/v2/', $request->getUri()->getPath())[1];
@@ -442,6 +493,12 @@ class Organizr
 		return ($encode) ? json_encode($files) : $files;
 		return ($encode) ? json_encode($files) : $files;
 	}
 	}
 	
 	
+	public function setTheme($theme = null)
+	{
+		$theme = $theme ?? $this->config['theme'];
+		return '<link id="theme" href="css/themes/' . $theme . '.css?v=' . $this->fileHash . '" rel="stylesheet">';
+	}
+	
 	public function pluginFiles($type, $settings = false)
 	public function pluginFiles($type, $settings = false)
 	{
 	{
 		$files = '';
 		$files = '';
@@ -3602,6 +3659,7 @@ class Organizr
 	
 	
 	public function organizrSpecialSettings()
 	public function organizrSpecialSettings()
 	{
 	{
+		// js activeInfo
 		return array(
 		return array(
 			'homepage' => array(
 			'homepage' => array(
 				'refresh' => $this->refreshList(),
 				'refresh' => $this->refreshList(),

+ 6 - 6
api/composer.lock

@@ -1517,16 +1517,16 @@
         },
         },
         {
         {
             "name": "phpmailer/phpmailer",
             "name": "phpmailer/phpmailer",
-            "version": "v6.4.1",
+            "version": "v6.5.0",
             "source": {
             "source": {
                 "type": "git",
                 "type": "git",
                 "url": "https://github.com/PHPMailer/PHPMailer.git",
                 "url": "https://github.com/PHPMailer/PHPMailer.git",
-                "reference": "9256f12d8fb0cd0500f93b19e18c356906cbed3d"
+                "reference": "a5b5c43e50b7fba655f793ad27303cd74c57363c"
             },
             },
             "dist": {
             "dist": {
                 "type": "zip",
                 "type": "zip",
-                "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/9256f12d8fb0cd0500f93b19e18c356906cbed3d",
-                "reference": "9256f12d8fb0cd0500f93b19e18c356906cbed3d",
+                "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/a5b5c43e50b7fba655f793ad27303cd74c57363c",
+                "reference": "a5b5c43e50b7fba655f793ad27303cd74c57363c",
                 "shasum": ""
                 "shasum": ""
             },
             },
             "require": {
             "require": {
@@ -1581,7 +1581,7 @@
             "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
             "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
             "support": {
             "support": {
                 "issues": "https://github.com/PHPMailer/PHPMailer/issues",
                 "issues": "https://github.com/PHPMailer/PHPMailer/issues",
-                "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.4.1"
+                "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.5.0"
             },
             },
             "funding": [
             "funding": [
                 {
                 {
@@ -1589,7 +1589,7 @@
                     "type": "github"
                     "type": "github"
                 }
                 }
             ],
             ],
-            "time": "2021-04-29T12:25:04+00:00"
+            "time": "2021-06-16T14:33:43+00:00"
         },
         },
         {
         {
             "name": "pragmarx/google2fa",
             "name": "pragmarx/google2fa",

+ 11 - 1
api/functions/config-functions.php

@@ -2,5 +2,15 @@
 
 
 trait ConfigFunctions
 trait ConfigFunctions
 {
 {
-
+	public function getConfigItem($item)
+	{
+		if ($this->config[$item]) {
+			$this->setAPIResponse('success', null, 200, $this->config[$item]);
+			return $this->config[$item];
+		} else {
+			$this->setAPIResponse('error', $item . ' is not defined or is blank', 404);
+			return false;
+		}
+		
+	}
 }
 }

+ 11 - 1
api/functions/custom-class.php

@@ -1,2 +1,12 @@
 <?php
 <?php
-/* Depreciated */
+/* Depreciated */
+/*
+          __
+     w  c(..)o   (
+      \__(-)    __)
+          /\   (
+         /(_)___)
+         w /|
+          | \
+rox      m  m
+ */

+ 2 - 0
api/functions/option-functions.php

@@ -13,6 +13,8 @@ trait OptionsFunction
 					'value' => $item
 					'value' => $item
 				];
 				];
 			}
 			}
+		} elseif ($values == '') {
+			$formattedValues = '';
 		} else {
 		} else {
 			$formattedValues[] = [
 			$formattedValues[] = [
 				'name' => $values,
 				'name' => $values,

+ 2 - 2
api/homepage/ombi.php

@@ -303,7 +303,7 @@ trait OmbiHomepageItem
 									'id' => $value['tvDbId'],
 									'id' => $value['tvDbId'],
 									'title' => $value['title'],
 									'title' => $value['title'],
 									'overview' => $value['overview'],
 									'overview' => $value['overview'],
-									'poster' => (isset($value['posterPath']) && $value['posterPath'] !== '') ? $value['posterPath'] : 'plugins/images/cache/no-list.png',
+									'poster' => (isset($value['posterPath']) && $value['posterPath'] !== '') ? (str_starts_with($value['posterPath'], '/') ? 'https://image.tmdb.org/t/p/w300/' . $value['posterPath'] : $value['posterPath']) : 'plugins/images/cache/no-list.png',
 									'background' => (isset($value['background']) && $value['background'] !== '') ? 'https://image.tmdb.org/t/p/w1280/' . $value['background'] : '',
 									'background' => (isset($value['background']) && $value['background'] !== '') ? 'https://image.tmdb.org/t/p/w1280/' . $value['background'] : '',
 									'approved' => $value['childRequests'][0]['approved'],
 									'approved' => $value['childRequests'][0]['approved'],
 									'available' => $value['childRequests'][0]['available'],
 									'available' => $value['childRequests'][0]['available'],
@@ -545,4 +545,4 @@ trait OmbiHomepageItem
 	{
 	{
 		return $type == $this->config['ombiTvDefault'];
 		return $type == $this->config['ombiTvDefault'];
 	}
 	}
-}
+}

+ 7 - 2
api/v2/routes/config.php

@@ -5,10 +5,15 @@
  *     description="Organizr Configuration Items"
  *     description="Organizr Configuration Items"
  * )
  * )
  */
  */
-$app->get('/config', function ($request, $response, $args) {
+$app->get('/config[/{item}]', function ($request, $response, $args) {
 	$Organizr = ($request->getAttribute('Organizr')) ?? new Organizr();
 	$Organizr = ($request->getAttribute('Organizr')) ?? new Organizr();
 	if ($Organizr->qualifyRequest(1, true)) {
 	if ($Organizr->qualifyRequest(1, true)) {
-		$GLOBALS['api']['response']['data'] = $Organizr->config;
+		if (isset($args['item'])) {
+			$Organizr->getConfigItem($args['item']);
+		} else {
+			$GLOBALS['api']['response']['data'] = $Organizr->config;
+		}
+		
 	}
 	}
 	$response->getBody()->write(jsonE($GLOBALS['api']));
 	$response->getBody()->write(jsonE($GLOBALS['api']));
 	return $response
 	return $response

+ 13 - 0
api/v2/routes/ip.php

@@ -0,0 +1,13 @@
+<?php
+$app->get('/ip/{ip}', function ($request, $response, $args) {
+	$Organizr = ($request->getAttribute('Organizr')) ?? new Organizr();
+	if ($Organizr->checkRoute($request)) {
+		if ($Organizr->qualifyRequest(1, true)) {
+			$Organizr->getIpInfo($args['ip']);
+		}
+	}
+	$response->getBody()->write(jsonE($GLOBALS['api']));
+	return $response
+		->withHeader('Content-Type', 'application/json;charset=UTF-8')
+		->withStatus($GLOBALS['responseCode']);
+});

+ 5 - 5
api/vendor/composer/InstalledVersions.php

@@ -29,7 +29,7 @@ private static $installed = array (
     'aliases' => 
     'aliases' => 
     array (
     array (
     ),
     ),
-    'reference' => 'd116a5555c0c9912ce0b22091539443ff3a9711a',
+    'reference' => '414dc4c37d9f1ea1739e52365c87922321a4f984',
     'name' => '__root__',
     'name' => '__root__',
   ),
   ),
   'versions' => 
   'versions' => 
@@ -41,7 +41,7 @@ private static $installed = array (
       'aliases' => 
       'aliases' => 
       array (
       array (
       ),
       ),
-      'reference' => 'd116a5555c0c9912ce0b22091539443ff3a9711a',
+      'reference' => '414dc4c37d9f1ea1739e52365c87922321a4f984',
     ),
     ),
     'adldap2/adldap2' => 
     'adldap2/adldap2' => 
     array (
     array (
@@ -277,12 +277,12 @@ private static $installed = array (
     ),
     ),
     'phpmailer/phpmailer' => 
     'phpmailer/phpmailer' => 
     array (
     array (
-      'pretty_version' => 'v6.4.1',
-      'version' => '6.4.1.0',
+      'pretty_version' => 'v6.5.0',
+      'version' => '6.5.0.0',
       'aliases' => 
       'aliases' => 
       array (
       array (
       ),
       ),
-      'reference' => '9256f12d8fb0cd0500f93b19e18c356906cbed3d',
+      'reference' => 'a5b5c43e50b7fba655f793ad27303cd74c57363c',
     ),
     ),
     'pragmarx/google2fa' => 
     'pragmarx/google2fa' => 
     array (
     array (

+ 7 - 7
api/vendor/composer/installed.json

@@ -1578,17 +1578,17 @@
         },
         },
         {
         {
             "name": "phpmailer/phpmailer",
             "name": "phpmailer/phpmailer",
-            "version": "v6.4.1",
-            "version_normalized": "6.4.1.0",
+            "version": "v6.5.0",
+            "version_normalized": "6.5.0.0",
             "source": {
             "source": {
                 "type": "git",
                 "type": "git",
                 "url": "https://github.com/PHPMailer/PHPMailer.git",
                 "url": "https://github.com/PHPMailer/PHPMailer.git",
-                "reference": "9256f12d8fb0cd0500f93b19e18c356906cbed3d"
+                "reference": "a5b5c43e50b7fba655f793ad27303cd74c57363c"
             },
             },
             "dist": {
             "dist": {
                 "type": "zip",
                 "type": "zip",
-                "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/9256f12d8fb0cd0500f93b19e18c356906cbed3d",
-                "reference": "9256f12d8fb0cd0500f93b19e18c356906cbed3d",
+                "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/a5b5c43e50b7fba655f793ad27303cd74c57363c",
+                "reference": "a5b5c43e50b7fba655f793ad27303cd74c57363c",
                 "shasum": ""
                 "shasum": ""
             },
             },
             "require": {
             "require": {
@@ -1613,7 +1613,7 @@
                 "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication",
                 "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication",
                 "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)"
                 "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)"
             },
             },
-            "time": "2021-04-29T12:25:04+00:00",
+            "time": "2021-06-16T14:33:43+00:00",
             "type": "library",
             "type": "library",
             "installation-source": "dist",
             "installation-source": "dist",
             "autoload": {
             "autoload": {
@@ -1645,7 +1645,7 @@
             "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
             "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
             "support": {
             "support": {
                 "issues": "https://github.com/PHPMailer/PHPMailer/issues",
                 "issues": "https://github.com/PHPMailer/PHPMailer/issues",
-                "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.4.1"
+                "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.5.0"
             },
             },
             "funding": [
             "funding": [
                 {
                 {

+ 5 - 5
api/vendor/composer/installed.php

@@ -6,7 +6,7 @@
     'aliases' => 
     'aliases' => 
     array (
     array (
     ),
     ),
-    'reference' => 'd116a5555c0c9912ce0b22091539443ff3a9711a',
+    'reference' => '414dc4c37d9f1ea1739e52365c87922321a4f984',
     'name' => '__root__',
     'name' => '__root__',
   ),
   ),
   'versions' => 
   'versions' => 
@@ -18,7 +18,7 @@
       'aliases' => 
       'aliases' => 
       array (
       array (
       ),
       ),
-      'reference' => 'd116a5555c0c9912ce0b22091539443ff3a9711a',
+      'reference' => '414dc4c37d9f1ea1739e52365c87922321a4f984',
     ),
     ),
     'adldap2/adldap2' => 
     'adldap2/adldap2' => 
     array (
     array (
@@ -254,12 +254,12 @@
     ),
     ),
     'phpmailer/phpmailer' => 
     'phpmailer/phpmailer' => 
     array (
     array (
-      'pretty_version' => 'v6.4.1',
-      'version' => '6.4.1.0',
+      'pretty_version' => 'v6.5.0',
+      'version' => '6.5.0.0',
       'aliases' => 
       'aliases' => 
       array (
       array (
       ),
       ),
-      'reference' => '9256f12d8fb0cd0500f93b19e18c356906cbed3d',
+      'reference' => 'a5b5c43e50b7fba655f793ad27303cd74c57363c',
     ),
     ),
     'pragmarx/google2fa' => 
     'pragmarx/google2fa' => 
     array (
     array (

+ 5 - 0
api/vendor/phpmailer/phpmailer/SECURITY.md

@@ -2,6 +2,11 @@
 
 
 Please disclose any security issues or vulnerabilities found through [Tidelift's coordinated disclosure system](https://tidelift.com/security) or to the maintainers privately.
 Please disclose any security issues or vulnerabilities found through [Tidelift's coordinated disclosure system](https://tidelift.com/security) or to the maintainers privately.
 
 
+PHPMailer 6.4.1 and earlier contain a vulnerability that can result in untrusted code being called (if such code is injected into the host project's scope by other means). If the `$patternselect` parameter to `validateAddress()` is set to `'php'` (the default, defined by `PHPMailer::$validator`), and the global namespace contains a function called `php`, it will be called in preference to the built-in validator of the same name. Mitigated in PHPMailer 6.5.0 by denying the use of simple strings as validator function names. Recorded as [CVE-2021-3603](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2021-3603). Reported by [Vikrant Singh Chauhan](mailto:vi@hackberry.xyz) via [huntr.dev](https://www.huntr.dev/).
+
+PHPMailer versions 6.4.1 and earlier contain a possible remote code execution vulnerability through the `$lang_path` parameter of the `setLanguage()` method. If the `$lang_path` parameter is passed unfiltered from user input, it can be set to [a UNC path](https://docs.microsoft.com/en-us/dotnet/standard/io/file-path-formats#unc-paths), and if an attacker is also able to persuade the server to load a file from that UNC path, a script file under their control may be executed. This vulnerability only applies to systems that resolve UNC paths, typically only Microsoft Windows.
+PHPMailer 6.5.0 mitigates this by no longer treating translation files as PHP code, but by parsing their text content directly. This approach avoids the possibility of executing unknown code while retaining backward compatibility. This isn't ideal, so the current translation format is deprecated and will be replaced in the next major release. Recorded as [CVE-2021-34551](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2021-34551). Reported by [Jilin Diting Information Technology Co., Ltd](https://listensec.com) via Tidelift.
+
 PHPMailer versions between 6.1.8 and 6.4.0 contain a regression of the earlier CVE-2018-19296 object injection vulnerability as a result of [a fix for Windows UNC paths in 6.1.8](https://github.com/PHPMailer/PHPMailer/commit/e2e07a355ee8ff36aba21d0242c5950c56e4c6f9). Recorded as [CVE-2020-36326](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2020-36326). Reported by Fariskhi Vidyan via Tidelift. 6.4.1 fixes this issue, and also enforces stricter checks for URL schemes in local path contexts.
 PHPMailer versions between 6.1.8 and 6.4.0 contain a regression of the earlier CVE-2018-19296 object injection vulnerability as a result of [a fix for Windows UNC paths in 6.1.8](https://github.com/PHPMailer/PHPMailer/commit/e2e07a355ee8ff36aba21d0242c5950c56e4c6f9). Recorded as [CVE-2020-36326](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2020-36326). Reported by Fariskhi Vidyan via Tidelift. 6.4.1 fixes this issue, and also enforces stricter checks for URL schemes in local path contexts.
 
 
 PHPMailer versions 6.1.5 and earlier contain an output escaping bug that occurs in `Content-Type` and `Content-Disposition` when filenames passed into `addAttachment` and other methods that accept attachment names contain double quote characters, in contravention of RFC822 3.4.1. No specific vulnerability has been found relating to this, but it could allow file attachments to bypass attachment filters that are based on matching filename extensions. Recorded as [CVE-2020-13625](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2020-13625). Reported by Elar Lang of Clarified Security.
 PHPMailer versions 6.1.5 and earlier contain an output escaping bug that occurs in `Content-Type` and `Content-Disposition` when filenames passed into `addAttachment` and other methods that accept attachment names contain double quote characters, in contravention of RFC822 3.4.1. No specific vulnerability has been found relating to this, but it could allow file attachments to bypass attachment filters that are based on matching filename extensions. Recorded as [CVE-2020-13625](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2020-13625). Reported by Elar Lang of Clarified Security.

+ 1 - 1
api/vendor/phpmailer/phpmailer/VERSION

@@ -1 +1 @@
-6.4.1
+6.5.0

+ 1 - 2
api/vendor/phpmailer/phpmailer/language/phpmailer.lang-ar.php

@@ -19,8 +19,7 @@ $PHPMAILER_LANG['instantiate']          = 'لا يمكن توفير خدمة ا
 $PHPMAILER_LANG['invalid_address']      = 'الإرسال غير ممكن لأن عنوان البريد الإلكتروني غير صالح: ';
 $PHPMAILER_LANG['invalid_address']      = 'الإرسال غير ممكن لأن عنوان البريد الإلكتروني غير صالح: ';
 $PHPMAILER_LANG['mailer_not_supported'] = ' برنامج الإرسال غير مدعوم.';
 $PHPMAILER_LANG['mailer_not_supported'] = ' برنامج الإرسال غير مدعوم.';
 $PHPMAILER_LANG['provide_address']      = 'يجب توفير عنوان البريد الإلكتروني لمستلم واحد على الأقل.';
 $PHPMAILER_LANG['provide_address']      = 'يجب توفير عنوان البريد الإلكتروني لمستلم واحد على الأقل.';
-$PHPMAILER_LANG['recipients_failed']    = 'خطأ SMTP: الأخطاء التالية ' .
-                                          'فشل في الارسال لكل من : ';
+$PHPMAILER_LANG['recipients_failed']    = 'خطأ SMTP: الأخطاء التالية فشل في الارسال لكل من : ';
 $PHPMAILER_LANG['signing']              = 'خطأ في التوقيع: ';
 $PHPMAILER_LANG['signing']              = 'خطأ في التوقيع: ';
 $PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() غير ممكن.';
 $PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() غير ممكن.';
 $PHPMAILER_LANG['smtp_error']           = 'خطأ على مستوى الخادم SMTP: ';
 $PHPMAILER_LANG['smtp_error']           = 'خطأ على مستوى الخادم SMTP: ';

+ 32 - 10
api/vendor/phpmailer/phpmailer/src/PHPMailer.php

@@ -428,9 +428,11 @@ class PHPMailer
     public $Debugoutput = 'echo';
     public $Debugoutput = 'echo';
 
 
     /**
     /**
-     * Whether to keep SMTP connection open after each message.
-     * If this is set to true then to close the connection
-     * requires an explicit call to smtpClose().
+     * Whether to keep the SMTP connection open after each message.
+     * If this is set to true then the connection will remain open after a send,
+     * and closing the connection will require an explicit call to smtpClose().
+     * It's a good idea to use this if you are sending multiple messages as it reduces overhead.
+     * See the mailing list example for how to use it.
      *
      *
      * @var bool
      * @var bool
      */
      */
@@ -748,7 +750,7 @@ class PHPMailer
      *
      *
      * @var string
      * @var string
      */
      */
-    const VERSION = '6.4.1';
+    const VERSION = '6.5.0';
 
 
     /**
     /**
      * Error severity: message only, continue processing.
      * Error severity: message only, continue processing.
@@ -1335,7 +1337,8 @@ class PHPMailer
         if (null === $patternselect) {
         if (null === $patternselect) {
             $patternselect = static::$validator;
             $patternselect = static::$validator;
         }
         }
-        if (is_callable($patternselect)) {
+        //Don't allow strings as callables, see SECURITY.md and CVE-2021-3603
+        if (is_callable($patternselect) && !is_string($patternselect)) {
             return call_user_func($patternselect, $address);
             return call_user_func($patternselect, $address);
         }
         }
         //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
         //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
@@ -2182,7 +2185,8 @@ class PHPMailer
      * The default language is English.
      * The default language is English.
      *
      *
      * @param string $langcode  ISO 639-1 2-character language code (e.g. French is "fr")
      * @param string $langcode  ISO 639-1 2-character language code (e.g. French is "fr")
-     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
+     * @param string $lang_path Path to the language file directory, with trailing separator (slash).D
+     *                          Do not set this from user input!
      *
      *
      * @return bool
      * @return bool
      */
      */
@@ -2244,14 +2248,32 @@ class PHPMailer
             if (!static::fileIsAccessible($lang_file)) {
             if (!static::fileIsAccessible($lang_file)) {
                 $foundlang = false;
                 $foundlang = false;
             } else {
             } else {
-                //Overwrite language-specific strings.
-                //This way we'll never have missing translation keys.
-                $foundlang = include $lang_file;
+                //$foundlang = include $lang_file;
+                $lines = file($lang_file);
+                foreach ($lines as $line) {
+                    //Translation file lines look like this:
+                    //$PHPMAILER_LANG['authenticate'] = 'SMTP-Fehler: Authentifizierung fehlgeschlagen.';
+                    //These files are parsed as text and not PHP so as to avoid the possibility of code injection
+                    //See https://blog.stevenlevithan.com/archives/match-quoted-string
+                    $matches = [];
+                    if (
+                        preg_match(
+                            '/^\$PHPMAILER_LANG\[\'([a-z\d_]+)\'\]\s*=\s*(["\'])(.+)*?\2;/',
+                            $line,
+                            $matches
+                        ) &&
+                        //Ignore unknown translation keys
+                        array_key_exists($matches[1], $PHPMAILER_LANG)
+                    ) {
+                        //Overwrite language-specific strings so we'll never have missing translation keys.
+                        $PHPMAILER_LANG[$matches[1]] = (string)$matches[3];
+                    }
+                }
             }
             }
         }
         }
         $this->language = $PHPMAILER_LANG;
         $this->language = $PHPMAILER_LANG;
 
 
-        return (bool) $foundlang; //Returns false if language not found
+        return $foundlang; //Returns false if language not found
     }
     }
 
 
     /**
     /**

+ 1 - 1
api/vendor/phpmailer/phpmailer/src/POP3.php

@@ -46,7 +46,7 @@ class POP3
      *
      *
      * @var string
      * @var string
      */
      */
-    const VERSION = '6.4.1';
+    const VERSION = '6.5.0';
 
 
     /**
     /**
      * Default POP3 port number.
      * Default POP3 port number.

+ 2 - 1
api/vendor/phpmailer/phpmailer/src/SMTP.php

@@ -35,7 +35,7 @@ class SMTP
      *
      *
      * @var string
      * @var string
      */
      */
-    const VERSION = '6.4.1';
+    const VERSION = '6.5.0';
 
 
     /**
     /**
      * SMTP line break constant.
      * SMTP line break constant.
@@ -186,6 +186,7 @@ class SMTP
         'Amazon_SES' => '/[\d]{3} Ok (.*)/',
         'Amazon_SES' => '/[\d]{3} Ok (.*)/',
         'SendGrid' => '/[\d]{3} Ok: queued as (.*)/',
         'SendGrid' => '/[\d]{3} Ok: queued as (.*)/',
         'CampaignMonitor' => '/[\d]{3} 2.0.0 OK:([a-zA-Z\d]{48})/',
         'CampaignMonitor' => '/[\d]{3} 2.0.0 OK:([a-zA-Z\d]{48})/',
+        'Haraka' => '/[\d]{3} Message Queued \((.*)\)/',
     ];
     ];
 
 
     /**
     /**

+ 1 - 1
index.php

@@ -44,7 +44,7 @@ $Organizr = new Organizr();
     <link id="style" href="css/dark.min.css?v=<?php echo $Organizr->fileHash; ?>" rel="stylesheet">
     <link id="style" href="css/dark.min.css?v=<?php echo $Organizr->fileHash; ?>" rel="stylesheet">
     <link href="css/organizr.min.css?v=<?php echo $Organizr->fileHash; ?>" rel="stylesheet">
     <link href="css/organizr.min.css?v=<?php echo $Organizr->fileHash; ?>" rel="stylesheet">
 	<?php echo $Organizr->pluginFiles('css'); ?>
 	<?php echo $Organizr->pluginFiles('css'); ?>
-    <link id="theme" href="css/themes/Organizr.css?v=<?php echo $Organizr->fileHash; ?>" rel="stylesheet">
+	<?php echo $Organizr->setTheme(); ?>
     <style id="user-appearance"></style>
     <style id="user-appearance"></style>
     <style id="custom-theme-css"></style>
     <style id="custom-theme-css"></style>
     <style id="custom-css"></style>
     <style id="custom-css"></style>

+ 42 - 35
js/custom.js

@@ -1751,41 +1751,48 @@ $(document).on('click', ".showMoreHealth", function(){
 });
 });
 //IP INFO
 //IP INFO
 $(document).on('click', ".ipInfo", function(){
 $(document).on('click', ".ipInfo", function(){
-    $.getJSON("https://ipinfo.io/"+$(this).text()+"/?token=ddd0c072ad5021", function (response) {
-        var region = (typeof response.region == 'undefined') ? ' N/A' : response.region;
-        var ip = (typeof response.ip == 'undefined') ? ' N/A' : response.ip;
-        var hostname = (typeof response.hostname == 'undefined') ? ' N/A' : response.hostname;
-        var loc = (typeof response.loc == 'undefined') ? ' N/A' : response.loc;
-        var org = (typeof response.org == 'undefined') ? ' N/A' : response.org;
-        var city = (typeof response.city == 'undefined') ? ' N/A' : response.city;
-        var country = (typeof response.country == 'undefined') ? ' N/A' : response.country;
-        var phone = (typeof response.phone == 'undefined') ? ' N/A' : response.phone;
-        var div = '<div class="row">' +
-            '<div class="col-lg-12">' +
-            '<div class="white-box">' +
-            '<h3 class="box-title">'+ip+'</h3>' +
-            '<div class="table-responsive">' +
-            '<table class="table">' +
-            '<tbody>' +
-            '<tr><td class="text-left">Hostname</td><td class="txt-oflo text-right">'+hostname+'</td></tr>' +
-            '<tr><td class="text-left">Location</td><td class="txt-oflo text-right">'+loc+'</td></tr>' +
-            '<tr><td class="text-left">Org</td><td class="txt-oflo text-right">'+org+'</td></tr>' +
-            '<tr><td class="text-left">City</td><td class="txt-oflo text-right">'+city+'</td></tr>' +
-            '<tr><td class="text-left">Country</td><td class="txt-oflo text-right">'+country+'</td></tr>' +
-            '<tr><td class="text-left">Phone</td><td class="txt-oflo text-right">'+phone+'</td></tr>' +
-            '<tr><td class="text-left">Region</td><td class="txt-oflo text-right">'+region+'</td></tr>' +
-            '</tbody>' +
-            '</table>' +
-            '</div>' +
-            '</div>' +
-            '</div>' +
-            '</div>';
-        swal({
-            content: createElementFromHTML(div),
-            buttons: false,
-            className: 'bg-org'
-        });
-    });
+	organizrAPI2('GET','api/v2/ip/'+$(this).text()).success(function(data) {
+		try {
+			let response = data.response.data;
+			var region = (typeof response.region == 'undefined') ? ' N/A' : response.region;
+			var ip = (typeof response.ip == 'undefined') ? ' N/A' : response.ip;
+			var hostname = (typeof response.hostname == 'undefined') ? ' N/A' : response.hostname;
+			var loc = (typeof response.loc == 'undefined') ? ' N/A' : response.loc;
+			var org = (typeof response.org == 'undefined') ? ' N/A' : response.org;
+			var city = (typeof response.city == 'undefined') ? ' N/A' : response.city;
+			var country = (typeof response.country == 'undefined') ? ' N/A' : response.country;
+			var phone = (typeof response.phone == 'undefined') ? ' N/A' : response.phone;
+			var div = '<div class="row">' +
+				'<div class="col-lg-12">' +
+				'<div class="white-box">' +
+				'<h3 class="box-title">'+ip+'</h3>' +
+				'<div class="table-responsive inbox-center">' +
+				'<table class="table">' +
+				'<tbody>' +
+				'<tr><td class="text-left">Hostname</td><td class="txt-oflo text-right">'+hostname+'</td></tr>' +
+				'<tr><td class="text-left">Location</td><td class="txt-oflo text-right">'+loc+'</td></tr>' +
+				'<tr><td class="text-left">Org</td><td class="txt-oflo text-right">'+org+'</td></tr>' +
+				'<tr><td class="text-left">City</td><td class="txt-oflo text-right">'+city+'</td></tr>' +
+				'<tr><td class="text-left">Country</td><td class="txt-oflo text-right">'+country+'</td></tr>' +
+				'<tr><td class="text-left">Phone</td><td class="txt-oflo text-right">'+phone+'</td></tr>' +
+				'<tr><td class="text-left">Region</td><td class="txt-oflo text-right">'+region+'</td></tr>' +
+				'</tbody>' +
+				'</table>' +
+				'</div>' +
+				'</div>' +
+				'</div>' +
+				'</div>';
+			swal({
+				content: createElementFromHTML(div),
+				buttons: false,
+				className: 'bg-org'
+			});
+		}catch(e) {
+			organizrCatchError(e,data);
+		}
+	}).fail(function(xhr) {
+		OrganizrApiError(xhr, 'API Error');
+	});
 });
 });
 // set active for group list
 // set active for group list
 $(document).on('click', '.allGroupsList', function() {
 $(document).on('click', '.allGroupsList', function() {

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
js/custom.min.js


+ 65 - 81
js/functions.js

@@ -970,7 +970,9 @@ function tabActions(event,name, type){
 		organizrConsole('Tab Function','Action not defined yet', 'info');
 		organizrConsole('Tab Function','Action not defined yet', 'info');
 	}else{
 	}else{
 		switchTab(cleanClass(name), type);
 		switchTab(cleanClass(name), type);
-        $('.splash-screen').removeClass('in').addClass('hidden');
+		if(type !== 2){
+			$('.splash-screen').removeClass('in').addClass('hidden');
+		}
 	}
 	}
 }
 }
 function reverseObject(object) {
 function reverseObject(object) {
@@ -3430,19 +3432,26 @@ function buildVersion(array){
 		}else if (x === 0){
 		}else if (x === 0){
 			button = '<button class="btn btn-sm btn-info btn-rounded waves-effect waves-light pull-right row b-none" type="button" onclick="updateNow();"><span class="btn-label"><i class="fa fa-download"></i></span><span lang="en">Install Update</span></button>';
 			button = '<button class="btn btn-sm btn-info btn-rounded waves-effect waves-light pull-right row b-none" type="button" onclick="updateNow();"><span class="btn-label"><i class="fa fa-download"></i></span><span lang="en">Install Update</span></button>';
 		}
 		}
+		let tableClass = x == 0 ? '' : 'hidden';
+		let divClassPadding = x == 0 ? '' : 'p-b-0';
+		let divClassMargin = x == 0 ? '' : 'm-b-0';
+		let toggleButtonText = x == 0 ? 'Less' : 'More';
+		let toggleButtonIcon = x == 0 ? 'up' : 'down';
+		let divStatus = x == 0 ? 'opened' : 'closed';
 		versions += `
 		versions += `
-		<div class="white-box bg-org">
+		<div class="white-box bg-org ${divClassPadding} update-main-div-${x}" data-status="${divStatus}">
 			<div class="col-md-3 col-sm-4 col-xs-6 pull-right">`+button+`</div>
 			<div class="col-md-3 col-sm-4 col-xs-6 pull-right">`+button+`</div>
-			<h3 class="box-title">`+i+`</h3>
+			<h3 class="box-title ${divClassMargin} update-box-title-${x}">`+i+`</h3>
 			<div class="row sales-report">
 			<div class="row sales-report">
 				<div class="col-md-12 col-sm-12 col-xs-12">
 				<div class="col-md-12 col-sm-12 col-xs-12">
-
+					<div class="pull-left">
 						<span class="tooltip-info" data-toggle="tooltip" data-placement="right" title="" data-original-title="`+moment(v.date).format('LL')+`">`+moment.utc(v.date, "YYYY-MM-DD hh:mm[Z]").local().fromNow()+`</span>
 						<span class="tooltip-info" data-toggle="tooltip" data-placement="right" title="" data-original-title="`+moment(v.date).format('LL')+`">`+moment.utc(v.date, "YYYY-MM-DD hh:mm[Z]").local().fromNow()+`</span>
-
-					<p class="text-info p-0">`+v.title+`</p>
+						<p class="text-info p-0">`+v.title+`</p>
+					</div>
+					<button class="btn btn-sm btn-primary btn-rounded waves-effect waves-light pull-right" onclick="toggleGithubVersion(${x})" type="button"><span class="btn-label"><i class="fa fa-long-arrow-${toggleButtonIcon} toggleButtonIcon-${x}"></i></span><span lang="en" class="toggleButton-${x}">${toggleButtonText}</span></button>
 				</div>
 				</div>
 			</div>
 			</div>
-			<div class="table-responsive">
+			<div class="table-responsive ${tableClass} update-table-${x}">
 				<table class="table inverse-bordered-table">
 				<table class="table inverse-bordered-table">
 					<tbody>
 					<tbody>
 						`+listing+`
 						`+listing+`
@@ -3457,7 +3466,25 @@ function buildVersion(array){
 	});
 	});
 	return versions;
 	return versions;
 }
 }
+function toggleGithubVersion(id){
+	let status = $('.update-main-div-' + id).attr('data-status');
+	if(status == 'opened'){
+		$('.update-main-div-' + id).attr('data-status', 'closed');
+		$('.update-main-div-' + id).addClass('p-b-0');
+		$('.update-box-title-' + id).addClass('m-b-0');
+		$('.update-table-' + id).addClass('hidden');
+		$('.toggleButton-' + id).text('More');
+		$('.toggleButtonIcon-' + id).removeClass('fa-long-arrow-up').addClass('fa-long-arrow-down');
+	}else{
+		$('.update-main-div-' + id).attr('data-status', 'opened');
+		$('.update-main-div-' + id).removeClass('p-b-0');
+		$('.update-box-title-' + id).removeClass('m-b-0');
+		$('.update-table-' + id).removeClass('hidden');
+		$('.toggleButton-' + id).text('Less');
+		$('.toggleButtonIcon-' + id).addClass('fa-long-arrow-up').removeClass('fa-long-arrow-down');
 
 
+	}
+}
 function manualUpdateCheck(){
 function manualUpdateCheck(){
     $('.buttonManualUpdateCheck').addClass('disabled');
     $('.buttonManualUpdateCheck').addClass('disabled');
     $('.buttonManualUpdateCheck i').removeClass('fa-globe').addClass('fa-refresh fa-spin');
     $('.buttonManualUpdateCheck i').removeClass('fa-globe').addClass('fa-refresh fa-spin');
@@ -3482,7 +3509,6 @@ function updateCheck(){
 		if(latest !== currentVersion) {
 		if(latest !== currentVersion) {
 			organizrConsole('Update Function','Update to ' + latest + ' is available', 'warning');
 			organizrConsole('Update Function','Update to ' + latest + ' is available', 'warning');
             if (activeInfo.settings.misc.docker === false) {
             if (activeInfo.settings.misc.docker === false) {
-	            closeAllMessages();
                 messageSingle(window.lang.translate('Update Available'), latest + ' ' + window.lang.translate('is available, goto') + ' <a href="javascript:void(0)" onclick="tabActions(event,\'Settings\',0);clickPath(\'update\')"><span lang="en">Update Tab</span></a>', activeInfo.settings.notifications.position, '#FFF', 'update', '60000');
                 messageSingle(window.lang.translate('Update Available'), latest + ' ' + window.lang.translate('is available, goto') + ' <a href="javascript:void(0)" onclick="tabActions(event,\'Settings\',0);clickPath(\'update\')"><span lang="en">Update Tab</span></a>', activeInfo.settings.notifications.position, '#FFF', 'update', '60000');
             }
             }
         }else{
         }else{
@@ -3564,7 +3590,6 @@ function checkCommitLoad(){
 				    var current = activeInfo.settings.misc.githubCommit.toString().trim();
 				    var current = activeInfo.settings.misc.githubCommit.toString().trim();
 				    var link = 'https://github.com/causefx/Organizr/compare/' + current + '...' + latest;
 				    var link = 'https://github.com/causefx/Organizr/compare/' + current + '...' + latest;
 				    if (latest !== current) {
 				    if (latest !== current) {
-					    closeAllMessages();
 					    messageSingle(window.lang.translate('Update Available'), ' <a href="' + link + '" target="_blank"><span lang="en">Compare Difference</span></a> <span lang="en">or</span> <a href="javascript:void(0)" onclick="updateNow()"><span lang="en">Update Now</span></a>', activeInfo.settings.notifications.position, '#FFF', 'update', '600000');
 					    messageSingle(window.lang.translate('Update Available'), ' <a href="' + link + '" target="_blank"><span lang="en">Compare Difference</span></a> <span lang="en">or</span> <a href="javascript:void(0)" onclick="updateNow()"><span lang="en">Update Now</span></a>', activeInfo.settings.notifications.position, '#FFF', 'update', '600000');
 				    } else {
 				    } else {
 					    organizrConsole('Update Function', 'Organizr Docker - Up to date');
 					    organizrConsole('Update Function', 'Organizr Docker - Up to date');
@@ -4691,7 +4716,7 @@ function uriRedirect(uri=null){
         var redirect = local('get', 'uri');
         var redirect = local('get', 'uri');
         local('remove', 'uri');
         local('remove', 'uri');
         if(redirect !== null){
         if(redirect !== null){
-            window.location.href = redirect;
+            window.location.href = decodeURIComponent(decodeURI(redirect));
         }
         }
     }
     }
 }
 }
@@ -9611,7 +9636,7 @@ function messagePositions(){
         }
         }
     };
     };
 }
 }
-function message(heading,text,position,color,icon,timeout){
+function message(heading,text,position,color,icon,timeout, single = false){
     var bb = (typeof activeInfo !== 'undefined') ? activeInfo.settings.notifications.backbone : 'izi';
     var bb = (typeof activeInfo !== 'undefined') ? activeInfo.settings.notifications.backbone : 'izi';
     switch (bb) {
     switch (bb) {
         case 'toastr':
         case 'toastr':
@@ -9625,7 +9650,7 @@ function message(heading,text,position,color,icon,timeout){
                 var ready = (typeof eval(notificationFunction) !== undefined) ? true :false;
                 var ready = (typeof eval(notificationFunction) !== undefined) ? true :false;
             } catch (e) {
             } catch (e) {
                 if (e instanceof SyntaxError) {
                 if (e instanceof SyntaxError) {
-                    setTimeout(function(){ message(heading,text,position,color,icon,timeout); }, 100);
+                    setTimeout(function(){ message(heading,text,position,color,icon,timeout, single); }, 100);
                 }
                 }
             }
             }
             break;
             break;
@@ -9635,10 +9660,28 @@ function message(heading,text,position,color,icon,timeout){
     if(notificationsReady && ready){
     if(notificationsReady && ready){
         oldPosition = position;
         oldPosition = position;
         position = messagePositions()[position][bb];
         position = messagePositions()[position][bb];
-        if(local('g','initial')){
-            setTimeout(function(){ message(heading,text,oldPosition,color,icon,timeout); }, 100);
+	    if(typeof activeInfo === 'undefined'){
+            setTimeout(function(){ message(heading,text,oldPosition,color,icon,timeout, single); }, 100);
             return false;
             return false;
         }
         }
+	    if(single){
+		    switch (bb) {
+			    case 'toastr':
+				    $.toast().reset('all');
+				    break;
+			    case 'izi':
+				    iziToast.destroy();
+				    break;
+			    case 'alertify':
+				    alertify.dismissAll();
+				    break;
+			    case 'noty':
+				    Noty.closeAll();
+				    break;
+			    default:
+				    return false;
+		    }
+	    }
         switch (bb) {
         switch (bb) {
             case 'toastr':
             case 'toastr':
                 $.toast({
                 $.toast({
@@ -9804,74 +9847,12 @@ function message(heading,text,position,color,icon,timeout){
         }
         }
 
 
     }else{
     }else{
-        setTimeout(function(){ message(heading,text,position,color,icon,timeout); }, 100);
+        setTimeout(function(){ message(heading,text,position,color,icon,timeout,single); }, 100);
     }
     }
 
 
 }
 }
 function messageSingle(heading,text,position,color,icon,timeout){
 function messageSingle(heading,text,position,color,icon,timeout){
-    var bb = activeInfo.settings.notifications.backbone;
-    switch (bb) {
-        case 'toastr':
-            var ready = (eval( notificationFunction) !== undefined) ? true :false;
-            break;
-        case 'izi':
-        case 'alertify':
-        case 'noty':
-            try {
-                var ready = (typeof eval(notificationFunction) !== undefined) ? true :false;
-            } catch (e) {
-                if (e instanceof SyntaxError) {
-                    setTimeout(function(){ messageSingle(heading,text,position,color,icon,timeout); }, 100);
-                }
-            }
-            break;
-        default:
-            var ready = false;
-    }
-    if(notificationsReady && ready){
-        switch (bb) {
-            case 'toastr':
-                $.toast().reset('all');
-                break;
-            case 'izi':
-                iziToast.destroy();
-                break;
-            case 'alertify':
-                alertify.dismissAll();
-                break;
-            case 'noty':
-                Noty.closeAll();
-                break;
-            default:
-                return false;
-        }
-        message(heading,text,position,color,icon,timeout);
-
-    }else{
-        setTimeout(function(){ messageSingle(heading,text,position,color,icon,timeout); }, 100);
-    }
-}
-
-function closeAllMessages(){
-	let bb = activeInfo.settings.notifications.backbone;
-	if(notificationsReady){
-		switch (bb) {
-			case 'toastr':
-				$.toast().reset('all');
-				break;
-			case 'izi':
-				iziToast.destroy();
-				break;
-			case 'alertify':
-				alertify.dismissAll();
-				break;
-			case 'noty':
-				Noty.closeAll();
-				break;
-			default:
-				return false;
-		}
-	}
+	message(heading,text,position,color,icon,timeout, true);
 }
 }
 
 
 function blockDev(e) {
 function blockDev(e) {
@@ -9909,8 +9890,11 @@ function openHomepage(){
     var tab = $("li[data-url='api/v2/page/homepage']").find('span').text();
     var tab = $("li[data-url='api/v2/page/homepage']").find('span').text();
     tabActions('click',tab,0);
     tabActions('click',tab,0);
 }
 }
+function toggleFullScreenIcon(){
+	$('.fullscreen-icon').toggleClass('ti-fullscreen').toggleClass('mdi mdi-fullscreen-exit');
+}
 function toggleFullScreen() {
 function toggleFullScreen() {
-    $('.fullscreen-icon').toggleClass('ti-fullscreen').toggleClass('mdi mdi-fullscreen-exit');
+	toggleFullScreenIcon();
     if (!document.fullscreenElement &&    // alternative standard method
     if (!document.fullscreenElement &&    // alternative standard method
         !document.mozFullScreenElement && !document.webkitFullscreenElement && !document.msFullscreenElement ) {  // current working methods
         !document.mozFullScreenElement && !document.webkitFullscreenElement && !document.msFullscreenElement ) {  // current working methods
         if (document.documentElement.requestFullscreen) {
         if (document.documentElement.requestFullscreen) {
@@ -10754,8 +10738,8 @@ function launch(){
 	        $('#wrapper').after('<div id="activeInfo"></div>');
 	        $('#wrapper').after('<div id="activeInfo"></div>');
 	        console.info("%c Organizr %c ".concat(currentVersion, " "), "color: white; background: #66D9EF; font-weight: 700; font-size: 24px; font-family: Monospace;", "color: #66D9EF; background: white; font-weight: 700; font-size: 24px; font-family: Monospace;");
 	        console.info("%c Organizr %c ".concat(currentVersion, " "), "color: white; background: #66D9EF; font-weight: 700; font-size: 24px; font-family: Monospace;", "color: #66D9EF; background: white; font-weight: 700; font-size: 24px; font-family: Monospace;");
 	        console.info("%c Status %c ".concat("Starting Up...", " "), "color: white; background: #F92671; font-weight: 700;", "color: #F92671; background: white; font-weight: 700;");
 	        console.info("%c Status %c ".concat("Starting Up...", " "), "color: white; background: #F92671; font-weight: 700;", "color: #F92671; background: white; font-weight: 700;");
-	        local('set','initial',true);
-	        setTimeout(function(){ local('r','initial'); }, 3000);
+	        //local('set','initial',true);
+	        //setTimeout(function(){ local('r','initial'); }, 300);
 	        defineNotification();
 	        defineNotification();
 	        checkMessage();
 	        checkMessage();
 	        errorPage();
 	        errorPage();

+ 7 - 0
js/version.json

@@ -390,5 +390,12 @@
     "new": "global blacklist user feature|option to define which settings page tab will open by default|sonarr to use new input method for token and url|icon for Prowlarr|email for Auth Proxy|start time and url validation for selfhosted url|new auth URL scheme",
     "new": "global blacklist user feature|option to define which settings page tab will open by default|sonarr to use new input method for token and url|icon for Prowlarr|email for Auth Proxy|start time and url validation for selfhosted url|new auth URL scheme",
     "fixed": "selfhosted healtcheck import issue|validate data on unused API endpoint|authRegister bug requiring 2 logins|help message for blacklist|catch all for single item parse on options|LDAP showing in backend|weather homepage|checking of commit",
     "fixed": "selfhosted healtcheck import issue|validate data on unused API endpoint|authRegister bug requiring 2 logins|help message for blacklist|catch all for single item parse on options|LDAP showing in backend|weather homepage|checking of commit",
     "notes": "update HC Plugin to only use Full Access Token|closeAllMessages function to update call"
     "notes": "update HC Plugin to only use Full Access Token|closeAllMessages function to update call"
+  },
+  "2.1.446": {
+    "date": "2021-08-13 19:20",
+    "title": "Some new features",
+    "new": "setResponse function|get config item to api|icons for TheLounge and Docsify services|small ui change to version section|change the way theme is set to fix loading ms issue",
+    "fixed": "Redirect uri that was encoded (#1690)|IP info on settings page|Ombi Missing Image for TVShow Posters that do not come with Full URL|only check for blacklisted ip if not blank|error handling of messages on startup",
+    "notes": "upgrade phpmailer/phpmailer to 6.5.0"
   }
   }
 }
 }

BIN
plugins/images/tabs/Docsify.png


BIN
plugins/images/tabs/TheLounge.png


Некоторые файлы не были показаны из-за большого количества измененных файлов