Kaynağa Gözat

Added Import Users from plex

causefx 7 yıl önce
ebeveyn
işleme
f6d8607ce3

+ 33 - 0
api/functions/api-functions.php

@@ -969,6 +969,39 @@ function createUser($username, $password, $defaults, $email = null)
 	}
 }
 
+function importUsers($array)
+{
+	$imported = 0;
+	$defaults = defaultUserGroup();
+	foreach ($array as $user) {
+		$password = random_ascii_string(30);
+		if ($user['username'] !== '' && $user['email'] !== '' && $password !== '' && $defaults !== '') {
+			$newUser = createUser($user['username'], $password, $defaults, $user['email']);
+			if (!$newUser) {
+				writeLog('error', 'Import Function - Error', $user['username']);
+			} else {
+				$imported++;
+			}
+		}
+	}
+	return $imported;
+}
+
+function importUsersType($array)
+{
+	$type = $array['data']['type'];
+	if ($type !== '') {
+		switch ($type) {
+			case 'plex':
+				return importUsers(allPlexUsers(true));
+				break;
+			default:
+				return false;
+		}
+	}
+	return false;
+}
+
 function allTabs()
 {
 	if (file_exists('config' . DIRECTORY_SEPARATOR . 'config.php')) {

+ 47 - 3
api/functions/auth-functions.php

@@ -1,9 +1,9 @@
 <?php
 function authRegister($username, $password, $defaults, $email)
 {
-    if ($GLOBALS['authBackend'] !== '') {
-        ombiImport($GLOBALS['authBackend']);
-    }
+	if ($GLOBALS['authBackend'] !== '') {
+		ombiImport($GLOBALS['authBackend']);
+	}
 	if (createUser($username, $password, $defaults, $email)) {
 		writeLog('success', 'Registration Function - A User has registered', $username);
 		if ($GLOBALS['PHPMAILER-enabled']) {
@@ -65,6 +65,50 @@ function checkPlexUser($username)
 	return false;
 }
 
+function allPlexUsers($newOnly = false)
+{
+	try {
+		if (!empty($GLOBALS['plexToken'])) {
+			$url = 'https://plex.tv/pms/friends/all';
+			$headers = array(
+				'X-Plex-Token' => $GLOBALS['plexToken'],
+			);
+			$response = Requests::get($url, $headers);
+			if ($response->success) {
+				libxml_use_internal_errors(true);
+				$userXML = simplexml_load_string($response->body);
+				if (is_array($userXML) || is_object($userXML)) {
+					$results = array();
+					foreach ($userXML as $child) {
+						if (((string)$child['username'] !== '') && ((string)$child['email'] !== '')) {
+							if ($newOnly) {
+								$taken = usernameTaken((string)$child['username'], (string)$child['email']);
+								if (!$taken) {
+									$results[] = array(
+										'username' => (string)$child['username'],
+										'email' => (string)$child['email']
+									);
+								}
+							} else {
+								$results[] = array(
+									'username' => (string)$child['username'],
+									'email' => (string)$child['email']
+								);
+							}
+							
+						}
+					}
+					return $results;
+				}
+			}
+		}
+		return false;
+	} catch (Requests_Exception $e) {
+		writeLog('success', 'Plex User Function - Error: ' . $e->getMessage(), $username);
+	}
+	return false;
+}
+
 function plugin_auth_plex($username, $password)
 {
 	try {

+ 9 - 0
api/functions/organizr-functions.php

@@ -1851,4 +1851,13 @@ function guestHash($start, $end)
 	$ip = $_SERVER['REMOTE_ADDR'];
 	$ip = md5($ip);
 	return substr($ip, $start, $end);
+}
+
+function importUserButtons()
+{
+	$buttons = '';
+	if (!empty($GLOBALS['plexToken'])) {
+		$buttons .= '<button class="btn bg-plex text-muted waves-effect waves-light importUsersButton" onclick="importUsers(\'plex\')" type="button"><span class="btn-label"><i class="mdi mdi-plex"></i></span><span lang="en">Import Plex Users</span></button>';
+	}
+	return $buttons;
 }

+ 19 - 0
api/index.php

@@ -1171,6 +1171,25 @@ switch ($function) {
 				break;
 		}
 		break;
+	case 'v1_import_users':
+		switch ($method) {
+			case 'POST':
+				if (qualifyRequest(1)) {
+					$result['status'] = 'success';
+					$result['statusText'] = 'success';
+					$result['data'] = importUsersType($_POST);
+				} else {
+					$result['status'] = 'error';
+					$result['statusText'] = 'API/Token invalid or not set';
+					$result['data'] = null;
+				}
+				break;
+			default:
+				$result['status'] = 'error';
+				$result['statusText'] = 'The function requested is not defined for method: ' . $method;
+				break;
+		}
+		break;
 	case 'v1_ombi':
 		switch ($method) {
 			case 'POST':

+ 6 - 0
api/pages/settings.php

@@ -116,6 +116,8 @@ if (file_exists('config' . DIRECTORY_SEPARATOR . 'config.php')) {
                             </li>
                             <li onclick="changeSettingsMenu(\'Settings::User Management::Manage Groups\');loadSettingsPage(\'api/?v1/settings/user/manage/groups\',\'#settings-user-manage-groups\',\'Group Management\');" role="presentation" class=""><a href="#settings-user-manage-groups" aria-controls="home" role="tab" data-toggle="tab" aria-expanded="false"><span class="visible-xs"><i class="ti-briefcase"></i></span><span class="hidden-xs" lang="en">Groups</span></a>
                             </li>
+                            <li onclick="changeSettingsMenu(\'Settings::User Management::Import Users\');" role="presentation" class=""><a href="#settings-user-import-users" aria-controls="home" role="tab" data-toggle="tab" aria-expanded="false"><span class="visible-xs"><i class="ti-briefcase"></i></span><span class="hidden-xs" lang="en">Import</span></a>
+                            </li>
                         </ul>
                         <!-- Tab panes -->
                         <div class="tab-content">
@@ -127,6 +129,10 @@ if (file_exists('config' . DIRECTORY_SEPARATOR . 'config.php')) {
                                 <h2 lang="en">Loading...</h2>
                                 <div class="clearfix"></div>
                             </div>
+                            <div role="tabpanel" class="tab-pane fade" id="settings-user-import-users">
+                                ' . importUserButtons() . '
+                                <div class="clearfix"></div>
+                            </div>
                         </div>
                     </section>
                     <! -- IMAGE MANAGER -->

+ 16 - 0
js/functions.js

@@ -4800,6 +4800,22 @@ function inlineLoad(){
 	  midClick: true // allow opening popup on middle mouse click. Always set it to true if you don't provide alternative source.
 	});
 }
+//Import Users
+function importUsers(type){
+    $('.importUsersButton').attr('disabled', true);
+    messageSingle('',window.lang.translate('Importing Users'),activeInfo.settings.notifications.position,'#FFF','success','5000');
+    organizrAPI('POST','api/?v1/import/users',{type:type}).success(function(data) {
+        var response = JSON.parse(data);
+        if(response.data !== false){
+            messageSingle('',window.lang.translate('Imported [' + response.data + '] Users'),activeInfo.settings.notifications.position,'#FFF','success','5000');
+            $('.importUsersButton').attr('disabled', false);
+        }else{
+            messageSingle('','Imported Users Error',activeInfo.settings.notifications.position,'#FFF','error','5000');
+        }
+    }).fail(function(xhr) {
+        console.error("Organizr Function: API Connection Failed");
+    });
+}
 //Settings change auth
 function changeAuth(){
     var type = $('#authSelect').val();