auth-functions.php 11 KB

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