auth-functions.php 8.5 KB

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