auth-functions.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. <?php
  2. function authRegister($username, $password, $defaults, $email, $token = null)
  3. {
  4. if ($GLOBALS['authBackend'] !== '') {
  5. ombiImport($GLOBALS['authBackend']);
  6. }
  7. ssoCheck($username, $password, $token);
  8. if (createUser($username, $password, $defaults, $email)) {
  9. writeLog('success', 'Registration Function - A User has registered', $username);
  10. if ($GLOBALS['PHPMAILER-enabled']) {
  11. $emailTemplate = array(
  12. 'type' => 'registration',
  13. 'body' => $GLOBALS['PHPMAILER-emailTemplateRegisterUser'],
  14. 'subject' => $GLOBALS['PHPMAILER-emailTemplateRegisterUserSubject'],
  15. 'user' => $username,
  16. 'password' => null,
  17. 'inviteCode' => null,
  18. );
  19. $emailTemplate = phpmEmailTemplate($emailTemplate);
  20. $sendEmail = array(
  21. 'to' => $email,
  22. 'user' => $username,
  23. 'subject' => $emailTemplate['subject'],
  24. 'body' => phpmBuildEmail($emailTemplate),
  25. );
  26. phpmSendEmail($sendEmail);
  27. }
  28. if (createToken($username, $email, gravatar($email), $defaults['group'], $defaults['group_id'], $GLOBALS['organizrHash'], $GLOBALS['rememberMeDays'])) {
  29. writeLoginLog($username, 'success');
  30. writeLog('success', 'Login Function - A User has logged in', $username);
  31. return true;
  32. }
  33. } else {
  34. writeLog('error', 'Registration Function - An error occurred', $username);
  35. return 'username taken';
  36. }
  37. return false;
  38. }
  39. function checkPlexToken($token = '')
  40. {
  41. try {
  42. if (($token !== '')) {
  43. $url = 'https://plex.tv/users/account.json';
  44. $headers = array(
  45. 'X-Plex-Token' => $token,
  46. 'Content-Type' => 'application/json',
  47. 'Accept' => 'application/json'
  48. );
  49. $response = Requests::get($url, $headers);
  50. if ($response->success) {
  51. return json_decode($response->body, true);
  52. }
  53. } else {
  54. return false;
  55. }
  56. } catch (Requests_Exception $e) {
  57. writeLog('success', 'Plex Token Check Function - Error: ' . $e->getMessage(), SYSTEM);
  58. }
  59. return false;
  60. }
  61. function checkPlexUser($username)
  62. {
  63. try {
  64. if (!empty($GLOBALS['plexToken'])) {
  65. $url = 'https://plex.tv/api/users';
  66. $headers = array(
  67. 'X-Plex-Token' => $GLOBALS['plexToken'],
  68. );
  69. $response = Requests::get($url, $headers);
  70. if ($response->success) {
  71. libxml_use_internal_errors(true);
  72. $userXML = simplexml_load_string($response->body);
  73. if (is_array($userXML) || is_object($userXML)) {
  74. $usernameLower = strtolower($username);
  75. foreach ($userXML as $child) {
  76. if (isset($child['username']) && strtolower($child['username']) == $usernameLower || isset($child['email']) && strtolower($child['email']) == $usernameLower) {
  77. writeLog('success', 'Plex User Check - Found User on Friends List', $username);
  78. if ((string)$child->Server['machineIdentifier'] == $GLOBALS['plexID']) {
  79. writeLog('success', 'Plex User Check - User Approved for Login', $username);
  80. return true;
  81. } else {
  82. writeLog('error', 'Plex User Check - User not Approved User', $username);
  83. }
  84. }
  85. }
  86. }
  87. }
  88. }
  89. return false;
  90. } catch (Requests_Exception $e) {
  91. writeLog('error', 'Plex User Check Function - Error: ' . $e->getMessage(), $username);
  92. }
  93. return false;
  94. }
  95. function allPlexUsers($newOnly = false)
  96. {
  97. try {
  98. if (!empty($GLOBALS['plexToken'])) {
  99. $url = 'https://plex.tv/api/users';
  100. $headers = array(
  101. 'X-Plex-Token' => $GLOBALS['plexToken'],
  102. );
  103. $response = Requests::get($url, $headers);
  104. if ($response->success) {
  105. libxml_use_internal_errors(true);
  106. $userXML = simplexml_load_string($response->body);
  107. if (is_array($userXML) || is_object($userXML)) {
  108. $results = array();
  109. foreach ($userXML as $child) {
  110. if (((string)$child['restricted'] == '0')) {
  111. if ($newOnly) {
  112. $taken = usernameTaken((string)$child['username'], (string)$child['email']);
  113. if (!$taken) {
  114. $results[] = array(
  115. 'username' => (string)$child['username'],
  116. 'email' => (string)$child['email']
  117. );
  118. }
  119. } else {
  120. $results[] = array(
  121. 'username' => (string)$child['username'],
  122. 'email' => (string)$child['email'],
  123. );
  124. }
  125. }
  126. }
  127. return $results;
  128. }
  129. }
  130. }
  131. return false;
  132. } catch (Requests_Exception $e) {
  133. writeLog('success', 'Plex User Function - Error: ' . $e->getMessage(), $username);
  134. }
  135. return false;
  136. }
  137. function plugin_auth_plex($username, $password)
  138. {
  139. try {
  140. $usernameLower = strtolower($username);
  141. if ((!empty($GLOBALS['plexAdmin']) && strtolower($GLOBALS['plexAdmin']) == $usernameLower) || checkPlexUser($username)) {
  142. //Login User
  143. $url = 'https://plex.tv/users/sign_in.json';
  144. $headers = array(
  145. 'Accept' => 'application/json',
  146. 'Content-Type' => 'application/x-www-form-urlencoded',
  147. 'X-Plex-Product' => 'Organizr',
  148. 'X-Plex-Version' => '2.0',
  149. 'X-Plex-Client-Identifier' => $GLOBALS['uuid'],
  150. );
  151. $data = array(
  152. 'user[login]' => $username,
  153. 'user[password]' => $password,
  154. );
  155. $response = Requests::post($url, $headers, $data);
  156. if ($response->success) {
  157. $json = json_decode($response->body, true);
  158. if ((is_array($json) && isset($json['user']) && isset($json['user']['username'])) && strtolower($json['user']['username']) == $usernameLower || strtolower($json['user']['email']) == $usernameLower) {
  159. //writeLog("success", $json['user']['username']." was logged into organizr using plex credentials");
  160. return array(
  161. 'username' => $json['user']['username'],
  162. 'email' => $json['user']['email'],
  163. 'image' => $json['user']['thumb'],
  164. 'token' => $json['user']['authToken']
  165. );
  166. }
  167. }
  168. }
  169. return false;
  170. } catch (Requests_Exception $e) {
  171. writeLog('success', 'Plex Auth Function - Error: ' . $e->getMessage(), $username);
  172. }
  173. return false;
  174. }
  175. if (function_exists('ldap_connect')) {
  176. // Pass credentials to LDAP backend
  177. function plugin_auth_ldap($username, $password)
  178. {
  179. if (!empty($GLOBALS['authBaseDN']) && !empty($GLOBALS['authBackendHost'])) {
  180. $ldapServers = explode(',', $GLOBALS['authBackendHost']);
  181. foreach ($ldapServers as $key => $value) {
  182. // Calculate parts
  183. $digest = parse_url(trim($value));
  184. $scheme = strtolower((isset($digest['scheme']) ? $digest['scheme'] : 'ldap'));
  185. $host = (isset($digest['host']) ? $digest['host'] : (isset($digest['path']) ? $digest['path'] : ''));
  186. $port = (isset($digest['port']) ? $digest['port'] : (strtolower($scheme) == 'ldap' ? 389 : 636));
  187. // Reassign
  188. $ldapServers[$key] = $scheme . '://' . $host . ':' . $port;
  189. }
  190. $ldap = ldap_connect(implode(' ', $ldapServers));
  191. ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
  192. ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
  193. $bind = @ldap_bind($ldap, sprintf($GLOBALS['authBaseDN'], $username), $password);
  194. return ($bind) ? true : false;
  195. }
  196. return false;
  197. }
  198. } else {
  199. // Ldap Auth Missing Dependency
  200. function plugin_auth_ldap_disabled()
  201. {
  202. return 'LDAP - Disabled (Dependency: php-ldap missing!)';
  203. }
  204. }
  205. // Pass credentials to FTP backend
  206. function plugin_auth_ftp($username, $password)
  207. {
  208. // Calculate parts
  209. $digest = parse_url($GLOBALS['authBackendHost']);
  210. $scheme = strtolower((isset($digest['scheme']) ? $digest['scheme'] : (function_exists('ftp_ssl_connect') ? 'ftps' : 'ftp')));
  211. $host = (isset($digest['host']) ? $digest['host'] : (isset($digest['path']) ? $digest['path'] : ''));
  212. $port = (isset($digest['port']) ? $digest['port'] : 21);
  213. // Determine Connection Type
  214. if ($scheme == 'ftps') {
  215. $conn_id = ftp_ssl_connect($host, $port, 20);
  216. } elseif ($scheme == 'ftp') {
  217. $conn_id = ftp_connect($host, $port, 20);
  218. } else {
  219. return false;
  220. }
  221. // Check if valid FTP connection
  222. if ($conn_id) {
  223. // Attempt login
  224. @$login_result = ftp_login($conn_id, $username, $password);
  225. ftp_close($conn_id);
  226. // Return Result
  227. if ($login_result) {
  228. return true;
  229. } else {
  230. return false;
  231. }
  232. } else {
  233. return false;
  234. }
  235. }
  236. // Pass credentials to Emby Backend
  237. function plugin_auth_emby_local($username, $password)
  238. {
  239. try {
  240. $url = qualifyURL($GLOBALS['embyURL']) . '/Users/AuthenticateByName';
  241. $headers = array(
  242. 'Authorization' => 'MediaBrowser UserId="e8837bc1-ad67-520e-8cd2-f629e3155721", Client="None", Device="Organizr", DeviceId="xxx", Version="1.0.0.0"',
  243. 'Content-Type' => 'application/json',
  244. );
  245. $data = array(
  246. 'Username' => $username,
  247. 'Password' => sha1($password),
  248. 'PasswordMd5' => md5($password),
  249. );
  250. $response = Requests::post($url, $headers, json_encode($data));
  251. if ($response->success) {
  252. $json = json_decode($response->body, true);
  253. if (is_array($json) && isset($json['SessionInfo']) && isset($json['User']) && $json['User']['HasPassword'] == true) {
  254. // Login Success - Now Logout Emby Session As We No Longer Need It
  255. $headers = array(
  256. 'X-Mediabrowser-Token' => $json['AccessToken'],
  257. );
  258. $response = Requests::post(qualifyURL($GLOBALS['embyURL']) . '/Sessions/Logout', $headers, array());
  259. if ($response->success) {
  260. return true;
  261. }
  262. }
  263. }
  264. return false;
  265. } catch (Requests_Exception $e) {
  266. writeLog('error', 'Emby Local Auth Function - Error: ' . $e->getMessage(), $username);
  267. }
  268. return false;
  269. }
  270. // Authenticate against emby connect
  271. function plugin_auth_emby_connect($username, $password)
  272. {
  273. try {
  274. // Get A User
  275. $connectId = '';
  276. $url = qualifyURL($GLOBALS['embyURL']) . '/Users?api_key=' . $GLOBALS['embyToken'];
  277. $response = Requests::get($url);
  278. if ($response->success) {
  279. $json = json_decode($response->body, true);
  280. if (is_array($json)) {
  281. foreach ($json as $key => $value) { // Scan for this user
  282. if (isset($value['ConnectUserName']) && isset($value['ConnectUserId'])) { // Qualify as connect account
  283. if ($value['ConnectUserName'] == $username || $value['Name'] == $username) {
  284. $connectId = $value['ConnectUserId'];
  285. writeLog('success', 'Emby Connect Auth Function - Found User', $username);
  286. break;
  287. }
  288. }
  289. }
  290. if ($connectId) {
  291. $connectURL = 'https://connect.emby.media/service/user/authenticate';
  292. $headers = array(
  293. 'Accept' => 'application/json',
  294. 'Content-Type' => 'application/x-www-form-urlencoded',
  295. );
  296. $data = array(
  297. 'nameOrEmail' => $username,
  298. 'rawpw' => $password,
  299. );
  300. $response = Requests::post($connectURL, $headers, $data);
  301. if ($response->success) {
  302. $json = json_decode($response->body, true);
  303. if (is_array($json) && isset($json['AccessToken']) && isset($json['User']) && $json['User']['Id'] == $connectId) {
  304. return array(
  305. 'email' => $json['User']['Email'],
  306. 'image' => $json['User']['ImageUrl'],
  307. );
  308. }
  309. }
  310. }
  311. }
  312. }
  313. return false;
  314. } catch (Requests_Exception $e) {
  315. writeLog('error', 'Emby Connect Auth Function - Error: ' . $e->getMessage(), $username);
  316. return false;
  317. }
  318. }
  319. // Authenticate Against Emby Local (first) and Emby Connect
  320. function plugin_auth_emby_all($username, $password)
  321. {
  322. $localResult = plugin_auth_emby_local($username, $password);
  323. if ($localResult) {
  324. return $localResult;
  325. } else {
  326. return plugin_auth_emby_connect($username, $password);
  327. }
  328. }