auth-functions.php 11 KB

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