api-functions.php 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002
  1. <?php /** @noinspection SqlResolve */
  2. /** @noinspection SqlResolve */
  3. /** @noinspection SqlResolve */
  4. /** @noinspection SqlResolve */
  5. /** @noinspection SyntaxError */
  6. function login($array)
  7. {
  8. // Grab username and Password from login form
  9. $username = $password = '';
  10. foreach ($array['data'] as $items) {
  11. foreach ($items as $key => $value) {
  12. if ($key == 'name') {
  13. $newKey = $value;
  14. }
  15. if ($key == 'value') {
  16. $newValue = $value;
  17. }
  18. if (isset($newKey) && isset($newValue)) {
  19. $$newKey = $newValue;
  20. }
  21. }
  22. }
  23. $username = strtolower($username);
  24. $days = (isset($remember)) ? 7 : 1;
  25. try {
  26. $database = new Dibi\Connection([
  27. 'driver' => 'sqlite3',
  28. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  29. ]);
  30. $authSuccess = false;
  31. $function = 'plugin_auth_' . $GLOBALS['authBackend'];
  32. $result = $database->fetch('SELECT * FROM users WHERE username = ? COLLATE NOCASE OR email = ? COLLATE NOCASE', $username, $username);
  33. switch ($GLOBALS['authType']) {
  34. case 'external':
  35. if (function_exists($function)) {
  36. $authSuccess = $function($username, $password);
  37. }
  38. break;
  39. /** @noinspection PhpMissingBreakStatementInspection */
  40. case 'both':
  41. if (function_exists($function)) {
  42. $authSuccess = $function($username, $password);
  43. }
  44. // no break
  45. default: // Internal
  46. if (!$authSuccess) {
  47. // perform the internal authentication step
  48. if (password_verify($password, $result['password'])) {
  49. $authSuccess = true;
  50. }
  51. }
  52. }
  53. if ($authSuccess) {
  54. // Make sure user exists in database
  55. $userExists = false;
  56. $passwordMatches = false;
  57. $token = (is_array($authSuccess) && isset($authSuccess['token']) ? $authSuccess['token'] : '');
  58. if ($result['username']) {
  59. $userExists = true;
  60. $username = $result['username'];
  61. $passwordMatches = (password_verify($password, $result['password'])) ? true : false;
  62. }
  63. if ($userExists) {
  64. //does org password need to be updated
  65. if (!$passwordMatches) {
  66. $database->query('
  67. UPDATE users SET', [
  68. 'password' => password_hash($password, PASSWORD_BCRYPT)
  69. ], '
  70. WHERE id=?', $result['id']);
  71. writeLog('success', 'Login Function - User Password updated from backend', $username);
  72. }
  73. // authentication passed - 1) mark active and update token
  74. if (createToken($result['username'], $result['email'], $result['image'], $result['group'], $result['group_id'], $GLOBALS['organizrHash'], $days)) {
  75. writeLoginLog($username, 'success');
  76. writeLog('success', 'Login Function - A User has logged in', $username);
  77. ssoCheck($username, $password, $token); //need to work on this
  78. return true;
  79. } else {
  80. return 'error';
  81. }
  82. } else {
  83. // Create User
  84. ssoCheck($username, $password, $token);
  85. return authRegister((is_array($authSuccess) && isset($authSuccess['username']) ? $authSuccess['username'] : $username), $password, defaultUserGroup(), (is_array($authSuccess) && isset($authSuccess['email']) ? $authSuccess['email'] : ''));
  86. }
  87. } else {
  88. // authentication failed
  89. writeLoginLog($username, 'error');
  90. writeLog('error', 'Login Function - Wrong Password', $username);
  91. return 'mismatch';
  92. }
  93. } catch (Dibi\Exception $e) {
  94. return $e;
  95. }
  96. }
  97. function createDB($path, $filename)
  98. {
  99. try {
  100. if (!file_exists($path)) {
  101. mkdir($path, 0777, true);
  102. }
  103. $createDB = new Dibi\Connection([
  104. 'driver' => 'sqlite3',
  105. 'database' => $path . $filename,
  106. ]);
  107. // Create Users
  108. $createDB->query('CREATE TABLE `users` (
  109. `id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
  110. `username` TEXT UNIQUE,
  111. `password` TEXT,
  112. `email` TEXT,
  113. `plex_token` TEXT,
  114. `group` TEXT,
  115. `group_id` INTEGER,
  116. `locked` INTEGER,
  117. `image` TEXT,
  118. `register_date` DATE,
  119. `auth_service` TEXT DEFAULT \'internal\'
  120. );');
  121. // Create Tokens
  122. $createDB->query('CREATE TABLE `tokens` (
  123. `id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
  124. `token` TEXT UNIQUE,
  125. `user_id` INTEGER,
  126. `created` DATE,
  127. `expires` DATE
  128. );');
  129. $createDB->query('CREATE TABLE `groups` (
  130. `id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
  131. `group` TEXT UNIQUE,
  132. `group_id` INTEGER,
  133. `image` TEXT,
  134. `default` INTEGER
  135. );');
  136. $createDB->query('CREATE TABLE `categories` (
  137. `id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
  138. `order` INTEGER,
  139. `category` TEXT UNIQUE,
  140. `category_id` INTEGER,
  141. `image` TEXT,
  142. `default` INTEGER
  143. );');
  144. // Create Tabs
  145. $createDB->query('CREATE TABLE `tabs` (
  146. `id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
  147. `order` INTEGER,
  148. `category_id` INTEGER,
  149. `name` TEXT,
  150. `url` TEXT,
  151. `url_local` TEXT,
  152. `default` INTEGER,
  153. `enabled` INTEGER,
  154. `group_id` INTEGER,
  155. `image` TEXT,
  156. `type` INTEGER,
  157. `splash` INTEGER,
  158. `ping` INTEGER,
  159. `ping_url` TEXT
  160. );');
  161. // Create Options
  162. $createDB->query('CREATE TABLE `options` (
  163. `id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
  164. `name` TEXT UNIQUE,
  165. `value` TEXT
  166. );');
  167. // Create Invites
  168. $createDB->query('CREATE TABLE `invites` (
  169. `id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
  170. `code` TEXT UNIQUE,
  171. `date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  172. `email` TEXT,
  173. `username` TEXT,
  174. `dateused` TIMESTAMP,
  175. `usedby` TEXT,
  176. `ip` TEXT,
  177. `valid` TEXT,
  178. `type` TEXT
  179. );');
  180. return true;
  181. } catch (Dibi\Exception $e) {
  182. return false;
  183. }
  184. }
  185. // Upgrade Database
  186. function updateDB($path, $filename, $oldVerNum = false)
  187. {
  188. try {
  189. $connect = new Dibi\Connection([
  190. 'driver' => 'sqlite3',
  191. 'database' => $path . $filename,
  192. ]);
  193. // Cache current DB
  194. $cache = array();
  195. foreach ($connect->query('SELECT name FROM sqlite_master WHERE type="table";') as $table) {
  196. foreach ($connect->query('SELECT * FROM ' . $table['name'] . ';') as $key => $row) {
  197. foreach ($row as $k => $v) {
  198. if (is_string($k)) {
  199. $cache[$table['name']][$key][$k] = $v;
  200. }
  201. }
  202. }
  203. }
  204. $connect->disconnect();
  205. } catch (Dibi\Exception $e) {
  206. return $e;
  207. }
  208. // Remove Current Database
  209. $pathDigest = pathinfo($path . $filename);
  210. if (file_exists($path . $filename)) {
  211. copy($path . $filename, $pathDigest['dirname'] . '/' . $pathDigest['filename'] . '[' . date('Y-m-d_H-i-s') . ']' . ($oldVerNum ? '[' . $oldVerNum . ']' : '') . '.bak.db');
  212. unlink($path . $filename);
  213. }
  214. // Create New Database
  215. $success = createDB($path, $filename);
  216. try {
  217. $GLOBALS['connect'] = new Dibi\Connection([
  218. 'driver' => 'sqlite3',
  219. 'database' => $path . $filename,
  220. ]);
  221. // Restore Items
  222. if ($success) {
  223. foreach ($cache as $table => $tableData) {
  224. if ($tableData) {
  225. $queryBase = 'INSERT INTO ' . $table . ' (`' . implode('`,`', array_keys(current($tableData))) . '`) values ';
  226. $insertValues = array();
  227. reset($tableData);
  228. foreach ($tableData as $key => $value) {
  229. $insertValues[] = '(' . implode(',', array_map(function ($d) {
  230. return (isset($d) ? str_replace('\/', '/', json_encode($d)) : 'null');
  231. }, $value)) . ')';
  232. }
  233. $GLOBALS['connect']->query($queryBase . implode(',', $insertValues) . ';');
  234. }
  235. }
  236. }
  237. return true;
  238. } catch (Dibi\Exception $e) {
  239. writeLog('error', 'Update Function - Error [' . $e . ']', 'Database');
  240. return false;
  241. }
  242. }
  243. function createFirstAdmin($path, $filename, $username, $password, $email)
  244. {
  245. try {
  246. $createDB = new Dibi\Connection([
  247. 'driver' => 'sqlite3',
  248. 'database' => $path . $filename,
  249. ]);
  250. $userInfo = [
  251. 'username' => $username,
  252. 'password' => password_hash($password, PASSWORD_BCRYPT),
  253. 'email' => $email,
  254. 'group' => 'Admin',
  255. 'group_id' => 0,
  256. 'image' => gravatar($email),
  257. 'register_date' => $GLOBALS['currentTime'],
  258. ];
  259. $groupInfo0 = [
  260. 'group' => 'Admin',
  261. 'group_id' => 0,
  262. 'default' => false,
  263. 'image' => 'plugins/images/groups/admin.png',
  264. ];
  265. $groupInfo1 = [
  266. 'group' => 'Co-Admin',
  267. 'group_id' => 1,
  268. 'default' => false,
  269. 'image' => 'plugins/images/groups/coadmin.png',
  270. ];
  271. $groupInfo2 = [
  272. 'group' => 'Super User',
  273. 'group_id' => 2,
  274. 'default' => false,
  275. 'image' => 'plugins/images/groups/superuser.png',
  276. ];
  277. $groupInfo3 = [
  278. 'group' => 'Power User',
  279. 'group_id' => 3,
  280. 'default' => false,
  281. 'image' => 'plugins/images/groups/poweruser.png',
  282. ];
  283. $groupInfo4 = [
  284. 'group' => 'User',
  285. 'group_id' => 4,
  286. 'default' => true,
  287. 'image' => 'plugins/images/groups/user.png',
  288. ];
  289. $groupInfoGuest = [
  290. 'group' => 'Guest',
  291. 'group_id' => 999,
  292. 'default' => false,
  293. 'image' => 'plugins/images/groups/guest.png',
  294. ];
  295. $settingsInfo = [
  296. 'order' => 1,
  297. 'category_id' => 0,
  298. 'name' => 'Settings',
  299. 'url' => 'api/?v1/settings/page',
  300. 'default' => false,
  301. 'enabled' => true,
  302. 'group_id' => 1,
  303. 'image' => 'fontawesome::cog',
  304. 'type' => 0
  305. ];
  306. $homepageInfo = [
  307. 'order' => 2,
  308. 'category_id' => 0,
  309. 'name' => 'Homepage',
  310. 'url' => 'api/?v1/homepage/page',
  311. 'default' => false,
  312. 'enabled' => false,
  313. 'group_id' => 4,
  314. 'image' => 'fontawesome::home',
  315. 'type' => 0
  316. ];
  317. $unsortedInfo = [
  318. 'order' => 1,
  319. 'category' => 'Unsorted',
  320. 'category_id' => 0,
  321. 'image' => 'plugins/images/categories/unsorted.png',
  322. 'default' => true
  323. ];
  324. $createDB->query('INSERT INTO [users]', $userInfo);
  325. $createDB->query('INSERT INTO [groups]', $groupInfo0);
  326. $createDB->query('INSERT INTO [groups]', $groupInfo1);
  327. $createDB->query('INSERT INTO [groups]', $groupInfo2);
  328. $createDB->query('INSERT INTO [groups]', $groupInfo3);
  329. $createDB->query('INSERT INTO [groups]', $groupInfo4);
  330. $createDB->query('INSERT INTO [groups]', $groupInfoGuest);
  331. $createDB->query('INSERT INTO [tabs]', $settingsInfo);
  332. $createDB->query('INSERT INTO [tabs]', $homepageInfo);
  333. $createDB->query('INSERT INTO [categories]', $unsortedInfo);
  334. return true;
  335. } catch (Dibi\Exception $e) {
  336. writeLog('error', 'Wizard Function - Error [' . $e . ']', 'Wizard');
  337. return false;
  338. }
  339. }
  340. function defaultUserGroup()
  341. {
  342. try {
  343. $connect = new Dibi\Connection([
  344. 'driver' => 'sqlite3',
  345. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  346. ]);
  347. $all = $connect->fetch('SELECT * FROM groups WHERE `default` = 1');
  348. return $all;
  349. } catch (Dibi\Exception $e) {
  350. return false;
  351. }
  352. }
  353. function defaultTabCategory()
  354. {
  355. try {
  356. $connect = new Dibi\Connection([
  357. 'driver' => 'sqlite3',
  358. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  359. ]);
  360. $all = $connect->fetch('SELECT * FROM categories WHERE `default` = 1');
  361. return $all;
  362. } catch (Dibi\Exception $e) {
  363. return false;
  364. }
  365. }
  366. function getGuest()
  367. {
  368. if (isset($GLOBALS['dbLocation'])) {
  369. try {
  370. $connect = new Dibi\Connection([
  371. 'driver' => 'sqlite3',
  372. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  373. ]);
  374. $all = $connect->fetch('SELECT * FROM groups WHERE `group` = "Guest"');
  375. return $all;
  376. } catch (Dibi\Exception $e) {
  377. return false;
  378. }
  379. } else {
  380. return array(
  381. 'group' => 'Guest',
  382. 'group_id' => 999,
  383. 'image' => 'plugins/images/groups/guest.png'
  384. );
  385. }
  386. }
  387. function adminEditGroup($array)
  388. {
  389. switch ($array['data']['action']) {
  390. case 'changeDefaultGroup':
  391. try {
  392. $connect = new Dibi\Connection([
  393. 'driver' => 'sqlite3',
  394. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  395. ]);
  396. $connect->query('UPDATE groups SET `default` = 0');
  397. $connect->query('
  398. UPDATE groups SET', [
  399. 'default' => 1
  400. ], '
  401. WHERE id=?', $array['data']['id']);
  402. writeLog('success', 'Group Management Function - Changed Default Group from [' . $array['data']['oldGroupName'] . '] to [' . $array['data']['newGroupName'] . ']', $GLOBALS['organizrUser']['username']);
  403. return true;
  404. } catch (Dibi\Exception $e) {
  405. return false;
  406. }
  407. break;
  408. case 'deleteUserGroup':
  409. try {
  410. $connect = new Dibi\Connection([
  411. 'driver' => 'sqlite3',
  412. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  413. ]);
  414. $connect->query('DELETE FROM groups WHERE id = ?', $array['data']['id']);
  415. writeLog('success', 'Group Management Function - Deleted Group [' . $array['data']['groupName'] . ']', $GLOBALS['organizrUser']['username']);
  416. return true;
  417. } catch (Dibi\Exception $e) {
  418. return false;
  419. }
  420. break;
  421. case 'addUserGroup':
  422. try {
  423. $connect = new Dibi\Connection([
  424. 'driver' => 'sqlite3',
  425. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  426. ]);
  427. $newGroup = [
  428. 'group' => $array['data']['newGroupName'],
  429. 'group_id' => $array['data']['newGroupID'],
  430. 'default' => false,
  431. 'image' => $array['data']['newGroupImage'],
  432. ];
  433. $connect->query('INSERT INTO [groups]', $newGroup);
  434. writeLog('success', 'Group Management Function - Added Group [' . $array['data']['newGroupName'] . ']', $GLOBALS['organizrUser']['username']);
  435. return true;
  436. } catch (Dibi\Exception $e) {
  437. return false;
  438. }
  439. break;
  440. case 'editUserGroup':
  441. try {
  442. $connect = new Dibi\Connection([
  443. 'driver' => 'sqlite3',
  444. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  445. ]);
  446. $connect->query('
  447. UPDATE groups SET', [
  448. 'group' => $array['data']['groupName'],
  449. 'image' => $array['data']['groupImage'],
  450. ], '
  451. WHERE id=?', $array['data']['id']);
  452. writeLog('success', 'Group Management Function - Edited Group Info for [' . $array['data']['oldGroupName'] . ']', $GLOBALS['organizrUser']['username']);
  453. return true;
  454. } catch (Dibi\Exception $e) {
  455. return false;
  456. }
  457. break;
  458. default:
  459. return false;
  460. break;
  461. }
  462. }
  463. function adminEditUser($array)
  464. {
  465. switch ($array['data']['action']) {
  466. case 'changeGroup':
  467. try {
  468. $connect = new Dibi\Connection([
  469. 'driver' => 'sqlite3',
  470. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  471. ]);
  472. $connect->query('
  473. UPDATE users SET', [
  474. 'group' => $array['data']['newGroupName'],
  475. 'group_id' => $array['data']['newGroupID'],
  476. ], '
  477. WHERE id=?', $array['data']['id']);
  478. writeLog('success', 'User Management Function - User: ' . $array['data']['username'] . '\'s group was changed from [' . $array['data']['oldGroup'] . '] to [' . $array['data']['newGroupName'] . ']', $GLOBALS['organizrUser']['username']);
  479. return true;
  480. } catch (Dibi\Exception $e) {
  481. 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']);
  482. return false;
  483. }
  484. break;
  485. case 'editUser':
  486. try {
  487. $connect = new Dibi\Connection([
  488. 'driver' => 'sqlite3',
  489. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  490. ]);
  491. if (!usernameTakenExcept($array['data']['username'], $array['data']['email'], $array['data']['id'])) {
  492. $connect->query('
  493. UPDATE users SET', [
  494. 'username' => $array['data']['username'],
  495. 'email' => $array['data']['email'],
  496. ], '
  497. WHERE id=?', $array['data']['id']);
  498. if (!empty($array['data']['password'])) {
  499. $connect->query('
  500. UPDATE users SET', [
  501. 'password' => password_hash($array['data']['password'], PASSWORD_BCRYPT)
  502. ], '
  503. WHERE id=?', $array['data']['id']);
  504. }
  505. writeLog('success', 'User Management Function - User: ' . $array['data']['username'] . '\'s info was changed', $GLOBALS['organizrUser']['username']);
  506. return true;
  507. } else {
  508. return false;
  509. }
  510. } catch (Dibi\Exception $e) {
  511. 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']);
  512. return false;
  513. }
  514. break;
  515. case 'addNewUser':
  516. $defaults = defaultUserGroup();
  517. if (createUser($array['data']['username'], $array['data']['password'], $defaults, $array['data']['email'])) {
  518. writeLog('success', 'Create User Function - Account created for [' . $array['data']['username'] . ']', $GLOBALS['organizrUser']['username']);
  519. return true;
  520. } else {
  521. writeLog('error', 'Registration Function - An error occurred', $GLOBALS['organizrUser']['username']);
  522. return 'username taken';
  523. }
  524. break;
  525. case 'deleteUser':
  526. try {
  527. $connect = new Dibi\Connection([
  528. 'driver' => 'sqlite3',
  529. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  530. ]);
  531. $connect->query('DELETE FROM users WHERE id = ?', $array['data']['id']);
  532. writeLog('success', 'User Management Function - Deleted User [' . $array['data']['username'] . ']', $GLOBALS['organizrUser']['username']);
  533. return true;
  534. } catch (Dibi\Exception $e) {
  535. return false;
  536. }
  537. break;
  538. default:
  539. return false;
  540. break;
  541. }
  542. }
  543. function editTabs($array)
  544. {
  545. switch ($array['data']['action']) {
  546. case 'changeGroup':
  547. try {
  548. $connect = new Dibi\Connection([
  549. 'driver' => 'sqlite3',
  550. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  551. ]);
  552. $connect->query('
  553. UPDATE tabs SET', [
  554. 'group_id' => $array['data']['newGroupID'],
  555. ], '
  556. WHERE id=?', $array['data']['id']);
  557. writeLog('success', 'Tab Editor Function - Tab: ' . $array['data']['tab'] . '\'s group was changed to [' . $array['data']['newGroupName'] . ']', $GLOBALS['organizrUser']['username']);
  558. return true;
  559. } catch (Dibi\Exception $e) {
  560. return false;
  561. }
  562. break;
  563. case 'changeCategory':
  564. try {
  565. $connect = new Dibi\Connection([
  566. 'driver' => 'sqlite3',
  567. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  568. ]);
  569. $connect->query('
  570. UPDATE tabs SET', [
  571. 'category_id' => $array['data']['newCategoryID'],
  572. ], '
  573. WHERE id=?', $array['data']['id']);
  574. writeLog('success', 'Tab Editor Function - Tab: ' . $array['data']['tab'] . '\'s category was changed to [' . $array['data']['newCategoryName'] . ']', $GLOBALS['organizrUser']['username']);
  575. return true;
  576. } catch (Dibi\Exception $e) {
  577. return false;
  578. }
  579. break;
  580. case 'changeType':
  581. try {
  582. $connect = new Dibi\Connection([
  583. 'driver' => 'sqlite3',
  584. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  585. ]);
  586. $connect->query('
  587. UPDATE tabs SET', [
  588. 'type' => $array['data']['newTypeID'],
  589. ], '
  590. WHERE id=?', $array['data']['id']);
  591. writeLog('success', 'Tab Editor Function - Tab: ' . $array['data']['tab'] . '\'s type was changed to [' . $array['data']['newTypeName'] . ']', $GLOBALS['organizrUser']['username']);
  592. return true;
  593. } catch (Dibi\Exception $e) {
  594. return false;
  595. }
  596. break;
  597. case 'changeEnabled':
  598. try {
  599. $connect = new Dibi\Connection([
  600. 'driver' => 'sqlite3',
  601. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  602. ]);
  603. $connect->query('
  604. UPDATE tabs SET', [
  605. 'enabled' => $array['data']['tabEnabled'],
  606. ], '
  607. WHERE id=?', $array['data']['id']);
  608. writeLog('success', 'Tab Editor Function - Tab: ' . $array['data']['tab'] . '\'s enable status was changed to [' . $array['data']['tabEnabledWord'] . ']', $GLOBALS['organizrUser']['username']);
  609. return true;
  610. } catch (Dibi\Exception $e) {
  611. return false;
  612. }
  613. break;
  614. case 'changeSplash':
  615. try {
  616. $connect = new Dibi\Connection([
  617. 'driver' => 'sqlite3',
  618. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  619. ]);
  620. $connect->query('
  621. UPDATE tabs SET', [
  622. 'splash' => $array['data']['tabSplash'],
  623. ], '
  624. WHERE id=?', $array['data']['id']);
  625. writeLog('success', 'Tab Editor Function - Tab: ' . $array['data']['tab'] . '\'s splash status was changed to [' . $array['data']['tabSplashWord'] . ']', $GLOBALS['organizrUser']['username']);
  626. return true;
  627. } catch (Dibi\Exception $e) {
  628. return false;
  629. }
  630. break;
  631. case 'changePing':
  632. try {
  633. $connect = new Dibi\Connection([
  634. 'driver' => 'sqlite3',
  635. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  636. ]);
  637. $connect->query('
  638. UPDATE tabs SET', [
  639. 'ping' => $array['data']['tabPing'],
  640. ], '
  641. WHERE id=?', $array['data']['id']);
  642. writeLog('success', 'Tab Editor Function - Tab: ' . $array['data']['tab'] . '\'s ping status was changed to [' . $array['data']['tabPingWord'] . ']', $GLOBALS['organizrUser']['username']);
  643. return true;
  644. } catch (Dibi\Exception $e) {
  645. return false;
  646. }
  647. break;
  648. case 'changeDefault':
  649. try {
  650. $connect = new Dibi\Connection([
  651. 'driver' => 'sqlite3',
  652. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  653. ]);
  654. $connect->query('UPDATE tabs SET `default` = 0');
  655. $connect->query('
  656. UPDATE tabs SET', [
  657. 'default' => 1
  658. ], '
  659. WHERE id=?', $array['data']['id']);
  660. writeLog('success', 'Tab Editor Function - Changed Default Tab to [' . $array['data']['tab'] . ']', $GLOBALS['organizrUser']['username']);
  661. return true;
  662. } catch (Dibi\Exception $e) {
  663. return false;
  664. }
  665. break;
  666. case 'deleteTab':
  667. try {
  668. $connect = new Dibi\Connection([
  669. 'driver' => 'sqlite3',
  670. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  671. ]);
  672. $connect->query('DELETE FROM tabs WHERE id = ?', $array['data']['id']);
  673. writeLog('success', 'Tab Editor Function - Deleted Tab [' . $array['data']['tab'] . ']', $GLOBALS['organizrUser']['username']);
  674. return true;
  675. } catch (Dibi\Exception $e) {
  676. return false;
  677. }
  678. break;
  679. case 'editTab':
  680. try {
  681. $connect = new Dibi\Connection([
  682. 'driver' => 'sqlite3',
  683. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  684. ]);
  685. $connect->query('
  686. UPDATE tabs SET', [
  687. 'name' => $array['data']['tabName'],
  688. 'url' => $array['data']['tabURL'],
  689. 'ping_url' => $array['data']['pingURL'],
  690. 'image' => $array['data']['tabImage'],
  691. ], '
  692. WHERE id=?', $array['data']['id']);
  693. writeLog('success', 'Tab Editor Function - Edited Tab Info for [' . $array['data']['tabName'] . ']', $GLOBALS['organizrUser']['username']);
  694. return true;
  695. } catch (Dibi\Exception $e) {
  696. return false;
  697. }
  698. case 'changeOrder':
  699. try {
  700. $connect = new Dibi\Connection([
  701. 'driver' => 'sqlite3',
  702. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  703. ]);
  704. foreach ($array['data']['tabs']['tab'] as $key => $value) {
  705. if ($value['order'] != $value['originalOrder']) {
  706. $connect->query('
  707. UPDATE tabs SET', [
  708. 'order' => $value['order'],
  709. ], '
  710. WHERE id=?', $value['id']);
  711. writeLog('success', 'Tab Editor Function - ' . $value['name'] . ' Order Changed From ' . $value['order'] . ' to ' . $value['originalOrder'], $GLOBALS['organizrUser']['username']);
  712. }
  713. }
  714. writeLog('success', 'Tab Editor Function - Tab Order Changed', $GLOBALS['organizrUser']['username']);
  715. return true;
  716. } catch (Dibi\Exception $e) {
  717. return false;
  718. }
  719. break;
  720. case 'addNewTab':
  721. try {
  722. $default = defaultTabCategory()['category_id'];
  723. $connect = new Dibi\Connection([
  724. 'driver' => 'sqlite3',
  725. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  726. ]);
  727. $newTab = [
  728. 'order' => $array['data']['tabOrder'],
  729. 'category_id' => $default,
  730. 'name' => $array['data']['tabName'],
  731. 'url' => $array['data']['tabURL'],
  732. 'ping_url' => $array['data']['pingURL'],
  733. 'default' => $array['data']['tabDefault'],
  734. 'enabled' => 1,
  735. 'group_id' => $array['data']['tabGroupID'],
  736. 'image' => $array['data']['tabImage'],
  737. 'type' => $array['data']['tabType']
  738. ];
  739. $connect->query('INSERT INTO [tabs]', $newTab);
  740. writeLog('success', 'Tab Editor Function - Created Tab for: ' . $array['data']['tabName'], $GLOBALS['organizrUser']['username']);
  741. return true;
  742. } catch (Dibi\Exception $e) {
  743. return false;
  744. }
  745. break;
  746. default:
  747. return false;
  748. break;
  749. }
  750. }
  751. function editCategories($array)
  752. {
  753. switch ($array['data']['action']) {
  754. case 'changeDefault':
  755. try {
  756. $connect = new Dibi\Connection([
  757. 'driver' => 'sqlite3',
  758. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  759. ]);
  760. $connect->query('UPDATE categories SET `default` = 0');
  761. $connect->query('
  762. UPDATE categories SET', [
  763. 'default' => 1
  764. ], '
  765. WHERE id=?', $array['data']['id']);
  766. writeLog('success', 'Category Editor Function - Changed Default Category from [' . $array['data']['oldCategoryName'] . '] to [' . $array['data']['newCategoryName'] . ']', $GLOBALS['organizrUser']['username']);
  767. return true;
  768. } catch (Dibi\Exception $e) {
  769. return false;
  770. }
  771. break;
  772. case 'deleteCategory':
  773. try {
  774. $connect = new Dibi\Connection([
  775. 'driver' => 'sqlite3',
  776. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  777. ]);
  778. $connect->query('DELETE FROM categories WHERE id = ?', $array['data']['id']);
  779. writeLog('success', 'Category Editor Function - Deleted Category [' . $array['data']['category'] . ']', $GLOBALS['organizrUser']['username']);
  780. return true;
  781. } catch (Dibi\Exception $e) {
  782. return false;
  783. }
  784. break;
  785. case 'addNewCategory':
  786. try {
  787. $connect = new Dibi\Connection([
  788. 'driver' => 'sqlite3',
  789. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  790. ]);
  791. $newCategory = [
  792. 'category' => $array['data']['categoryName'],
  793. 'order' => $array['data']['categoryOrder'],
  794. 'category_id' => $array['data']['categoryID'],
  795. 'default' => false,
  796. 'image' => $array['data']['categoryImage'],
  797. ];
  798. $connect->query('INSERT INTO [categories]', $newCategory);
  799. writeLog('success', 'Category Editor Function - Added Category [' . $array['data']['categoryName'] . ']', $GLOBALS['organizrUser']['username']);
  800. return true;
  801. } catch (Dibi\Exception $e) {
  802. return $e;
  803. }
  804. break;
  805. case 'editCategory':
  806. try {
  807. $connect = new Dibi\Connection([
  808. 'driver' => 'sqlite3',
  809. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  810. ]);
  811. $connect->query('
  812. UPDATE categories SET', [
  813. 'category' => $array['data']['name'],
  814. 'image' => $array['data']['image'],
  815. ], '
  816. WHERE id=?', $array['data']['id']);
  817. writeLog('success', 'Category Editor Function - Edited Category Info for [' . $array['data']['name'] . ']', $GLOBALS['organizrUser']['username']);
  818. return true;
  819. } catch (Dibi\Exception $e) {
  820. return false;
  821. }
  822. break;
  823. case 'changeOrder':
  824. try {
  825. $connect = new Dibi\Connection([
  826. 'driver' => 'sqlite3',
  827. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  828. ]);
  829. foreach ($array['data']['categories']['category'] as $key => $value) {
  830. if ($value['order'] != $value['originalOrder']) {
  831. $connect->query('
  832. UPDATE categories SET', [
  833. 'order' => $value['order'],
  834. ], '
  835. WHERE id=?', $value['id']);
  836. writeLog('success', 'Category Editor Function - ' . $value['name'] . ' Order Changed From ' . $value['order'] . ' to ' . $value['originalOrder'], $GLOBALS['organizrUser']['username']);
  837. }
  838. }
  839. writeLog('success', 'Category Editor Function - Category Order Changed', $GLOBALS['organizrUser']['username']);
  840. return true;
  841. } catch (Dibi\Exception $e) {
  842. return false;
  843. }
  844. break;
  845. default:
  846. return false;
  847. break;
  848. }
  849. }
  850. function allUsers()
  851. {
  852. try {
  853. $connect = new Dibi\Connection([
  854. 'driver' => 'sqlite3',
  855. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  856. ]);
  857. $users = $connect->fetchAll('SELECT * FROM users');
  858. $groups = $connect->fetchAll('SELECT * FROM groups ORDER BY group_id ASC');
  859. foreach ($users as $k => $v) {
  860. // clear password from array
  861. unset($users[$k]['password']);
  862. }
  863. $all['users'] = $users;
  864. $all['groups'] = $groups;
  865. return $all;
  866. } catch (Dibi\Exception $e) {
  867. return false;
  868. }
  869. }
  870. function usernameTaken($username, $email)
  871. {
  872. try {
  873. $connect = new Dibi\Connection([
  874. 'driver' => 'sqlite3',
  875. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  876. ]);
  877. $all = $connect->fetch('SELECT * FROM users WHERE username = ? COLLATE NOCASE OR email = ? COLLATE NOCASE', $username, $email);
  878. return ($all) ? true : false;
  879. } catch (Dibi\Exception $e) {
  880. return false;
  881. }
  882. }
  883. function usernameTakenExcept($username, $email, $id)
  884. {
  885. try {
  886. $connect = new Dibi\Connection([
  887. 'driver' => 'sqlite3',
  888. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  889. ]);
  890. $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);
  891. return ($all) ? true : false;
  892. } catch (Dibi\Exception $e) {
  893. return false;
  894. }
  895. }
  896. function createUser($username, $password, $defaults, $email = null)
  897. {
  898. $email = ($email) ? $email : random_ascii_string(10) . '@placeholder.eml';
  899. try {
  900. if (!usernameTaken($username, $email)) {
  901. $createDB = new Dibi\Connection([
  902. 'driver' => 'sqlite3',
  903. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  904. ]);
  905. $userInfo = [
  906. 'username' => $username,
  907. 'password' => password_hash($password, PASSWORD_BCRYPT),
  908. 'email' => $email,
  909. 'group' => $defaults['group'],
  910. 'group_id' => $defaults['group_id'],
  911. 'image' => gravatar($email),
  912. 'register_date' => $GLOBALS['currentTime'],
  913. ];
  914. $createDB->query('INSERT INTO [users]', $userInfo);
  915. return true;
  916. } else {
  917. return false;
  918. }
  919. } catch (Dibi\Exception $e) {
  920. return false;
  921. }
  922. }
  923. function allTabs()
  924. {
  925. if (file_exists('config' . DIRECTORY_SEPARATOR . 'config.php')) {
  926. try {
  927. $connect = new Dibi\Connection([
  928. 'driver' => 'sqlite3',
  929. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  930. ]);
  931. $all['tabs'] = $connect->fetchAll('SELECT * FROM tabs ORDER BY `order` ASC');
  932. $all['categories'] = $connect->fetchAll('SELECT * FROM categories ORDER BY `order` ASC');
  933. $all['groups'] = $connect->fetchAll('SELECT * FROM groups ORDER BY `group_id` ASC');
  934. return $all;
  935. } catch (Dibi\Exception $e) {
  936. return false;
  937. }
  938. }
  939. return false;
  940. }
  941. function allGroups()
  942. {
  943. if (file_exists('config' . DIRECTORY_SEPARATOR . 'config.php')) {
  944. try {
  945. $connect = new Dibi\Connection([
  946. 'driver' => 'sqlite3',
  947. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  948. ]);
  949. $all = $connect->fetchAll('SELECT * FROM groups ORDER BY `group_id` ASC');
  950. return $all;
  951. } catch (Dibi\Exception $e) {
  952. return false;
  953. }
  954. }
  955. return false;
  956. }
  957. function loadTabs()
  958. {
  959. if (file_exists('config' . DIRECTORY_SEPARATOR . 'config.php')) {
  960. try {
  961. $connect = new Dibi\Connection([
  962. 'driver' => 'sqlite3',
  963. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  964. ]);
  965. $tabs = $connect->fetchAll('SELECT * FROM tabs WHERE `group_id` >= ? AND `enabled` = 1 ORDER BY `order` DESC', $GLOBALS['organizrUser']['groupID']);
  966. $categories = $connect->fetchAll('SELECT * FROM categories ORDER BY `order` ASC');
  967. $all['tabs'] = $tabs;
  968. foreach ($tabs as $k => $v) {
  969. $v['access_url'] = isset($v['url_local']) && getenv('SERVER_ADDR') == userIP() ? $v['url_local'] : $v['url'];
  970. }
  971. $count = array_map(function ($element) {
  972. return $element['category_id'];
  973. }, $tabs);
  974. $count = (array_count_values($count));
  975. foreach ($categories as $k => $v) {
  976. $v['count'] = isset($count[$v['category_id']]) ? $count[$v['category_id']] : 0;
  977. }
  978. $all['categories'] = $categories;
  979. return $all;
  980. } catch (Dibi\Exception $e) {
  981. return false;
  982. }
  983. }
  984. return false;
  985. }