api-functions.php 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007
  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. writeLog('success', 'Update Function - Cached Old Database', 'Database');
  206. } catch (Dibi\Exception $e) {
  207. writeLog('error', 'Update Function - Cache Error [' . $e . ']', 'Database');
  208. return $e;
  209. }
  210. // Remove Current Database
  211. $pathDigest = pathinfo($path . $filename);
  212. if (file_exists($path . $filename)) {
  213. copy($path . $filename, $pathDigest['dirname'] . '/' . $pathDigest['filename'] . '[' . date('Y-m-d_H-i-s') . ']' . ($oldVerNum ? '[' . $oldVerNum . ']' : '') . '.bak.db');
  214. unlink($path . $filename);
  215. }
  216. // Create New Database
  217. $success = createDB($path, $filename);
  218. try {
  219. $GLOBALS['connect'] = new Dibi\Connection([
  220. 'driver' => 'sqlite3',
  221. 'database' => $path . $filename,
  222. ]);
  223. // Restore Items
  224. if ($success) {
  225. writeLog('success', 'Update Function - Created New Database', 'Database');
  226. foreach ($cache as $table => $tableData) {
  227. if ($tableData) {
  228. $queryBase = 'INSERT INTO ' . $table . ' (`' . implode('`,`', array_keys(current($tableData))) . '`) values ';
  229. $insertValues = array();
  230. reset($tableData);
  231. foreach ($tableData as $key => $value) {
  232. $insertValues[] = '(' . implode(',', array_map(function ($d) {
  233. return (isset($d) ? str_replace('\/', '/', json_encode($d)) : 'null');
  234. }, $value)) . ')';
  235. }
  236. $GLOBALS['connect']->query($queryBase . implode(',', $insertValues) . ';');
  237. }
  238. }
  239. }
  240. writeLog('success', 'Update Function - Migrated Old Info to new Database', 'Database');
  241. return true;
  242. } catch (Dibi\Exception $e) {
  243. writeLog('error', 'Update Function - Error [' . $e . ']', 'Database');
  244. return false;
  245. }
  246. }
  247. function createFirstAdmin($path, $filename, $username, $password, $email)
  248. {
  249. try {
  250. $createDB = new Dibi\Connection([
  251. 'driver' => 'sqlite3',
  252. 'database' => $path . $filename,
  253. ]);
  254. $userInfo = [
  255. 'username' => $username,
  256. 'password' => password_hash($password, PASSWORD_BCRYPT),
  257. 'email' => $email,
  258. 'group' => 'Admin',
  259. 'group_id' => 0,
  260. 'image' => gravatar($email),
  261. 'register_date' => $GLOBALS['currentTime'],
  262. ];
  263. $groupInfo0 = [
  264. 'group' => 'Admin',
  265. 'group_id' => 0,
  266. 'default' => false,
  267. 'image' => 'plugins/images/groups/admin.png',
  268. ];
  269. $groupInfo1 = [
  270. 'group' => 'Co-Admin',
  271. 'group_id' => 1,
  272. 'default' => false,
  273. 'image' => 'plugins/images/groups/coadmin.png',
  274. ];
  275. $groupInfo2 = [
  276. 'group' => 'Super User',
  277. 'group_id' => 2,
  278. 'default' => false,
  279. 'image' => 'plugins/images/groups/superuser.png',
  280. ];
  281. $groupInfo3 = [
  282. 'group' => 'Power User',
  283. 'group_id' => 3,
  284. 'default' => false,
  285. 'image' => 'plugins/images/groups/poweruser.png',
  286. ];
  287. $groupInfo4 = [
  288. 'group' => 'User',
  289. 'group_id' => 4,
  290. 'default' => true,
  291. 'image' => 'plugins/images/groups/user.png',
  292. ];
  293. $groupInfoGuest = [
  294. 'group' => 'Guest',
  295. 'group_id' => 999,
  296. 'default' => false,
  297. 'image' => 'plugins/images/groups/guest.png',
  298. ];
  299. $settingsInfo = [
  300. 'order' => 1,
  301. 'category_id' => 0,
  302. 'name' => 'Settings',
  303. 'url' => 'api/?v1/settings/page',
  304. 'default' => false,
  305. 'enabled' => true,
  306. 'group_id' => 1,
  307. 'image' => 'fontawesome::cog',
  308. 'type' => 0
  309. ];
  310. $homepageInfo = [
  311. 'order' => 2,
  312. 'category_id' => 0,
  313. 'name' => 'Homepage',
  314. 'url' => 'api/?v1/homepage/page',
  315. 'default' => false,
  316. 'enabled' => false,
  317. 'group_id' => 4,
  318. 'image' => 'fontawesome::home',
  319. 'type' => 0
  320. ];
  321. $unsortedInfo = [
  322. 'order' => 1,
  323. 'category' => 'Unsorted',
  324. 'category_id' => 0,
  325. 'image' => 'plugins/images/categories/unsorted.png',
  326. 'default' => true
  327. ];
  328. $createDB->query('INSERT INTO [users]', $userInfo);
  329. $createDB->query('INSERT INTO [groups]', $groupInfo0);
  330. $createDB->query('INSERT INTO [groups]', $groupInfo1);
  331. $createDB->query('INSERT INTO [groups]', $groupInfo2);
  332. $createDB->query('INSERT INTO [groups]', $groupInfo3);
  333. $createDB->query('INSERT INTO [groups]', $groupInfo4);
  334. $createDB->query('INSERT INTO [groups]', $groupInfoGuest);
  335. $createDB->query('INSERT INTO [tabs]', $settingsInfo);
  336. $createDB->query('INSERT INTO [tabs]', $homepageInfo);
  337. $createDB->query('INSERT INTO [categories]', $unsortedInfo);
  338. return true;
  339. } catch (Dibi\Exception $e) {
  340. writeLog('error', 'Wizard Function - Error [' . $e . ']', 'Wizard');
  341. return false;
  342. }
  343. }
  344. function defaultUserGroup()
  345. {
  346. try {
  347. $connect = new Dibi\Connection([
  348. 'driver' => 'sqlite3',
  349. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  350. ]);
  351. $all = $connect->fetch('SELECT * FROM groups WHERE `default` = 1');
  352. return $all;
  353. } catch (Dibi\Exception $e) {
  354. return false;
  355. }
  356. }
  357. function defaultTabCategory()
  358. {
  359. try {
  360. $connect = new Dibi\Connection([
  361. 'driver' => 'sqlite3',
  362. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  363. ]);
  364. $all = $connect->fetch('SELECT * FROM categories WHERE `default` = 1');
  365. return $all;
  366. } catch (Dibi\Exception $e) {
  367. return false;
  368. }
  369. }
  370. function getGuest()
  371. {
  372. if (isset($GLOBALS['dbLocation'])) {
  373. try {
  374. $connect = new Dibi\Connection([
  375. 'driver' => 'sqlite3',
  376. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  377. ]);
  378. $all = $connect->fetch('SELECT * FROM groups WHERE `group` = "Guest"');
  379. return $all;
  380. } catch (Dibi\Exception $e) {
  381. return false;
  382. }
  383. } else {
  384. return array(
  385. 'group' => 'Guest',
  386. 'group_id' => 999,
  387. 'image' => 'plugins/images/groups/guest.png'
  388. );
  389. }
  390. }
  391. function adminEditGroup($array)
  392. {
  393. switch ($array['data']['action']) {
  394. case 'changeDefaultGroup':
  395. try {
  396. $connect = new Dibi\Connection([
  397. 'driver' => 'sqlite3',
  398. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  399. ]);
  400. $connect->query('UPDATE groups SET `default` = 0');
  401. $connect->query('
  402. UPDATE groups SET', [
  403. 'default' => 1
  404. ], '
  405. WHERE id=?', $array['data']['id']);
  406. writeLog('success', 'Group Management Function - Changed Default Group from [' . $array['data']['oldGroupName'] . '] to [' . $array['data']['newGroupName'] . ']', $GLOBALS['organizrUser']['username']);
  407. return true;
  408. } catch (Dibi\Exception $e) {
  409. return false;
  410. }
  411. break;
  412. case 'deleteUserGroup':
  413. try {
  414. $connect = new Dibi\Connection([
  415. 'driver' => 'sqlite3',
  416. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  417. ]);
  418. $connect->query('DELETE FROM groups WHERE id = ?', $array['data']['id']);
  419. writeLog('success', 'Group Management Function - Deleted Group [' . $array['data']['groupName'] . ']', $GLOBALS['organizrUser']['username']);
  420. return true;
  421. } catch (Dibi\Exception $e) {
  422. return false;
  423. }
  424. break;
  425. case 'addUserGroup':
  426. try {
  427. $connect = new Dibi\Connection([
  428. 'driver' => 'sqlite3',
  429. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  430. ]);
  431. $newGroup = [
  432. 'group' => $array['data']['newGroupName'],
  433. 'group_id' => $array['data']['newGroupID'],
  434. 'default' => false,
  435. 'image' => $array['data']['newGroupImage'],
  436. ];
  437. $connect->query('INSERT INTO [groups]', $newGroup);
  438. writeLog('success', 'Group Management Function - Added Group [' . $array['data']['newGroupName'] . ']', $GLOBALS['organizrUser']['username']);
  439. return true;
  440. } catch (Dibi\Exception $e) {
  441. return false;
  442. }
  443. break;
  444. case 'editUserGroup':
  445. try {
  446. $connect = new Dibi\Connection([
  447. 'driver' => 'sqlite3',
  448. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  449. ]);
  450. $connect->query('
  451. UPDATE groups SET', [
  452. 'group' => $array['data']['groupName'],
  453. 'image' => $array['data']['groupImage'],
  454. ], '
  455. WHERE id=?', $array['data']['id']);
  456. writeLog('success', 'Group Management Function - Edited Group Info for [' . $array['data']['oldGroupName'] . ']', $GLOBALS['organizrUser']['username']);
  457. return true;
  458. } catch (Dibi\Exception $e) {
  459. return false;
  460. }
  461. break;
  462. default:
  463. return false;
  464. break;
  465. }
  466. }
  467. function adminEditUser($array)
  468. {
  469. switch ($array['data']['action']) {
  470. case 'changeGroup':
  471. try {
  472. $connect = new Dibi\Connection([
  473. 'driver' => 'sqlite3',
  474. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  475. ]);
  476. $connect->query('
  477. UPDATE users SET', [
  478. 'group' => $array['data']['newGroupName'],
  479. 'group_id' => $array['data']['newGroupID'],
  480. ], '
  481. WHERE id=?', $array['data']['id']);
  482. writeLog('success', 'User Management Function - User: ' . $array['data']['username'] . '\'s group was changed from [' . $array['data']['oldGroup'] . '] to [' . $array['data']['newGroupName'] . ']', $GLOBALS['organizrUser']['username']);
  483. return true;
  484. } catch (Dibi\Exception $e) {
  485. 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']);
  486. return false;
  487. }
  488. break;
  489. case 'editUser':
  490. try {
  491. $connect = new Dibi\Connection([
  492. 'driver' => 'sqlite3',
  493. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  494. ]);
  495. if (!usernameTakenExcept($array['data']['username'], $array['data']['email'], $array['data']['id'])) {
  496. $connect->query('
  497. UPDATE users SET', [
  498. 'username' => $array['data']['username'],
  499. 'email' => $array['data']['email'],
  500. ], '
  501. WHERE id=?', $array['data']['id']);
  502. if (!empty($array['data']['password'])) {
  503. $connect->query('
  504. UPDATE users SET', [
  505. 'password' => password_hash($array['data']['password'], PASSWORD_BCRYPT)
  506. ], '
  507. WHERE id=?', $array['data']['id']);
  508. }
  509. writeLog('success', 'User Management Function - User: ' . $array['data']['username'] . '\'s info was changed', $GLOBALS['organizrUser']['username']);
  510. return true;
  511. } else {
  512. return false;
  513. }
  514. } catch (Dibi\Exception $e) {
  515. 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']);
  516. return false;
  517. }
  518. break;
  519. case 'addNewUser':
  520. $defaults = defaultUserGroup();
  521. if (createUser($array['data']['username'], $array['data']['password'], $defaults, $array['data']['email'])) {
  522. writeLog('success', 'Create User Function - Account created for [' . $array['data']['username'] . ']', $GLOBALS['organizrUser']['username']);
  523. return true;
  524. } else {
  525. writeLog('error', 'Registration Function - An error occurred', $GLOBALS['organizrUser']['username']);
  526. return 'username taken';
  527. }
  528. break;
  529. case 'deleteUser':
  530. try {
  531. $connect = new Dibi\Connection([
  532. 'driver' => 'sqlite3',
  533. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  534. ]);
  535. $connect->query('DELETE FROM users WHERE id = ?', $array['data']['id']);
  536. writeLog('success', 'User Management Function - Deleted User [' . $array['data']['username'] . ']', $GLOBALS['organizrUser']['username']);
  537. return true;
  538. } catch (Dibi\Exception $e) {
  539. return false;
  540. }
  541. break;
  542. default:
  543. return false;
  544. break;
  545. }
  546. }
  547. function editTabs($array)
  548. {
  549. switch ($array['data']['action']) {
  550. case 'changeGroup':
  551. try {
  552. $connect = new Dibi\Connection([
  553. 'driver' => 'sqlite3',
  554. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  555. ]);
  556. $connect->query('
  557. UPDATE tabs SET', [
  558. 'group_id' => $array['data']['newGroupID'],
  559. ], '
  560. WHERE id=?', $array['data']['id']);
  561. writeLog('success', 'Tab Editor Function - Tab: ' . $array['data']['tab'] . '\'s group was changed to [' . $array['data']['newGroupName'] . ']', $GLOBALS['organizrUser']['username']);
  562. return true;
  563. } catch (Dibi\Exception $e) {
  564. return false;
  565. }
  566. break;
  567. case 'changeCategory':
  568. try {
  569. $connect = new Dibi\Connection([
  570. 'driver' => 'sqlite3',
  571. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  572. ]);
  573. $connect->query('
  574. UPDATE tabs SET', [
  575. 'category_id' => $array['data']['newCategoryID'],
  576. ], '
  577. WHERE id=?', $array['data']['id']);
  578. writeLog('success', 'Tab Editor Function - Tab: ' . $array['data']['tab'] . '\'s category was changed to [' . $array['data']['newCategoryName'] . ']', $GLOBALS['organizrUser']['username']);
  579. return true;
  580. } catch (Dibi\Exception $e) {
  581. return false;
  582. }
  583. break;
  584. case 'changeType':
  585. try {
  586. $connect = new Dibi\Connection([
  587. 'driver' => 'sqlite3',
  588. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  589. ]);
  590. $connect->query('
  591. UPDATE tabs SET', [
  592. 'type' => $array['data']['newTypeID'],
  593. ], '
  594. WHERE id=?', $array['data']['id']);
  595. writeLog('success', 'Tab Editor Function - Tab: ' . $array['data']['tab'] . '\'s type was changed to [' . $array['data']['newTypeName'] . ']', $GLOBALS['organizrUser']['username']);
  596. return true;
  597. } catch (Dibi\Exception $e) {
  598. return false;
  599. }
  600. break;
  601. case 'changeEnabled':
  602. try {
  603. $connect = new Dibi\Connection([
  604. 'driver' => 'sqlite3',
  605. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  606. ]);
  607. $connect->query('
  608. UPDATE tabs SET', [
  609. 'enabled' => $array['data']['tabEnabled'],
  610. ], '
  611. WHERE id=?', $array['data']['id']);
  612. writeLog('success', 'Tab Editor Function - Tab: ' . $array['data']['tab'] . '\'s enable status was changed to [' . $array['data']['tabEnabledWord'] . ']', $GLOBALS['organizrUser']['username']);
  613. return true;
  614. } catch (Dibi\Exception $e) {
  615. return false;
  616. }
  617. break;
  618. case 'changeSplash':
  619. try {
  620. $connect = new Dibi\Connection([
  621. 'driver' => 'sqlite3',
  622. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  623. ]);
  624. $connect->query('
  625. UPDATE tabs SET', [
  626. 'splash' => $array['data']['tabSplash'],
  627. ], '
  628. WHERE id=?', $array['data']['id']);
  629. writeLog('success', 'Tab Editor Function - Tab: ' . $array['data']['tab'] . '\'s splash status was changed to [' . $array['data']['tabSplashWord'] . ']', $GLOBALS['organizrUser']['username']);
  630. return true;
  631. } catch (Dibi\Exception $e) {
  632. return false;
  633. }
  634. break;
  635. case 'changePing':
  636. try {
  637. $connect = new Dibi\Connection([
  638. 'driver' => 'sqlite3',
  639. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  640. ]);
  641. $connect->query('
  642. UPDATE tabs SET', [
  643. 'ping' => $array['data']['tabPing'],
  644. ], '
  645. WHERE id=?', $array['data']['id']);
  646. writeLog('success', 'Tab Editor Function - Tab: ' . $array['data']['tab'] . '\'s ping status was changed to [' . $array['data']['tabPingWord'] . ']', $GLOBALS['organizrUser']['username']);
  647. return true;
  648. } catch (Dibi\Exception $e) {
  649. return false;
  650. }
  651. break;
  652. case 'changeDefault':
  653. try {
  654. $connect = new Dibi\Connection([
  655. 'driver' => 'sqlite3',
  656. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  657. ]);
  658. $connect->query('UPDATE tabs SET `default` = 0');
  659. $connect->query('
  660. UPDATE tabs SET', [
  661. 'default' => 1
  662. ], '
  663. WHERE id=?', $array['data']['id']);
  664. writeLog('success', 'Tab Editor Function - Changed Default Tab to [' . $array['data']['tab'] . ']', $GLOBALS['organizrUser']['username']);
  665. return true;
  666. } catch (Dibi\Exception $e) {
  667. return false;
  668. }
  669. break;
  670. case 'deleteTab':
  671. try {
  672. $connect = new Dibi\Connection([
  673. 'driver' => 'sqlite3',
  674. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  675. ]);
  676. $connect->query('DELETE FROM tabs WHERE id = ?', $array['data']['id']);
  677. writeLog('success', 'Tab Editor Function - Deleted Tab [' . $array['data']['tab'] . ']', $GLOBALS['organizrUser']['username']);
  678. return true;
  679. } catch (Dibi\Exception $e) {
  680. return false;
  681. }
  682. break;
  683. case 'editTab':
  684. try {
  685. $connect = new Dibi\Connection([
  686. 'driver' => 'sqlite3',
  687. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  688. ]);
  689. $connect->query('
  690. UPDATE tabs SET', [
  691. 'name' => $array['data']['tabName'],
  692. 'url' => $array['data']['tabURL'],
  693. 'ping_url' => $array['data']['pingURL'],
  694. 'image' => $array['data']['tabImage'],
  695. ], '
  696. WHERE id=?', $array['data']['id']);
  697. writeLog('success', 'Tab Editor Function - Edited Tab Info for [' . $array['data']['tabName'] . ']', $GLOBALS['organizrUser']['username']);
  698. return true;
  699. } catch (Dibi\Exception $e) {
  700. return false;
  701. }
  702. case 'changeOrder':
  703. try {
  704. $connect = new Dibi\Connection([
  705. 'driver' => 'sqlite3',
  706. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  707. ]);
  708. foreach ($array['data']['tabs']['tab'] as $key => $value) {
  709. if ($value['order'] != $value['originalOrder']) {
  710. $connect->query('
  711. UPDATE tabs SET', [
  712. 'order' => $value['order'],
  713. ], '
  714. WHERE id=?', $value['id']);
  715. writeLog('success', 'Tab Editor Function - ' . $value['name'] . ' Order Changed From ' . $value['order'] . ' to ' . $value['originalOrder'], $GLOBALS['organizrUser']['username']);
  716. }
  717. }
  718. writeLog('success', 'Tab Editor Function - Tab Order Changed', $GLOBALS['organizrUser']['username']);
  719. return true;
  720. } catch (Dibi\Exception $e) {
  721. return false;
  722. }
  723. break;
  724. case 'addNewTab':
  725. try {
  726. $default = defaultTabCategory()['category_id'];
  727. $connect = new Dibi\Connection([
  728. 'driver' => 'sqlite3',
  729. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  730. ]);
  731. $newTab = [
  732. 'order' => $array['data']['tabOrder'],
  733. 'category_id' => $default,
  734. 'name' => $array['data']['tabName'],
  735. 'url' => $array['data']['tabURL'],
  736. 'ping_url' => $array['data']['pingURL'],
  737. 'default' => $array['data']['tabDefault'],
  738. 'enabled' => 1,
  739. 'group_id' => $array['data']['tabGroupID'],
  740. 'image' => $array['data']['tabImage'],
  741. 'type' => $array['data']['tabType']
  742. ];
  743. $connect->query('INSERT INTO [tabs]', $newTab);
  744. writeLog('success', 'Tab Editor Function - Created Tab for: ' . $array['data']['tabName'], $GLOBALS['organizrUser']['username']);
  745. return true;
  746. } catch (Dibi\Exception $e) {
  747. return false;
  748. }
  749. break;
  750. default:
  751. return false;
  752. break;
  753. }
  754. }
  755. function editCategories($array)
  756. {
  757. switch ($array['data']['action']) {
  758. case 'changeDefault':
  759. try {
  760. $connect = new Dibi\Connection([
  761. 'driver' => 'sqlite3',
  762. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  763. ]);
  764. $connect->query('UPDATE categories SET `default` = 0');
  765. $connect->query('
  766. UPDATE categories SET', [
  767. 'default' => 1
  768. ], '
  769. WHERE id=?', $array['data']['id']);
  770. writeLog('success', 'Category Editor Function - Changed Default Category from [' . $array['data']['oldCategoryName'] . '] to [' . $array['data']['newCategoryName'] . ']', $GLOBALS['organizrUser']['username']);
  771. return true;
  772. } catch (Dibi\Exception $e) {
  773. return false;
  774. }
  775. break;
  776. case 'deleteCategory':
  777. try {
  778. $connect = new Dibi\Connection([
  779. 'driver' => 'sqlite3',
  780. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  781. ]);
  782. $connect->query('DELETE FROM categories WHERE id = ?', $array['data']['id']);
  783. writeLog('success', 'Category Editor Function - Deleted Category [' . $array['data']['category'] . ']', $GLOBALS['organizrUser']['username']);
  784. return true;
  785. } catch (Dibi\Exception $e) {
  786. return false;
  787. }
  788. break;
  789. case 'addNewCategory':
  790. try {
  791. $connect = new Dibi\Connection([
  792. 'driver' => 'sqlite3',
  793. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  794. ]);
  795. $newCategory = [
  796. 'category' => $array['data']['categoryName'],
  797. 'order' => $array['data']['categoryOrder'],
  798. 'category_id' => $array['data']['categoryID'],
  799. 'default' => false,
  800. 'image' => $array['data']['categoryImage'],
  801. ];
  802. $connect->query('INSERT INTO [categories]', $newCategory);
  803. writeLog('success', 'Category Editor Function - Added Category [' . $array['data']['categoryName'] . ']', $GLOBALS['organizrUser']['username']);
  804. return true;
  805. } catch (Dibi\Exception $e) {
  806. return $e;
  807. }
  808. break;
  809. case 'editCategory':
  810. try {
  811. $connect = new Dibi\Connection([
  812. 'driver' => 'sqlite3',
  813. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  814. ]);
  815. $connect->query('
  816. UPDATE categories SET', [
  817. 'category' => $array['data']['name'],
  818. 'image' => $array['data']['image'],
  819. ], '
  820. WHERE id=?', $array['data']['id']);
  821. writeLog('success', 'Category Editor Function - Edited Category Info for [' . $array['data']['name'] . ']', $GLOBALS['organizrUser']['username']);
  822. return true;
  823. } catch (Dibi\Exception $e) {
  824. return false;
  825. }
  826. break;
  827. case 'changeOrder':
  828. try {
  829. $connect = new Dibi\Connection([
  830. 'driver' => 'sqlite3',
  831. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  832. ]);
  833. foreach ($array['data']['categories']['category'] as $key => $value) {
  834. if ($value['order'] != $value['originalOrder']) {
  835. $connect->query('
  836. UPDATE categories SET', [
  837. 'order' => $value['order'],
  838. ], '
  839. WHERE id=?', $value['id']);
  840. writeLog('success', 'Category Editor Function - ' . $value['name'] . ' Order Changed From ' . $value['order'] . ' to ' . $value['originalOrder'], $GLOBALS['organizrUser']['username']);
  841. }
  842. }
  843. writeLog('success', 'Category Editor Function - Category Order Changed', $GLOBALS['organizrUser']['username']);
  844. return true;
  845. } catch (Dibi\Exception $e) {
  846. return false;
  847. }
  848. break;
  849. default:
  850. return false;
  851. break;
  852. }
  853. }
  854. function allUsers()
  855. {
  856. try {
  857. $connect = new Dibi\Connection([
  858. 'driver' => 'sqlite3',
  859. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  860. ]);
  861. $users = $connect->fetchAll('SELECT * FROM users');
  862. $groups = $connect->fetchAll('SELECT * FROM groups ORDER BY group_id ASC');
  863. foreach ($users as $k => $v) {
  864. // clear password from array
  865. unset($users[$k]['password']);
  866. }
  867. $all['users'] = $users;
  868. $all['groups'] = $groups;
  869. return $all;
  870. } catch (Dibi\Exception $e) {
  871. return false;
  872. }
  873. }
  874. function usernameTaken($username, $email)
  875. {
  876. try {
  877. $connect = new Dibi\Connection([
  878. 'driver' => 'sqlite3',
  879. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  880. ]);
  881. $all = $connect->fetch('SELECT * FROM users WHERE username = ? COLLATE NOCASE OR email = ? COLLATE NOCASE', $username, $email);
  882. return ($all) ? true : false;
  883. } catch (Dibi\Exception $e) {
  884. return false;
  885. }
  886. }
  887. function usernameTakenExcept($username, $email, $id)
  888. {
  889. try {
  890. $connect = new Dibi\Connection([
  891. 'driver' => 'sqlite3',
  892. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  893. ]);
  894. $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);
  895. return ($all) ? true : false;
  896. } catch (Dibi\Exception $e) {
  897. return false;
  898. }
  899. }
  900. function createUser($username, $password, $defaults, $email = null)
  901. {
  902. $email = ($email) ? $email : random_ascii_string(10) . '@placeholder.eml';
  903. try {
  904. if (!usernameTaken($username, $email)) {
  905. $createDB = new Dibi\Connection([
  906. 'driver' => 'sqlite3',
  907. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  908. ]);
  909. $userInfo = [
  910. 'username' => $username,
  911. 'password' => password_hash($password, PASSWORD_BCRYPT),
  912. 'email' => $email,
  913. 'group' => $defaults['group'],
  914. 'group_id' => $defaults['group_id'],
  915. 'image' => gravatar($email),
  916. 'register_date' => $GLOBALS['currentTime'],
  917. ];
  918. $createDB->query('INSERT INTO [users]', $userInfo);
  919. return true;
  920. } else {
  921. return false;
  922. }
  923. } catch (Dibi\Exception $e) {
  924. return false;
  925. }
  926. }
  927. function allTabs()
  928. {
  929. if (file_exists('config' . DIRECTORY_SEPARATOR . 'config.php')) {
  930. try {
  931. $connect = new Dibi\Connection([
  932. 'driver' => 'sqlite3',
  933. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  934. ]);
  935. $all['tabs'] = $connect->fetchAll('SELECT * FROM tabs ORDER BY `order` ASC');
  936. $all['categories'] = $connect->fetchAll('SELECT * FROM categories ORDER BY `order` ASC');
  937. $all['groups'] = $connect->fetchAll('SELECT * FROM groups ORDER BY `group_id` ASC');
  938. return $all;
  939. } catch (Dibi\Exception $e) {
  940. return false;
  941. }
  942. }
  943. return false;
  944. }
  945. function allGroups()
  946. {
  947. if (file_exists('config' . DIRECTORY_SEPARATOR . 'config.php')) {
  948. try {
  949. $connect = new Dibi\Connection([
  950. 'driver' => 'sqlite3',
  951. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  952. ]);
  953. $all = $connect->fetchAll('SELECT * FROM groups ORDER BY `group_id` ASC');
  954. return $all;
  955. } catch (Dibi\Exception $e) {
  956. return false;
  957. }
  958. }
  959. return false;
  960. }
  961. function loadTabs()
  962. {
  963. if (file_exists('config' . DIRECTORY_SEPARATOR . 'config.php')) {
  964. try {
  965. $connect = new Dibi\Connection([
  966. 'driver' => 'sqlite3',
  967. 'database' => $GLOBALS['dbLocation'] . $GLOBALS['dbName'],
  968. ]);
  969. $sort = ($GLOBALS['unsortedTabs'] == 'top') ? 'DESC' : 'ASC';
  970. $tabs = $connect->fetchAll('SELECT * FROM tabs WHERE `group_id` >= ? AND `enabled` = 1 ORDER BY `order` ' . $sort, $GLOBALS['organizrUser']['groupID']);
  971. $categories = $connect->fetchAll('SELECT * FROM categories ORDER BY `order` ASC');
  972. $all['tabs'] = $tabs;
  973. foreach ($tabs as $k => $v) {
  974. $v['access_url'] = isset($v['url_local']) && getenv('SERVER_ADDR') == userIP() ? $v['url_local'] : $v['url'];
  975. }
  976. $count = array_map(function ($element) {
  977. return $element['category_id'];
  978. }, $tabs);
  979. $count = (array_count_values($count));
  980. foreach ($categories as $k => $v) {
  981. $v['count'] = isset($count[$v['category_id']]) ? $count[$v['category_id']] : 0;
  982. }
  983. $all['categories'] = $categories;
  984. return $all;
  985. } catch (Dibi\Exception $e) {
  986. return false;
  987. }
  988. }
  989. return false;
  990. }