Sfoglia il codice sorgente

fix Jellyfin API for SSO (#1609)

CauseFX 5 anni fa
parent
commit
5dbffcb7f0

+ 1 - 1
api/classes/organizr.class.php

@@ -3182,10 +3182,10 @@ class Organizr
 		$this->coookie('delete', 'mpt');
 		$this->coookie('delete', 'Auth');
 		$this->coookie('delete', 'oAuth');
-		$this->coookie('delete', 'jellyfin_credentials');
 		$this->coookie('delete', 'connect.sid');
 		$this->coookie('delete', 'petio_jwt');
 		$this->clearTautulliTokens();
+		$this->clearJellyfinTokens();
 		$this->revokeTokenCurrentUser($this->user['token']);
 		$this->user = null;
 		return true;

+ 10 - 0
api/functions/organizr-functions.php

@@ -573,6 +573,16 @@ trait OrganizrFunctions
 		}
 	}
 	
+	public function clearJellyfinTokens()
+	{
+		foreach (array_keys($_COOKIE) as $k => $v) {
+			if (strpos($v, 'user-') !== false) {
+				$this->coookie('delete', $v);
+			}
+		}
+		$this->coookie('delete', 'jellyfin_credentials');
+	}
+	
 	public function analyzeIP($ip)
 	{
 		if (strpos($ip, '/') !== false) {

+ 26 - 2
api/functions/sso-functions.php

@@ -2,6 +2,25 @@
 
 trait SSOFunctions
 {
+	public function ssoCookies()
+	{
+		$cookies = array(
+			'myPlexAccessToken' => isset($_COOKIE['mpt']) ? $_COOKIE['mpt'] : false,
+			'id_token' => isset($_COOKIE['Auth']) ? $_COOKIE['Auth'] : false,
+			'jellyfin_credentials' => isset($_COOKIE['jellyfin_credentials']) ? $_COOKIE['jellyfin_credentials'] : false,
+		);
+		// Jellyfin cookie
+		foreach (array_keys($_COOKIE) as $k => $v) {
+			if (strpos($v, 'user-') !== false) {
+				$cookiesToAdd = [
+					$v => $_COOKIE[$v]
+				];
+				$cookies = array_merge($cookies, $cookiesToAdd);
+			}
+		}
+		return $cookies;
+	}
+	
 	public function getSSOUserFor($app, $userobj)
 	{
 		$map = array(
@@ -37,7 +56,9 @@ trait SSOFunctions
 		if ($this->config['ssoJellyfin']) {
 			$jellyfinToken = $this->getJellyfinToken($this->getSSOUserFor('jellyfin', $userobj), $password);
 			if ($jellyfinToken) {
-				$this->coookie('set', 'jellyfin_credentials', $jellyfinToken, $this->config['rememberMeDays'], false);
+				foreach ($jellyfinToken as $k => $v) {
+					$this->coookie('set', $k, $v, $this->config['rememberMeDays'], false);
+				}
 			}
 		}
 		if ($this->config['ssoOverseerr']) {
@@ -77,7 +98,10 @@ trait SSOFunctions
 			if ($response->success) {
 				$token = json_decode($response->body, true);
 				$this->writeLog('success', 'Jellyfin Token Function - Grabbed token.', $username);
-				return '{"Servers":[{"ManualAddress":"' . $ssoUrl . '","Id":"' . $token['ServerId'] . '","UserId":"' . $token['User']['Id'] . '","AccessToken":"' . $token['AccessToken'] . '"}]}';
+				$key = 'user-' . $token['User']['Id'] . '-' . $token['ServerId'];
+				$jellyfin[$key] = json_encode($token['User']);
+				$jellyfin['jellyfin_credentials'] = '{"Servers":[{"ManualAddress":"' . $ssoUrl . '","Id":"' . $token['ServerId'] . '","UserId":"' . $token['User']['Id'] . '","AccessToken":"' . $token['AccessToken'] . '"}]}';
+				return $jellyfin;
 			} else {
 				$this->writeLog('error', 'Jellyfin Token Function - Jellyfin did not return Token', $username);
 			}

+ 2 - 6
api/v2/routes/root.php

@@ -114,14 +114,10 @@ $app->get('/launch', function ($request, $response, $args) {
 	$GLOBALS['api']['response']['data']['plugins'] = $Organizr->pluginGlobalList();
 	$GLOBALS['api']['response']['data']['appearance'] = $Organizr->loadAppearance();
 	$GLOBALS['api']['response']['data']['status'] = $Organizr->status();
-	$GLOBALS['api']['response']['data']['sso'] = array(
-		'myPlexAccessToken' => isset($_COOKIE['mpt']) ? $_COOKIE['mpt'] : false,
-		'id_token' => isset($_COOKIE['Auth']) ? $_COOKIE['Auth'] : false,
-		'jellyfin_credentials' => isset($_COOKIE['jellyfin_credentials']) ? $_COOKIE['jellyfin_credentials'] : false
-	);
+	$GLOBALS['api']['response']['data']['sso'] = $Organizr->ssoCookies();
 	$response->getBody()->write(jsonE($GLOBALS['api']));
 	return $response
 		->withHeader('Content-Type', 'application/json;charset=UTF-8')
 		->withStatus($GLOBALS['responseCode']);
 	
-});
+});