api-functions.php 34 KB

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