Browse Source

Add Overseerr SSO

CauseFX 5 years ago
parent
commit
8689bf810f

+ 39 - 0
api/classes/organizr.class.php

@@ -2268,6 +2268,43 @@ class Organizr
 					'value' => $this->config['ssoTautulli']
 				)
 			),
+			'Overseerr' => array(
+				array(
+					'type' => 'input',
+					'name' => 'overseerrURL',
+					'label' => 'Overseerr URL',
+					'value' => $this->config['overseerrURL'],
+					'help' => 'Please make sure to use local IP address and port - You also may use local dns name too.',
+					'placeholder' => 'http(s)://hostname:port'
+				),
+				array(
+					'type' => 'password-alt',
+					'name' => 'overseerrToken',
+					'label' => 'Token',
+					'value' => $this->config['overseerrToken']
+				),
+				array(
+					'type' => 'input',
+					'name' => 'overseerrFallbackUser',
+					'label' => 'Overseerr Fallback User',
+					'value' => $this->config['overseerrFallbackUser'],
+					'help' => 'Organizr will request an Overseerr User Token based off of this user credentials',
+					'attr' => 'disabled'
+				),
+				array(
+					'type' => 'password-alt',
+					'name' => 'overseerrFallbackPassword',
+					'label' => 'Overseerr Fallback Password',
+					'value' => $this->config['overseerrFallbackPassword'],
+					'attr' => 'disabled'
+				),
+				array(
+					'type' => 'switch',
+					'name' => 'ssoOverseerr',
+					'label' => 'Enable',
+					'value' => $this->config['ssoOverseerr']
+				)
+			),
 			'Ombi' => array(
 				array(
 					'type' => 'input',
@@ -2995,6 +3032,8 @@ 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->clearTautulliTokens();
 		$this->revokeTokenCurrentUser($this->user['token']);
 		$this->user = null;

+ 5 - 0
api/config/default.php

@@ -53,10 +53,15 @@ return array(
 	'ombiAlias' => false,
 	'ombiFallbackUser' => '',
 	'ombiFallbackPassword' => '',
+	'overseerrURL' => '',
+	'overseerrToken' => '',
+	'overseerrFallbackUser' => '',
+	'overseerrFallbackPassword' => '',
 	'ssoPlex' => false,
 	'ssoOmbi' => false,
 	'ssoTautulli' => false,
 	'ssoJellyfin' => false,
+	'ssoOverseerr' => false,
 	'sonarrURL' => '',
 	'sonarrUnmonitored' => false,
 	'sonarrToken' => '',

+ 50 - 5
api/functions/sso-functions.php

@@ -7,11 +7,12 @@ trait SSOFunctions
 		$map = array(
 			'jellyfin' => 'username',
 			'ombi' => 'username',
+			'overseerr' => 'username',
 			'tautulli' => 'username'
 		);
 		return $userobj[$map[$app]];
 	}
-
+	
 	public function ssoCheck($userobj, $password, $token = null)
 	{
 		if ($this->config['ssoPlex'] && $token) {
@@ -38,9 +39,15 @@ trait SSOFunctions
 				$this->coookie('set', 'jellyfin_credentials', $jellyfinToken, $this->config['rememberMeDays'], false);
 			}
 		}
+		if ($this->config['ssoOverseerr']) {
+			$overseerrToken = $this->getOverseerrToken($this->getSSOUserFor('overseerr', $userobj), $password, $token);
+			if ($overseerrToken) {
+				$this->coookie('set', 'connect.sid', $overseerrToken, $this->config['rememberMeDays'], false);
+			}
+		}
 		return true;
 	}
-
+	
 	public function getJellyfinToken($username, $password)
 	{
 		$token = null;
@@ -67,10 +74,9 @@ trait SSOFunctions
 		} catch (Requests_Exception $e) {
 			$this->writeLog('error', 'Jellyfin Token Function - Error: ' . $e->getMessage(), $username);
 		}
-		
-		return '{"Servers":[{"ManualAddress":"'. $url . '","Id":"' . $token['ServerId'] . '","UserId":"' . $token['User']['Id'] . '","AccessToken":"' . $token['AccessToken'] . '"}]}';
+		return '{"Servers":[{"ManualAddress":"' . $url . '","Id":"' . $token['ServerId'] . '","UserId":"' . $token['User']['Id'] . '","AccessToken":"' . $token['AccessToken'] . '"}]}';
 	}
-
+	
 	public function getOmbiToken($username, $password, $oAuthToken = null, $fallback = false)
 	{
 		$token = null;
@@ -150,4 +156,43 @@ trait SSOFunctions
 		return ($token) ? $token : false;
 	}
 	
+	public function getOverseerrToken($username, $password, $oAuthToken = null, $fallback = false)
+	{
+		$token = null;
+		try {
+			$url = $this->qualifyURL($this->config['overseerrURL']);
+			$headers = array(
+				"Content-Type" => "application/json"
+			);
+			$data = array(
+				//"username" => ($oAuthToken ? "" : $username), // not needed yet
+				//"password" => ($oAuthToken ? "" : $password), // not needed yet
+				"authToken" => $oAuthToken
+			);
+			$endpoint = '/api/v1/auth/login';
+			$options = ($this->localURL($url)) ? array('verify' => false) : array();
+			$response = Requests::post($url . $endpoint, $headers, json_encode($data), $options);
+			if ($response->success) {
+				$user = json_decode($response->body, true); // not really needed yet
+				$token = $response->cookies['connect.sid']->value;
+				$this->writeLog('success', 'Overseerr Token Function - Grabbed token', $user['username']);
+			} else {
+				if ($fallback) {
+					$this->writeLog('error', 'Overseerr Token Function - Overseerr did not return Token - Will retry using fallback credentials', $username);
+				} else {
+					$this->writeLog('error', 'Overseerr Token Function - Overseerr did not return Token', $username);
+				}
+			}
+		} catch (Requests_Exception $e) {
+			$this->writeLog('error', 'Overseerr Token Function - Error: ' . $e->getMessage(), $username);
+		}
+		if ($token) {
+			return urldecode($token);
+		} elseif ($fallback) {
+			return $this->getOverseerrToken($this->config['overseerrFallbackUser'], $this->decrypt($this->config['overseerrFallbackPassword']), null, false);
+		} else {
+			return false;
+		}
+	}
+	
 }

+ 0 - 31
api/pages/settings-settings-sso.php

@@ -26,36 +26,5 @@ function get_page_settings_settings_sso($Organizr)
         </div>
     </div>
 </div>
-<form id="sso-plex-token-form" class="mfp-hide white-popup-block mfp-with-anim">
-    <h1 lang="en">Get Plex Token</h1>
-    <div class="panel ssoPlexTokenHeader">
-        <div class="panel-heading ssoPlexTokenMessage" lang="en">Enter Plex Details</div>
-    </div>
-    <fieldset style="border:0;">
-        <div class="form-group">
-            <label class="control-label" for="sso-plex-token-form-username" lang="en">Plex Username</label>
-            <input type="text" class="form-control" id="sso-plex-token-form-username" name="username" required="" autofocus>
-        </div>
-        <div class="form-group">
-            <label class="control-label" for="sso-plex-token-form-password" lang="en">Plex Password</label>
-            <input type="password" class="form-control" id="sso-plex-token-form-password" name="password"  required="">
-        </div>
-    </fieldset>
-    <button class="btn btn-sm btn-info btn-rounded waves-effect waves-light pull-right row b-none getSSOPlexToken" type="button"><span class="btn-label"><i class="fa fa-ticket"></i></span><span lang="en">Grab It</span></button>
-    <div class="clearfix"></div>
-</form>
-<form id="sso-plex-machine-form" class="mfp-hide white-popup-block mfp-with-anim">
-    <h1 lang="en">Get Plex Machine</h1>
-    <div class="panel ssoPlexMachineHeader">
-        <div class="panel-heading ssoPlexMachineMessage" lang="en"></div>
-    </div>
-    <fieldset style="border:0;">
-        <div class="form-group">
-            <label class="control-label" for="sso-plex-machine-form-machine" lang="en">Plex Machine</label>
-            <div class="ssoPlexMachineListing"></div>
-        </div>
-    </fieldset>
-    <div class="clearfix"></div>
-</form>
 ';
 }