api-functions.php 34 KB

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