api-functions.php 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262
  1. <?php /** @noinspection SqlResolve */
  2. /** @noinspection SqlResolve */
  3. /** @noinspection SqlResolve */
  4. /** @noinspection SqlResolve */
  5. /** @noinspection SyntaxError */
  6. function apiLogin()
  7. {
  8. $array = array(
  9. 'data' => array(
  10. array(
  11. 'name' => 'username',
  12. 'value' => (isset($_POST['username'])) ? $_POST['username'] : false
  13. ),
  14. array(
  15. 'name' => 'password',
  16. 'value' => (isset($_POST['password'])) ? $_POST['password'] : false
  17. ),
  18. array(
  19. 'name' => 'remember',
  20. 'value' => (isset($_POST['remember'])) ? true : false
  21. ),
  22. array(
  23. 'name' => 'oAuth',
  24. 'value' => (isset($_POST['oAuth'])) ? $_POST['oAuth'] : false
  25. ),
  26. array(
  27. 'name' => 'oAuthType',
  28. 'value' => (isset($_POST['oAuthType'])) ? $_POST['oAuthType'] : false
  29. ),
  30. array(
  31. 'name' => 'tfaCode',
  32. 'value' => (isset($_POST['tfaCode'])) ? $_POST['tfaCode'] : false
  33. ),
  34. array(
  35. 'name' => 'loginAttempts',
  36. 'value' => (isset($_POST['loginAttempts'])) ? $_POST['loginAttempts'] : false
  37. ),
  38. array(
  39. 'name' => 'output',
  40. 'value' => true
  41. ),
  42. )
  43. );
  44. foreach ($array['data'] as $items) {
  45. foreach ($items as $key => $value) {
  46. if ($key == 'name') {
  47. $newKey = $value;
  48. }
  49. if ($key == 'value') {
  50. $newValue = $value;
  51. }
  52. if (isset($newKey) && isset($newValue)) {
  53. $$newKey = $newValue;
  54. }
  55. }
  56. }
  57. return login($array);
  58. }
  59. function login($array)
  60. {
  61. // Grab username and Password from login form
  62. $username = $password = $oAuth = $oAuthType = '';
  63. foreach ($array['data'] as $items) {
  64. foreach ($items as $key => $value) {
  65. if ($key == 'name') {
  66. $newKey = $value;
  67. }
  68. if ($key == 'value') {
  69. $newValue = $value;
  70. }
  71. if (isset($newKey) && isset($newValue)) {
  72. $$newKey = $newValue;
  73. }
  74. }
  75. }
  76. $username = (strpos($GLOBALS['authBackend'], 'emby') !== false) ? $username : strtolower($username);
  77. $days = (isset($remember)) ? $GLOBALS['rememberMeDays'] : 1;
  78. $oAuth = (isset($oAuth)) ? $oAuth : false;
  79. $output = (isset($output)) ? $output : false;
  80. $loginAttempts = (isset($loginAttempts)) ? $loginAttempts : false;
  81. if($loginAttempts > $GLOBALS['loginAttempts'] || isset($_COOKIE['lockout'])){
  82. coookieSeconds('set', 'lockout', $GLOBALS['loginLockout'], $GLOBALS['loginLockout']);
  83. return 'lockout';
  84. }
  85. try {
  86. $database = new Dibi\Connection([
  87. 'driver' => 'sqlite3',
  88. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  89. ]);
  90. $authSuccess = false;
  91. $authProxy = false;
  92. if($GLOBALS['authProxyEnabled'] && $GLOBALS['authProxyHeaderName'] !== '' && $GLOBALS['authProxyWhitelist'] !== ''){
  93. $whitelistRange = analyzeIP($GLOBALS['authProxyWhitelist']);
  94. $from = $whitelistRange['from'];
  95. $to = $whitelistRange['to'];
  96. $authProxy = authProxyRangeCheck($from,$to);
  97. $usernameHeader = isset(getallheaders()[$GLOBALS['authProxyHeaderName']]) ? getallheaders()[$GLOBALS['authProxyHeaderName']] : $username;
  98. $username = ($authProxy) ? $usernameHeader : $username;
  99. }
  100. $function = 'plugin_auth_' . $GLOBALS['authBackend'];
  101. if (!$oAuth) {
  102. $result = $database->fetch('SELECT * FROM users WHERE username = ? COLLATE NOCASE OR email = ? COLLATE NOCASE', $username, $username);
  103. switch ($GLOBALS['authType']) {
  104. case 'external':
  105. if (function_exists($function)) {
  106. $authSuccess = $function($username, $password);
  107. }
  108. break;
  109. /** @noinspection PhpMissingBreakStatementInspection */
  110. case 'both':
  111. if (function_exists($function)) {
  112. $authSuccess = $function($username, $password);
  113. }
  114. // no break
  115. default: // Internal
  116. if (!$authSuccess) {
  117. // perform the internal authentication step
  118. if (password_verify($password, $result['password'])) {
  119. $authSuccess = true;
  120. }
  121. }
  122. }
  123. $authSuccess = ($authProxy) ? true : $authSuccess;
  124. } else {
  125. // Has oAuth Token!
  126. switch ($oAuthType) {
  127. case 'plex':
  128. if ($GLOBALS['plexoAuth']) {
  129. $tokenInfo = checkPlexToken($oAuth);
  130. if ($tokenInfo) {
  131. $authSuccess = array(
  132. 'username' => $tokenInfo['user']['username'],
  133. 'email' => $tokenInfo['user']['email'],
  134. 'image' => $tokenInfo['user']['thumb'],
  135. 'token' => $tokenInfo['user']['authToken']
  136. );
  137. coookie('set', 'oAuth', 'true', $GLOBALS['rememberMeDays']);
  138. $authSuccess = ((!empty($GLOBALS['plexAdmin']) && strtolower($GLOBALS['plexAdmin']) == strtolower($tokenInfo['user']['username'])) || (!empty($GLOBALS['plexAdmin']) && strtolower($GLOBALS['plexAdmin']) == strtolower($tokenInfo['user']['email'])) || checkPlexUser($tokenInfo['user']['username'])) ? $authSuccess : false;
  139. }
  140. }
  141. break;
  142. default:
  143. return ($output) ? 'No oAuthType defined' : 'error';
  144. break;
  145. }
  146. $result = ($authSuccess) ? $database->fetch('SELECT * FROM users WHERE username = ? COLLATE NOCASE OR email = ? COLLATE NOCASE', $authSuccess['username'], $authSuccess['email']) : '';
  147. }
  148. if ($authSuccess) {
  149. // Make sure user exists in database
  150. $userExists = false;
  151. $passwordMatches = ($oAuth || $authProxy) ? true : false;
  152. $token = (is_array($authSuccess) && isset($authSuccess['token']) ? $authSuccess['token'] : '');
  153. if ($result['username']) {
  154. $userExists = true;
  155. $username = $result['username'];
  156. if ($passwordMatches == false) {
  157. $passwordMatches = (password_verify($password, $result['password'])) ? true : false;
  158. }
  159. }
  160. if ($userExists) {
  161. //does org password need to be updated
  162. if (!$passwordMatches) {
  163. $database->query('
  164. UPDATE users SET', [
  165. 'password' => password_hash($password, PASSWORD_BCRYPT)
  166. ], '
  167. WHERE id=?', $result['id']);
  168. writeLog('success', 'Login Function - User Password updated from backend', $username);
  169. }
  170. if ($token !== '') {
  171. if ($token !== $result['plex_token']) {
  172. $database->query('
  173. UPDATE users SET', [
  174. 'plex_token' => $token
  175. ], '
  176. WHERE id=?', $result['id']);
  177. writeLog('success', 'Login Function - User Plex Token updated from backend', $username);
  178. }
  179. }
  180. // 2FA might go here
  181. if ($result['auth_service'] !== 'internal' && strpos($result['auth_service'], '::') !== false) {
  182. $TFA = explode('::', $result['auth_service']);
  183. // Is code with login info?
  184. if ($tfaCode == '') {
  185. return '2FA';
  186. } else {
  187. if (!verify2FA($TFA[1], $tfaCode, $TFA[0])) {
  188. writeLoginLog($username, 'error');
  189. writeLog('error', 'Login Function - Wrong 2FA', $username);
  190. return '2FA-incorrect';
  191. }
  192. }
  193. }
  194. // End 2FA
  195. // authentication passed - 1) mark active and update token
  196. $createToken = createToken($result['username'], $result['email'], $result['image'], $result['group'], $result['group_id'], $GLOBALS['organizrHash'], $days);
  197. if ($createToken) {
  198. writeLoginLog($username, 'success');
  199. writeLog('success', 'Login Function - A User has logged in', $username);
  200. $ssoUser = (empty($result['email'])) ? $result['username'] : (strpos($result['email'], 'placeholder') !== false) ? $result['username'] : $result['email'];
  201. ssoCheck($ssoUser, $password, $token); //need to work on this
  202. return ($output) ? array('name' => $GLOBALS['cookieName'], 'token' => (string)$createToken) : true;
  203. } else {
  204. return 'Token Creation Error';
  205. }
  206. } else {
  207. // Create User
  208. //ssoCheck($username, $password, $token);
  209. return authRegister((is_array($authSuccess) && isset($authSuccess['username']) ? $authSuccess['username'] : $username), $password, defaultUserGroup(), (is_array($authSuccess) && isset($authSuccess['email']) ? $authSuccess['email'] : ''), $token);
  210. }
  211. } else {
  212. // authentication failed
  213. writeLoginLog($username, 'error');
  214. writeLog('error', 'Login Function - Wrong Password', $username);
  215. if($loginAttempts >= $GLOBALS['loginAttempts']){
  216. coookieSeconds('set', 'lockout', $GLOBALS['loginLockout'], $GLOBALS['loginLockout']);
  217. return 'lockout';
  218. }else{
  219. return 'mismatch';
  220. }
  221. }
  222. } catch (Dibi\Exception $e) {
  223. return $e;
  224. }
  225. }
  226. function createDB($path, $filename)
  227. {
  228. try {
  229. if (!file_exists($path)) {
  230. mkdir($path, 0777, true);
  231. }
  232. $createDB = new Dibi\Connection([
  233. 'driver' => 'sqlite3',
  234. 'database' => $path . $filename,
  235. ]);
  236. // Create Users
  237. $createDB->query('CREATE TABLE `users` (
  238. `id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
  239. `username` TEXT UNIQUE,
  240. `password` TEXT,
  241. `email` TEXT,
  242. `plex_token` TEXT,
  243. `group` TEXT,
  244. `group_id` INTEGER,
  245. `locked` INTEGER,
  246. `image` TEXT,
  247. `register_date` DATE,
  248. `auth_service` TEXT DEFAULT \'internal\'
  249. );');
  250. // Create Tokens
  251. $createDB->query('CREATE TABLE `chatroom` (
  252. `id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
  253. `username` TEXT,
  254. `gravatar` TEXT,
  255. `uid` TEXT,
  256. `date` DATE,
  257. `ip` TEXT,
  258. `message` TEXT
  259. );');
  260. $createDB->query('CREATE TABLE `tokens` (
  261. `id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
  262. `token` TEXT UNIQUE,
  263. `user_id` INTEGER,
  264. `browser` TEXT,
  265. `ip` TEXT,
  266. `created` DATE,
  267. `expires` DATE
  268. );');
  269. $createDB->query('CREATE TABLE `groups` (
  270. `id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
  271. `group` TEXT UNIQUE,
  272. `group_id` INTEGER,
  273. `image` TEXT,
  274. `default` INTEGER
  275. );');
  276. $createDB->query('CREATE TABLE `categories` (
  277. `id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
  278. `order` INTEGER,
  279. `category` TEXT UNIQUE,
  280. `category_id` INTEGER,
  281. `image` TEXT,
  282. `default` INTEGER
  283. );');
  284. // Create Tabs
  285. $createDB->query('CREATE TABLE `tabs` (
  286. `id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
  287. `order` INTEGER,
  288. `category_id` INTEGER,
  289. `name` TEXT,
  290. `url` TEXT,
  291. `url_local` TEXT,
  292. `default` INTEGER,
  293. `enabled` INTEGER,
  294. `group_id` INTEGER,
  295. `image` TEXT,
  296. `type` INTEGER,
  297. `splash` INTEGER,
  298. `ping` INTEGER,
  299. `ping_url` TEXT,
  300. `timeout` INTEGER,
  301. `timeout_ms` INTEGER,
  302. `preload` INTEGER
  303. );');
  304. // Create Options
  305. $createDB->query('CREATE TABLE `options` (
  306. `id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
  307. `name` TEXT UNIQUE,
  308. `value` TEXT
  309. );');
  310. // Create Invites
  311. $createDB->query('CREATE TABLE `invites` (
  312. `id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
  313. `code` TEXT UNIQUE,
  314. `date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  315. `email` TEXT,
  316. `username` TEXT,
  317. `dateused` TIMESTAMP,
  318. `usedby` TEXT,
  319. `ip` TEXT,
  320. `valid` TEXT,
  321. `type` TEXT
  322. );');
  323. return true;
  324. } catch (Dibi\Exception $e) {
  325. return false;
  326. }
  327. }
  328. // Upgrade Database
  329. function updateDB($oldVerNum = false)
  330. {
  331. $tempLock = $GLOBALS['dbLocation'] . 'DBLOCK.txt';
  332. if (!file_exists($tempLock)) {
  333. touch($tempLock);
  334. // Create Temp DB First
  335. $migrationDB = 'tempMigration.db';
  336. $pathDigest = pathinfo($GLOBALS['dbLocation'] . $GLOBALS['dbName']);
  337. if (file_exists($GLOBALS['dbLocation'] . $migrationDB)) {
  338. unlink($GLOBALS['dbLocation'] . $migrationDB);
  339. }
  340. $backupDB = $pathDigest['dirname'] . '/' . $pathDigest['filename'] . '[' . date('Y-m-d_H-i-s') . ']' . ($oldVerNum ? '[' . $oldVerNum . ']' : '') . '.bak.db';
  341. copy($GLOBALS['dbLocation'] . $GLOBALS['dbName'], $backupDB);
  342. $success = createDB($GLOBALS['dbLocation'], $migrationDB);
  343. if ($success) {
  344. try {
  345. $connectOldDB = new Dibi\Connection([
  346. 'driver' => 'sqlite3',
  347. 'database' => $backupDB,
  348. ]);
  349. $connectNewDB = new Dibi\Connection([
  350. 'driver' => 'sqlite3',
  351. 'database' => $GLOBALS['dbLocation'] . $migrationDB,
  352. ]);
  353. $tables = $connectOldDB->fetchAll('SELECT name FROM sqlite_master WHERE type="table"');
  354. foreach ($tables as $table) {
  355. $data = $connectOldDB->fetchAll('SELECT * FROM ' . $table['name']);
  356. writeLog('success', 'Update Function - Grabbed Table data for Table: ' . $table['name'], 'Database');
  357. foreach ($data as $row) {
  358. $connectNewDB->query('INSERT into ' . $table['name'], $row);
  359. }
  360. writeLog('success', 'Update Function - Wrote Table data for Table: ' . $table['name'], 'Database');
  361. }
  362. writeLog('success', 'Update Function - All Table data converted - Starting Movement', 'Database');
  363. $connectOldDB->disconnect();
  364. $connectNewDB->disconnect();
  365. // Remove Current Database
  366. if (file_exists($GLOBALS['dbLocation'] . $migrationDB)) {
  367. $oldFileSize = filesize($GLOBALS['dbLocation'] . $GLOBALS['dbName']);
  368. $newFileSize = filesize($GLOBALS['dbLocation'] . $migrationDB);
  369. if ($newFileSize > 0) {
  370. writeLog('success', 'Update Function - Table Size of new DB ok..', 'Database');
  371. @unlink($GLOBALS['dbLocation'] . $GLOBALS['dbName']);
  372. copy($GLOBALS['dbLocation'] . $migrationDB, $GLOBALS['dbLocation'] . $GLOBALS['dbName']);
  373. @unlink($GLOBALS['dbLocation'] . $migrationDB);
  374. writeLog('success', 'Update Function - Migrated Old Info to new Database', 'Database');
  375. @unlink($tempLock);
  376. return true;
  377. }
  378. }
  379. @unlink($tempLock);
  380. return false;
  381. } catch (Dibi\Exception $e) {
  382. writeLog('error', 'Update Function - Error [' . $e . ']', 'Database');
  383. @unlink($tempLock);
  384. return false;
  385. }
  386. }
  387. @unlink($tempLock);
  388. return false;
  389. }
  390. return false;
  391. }
  392. function createFirstAdmin($path, $filename, $username, $password, $email)
  393. {
  394. try {
  395. $createDB = new Dibi\Connection([
  396. 'driver' => 'sqlite3',
  397. 'database' => $path . $filename,
  398. ]);
  399. $userInfo = [
  400. 'username' => $username,
  401. 'password' => password_hash($password, PASSWORD_BCRYPT),
  402. 'email' => $email,
  403. 'group' => 'Admin',
  404. 'group_id' => 0,
  405. 'image' => gravatar($email),
  406. 'register_date' => $GLOBALS['currentTime'],
  407. ];
  408. $groupInfo0 = [
  409. 'group' => 'Admin',
  410. 'group_id' => 0,
  411. 'default' => false,
  412. 'image' => 'plugins/images/groups/admin.png',
  413. ];
  414. $groupInfo1 = [
  415. 'group' => 'Co-Admin',
  416. 'group_id' => 1,
  417. 'default' => false,
  418. 'image' => 'plugins/images/groups/coadmin.png',
  419. ];
  420. $groupInfo2 = [
  421. 'group' => 'Super User',
  422. 'group_id' => 2,
  423. 'default' => false,
  424. 'image' => 'plugins/images/groups/superuser.png',
  425. ];
  426. $groupInfo3 = [
  427. 'group' => 'Power User',
  428. 'group_id' => 3,
  429. 'default' => false,
  430. 'image' => 'plugins/images/groups/poweruser.png',
  431. ];
  432. $groupInfo4 = [
  433. 'group' => 'User',
  434. 'group_id' => 4,
  435. 'default' => true,
  436. 'image' => 'plugins/images/groups/user.png',
  437. ];
  438. $groupInfoGuest = [
  439. 'group' => 'Guest',
  440. 'group_id' => 999,
  441. 'default' => false,
  442. 'image' => 'plugins/images/groups/guest.png',
  443. ];
  444. $settingsInfo = [
  445. 'order' => 1,
  446. 'category_id' => 0,
  447. 'name' => 'Settings',
  448. 'url' => 'api/?v1/settings/page',
  449. 'default' => false,
  450. 'enabled' => true,
  451. 'group_id' => 1,
  452. 'image' => 'fontawesome::cog',
  453. 'type' => 0
  454. ];
  455. $homepageInfo = [
  456. 'order' => 2,
  457. 'category_id' => 0,
  458. 'name' => 'Homepage',
  459. 'url' => 'api/?v1/homepage/page',
  460. 'default' => false,
  461. 'enabled' => false,
  462. 'group_id' => 4,
  463. 'image' => 'fontawesome::home',
  464. 'type' => 0
  465. ];
  466. $unsortedInfo = [
  467. 'order' => 1,
  468. 'category' => 'Unsorted',
  469. 'category_id' => 0,
  470. 'image' => 'plugins/images/categories/unsorted.png',
  471. 'default' => true
  472. ];
  473. $createDB->query('INSERT INTO [users]', $userInfo);
  474. $createDB->query('INSERT INTO [groups]', $groupInfo0);
  475. $createDB->query('INSERT INTO [groups]', $groupInfo1);
  476. $createDB->query('INSERT INTO [groups]', $groupInfo2);
  477. $createDB->query('INSERT INTO [groups]', $groupInfo3);
  478. $createDB->query('INSERT INTO [groups]', $groupInfo4);
  479. $createDB->query('INSERT INTO [groups]', $groupInfoGuest);
  480. $createDB->query('INSERT INTO [tabs]', $settingsInfo);
  481. $createDB->query('INSERT INTO [tabs]', $homepageInfo);
  482. $createDB->query('INSERT INTO [categories]', $unsortedInfo);
  483. return true;
  484. } catch (Dibi\Exception $e) {
  485. writeLog('error', 'Wizard Function - Error [' . $e . ']', 'Wizard');
  486. return false;
  487. }
  488. }
  489. function defaultUserGroup()
  490. {
  491. try {
  492. $connect = new Dibi\Connection([
  493. 'driver' => 'sqlite3',
  494. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  495. ]);
  496. $all = $connect->fetch('SELECT * FROM groups WHERE `default` = 1');
  497. return $all;
  498. } catch (Dibi\Exception $e) {
  499. return false;
  500. }
  501. }
  502. function defaultTabCategory()
  503. {
  504. try {
  505. $connect = new Dibi\Connection([
  506. 'driver' => 'sqlite3',
  507. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  508. ]);
  509. $all = $connect->fetch('SELECT * FROM categories WHERE `default` = 1');
  510. return $all;
  511. } catch (Dibi\Exception $e) {
  512. return false;
  513. }
  514. }
  515. function getGuest()
  516. {
  517. if (isset($GLOBALS['dbLocation'])) {
  518. try {
  519. $connect = new Dibi\Connection([
  520. 'driver' => 'sqlite3',
  521. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  522. ]);
  523. $all = $connect->fetch('SELECT * FROM groups WHERE `group_id` = 999');
  524. return $all;
  525. } catch (Dibi\Exception $e) {
  526. return false;
  527. }
  528. } else {
  529. return array(
  530. 'group' => 'Guest',
  531. 'group_id' => 999,
  532. 'image' => 'plugins/images/groups/guest.png'
  533. );
  534. }
  535. }
  536. function adminEditGroup($array)
  537. {
  538. switch ($array['data']['action']) {
  539. case 'changeDefaultGroup':
  540. try {
  541. $connect = new Dibi\Connection([
  542. 'driver' => 'sqlite3',
  543. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  544. ]);
  545. $connect->query('UPDATE groups SET `default` = 0');
  546. $connect->query('
  547. UPDATE groups SET', [
  548. 'default' => 1
  549. ], '
  550. WHERE id=?', $array['data']['id']);
  551. writeLog('success', 'Group Management Function - Changed Default Group from [' . $array['data']['oldGroupName'] . '] to [' . $array['data']['newGroupName'] . ']', $GLOBALS['organizrUser']['username']);
  552. return true;
  553. } catch (Dibi\Exception $e) {
  554. return false;
  555. }
  556. break;
  557. case 'deleteUserGroup':
  558. try {
  559. $connect = new Dibi\Connection([
  560. 'driver' => 'sqlite3',
  561. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  562. ]);
  563. $connect->query('DELETE FROM groups WHERE id = ?', $array['data']['id']);
  564. writeLog('success', 'Group Management Function - Deleted Group [' . $array['data']['groupName'] . ']', $GLOBALS['organizrUser']['username']);
  565. return true;
  566. } catch (Dibi\Exception $e) {
  567. return false;
  568. }
  569. break;
  570. case 'addUserGroup':
  571. try {
  572. $connect = new Dibi\Connection([
  573. 'driver' => 'sqlite3',
  574. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  575. ]);
  576. $newGroup = [
  577. 'group' => $array['data']['newGroupName'],
  578. 'group_id' => $array['data']['newGroupID'],
  579. 'default' => false,
  580. 'image' => $array['data']['newGroupImage'],
  581. ];
  582. $connect->query('INSERT INTO [groups]', $newGroup);
  583. writeLog('success', 'Group Management Function - Added Group [' . $array['data']['newGroupName'] . ']', $GLOBALS['organizrUser']['username']);
  584. return true;
  585. } catch (Dibi\Exception $e) {
  586. return false;
  587. }
  588. break;
  589. case 'editUserGroup':
  590. try {
  591. $connect = new Dibi\Connection([
  592. 'driver' => 'sqlite3',
  593. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  594. ]);
  595. $connect->query('
  596. UPDATE groups SET', [
  597. 'group' => $array['data']['groupName'],
  598. 'image' => $array['data']['groupImage'],
  599. ], '
  600. WHERE id=?', $array['data']['id']);
  601. writeLog('success', 'Group Management Function - Edited Group Info for [' . $array['data']['oldGroupName'] . ']', $GLOBALS['organizrUser']['username']);
  602. return true;
  603. } catch (Dibi\Exception $e) {
  604. return false;
  605. }
  606. break;
  607. default:
  608. return false;
  609. break;
  610. }
  611. }
  612. function adminEditUser($array)
  613. {
  614. switch ($array['data']['action']) {
  615. case 'changeGroup':
  616. if ($array['data']['newGroupID'] == 0) {
  617. return false;
  618. }
  619. try {
  620. $connect = new Dibi\Connection([
  621. 'driver' => 'sqlite3',
  622. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  623. ]);
  624. $connect->query('
  625. UPDATE users SET', [
  626. 'group' => $array['data']['newGroupName'],
  627. 'group_id' => $array['data']['newGroupID'],
  628. ], '
  629. WHERE id=?', $array['data']['id']);
  630. writeLog('success', 'User Management Function - User: ' . $array['data']['username'] . '\'s group was changed from [' . $array['data']['oldGroup'] . '] to [' . $array['data']['newGroupName'] . ']', $GLOBALS['organizrUser']['username']);
  631. return true;
  632. } catch (Dibi\Exception $e) {
  633. writeLog('error', 'User Management Function - Error - User: ' . $array['data']['username'] . '\'s group was changed from [' . $array['data']['oldGroup'] . '] to [' . $array['data']['newGroupName'] . ']', $GLOBALS['organizrUser']['username']);
  634. return false;
  635. }
  636. break;
  637. case 'editUser':
  638. try {
  639. $connect = new Dibi\Connection([
  640. 'driver' => 'sqlite3',
  641. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  642. ]);
  643. if (!usernameTakenExcept($array['data']['username'], $array['data']['email'], $array['data']['id'])) {
  644. $connect->query('
  645. UPDATE users SET', [
  646. 'username' => $array['data']['username'],
  647. 'email' => $array['data']['email'],
  648. 'image' => gravatar($array['data']['email']),
  649. ], '
  650. WHERE id=?', $array['data']['id']);
  651. if (!empty($array['data']['password'])) {
  652. $connect->query('
  653. UPDATE users SET', [
  654. 'password' => password_hash($array['data']['password'], PASSWORD_BCRYPT)
  655. ], '
  656. WHERE id=?', $array['data']['id']);
  657. }
  658. writeLog('success', 'User Management Function - User: ' . $array['data']['username'] . '\'s info was changed', $GLOBALS['organizrUser']['username']);
  659. return true;
  660. } else {
  661. return false;
  662. }
  663. } catch (Dibi\Exception $e) {
  664. writeLog('error', 'User Management Function - Error - User: ' . $array['data']['username'] . '\'s group was changed from [' . $array['data']['oldGroup'] . '] to [' . $array['data']['newGroupName'] . ']', $GLOBALS['organizrUser']['username']);
  665. return false;
  666. }
  667. break;
  668. case 'addNewUser':
  669. $defaults = defaultUserGroup();
  670. if (createUser($array['data']['username'], $array['data']['password'], $defaults, $array['data']['email'])) {
  671. writeLog('success', 'Create User Function - Account created for [' . $array['data']['username'] . ']', $GLOBALS['organizrUser']['username']);
  672. return true;
  673. } else {
  674. writeLog('error', 'Registration Function - An error occurred', $GLOBALS['organizrUser']['username']);
  675. return 'username taken';
  676. }
  677. break;
  678. case 'deleteUser':
  679. try {
  680. $connect = new Dibi\Connection([
  681. 'driver' => 'sqlite3',
  682. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  683. ]);
  684. $connect->query('DELETE FROM users WHERE id = ?', $array['data']['id']);
  685. writeLog('success', 'User Management Function - Deleted User [' . $array['data']['username'] . ']', $GLOBALS['organizrUser']['username']);
  686. return true;
  687. } catch (Dibi\Exception $e) {
  688. return false;
  689. }
  690. break;
  691. default:
  692. return false;
  693. break;
  694. }
  695. }
  696. function editTabs($array)
  697. {
  698. switch ($array['data']['action']) {
  699. case 'changeGroup':
  700. try {
  701. $connect = new Dibi\Connection([
  702. 'driver' => 'sqlite3',
  703. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  704. ]);
  705. $connect->query('
  706. UPDATE tabs SET', [
  707. 'group_id' => $array['data']['newGroupID'],
  708. ], '
  709. WHERE id=?', $array['data']['id']);
  710. writeLog('success', 'Tab Editor Function - Tab: ' . $array['data']['tab'] . '\'s group was changed to [' . $array['data']['newGroupName'] . ']', $GLOBALS['organizrUser']['username']);
  711. return true;
  712. } catch (Dibi\Exception $e) {
  713. return false;
  714. }
  715. break;
  716. case 'changeCategory':
  717. try {
  718. $connect = new Dibi\Connection([
  719. 'driver' => 'sqlite3',
  720. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  721. ]);
  722. $connect->query('
  723. UPDATE tabs SET', [
  724. 'category_id' => $array['data']['newCategoryID'],
  725. ], '
  726. WHERE id=?', $array['data']['id']);
  727. writeLog('success', 'Tab Editor Function - Tab: ' . $array['data']['tab'] . '\'s category was changed to [' . $array['data']['newCategoryName'] . ']', $GLOBALS['organizrUser']['username']);
  728. return true;
  729. } catch (Dibi\Exception $e) {
  730. return false;
  731. }
  732. break;
  733. case 'changeType':
  734. try {
  735. $connect = new Dibi\Connection([
  736. 'driver' => 'sqlite3',
  737. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  738. ]);
  739. $connect->query('
  740. UPDATE tabs SET', [
  741. 'type' => $array['data']['newTypeID'],
  742. ], '
  743. WHERE id=?', $array['data']['id']);
  744. writeLog('success', 'Tab Editor Function - Tab: ' . $array['data']['tab'] . '\'s type was changed to [' . $array['data']['newTypeName'] . ']', $GLOBALS['organizrUser']['username']);
  745. return true;
  746. } catch (Dibi\Exception $e) {
  747. return false;
  748. }
  749. break;
  750. case 'changeEnabled':
  751. try {
  752. $connect = new Dibi\Connection([
  753. 'driver' => 'sqlite3',
  754. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  755. ]);
  756. $connect->query('
  757. UPDATE tabs SET', [
  758. 'enabled' => $array['data']['tabEnabled'],
  759. ], '
  760. WHERE id=?', $array['data']['id']);
  761. writeLog('success', 'Tab Editor Function - Tab: ' . $array['data']['tab'] . '\'s enable status was changed to [' . $array['data']['tabEnabledWord'] . ']', $GLOBALS['organizrUser']['username']);
  762. return true;
  763. } catch (Dibi\Exception $e) {
  764. return false;
  765. }
  766. break;
  767. case 'changeSplash':
  768. try {
  769. $connect = new Dibi\Connection([
  770. 'driver' => 'sqlite3',
  771. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  772. ]);
  773. $connect->query('
  774. UPDATE tabs SET', [
  775. 'splash' => $array['data']['tabSplash'],
  776. ], '
  777. WHERE id=?', $array['data']['id']);
  778. writeLog('success', 'Tab Editor Function - Tab: ' . $array['data']['tab'] . '\'s splash status was changed to [' . $array['data']['tabSplashWord'] . ']', $GLOBALS['organizrUser']['username']);
  779. return true;
  780. } catch (Dibi\Exception $e) {
  781. return false;
  782. }
  783. break;
  784. case 'changePing':
  785. try {
  786. $connect = new Dibi\Connection([
  787. 'driver' => 'sqlite3',
  788. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  789. ]);
  790. $connect->query('
  791. UPDATE tabs SET', [
  792. 'ping' => $array['data']['tabPing'],
  793. ], '
  794. WHERE id=?', $array['data']['id']);
  795. writeLog('success', 'Tab Editor Function - Tab: ' . $array['data']['tab'] . '\'s ping status was changed to [' . $array['data']['tabPingWord'] . ']', $GLOBALS['organizrUser']['username']);
  796. return true;
  797. } catch (Dibi\Exception $e) {
  798. return false;
  799. }
  800. break;
  801. case 'changePreload':
  802. try {
  803. $connect = new Dibi\Connection([
  804. 'driver' => 'sqlite3',
  805. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  806. ]);
  807. $connect->query('
  808. UPDATE tabs SET', [
  809. 'preload' => $array['data']['tabPreload'],
  810. ], '
  811. WHERE id=?', $array['data']['id']);
  812. writeLog('success', 'Tab Editor Function - Tab: ' . $array['data']['tab'] . '\'s preload status was changed to [' . $array['data']['tabPreloadWord'] . ']', $GLOBALS['organizrUser']['username']);
  813. return true;
  814. } catch (Dibi\Exception $e) {
  815. return false;
  816. }
  817. break;
  818. case 'changeDefault':
  819. try {
  820. $connect = new Dibi\Connection([
  821. 'driver' => 'sqlite3',
  822. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  823. ]);
  824. $connect->query('UPDATE tabs SET `default` = 0');
  825. $connect->query('
  826. UPDATE tabs SET', [
  827. 'default' => 1
  828. ], '
  829. WHERE id=?', $array['data']['id']);
  830. writeLog('success', 'Tab Editor Function - Changed Default Tab to [' . $array['data']['tab'] . ']', $GLOBALS['organizrUser']['username']);
  831. return true;
  832. } catch (Dibi\Exception $e) {
  833. return false;
  834. }
  835. break;
  836. case 'deleteTab':
  837. try {
  838. $connect = new Dibi\Connection([
  839. 'driver' => 'sqlite3',
  840. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  841. ]);
  842. $connect->query('DELETE FROM tabs WHERE id = ?', $array['data']['id']);
  843. writeLog('success', 'Tab Editor Function - Deleted Tab [' . $array['data']['tab'] . ']', $GLOBALS['organizrUser']['username']);
  844. return true;
  845. } catch (Dibi\Exception $e) {
  846. return false;
  847. }
  848. break;
  849. case 'editTab':
  850. try {
  851. $connect = new Dibi\Connection([
  852. 'driver' => 'sqlite3',
  853. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  854. ]);
  855. $connect->query('
  856. UPDATE tabs SET', [
  857. 'name' => $array['data']['tabName'],
  858. 'url' => $array['data']['tabURL'],
  859. 'url_local' => $array['data']['tabLocalURL'],
  860. 'ping_url' => $array['data']['pingURL'],
  861. 'image' => $array['data']['tabImage'],
  862. 'timeout' => $array['data']['tabActionType'],
  863. 'timeout_ms' => $array['data']['tabActionTime'],
  864. ], '
  865. WHERE id=?', $array['data']['id']);
  866. writeLog('success', 'Tab Editor Function - Edited Tab Info for [' . $array['data']['tabName'] . ']', $GLOBALS['organizrUser']['username']);
  867. return true;
  868. } catch (Dibi\Exception $e) {
  869. return false;
  870. }
  871. case 'changeOrder':
  872. try {
  873. $connect = new Dibi\Connection([
  874. 'driver' => 'sqlite3',
  875. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  876. ]);
  877. foreach ($array['data']['tabs']['tab'] as $key => $value) {
  878. if ($value['order'] != $value['originalOrder']) {
  879. $connect->query('
  880. UPDATE tabs SET', [
  881. 'order' => $value['order'],
  882. ], '
  883. WHERE id=?', $value['id']);
  884. writeLog('success', 'Tab Editor Function - ' . $value['name'] . ' Order Changed From ' . $value['order'] . ' to ' . $value['originalOrder'], $GLOBALS['organizrUser']['username']);
  885. }
  886. }
  887. writeLog('success', 'Tab Editor Function - Tab Order Changed', $GLOBALS['organizrUser']['username']);
  888. return true;
  889. } catch (Dibi\Exception $e) {
  890. return false;
  891. }
  892. break;
  893. case 'addNewTab':
  894. try {
  895. $default = defaultTabCategory()['category_id'];
  896. $connect = new Dibi\Connection([
  897. 'driver' => 'sqlite3',
  898. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  899. ]);
  900. $newTab = [
  901. 'order' => $array['data']['tabOrder'],
  902. 'category_id' => $default,
  903. 'name' => $array['data']['tabName'],
  904. 'url' => $array['data']['tabURL'],
  905. 'url_local' => $array['data']['tabLocalURL'],
  906. 'ping_url' => $array['data']['pingURL'],
  907. 'default' => $array['data']['tabDefault'],
  908. 'enabled' => 1,
  909. 'group_id' => $array['data']['tabGroupID'],
  910. 'image' => $array['data']['tabImage'],
  911. 'type' => $array['data']['tabType'],
  912. 'timeout' => $array['data']['tabActionType'],
  913. 'timeout_ms' => $array['data']['tabActionTime'],
  914. ];
  915. $connect->query('INSERT INTO [tabs]', $newTab);
  916. writeLog('success', 'Tab Editor Function - Created Tab for: ' . $array['data']['tabName'], $GLOBALS['organizrUser']['username']);
  917. return true;
  918. } catch (Dibi\Exception $e) {
  919. return false;
  920. }
  921. break;
  922. default:
  923. return false;
  924. break;
  925. }
  926. }
  927. function editCategories($array)
  928. {
  929. switch ($array['data']['action']) {
  930. case 'changeDefault':
  931. try {
  932. $connect = new Dibi\Connection([
  933. 'driver' => 'sqlite3',
  934. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  935. ]);
  936. $connect->query('UPDATE categories SET `default` = 0');
  937. $connect->query('
  938. UPDATE categories SET', [
  939. 'default' => 1
  940. ], '
  941. WHERE id=?', $array['data']['id']);
  942. writeLog('success', 'Category Editor Function - Changed Default Category from [' . $array['data']['oldCategoryName'] . '] to [' . $array['data']['newCategoryName'] . ']', $GLOBALS['organizrUser']['username']);
  943. return true;
  944. } catch (Dibi\Exception $e) {
  945. return false;
  946. }
  947. break;
  948. case 'deleteCategory':
  949. try {
  950. $connect = new Dibi\Connection([
  951. 'driver' => 'sqlite3',
  952. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  953. ]);
  954. $connect->query('DELETE FROM categories WHERE id = ?', $array['data']['id']);
  955. writeLog('success', 'Category Editor Function - Deleted Category [' . $array['data']['category'] . ']', $GLOBALS['organizrUser']['username']);
  956. return true;
  957. } catch (Dibi\Exception $e) {
  958. return false;
  959. }
  960. break;
  961. case 'addNewCategory':
  962. try {
  963. $connect = new Dibi\Connection([
  964. 'driver' => 'sqlite3',
  965. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  966. ]);
  967. $newCategory = [
  968. 'category' => $array['data']['categoryName'],
  969. 'order' => $array['data']['categoryOrder'],
  970. 'category_id' => $array['data']['categoryID'],
  971. 'default' => false,
  972. 'image' => $array['data']['categoryImage'],
  973. ];
  974. $connect->query('INSERT INTO [categories]', $newCategory);
  975. writeLog('success', 'Category Editor Function - Added Category [' . $array['data']['categoryName'] . ']', $GLOBALS['organizrUser']['username']);
  976. return true;
  977. } catch (Dibi\Exception $e) {
  978. return $e;
  979. }
  980. break;
  981. case 'editCategory':
  982. try {
  983. $connect = new Dibi\Connection([
  984. 'driver' => 'sqlite3',
  985. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  986. ]);
  987. $connect->query('
  988. UPDATE categories SET', [
  989. 'category' => $array['data']['name'],
  990. 'image' => $array['data']['image'],
  991. ], '
  992. WHERE id=?', $array['data']['id']);
  993. writeLog('success', 'Category Editor Function - Edited Category Info for [' . $array['data']['name'] . ']', $GLOBALS['organizrUser']['username']);
  994. return true;
  995. } catch (Dibi\Exception $e) {
  996. return false;
  997. }
  998. break;
  999. case 'changeOrder':
  1000. try {
  1001. $connect = new Dibi\Connection([
  1002. 'driver' => 'sqlite3',
  1003. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  1004. ]);
  1005. foreach ($array['data']['categories']['category'] as $key => $value) {
  1006. if ($value['order'] != $value['originalOrder']) {
  1007. $connect->query('
  1008. UPDATE categories SET', [
  1009. 'order' => $value['order'],
  1010. ], '
  1011. WHERE id=?', $value['id']);
  1012. writeLog('success', 'Category Editor Function - ' . $value['name'] . ' Order Changed From ' . $value['order'] . ' to ' . $value['originalOrder'], $GLOBALS['organizrUser']['username']);
  1013. }
  1014. }
  1015. writeLog('success', 'Category Editor Function - Category Order Changed', $GLOBALS['organizrUser']['username']);
  1016. return true;
  1017. } catch (Dibi\Exception $e) {
  1018. return false;
  1019. }
  1020. break;
  1021. default:
  1022. return false;
  1023. break;
  1024. }
  1025. }
  1026. function allUsers()
  1027. {
  1028. try {
  1029. $connect = new Dibi\Connection([
  1030. 'driver' => 'sqlite3',
  1031. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  1032. ]);
  1033. $users = $connect->fetchAll('SELECT * FROM users');
  1034. $groups = $connect->fetchAll('SELECT * FROM groups ORDER BY group_id ASC');
  1035. foreach ($users as $k => $v) {
  1036. // clear password from array
  1037. unset($users[$k]['password']);
  1038. }
  1039. $all['users'] = $users;
  1040. $all['groups'] = $groups;
  1041. return $all;
  1042. } catch (Dibi\Exception $e) {
  1043. return false;
  1044. }
  1045. }
  1046. function usernameTaken($username, $email)
  1047. {
  1048. try {
  1049. $connect = new Dibi\Connection([
  1050. 'driver' => 'sqlite3',
  1051. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  1052. ]);
  1053. $all = $connect->fetch('SELECT * FROM users WHERE username = ? COLLATE NOCASE OR email = ? COLLATE NOCASE', $username, $email);
  1054. return ($all) ? true : false;
  1055. } catch (Dibi\Exception $e) {
  1056. return false;
  1057. }
  1058. }
  1059. function usernameTakenExcept($username, $email, $id)
  1060. {
  1061. try {
  1062. $connect = new Dibi\Connection([
  1063. 'driver' => 'sqlite3',
  1064. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  1065. ]);
  1066. $all = $connect->fetch('SELECT * FROM users WHERE id IS NOT ? AND username = ? COLLATE NOCASE OR id IS NOT ? AND email = ? COLLATE NOCASE', $id, $username, $id, $email);
  1067. return ($all) ? true : false;
  1068. } catch (Dibi\Exception $e) {
  1069. return false;
  1070. }
  1071. }
  1072. function createUser($username, $password, $defaults, $email = null)
  1073. {
  1074. $email = ($email) ? $email : random_ascii_string(10) . '@placeholder.eml';
  1075. try {
  1076. if (!usernameTaken($username, $email)) {
  1077. $createDB = new Dibi\Connection([
  1078. 'driver' => 'sqlite3',
  1079. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  1080. ]);
  1081. $userInfo = [
  1082. 'username' => $username,
  1083. 'password' => password_hash($password, PASSWORD_BCRYPT),
  1084. 'email' => $email,
  1085. 'group' => $defaults['group'],
  1086. 'group_id' => $defaults['group_id'],
  1087. 'image' => gravatar($email),
  1088. 'register_date' => $GLOBALS['currentTime'],
  1089. ];
  1090. $createDB->query('INSERT INTO [users]', $userInfo);
  1091. return true;
  1092. } else {
  1093. return false;
  1094. }
  1095. } catch (Dibi\Exception $e) {
  1096. return false;
  1097. }
  1098. }
  1099. function importUsers($array)
  1100. {
  1101. $imported = 0;
  1102. $defaults = defaultUserGroup();
  1103. foreach ($array as $user) {
  1104. $password = random_ascii_string(30);
  1105. if ($user['username'] !== '' && $user['email'] !== '' && $password !== '' && $defaults !== '') {
  1106. $newUser = createUser($user['username'], $password, $defaults, $user['email']);
  1107. if (!$newUser) {
  1108. writeLog('error', 'Import Function - Error', $user['username']);
  1109. } else {
  1110. $imported++;
  1111. }
  1112. }
  1113. }
  1114. return $imported;
  1115. }
  1116. function importUsersType($array)
  1117. {
  1118. $type = $array['data']['type'];
  1119. if ($type !== '') {
  1120. switch ($type) {
  1121. case 'plex':
  1122. return importUsers(allPlexUsers(true));
  1123. break;
  1124. default:
  1125. return false;
  1126. }
  1127. }
  1128. return false;
  1129. }
  1130. function allTabs()
  1131. {
  1132. if (file_exists('config' . DIRECTORY_SEPARATOR . 'config.php')) {
  1133. try {
  1134. $connect = new Dibi\Connection([
  1135. 'driver' => 'sqlite3',
  1136. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  1137. ]);
  1138. $all['tabs'] = $connect->fetchAll('SELECT * FROM tabs ORDER BY `order` ASC');
  1139. $all['categories'] = $connect->fetchAll('SELECT * FROM categories ORDER BY `order` ASC');
  1140. $all['groups'] = $connect->fetchAll('SELECT * FROM groups ORDER BY `group_id` ASC');
  1141. return $all;
  1142. } catch (Dibi\Exception $e) {
  1143. return false;
  1144. }
  1145. }
  1146. return false;
  1147. }
  1148. function allGroups()
  1149. {
  1150. if (file_exists('config' . DIRECTORY_SEPARATOR . 'config.php')) {
  1151. try {
  1152. $connect = new Dibi\Connection([
  1153. 'driver' => 'sqlite3',
  1154. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  1155. ]);
  1156. $all = $connect->fetchAll('SELECT * FROM groups ORDER BY `group_id` ASC');
  1157. return $all;
  1158. } catch (Dibi\Exception $e) {
  1159. return false;
  1160. }
  1161. }
  1162. return false;
  1163. }
  1164. function loadTabs()
  1165. {
  1166. if (file_exists('config' . DIRECTORY_SEPARATOR . 'config.php')) {
  1167. try {
  1168. $connect = new Dibi\Connection([
  1169. 'driver' => 'sqlite3',
  1170. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  1171. ]);
  1172. $sort = ($GLOBALS['unsortedTabs'] == 'top') ? 'DESC' : 'ASC';
  1173. $tabs = $connect->fetchAll('SELECT * FROM tabs WHERE `group_id` >= ? AND `enabled` = 1 ORDER BY `order` ' . $sort, $GLOBALS['organizrUser']['groupID']);
  1174. $categories = $connect->fetchAll('SELECT * FROM categories ORDER BY `order` ASC');
  1175. $all['tabs'] = $tabs;
  1176. foreach ($tabs as $k => $v) {
  1177. $v['access_url'] = (!empty($v['url_local']) && ($v['url_local'] !== null) && ($v['url_local'] !== 'null') && isLocal() && $v['type'] !== 0) ? $v['url_local'] : $v['url'];
  1178. }
  1179. $count = array_map(function ($element) {
  1180. return $element['category_id'];
  1181. }, $tabs);
  1182. $count = (array_count_values($count));
  1183. foreach ($categories as $k => $v) {
  1184. $v['count'] = isset($count[$v['category_id']]) ? $count[$v['category_id']] : 0;
  1185. }
  1186. $all['categories'] = $categories;
  1187. return $all;
  1188. } catch (Dibi\Exception $e) {
  1189. return false;
  1190. }
  1191. }
  1192. return false;
  1193. }
  1194. function getActiveTokens()
  1195. {
  1196. try {
  1197. $connect = new Dibi\Connection([
  1198. 'driver' => 'sqlite3',
  1199. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  1200. ]);
  1201. $all = $connect->fetchAll('SELECT * FROM `tokens` WHERE `user_id` = ? AND `expires` > ?', $GLOBALS['organizrUser']['userID'], $GLOBALS['currentTime']);
  1202. return $all;
  1203. } catch (Dibi\Exception $e) {
  1204. return false;
  1205. }
  1206. }
  1207. function revokeToken($array)
  1208. {
  1209. if ($array['data']['token']) {
  1210. try {
  1211. $connect = new Dibi\Connection([
  1212. 'driver' => 'sqlite3',
  1213. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  1214. ]);
  1215. $connect->query('DELETE FROM tokens WHERE user_id = ? AND token = ?', $GLOBALS['organizrUser']['userID'], $array['data']['token']);
  1216. return true;
  1217. } catch (Dibi\Exception $e) {
  1218. return false;
  1219. }
  1220. }
  1221. }
  1222. function getSchema()
  1223. {
  1224. if (file_exists('config' . DIRECTORY_SEPARATOR . 'config.php')) {
  1225. try {
  1226. $connect = new Dibi\Connection([
  1227. 'driver' => 'sqlite3',
  1228. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  1229. ]);
  1230. $result = $connect->fetchAll(' SELECT name, sql FROM sqlite_master WHERE type=\'table\' ORDER BY name');
  1231. return $result;
  1232. } catch (Dibi\Exception $e) {
  1233. return false;
  1234. }
  1235. } else {
  1236. return 'DB not set yet...';
  1237. }
  1238. }