api-functions.php 39 KB

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