auth-functions.php 7.8 KB

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