parse((string) $token); // Parses from a string
$jwttoken->getHeaders(); // Retrieves the token header
$jwttoken->getClaims(); // Retrieves the token claims
//Start Validation
if($jwttoken->verify($signer, $key)){
$data = new ValidationData(); // It will use the current time to validate (iat, nbf and exp)
$data->setIssuer('Organizr');
$data->setAudience('Organizr');
if($jwttoken->validate($data)){
$result['valid'] = true;
$result['username'] = $jwttoken->getClaim('username');
$result['group'] = $jwttoken->getClaim('group');
$result['groupID'] = $jwttoken->getClaim('groupID');
$result['email'] = $jwttoken->getClaim('email');
$result['image'] = $jwttoken->getClaim('image');
$result['tokenExpire'] = $jwttoken->getClaim('exp');
$result['tokenDate'] = $jwttoken->getClaim('iat');
$result['token'] = $jwttoken->getClaim('exp');
}
}
if($result['valid'] == true){ return $result; }else{ return false; }
} catch(\RunException $e) {
return false;
} catch(\OutOfBoundsException $e) {
return false;
} catch(\RunTimeException $e) {
return false;
} catch(\InvalidArgumentException $e) {
return false;
}
}
function createToken($username,$email,$image,$group,$groupID,$key,$days = 1){
//Create JWT
//Set key
//HSA256 Encyption
$signer = new Sha256();
//Start Builder
$jwttoken = (new Builder())->setIssuer('Organizr') // Configures the issuer (iss claim)
->setAudience('Organizr') // Configures the audience (aud claim)
->setId('4f1g23a12aa', true) // Configures the id (jti claim), replicating as a header item
->setIssuedAt(time()) // Configures the time that the token was issue (iat claim)
->setExpiration(time() + (86400 * $days)) // Configures the expiration time of the token (exp claim)
->set('username', $username) // Configures a new claim, called "username"
->set('group', $group) // Configures a new claim, called "group"
->set('groupID', $groupID) // Configures a new claim, called "groupID"
->set('email', $email) // Configures a new claim, called "email"
->set('image', $image) // Configures a new claim, called "image"
->sign($signer, $key) // creates a signature using "testing" as key
->getToken(); // Retrieves the generated token
$jwttoken->getHeaders(); // Retrieves the token headers
$jwttoken->getClaims(); // Retrieves the token claims
coookie('set','organizrToken',$jwttoken,$days);
return $jwttoken;
}
function prettyPrint($v) {
$trace = debug_backtrace()[0];
echo '
'.$trace['file'].':'.$trace['line'].' '.gettype($v)."\n\n".print_r($v, 1).'
';
}
// Create config file in the return syntax
function createConfig($array, $path = null, $nest = 0) {
$path = ($path) ? $path : $GLOBALS['userConfigPath'];
// Define Initial Value
$output = array();
// Sort Items
ksort($array);
// Update the current config version
if (!$nest) {
// Inject Current Version
$output[] = "\t'configVersion' => '".(isset($array['apply_CONFIG_VERSION'])?$array['apply_CONFIG_VERSION']:$GLOBALS['installedVersion'])."'";
}
unset($array['configVersion']);
unset($array['apply_CONFIG_VERSION']);
// Process Settings
foreach ($array as $k => $v) {
$allowCommit = true;
switch (gettype($v)) {
case 'boolean':
$item = ($v?true:false);
break;
case 'integer':
case 'double':
case 'integer':
case 'NULL':
$item = $v;
break;
case 'string':
$item = "'".str_replace(array('\\',"'"),array('\\\\',"\'"),$v)."'";
break;
case 'array':
$item = createConfig($v, false, $nest+1);
break;
default:
$allowCommit = false;
}
if($allowCommit) {
$output[] = str_repeat("\t",$nest+1)."'$k' => $item";
}
}
// Build output
$output = (!$nest?" $v) {
$current[$k] = $v;
}
// Return Create
return createConfig($current);
}
function configLazy() {
// Load config or default
if (file_exists($GLOBALS['userConfigPath'])) {
$config = fillDefaultConfig(loadConfig($GLOBALS['userConfigPath']));
} else {
$config = loadConfig($GLOBALS['defaultConfigPath']);
}
if (is_array($config)) {
defineConfig($config);
}
return $config;
}
function loadConfig($path = null){
$path = ($path) ? $path : $GLOBALS['userConfigPath'];
if (!is_file($path)) {
return null;
} else {
return (array) call_user_func(function() use($path) {
return include($path);
});
}
}
function fillDefaultConfig($array) {
$path = $GLOBALS['defaultConfigPath'];
if (is_string($path)) {
$loadedDefaults = loadConfig($path);
} else {
$loadedDefaults = $path;
}
return (is_array($loadedDefaults) ? fillDefaultConfig_recurse($array, $loadedDefaults) : false);
}
function fillDefaultConfig_recurse($current, $defaults) {
foreach($defaults as $k => $v) {
if (!isset($current[$k])) {
$current[$k] = $v;
} else if (is_array($current[$k]) && is_array($v)) {
$current[$k] = fillDefaultConfig_recurse($current[$k], $v);
}
}
return $current;
}
function defineConfig($array, $anyCase = true, $nest_prefix = false) {
foreach($array as $k => $v) {
if (is_scalar($v) && !defined($nest_prefix.$k)) {
$GLOBALS[$nest_prefix.$k] = $v;
} else if (is_array($v)) {
defineConfig($v, $anyCase, $nest_prefix.$k.'_');
}
}
}
function cleanDirectory($path){
$path = str_replace(array('/', '\\'), '/', $path);
if(substr($path, -1) != '/'){
$path = $path . '/';
}
if($path[0] != '/' && $path[1] != ':'){
$path = '/' . $path;
}
return $path;
}
function wizardConfig($array){
foreach ($array['data'] as $items) {
foreach ($items as $key => $value) {
if($key == 'name'){
$newKey = $value;
}
if($key == 'value'){
$newValue = $value;
}
if(isset($newKey) && isset($newValue)){
$$newKey = $newValue;
}
}
}
$location = cleanDirectory($location);
$dbName = $dbName.'.db';
$configVersion = $GLOBALS['installedVersion'];
$configArray = array(
'dbName' => $dbName,
'dbLocation' => $location,
'license' => $license,
'organizrHash' => $hashKey,
'organizrAPI' => $api,
'registrationPassword' => $registrationPassword,
);
/*
file_put_contents('config'.DIRECTORY_SEPARATOR.'config.php',
" \"$configVersion\",
\"dbName\" => \"$dbName\",
\"dbLocation\" => \"$location\",
\"license\" => \"$license\",
\"organizrHash\" => \"$hashKey\",
\"organizrAPI\" => \"$api\",
\"registrationPassword\" => \"$registrationPassword\"
);");
*/
//Create Config
if(createConfig($configArray)){
//Call DB Create
if(createDB($location,$dbName)){
//Add in first user
if(createFirstAdmin($location,$dbName,$username,$password,$email)){
if(createToken($username,$email,gravatar($email),'Admin',0,$hashKey,1)){
return true;
}
}
}
}
return false;
}
function gravatar($email = '') {
$email = md5(strtolower(trim($email)));
$gravurl = "https://www.gravatar.com/avatar/$email?s=100&d=mm";
return $gravurl;
}
function login($array){
//Grab username and Password from login form
foreach ($array['data'] as $items) {
foreach ($items as $key => $value) {
if($key == 'name'){
$newKey = $value;
}
if($key == 'value'){
$newValue = $value;
}
if(isset($newKey) && isset($newValue)){
$$newKey = $newValue;
}
}
}
$username = strtolower($username);
$days = (isset($remember)) ? 7 : 1;
try {
$database = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$result = $database->fetch('SELECT * FROM users WHERE username = ? COLLATE NOCASE OR email = ? COLLATE NOCASE',$username,$username);
if(password_verify($password, $result['password'])){
if(createToken($result['username'],$result['email'],$result['image'],$result['group'],$result['group_id'],$GLOBALS['organizrHash'],$days)){
writeLoginLog($username, 'success');
writeLog('success', 'Login Function - A User has logged in', $username);
return true;
}
}else{
writeLoginLog($username, 'error');
writeLog('error', 'Login Function - Wrong Password', $username);
return 'mismatch';
}
} catch (Dibi\Exception $e) {
return 'error';
}
}
function createDB($path,$filename) {
if(file_exists($path.$filename)){
unlink($path.$filename);
}
try {
$createDB = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $path.$filename,
]);
// Create Users
$users = $createDB->query('CREATE TABLE `users` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
`username` TEXT UNIQUE,
`password` TEXT,
`email` TEXT,
`plex_token` TEXT,
`group` TEXT,
`group_id` INTEGER,
`image` TEXT,
`register_date` DATE,
`auth_service` TEXT DEFAULT \'internal\'
);');
$groups = $createDB->query('CREATE TABLE `groups` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
`group` TEXT UNIQUE,
`group_id` INTEGER,
`image` TEXT,
`default` INTEGER
);');
$categories = $createDB->query('CREATE TABLE `categories` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
`order` INTEGER,
`category` TEXT UNIQUE,
`category_id` INTEGER,
`image` TEXT,
`default` INTEGER
);');
// Create Tabs
$tabs = $createDB->query('CREATE TABLE `tabs` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
`order` INTEGER,
`category_id` INTEGER,
`name` TEXT,
`url` TEXT,
`url_local` TEXT,
`default` INTEGER,
`enabled` INTEGER,
`group_id` INTEGER,
`image` TEXT,
`type` INTEGER,
`splash` INTEGER,
`ping` INTEGER,
`ping_url` TEXT
);');
// Create Options
$options = $createDB->query('CREATE TABLE `options` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
`users_id` INTEGER UNIQUE,
`title` TEXT UNIQUE,
`topbar` TEXT,
`bottombar` TEXT,
`sidebar` TEXT,
`hoverbg` TEXT,
`topbartext` TEXT,
`activetabBG` TEXT,
`activetabicon` TEXT,
`activetabtext` TEXT,
`inactiveicon` TEXT,
`inactivetext` TEXT,
`loading` TEXT,
`hovertext` TEXT
);');
// Create Invites
$invites = $createDB->query('CREATE TABLE `invites` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
`code` TEXT UNIQUE,
`date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`email` TEXT,
`username` TEXT,
`dateused` TIMESTAMP,
`usedby` TEXT,
`ip` TEXT,
`valid` TEXT,
`type` TEXT
);');
return true;
} catch (Dibi\Exception $e) {
return false;
}
}
// Upgrade Database
function updateDB($path,$filename,$oldVerNum = false) {
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $path.$filename,
]);
// Cache current DB
$cache = array();
foreach($connect->query('SELECT name FROM sqlite_master WHERE type="table";') as $table) {
foreach($connect->query('SELECT * FROM '.$table['name'].';') as $key => $row) {
foreach($row as $k => $v) {
if (is_string($k)) {
$cache[$table['name']][$key][$k] = $v;
}
}
}
}
// Remove Current Database
/*
$pathDigest = pathinfo($path.$filename);
if (file_exists($path.$filename)) {
rename($path.$filename, $pathDigest['dirname'].'/'.$pathDigest['filename'].'['.date('Y-m-d_H-i-s').']'.($oldVerNum?'['.$oldVerNum.']':'').'.bak.db');
}
// Create New Database
$success = createSQLiteDB($path.$filename);
// Restore Items
if ($success) {
foreach($cache as $table => $tableData) {
if ($tableData) {
$queryBase = 'INSERT INTO '.$table.' (`'.implode('`,`',array_keys(current($tableData))).'`) values ';
$insertValues = array();
reset($tableData);
foreach($tableData as $key => $value) {
$insertValues[] = '('.implode(',',array_map(function($d) {
return (isset($d)?$GLOBALS['file_db']->quote($d):'null');
}, $value)).')';
}
$GLOBALS['file_db']->query($queryBase.implode(',',$insertValues).';');
}
}
//writeLog("success", "database values have been updated");
return true;
} else {
//writeLog("error", "database values unable to be updated");
return false;
}
*/
return $cache;
} catch (Dibi\Exception $e) {
return $e;
}
}
function createFirstAdmin($path,$filename,$username,$password,$email) {
try {
$createDB = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $path.$filename,
]);
$userInfo = [
'username' => $username,
'password' => password_hash($password, PASSWORD_BCRYPT),
'email' => $email,
'group' => 'Admin',
'group_id' => 0,
'image' => gravatar($email),
'register_date' => $GLOBALS['currentTime'],
];
$groupInfo0 = [
'group' => 'Admin',
'group_id' => 0,
'default' => false,
'image' => 'plugins/images/groups/admin.png',
];
$groupInfo1 = [
'group' => 'Co-Admin',
'group_id' => 1,
'default' => false,
'image' => 'plugins/images/groups/coadmin.png',
];
$groupInfo2 = [
'group' => 'Super User',
'group_id' => 2,
'default' => false,
'image' => 'plugins/images/groups/superuser.png',
];
$groupInfo3 = [
'group' => 'Power User',
'group_id' => 3,
'default' => false,
'image' => 'plugins/images/groups/poweruser.png',
];
$groupInfo4 = [
'group' => 'User',
'group_id' => 4,
'default' => true,
'image' => 'plugins/images/groups/user.png',
];
$groupInfoGuest = [
'group' => 'Guest',
'group_id' => 999,
'default' => false,
'image' => 'plugins/images/groups/guest.png',
];
$settingsInfo = [
'order' => 1,
'category_id' => 0,
'name' => 'Settings',
'url' => 'api/?v1/settings/page',
'default' => false,
'enabled' => true,
'group_id' => 1,
'image' => 'fontawesome::cog',
'type' => 0
];
$homepageInfo = [
'order' => 2,
'category_id' => 0,
'name' => 'Homepage',
'url' => 'api/?v1/homepage/page',
'default' => false,
'enabled' => false,
'group_id' => 4,
'image' => 'fontawesome::home',
'type' => 0
];
$unsortedInfo = [
'order' => 1,
'category' => 'Unsorted',
'category_id' => 0,
'image' => 'plugins/images/categories/unsorted.png',
'default' => true
];
$createDB->query('INSERT INTO [users]', $userInfo);
$createDB->query('INSERT INTO [groups]', $groupInfo0);
$createDB->query('INSERT INTO [groups]', $groupInfo1);
$createDB->query('INSERT INTO [groups]', $groupInfo2);
$createDB->query('INSERT INTO [groups]', $groupInfo3);
$createDB->query('INSERT INTO [groups]', $groupInfo4);
$createDB->query('INSERT INTO [groups]', $groupInfoGuest);
$createDB->query('INSERT INTO [tabs]', $settingsInfo);
$createDB->query('INSERT INTO [tabs]', $homepageInfo);
$createDB->query('INSERT INTO [categories]', $unsortedInfo);
return true;
} catch (Dibi\Exception $e) {
return false;
}
}
function register($array){
//Grab username and Password from login form
foreach ($array['data'] as $items) {
foreach ($items as $key => $value) {
if($key == 'name'){
$newKey = $value;
}
if($key == 'value'){
$newValue = $value;
}
if(isset($newKey) && isset($newValue)){
$$newKey = $newValue;
}
}
}
if($registrationPassword == $GLOBALS['registrationPassword']){
$defaults = defaultUserGroup();
writeLog('success', 'Registration Function - Registration Password Verified', $username);
if(createUser($username,$password,$defaults,$email)){
writeLog('success', 'Registration Function - A User has registered', $username);
if(createToken($username,$email,gravatar($email),$defaults['group'],$defaults['group_id'],$GLOBALS['organizrHash'],1)){
writeLoginLog($username, 'success');
writeLog('success', 'Login Function - A User has logged in', $username);
return true;
}
}else{
writeLog('error', 'Registration Function - An error occured', $username);
return 'username taken';
}
}else{
writeLog('warning', 'Registration Function - Wrong Password', $username);
return 'mismatch';
}
}
function defaultUserGroup(){
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$all = $connect->fetch('SELECT * FROM groups WHERE `default` = 1');
return $all;
} catch (Dibi\Exception $e) {
return false;
}
}
function defaulTabCategory(){
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$all = $connect->fetch('SELECT * FROM categories WHERE `default` = 1');
return $all;
} catch (Dibi\Exception $e) {
return false;
}
}
function getGuest(){
if(isset($GLOBALS['dbLocation'])){
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$all = $connect->fetch('SELECT * FROM groups WHERE `group` = "Guest"');
return $all;
} catch (Dibi\Exception $e) {
return false;
}
}else{
return array(
'group' => 'Guest',
'group_id' => 999,
'image' => 'plugins/images/groups/guest.png'
);
}
}
function adminEditGroup($array){
switch ($array['data']['action']) {
case 'changeDefaultGroup':
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$connect->query('UPDATE groups SET `default` = 0');
$connect->query('
UPDATE groups SET', [
'default' => 1
], '
WHERE id=?', $array['data']['id']);
writeLog('success', 'Group Management Function - Changed Default Group from ['.$array['data']['oldGroupName'].'] to ['.$array['data']['newGroupName'].']', $GLOBALS['organizrUser']['username']);
return true;
} catch (Dibi\Exception $e) {
return false;
}
break;
case 'deleteUserGroup':
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$connect->query('DELETE FROM groups WHERE id = ?', $array['data']['id']);
writeLog('success', 'Group Management Function - Deleted Group ['.$array['data']['groupName'].']', $GLOBALS['organizrUser']['username']);
return true;
} catch (Dibi\Exception $e) {
return false;
}
break;
case 'addUserGroup':
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$newGroup = [
'group' => $array['data']['newGroupName'],
'group_id' => $array['data']['newGroupID'],
'default' => false,
'image' => $array['data']['newGroupImage'],
];
$connect->query('INSERT INTO [groups]', $newGroup);
writeLog('success', 'Group Management Function - Added Group ['.$array['data']['newGroupName'].']', $GLOBALS['organizrUser']['username']);
return true;
} catch (Dibi\Exception $e) {
return false;
}
break;
case 'editUserGroup':
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$connect->query('
UPDATE groups SET', [
'group' => $array['data']['groupName'],
'image' => $array['data']['groupImage'],
], '
WHERE id=?', $array['data']['id']);
writeLog('success', 'Group Management Function - Edited Group Info for ['.$array['data']['oldGroupName'].']', $GLOBALS['organizrUser']['username']);
return true;
} catch (Dibi\Exception $e) {
return false;
}
break;
default:
# code...
break;
}
}
function adminEditUser($array){
switch ($array['data']['action']) {
case 'changeGroup':
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$connect->query('
UPDATE users SET', [
'group' => $array['data']['newGroupName'],
'group_id' => $array['data']['newGroupID'],
], '
WHERE id=?', $array['data']['id']);
writeLog('success', 'User Management Function - User: '.$array['data']['username'].'\'s group was changed from ['.$array['data']['oldGroup'].'] to ['.$array['data']['newGroupName'].']', $GLOBALS['organizrUser']['username']);
return true;
} catch (Dibi\Exception $e) {
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']);
return false;
}
break;
case 'addNewUser':
$defaults = defaultUserGroup();
if(createUser($array['data']['username'],$array['data']['password'],$defaults,$array['data']['email'])){
writeLog('success', 'Create User Function - Acount created for ['.$array['data']['username'].']', $GLOBALS['organizrUser']['username']);
return true;
}else{
writeLog('error', 'Registration Function - An error occured', $GLOBALS['organizrUser']['username']);
return 'username taken';
}
break;
case 'deleteUser':
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$connect->query('DELETE FROM users WHERE id = ?', $array['data']['id']);
writeLog('success', 'User Management Function - Deleted User ['.$array['data']['username'].']', $GLOBALS['organizrUser']['username']);
return true;
} catch (Dibi\Exception $e) {
return false;
}
break;
default:
# code...
break;
}
}
function editTabs($array){
switch ($array['data']['action']) {
case 'changeGroup':
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$connect->query('
UPDATE tabs SET', [
'group_id' => $array['data']['newGroupID'],
], '
WHERE id=?', $array['data']['id']);
writeLog('success', 'Tab Editor Function - Tab: '.$array['data']['tab'].'\'s group was changed to ['.$array['data']['newGroupName'].']', $GLOBALS['organizrUser']['username']);
return true;
} catch (Dibi\Exception $e) {
return false;
}
break;
case 'changeCategory':
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$connect->query('
UPDATE tabs SET', [
'category_id' => $array['data']['newCategoryID'],
], '
WHERE id=?', $array['data']['id']);
writeLog('success', 'Tab Editor Function - Tab: '.$array['data']['tab'].'\'s category was changed to ['.$array['data']['newCategoryName'].']', $GLOBALS['organizrUser']['username']);
return true;
} catch (Dibi\Exception $e) {
return false;
}
break;
case 'changeType':
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$connect->query('
UPDATE tabs SET', [
'type' => $array['data']['newTypeID'],
], '
WHERE id=?', $array['data']['id']);
writeLog('success', 'Tab Editor Function - Tab: '.$array['data']['tab'].'\'s type was changed to ['.$array['data']['newTypeName'].']', $GLOBALS['organizrUser']['username']);
return true;
} catch (Dibi\Exception $e) {
return false;
}
break;
case 'changeEnabled':
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$connect->query('
UPDATE tabs SET', [
'enabled' => $array['data']['tabEnabled'],
], '
WHERE id=?', $array['data']['id']);
writeLog('success', 'Tab Editor Function - Tab: '.$array['data']['tab'].'\'s enable status was changed to ['.$array['data']['tabEnabledWord'].']', $GLOBALS['organizrUser']['username']);
return true;
} catch (Dibi\Exception $e) {
return false;
}
break;
case 'changeSplash':
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$connect->query('
UPDATE tabs SET', [
'splash' => $array['data']['tabSplash'],
], '
WHERE id=?', $array['data']['id']);
writeLog('success', 'Tab Editor Function - Tab: '.$array['data']['tab'].'\'s splash status was changed to ['.$array['data']['tabSplashWord'].']', $GLOBALS['organizrUser']['username']);
return true;
} catch (Dibi\Exception $e) {
return false;
}
break;
case 'changeDefault':
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$connect->query('UPDATE tabs SET `default` = 0');
$connect->query('
UPDATE tabs SET', [
'default' => 1
], '
WHERE id=?', $array['data']['id']);
writeLog('success', 'Tab Editor Function - Changed Default Tab to ['.$array['data']['tab'].']', $GLOBALS['organizrUser']['username']);
return true;
} catch (Dibi\Exception $e) {
return false;
}
break;
case 'deleteTab':
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$connect->query('DELETE FROM tabs WHERE id = ?', $array['data']['id']);
writeLog('success', 'Tab Editor Function - Deleted Tab ['.$array['data']['tab'].']', $GLOBALS['organizrUser']['username']);
return true;
} catch (Dibi\Exception $e) {
return false;
}
break;
case 'editTab':
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$connect->query('
UPDATE tabs SET', [
'name' => $array['data']['tabName'],
'url' => $array['data']['tabURL'],
'image' => $array['data']['tabImage'],
], '
WHERE id=?', $array['data']['id']);
writeLog('success', 'Tab Editor Function - Edited Tab Info for ['.$array['data']['tabName'].']', $GLOBALS['organizrUser']['username']);
return true;
} catch (Dibi\Exception $e) {
return false;
}
case 'changeOrder':
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
foreach ($array['data']['tabs']['tab'] as $key => $value) {
if($value['order'] != $value['originalOrder']){
$connect->query('
UPDATE tabs SET', [
'order' => $value['order'],
], '
WHERE id=?', $value['id']);
writeLog('success', 'Tab Editor Function - '.$value['name'].' Order Changed From '.$value['order'].' to '.$value['originalOrder'], $GLOBALS['organizrUser']['username']);
}
}
writeLog('success', 'Tab Editor Function - Tab Order Changed', $GLOBALS['organizrUser']['username']);
return true;
} catch (Dibi\Exception $e) {
return false;
}
break;
case 'addNewTab':
try {
$default = defaulTabCategory()['category_id'];
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$newTab = [
'order' => $array['data']['tabOrder'],
'category_id' => $default,
'name' => $array['data']['tabName'],
'url' => $array['data']['tabURL'],
'default' => $array['data']['tabDefault'],
'enabled' => 1,
'group_id' => $array['data']['tabGroupID'],
'image' => $array['data']['tabImage'],
'type' => $array['data']['tabType']
];
$connect->query('INSERT INTO [tabs]', $newTab);
writeLog('success', 'Tab Editor Function - Created Tab for: '.$array['data']['tabName'], $GLOBALS['organizrUser']['username']);
return true;
} catch (Dibi\Exception $e) {
return false;
}
break;
case 'deleteTab':
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$connect->query('DELETE FROM tabs WHERE id = ?', $array['data']['id']);
writeLog('success', 'Tab Editor Function - Deleted Tab ['.$array['data']['name'].']', $GLOBALS['organizrUser']['username']);
return true;
} catch (Dibi\Exception $e) {
return false;
}
break;
default:
# code...
break;
}
}
function editCategories($array){
switch ($array['data']['action']) {
case 'changeDefault':
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$connect->query('UPDATE categories SET `default` = 0');
$connect->query('
UPDATE categories SET', [
'default' => 1
], '
WHERE id=?', $array['data']['id']);
writeLog('success', 'Category Editor Function - Changed Default Category from ['.$array['data']['oldCategoryName'].'] to ['.$array['data']['newCategoryName'].']', $GLOBALS['organizrUser']['username']);
return true;
} catch (Dibi\Exception $e) {
return false;
}
break;
case 'deleteCategory':
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$connect->query('DELETE FROM categories WHERE id = ?', $array['data']['id']);
writeLog('success', 'Category Editor Function - Deleted Category ['.$array['data']['category'].']', $GLOBALS['organizrUser']['username']);
return true;
} catch (Dibi\Exception $e) {
return false;
}
break;
case 'addNewCategory':
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$newCategory = [
'category' => $array['data']['categoryName'],
'order' => $array['data']['categoryOrder'],
'category_id' => $array['data']['categoryID'],
'default' => false,
'image' => $array['data']['categoryImage'],
];
$connect->query('INSERT INTO [categories]', $newCategory);
writeLog('success', 'Category Editor Function - Added Category ['.$array['data']['categoryName'].']', $GLOBALS['organizrUser']['username']);
return true;
} catch (Dibi\Exception $e) {
return $e;
}
break;
case 'editCategory':
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$connect->query('
UPDATE categories SET', [
'category' => $array['data']['name'],
'image' => $array['data']['image'],
], '
WHERE id=?', $array['data']['id']);
writeLog('success', 'Category Editor Function - Edited Category Info for ['.$array['data']['name'].']', $GLOBALS['organizrUser']['username']);
return true;
} catch (Dibi\Exception $e) {
return false;
}
break;
case 'changeOrder':
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
foreach ($array['data']['categories']['category'] as $key => $value) {
if($value['order'] != $value['originalOrder']){
$connect->query('
UPDATE categories SET', [
'order' => $value['order'],
], '
WHERE id=?', $value['id']);
writeLog('success', 'Category Editor Function - '.$value['name'].' Order Changed From '.$value['order'].' to '.$value['originalOrder'], $GLOBALS['organizrUser']['username']);
}
}
writeLog('success', 'Category Editor Function - Category Order Changed', $GLOBALS['organizrUser']['username']);
return true;
} catch (Dibi\Exception $e) {
return false;
}
break;
default:
# code...
break;
}
}
function editUser($array){
return $array;
}
function allUsers(){
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$users = $connect->fetchAll('SELECT * FROM users');
$groups = $connect->fetchAll('SELECT * FROM groups ORDER BY group_id ASC');
foreach ($users as $k => $v) {
//clear password from array
unset($users[$k]['password']);
}
$all['users'] = $users;
$all['groups'] = $groups;
return $all;
} catch (Dibi\Exception $e) {
return false;
}
}
function usernameTaken($username,$email){
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$all = $connect->fetch('SELECT * FROM users WHERE username = ? COLLATE NOCASE OR email = ? COLLATE NOCASE',$username,$email);
return ($all) ? true : false;
} catch (Dibi\Exception $e) {
return false;
}
}
function createUser($username,$password,$defaults,$email=null) {
$email = ($email) ? $email : random_ascii_string(10).'@placeholder.eml';
try {
if(!usernameTaken($username,$email)){
$createDB = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$userInfo = [
'username' => $username,
'password' => password_hash($password, PASSWORD_BCRYPT),
'email' => $email,
'group' => $defaults['group'],
'group_id' => $defaults['group_id'],
'image' => gravatar($email),
'register_date' => $GLOBALS['currentTime'],
];
$createDB->query('INSERT INTO [users]', $userInfo);
return true;
}else{
return false;
}
} catch (Dibi\Exception $e) {
return false;
}
}
//Cookie Function
function coookie($type, $name, $value = '', $days = -1, $http = true){
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == "https"){
$Secure = true;
$HTTPOnly = true;
}elseif (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
$Secure = true;
$HTTPOnly = true;
} else {
$Secure = false;
$HTTPOnly = false;
}
if(!$http){ $HTTPOnly = false; }
$Path = '/';
$Domain = $_SERVER['HTTP_HOST'];
$Port = strpos($Domain, ':');
if ($Port !== false) $Domain = substr($Domain, 0, $Port);
$Port = strpos($Domain, ':');
$check = substr_count($Domain, '.');
if($check >= 3){
if(is_numeric($Domain[0])){
$Domain = '';
}else{
$Domain = '.'.explode('.',$Domain)[1].'.'.explode('.',$Domain)[2].'.'.explode('.',$Domain)[3];
}
}elseif($check == 2){
$Domain = '.'.explode('.',$Domain)[1].'.'.explode('.',$Domain)[2];
}elseif($check == 1){
$Domain = '.' . $Domain;
}else{
$Domain = '';
}
if($type = 'set'){
$_COOKIE[$name] = $value;
header('Set-Cookie: ' . rawurlencode($name) . '=' . rawurlencode($value)
. (empty($days) ? '' : '; expires=' . gmdate('D, d-M-Y H:i:s', time() + (86400 * $days)) . ' GMT')
. (empty($Path) ? '' : '; path=' . $Path)
. (empty($Domain) ? '' : '; domain=' . $Domain)
. (!$Secure ? '' : '; secure')
. (!$HTTPOnly ? '' : '; HttpOnly'), false);
}elseif($type = 'delete'){
unset($_COOKIE[$name]);
header('Set-Cookie: ' . rawurlencode($name) . '=' . rawurlencode($value)
. (empty($days) ? '' : '; expires=' . gmdate('D, d-M-Y H:i:s', time() - 3600) . ' GMT')
. (empty($Path) ? '' : '; path=' . $Path)
. (empty($Domain) ? '' : '; domain=' . $Domain)
. (!$Secure ? '' : '; secure')
. (!$HTTPOnly ? '' : '; HttpOnly'), false);
}
}
function validateToken($token,$global=false){
//validate script
$userInfo = jwtParse($token);
$validated = $userInfo ? true : false;
if($validated == true){
if($global == true){
$GLOBALS['organizrUser'] = array(
"token"=>$token,
"tokenDate"=>$userInfo['tokenDate'],
"tokenExpire"=>$userInfo['tokenExpire'],
"username"=>$userInfo['username'],
"group"=>$userInfo['group'],
"groupID"=>$userInfo['groupID'],
"email"=>$userInfo['email'],
"image"=>$userInfo['image'],
"loggedin"=>true
);
}
}else{
//delete cookie & reload page
coookie('delete','organizrToken');
$GLOBALS['organizrUser'] = false;
}
}
function logout(){
coookie('delete','organizrToken');
$GLOBALS['organizrUser'] = false;
return true;
}
function getOrganizrUserToken(){
if(isset($_COOKIE['organizrToken'])){
//get token form cookie and validate
validateToken($_COOKIE['organizrToken'],true);
}else{
$GLOBALS['organizrUser'] = array(
"token"=>null,
"tokenDate"=>null,
"tokenExpire"=>null,
"username"=>"Guest",
"group"=>getGuest()['group'],
"groupID"=>getGuest()['group_id'],
"email"=>null,
"image"=>getGuest()['image'],
"loggedin"=>false
);
}
}
function qualifyRequest($accessLevelNeeded){
if(getUserLevel() <= $accessLevelNeeded){
return true;
}else{
return false;
}
}
function getUserLevel(){
$requesterToken = isset(getallheaders()['Token']) ? getallheaders()['Token'] : false;
//check token or API key
//If API key, return 0 for admin
if(strlen($requesterToken) == 20 && $requesterToken == $GLOBALS['organizrAPI']){
//DO API CHECK
return 0;
}elseif(isset($GLOBALS['organizrUser'])){
return $GLOBALS['organizrUser']['groupID'];
}
//all else fails? return guest id
return 999;
}
function getOS(){
if(PHP_SHLIB_SUFFIX == "dll"){
return "win";
}else{
return "*nix";
}
}
function organizrStatus(){
$status = array();
$dependenciesActive = array();
$dependenciesInactive = array();
$extensions = array("PDO_SQLITE", "PDO", "SQLITE3", "zip", "cURL", "openssl", "simplexml", "json", "session");
$functions = array("hash", "fopen", "fsockopen", "fwrite", "fclose", "readfile");
foreach($extensions as $check){
if(extension_loaded($check)){
array_push($dependenciesActive,$check);
}else{
array_push($dependenciesInactive,$check);
}
}
foreach($functions as $check){
if(function_exists($check)){
array_push($dependenciesActive,$check);
}else{
array_push($dependenciesInactive,$check);
}
}
if(!file_exists('config'.DIRECTORY_SEPARATOR.'config.php')){
$status['status'] = "wizard";//wizard - ok for test
}
if(count($dependenciesInactive)>0 || !is_writable(dirname(__DIR__,2))){
$status['status'] = "dependencies";
}
$status['status'] = (!empty($status['status'])) ? $status['status'] : $status['status'] = "ok";
$status['writable'] = is_writable(dirname(__DIR__,2)) ? 'yes' : 'no';
$status['dependenciesActive'] = $dependenciesActive;
$status['dependenciesInactive'] = $dependenciesInactive;
$status['version'] = $GLOBALS['installedVersion'];
$status['os'] = getOS();
$status['php'] = phpversion();
return $status;
}
function allTabs(){
if(file_exists('config'.DIRECTORY_SEPARATOR.'config.php')){
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$all['tabs'] = $connect->fetchAll('SELECT * FROM tabs ORDER BY `order` ASC');
$all['categories'] = $connect->fetchAll('SELECT * FROM categories ORDER BY `order` ASC');
$all['groups'] = $connect->fetchAll('SELECT * FROM groups ORDER BY `group_id` ASC');
return $all;
} catch (Dibi\Exception $e) {
return false;
}
}
}
function loadTabs(){
if(file_exists('config'.DIRECTORY_SEPARATOR.'config.php')){
try {
$connect = new Dibi\Connection([
'driver' => 'sqlite3',
'database' => $GLOBALS['dbLocation'].$GLOBALS['dbName'],
]);
$tabs = $connect->fetchAll('SELECT * FROM tabs WHERE `group_id` >= ? AND `enabled` = 1 ORDER BY `order` DESC',$GLOBALS['organizrUser']['groupID']);
$categories = $connect->fetchAll('SELECT * FROM categories ORDER BY `order` ASC');
$all['tabs'] = $tabs;
foreach ($tabs as $k => $v) {
$v['access_url'] = isset($v['url_local']) && $_SERVER['SERVER_ADDR'] == userIP() ? $v['url_local'] : $v['url'];
}
$count = array_map(function($element){
return $element['category_id'];
}, $tabs);
$count = (array_count_values($count));
foreach ($categories as $k => $v) {
$v['count'] = isset($count[$v['category_id']]) ? $count[$v['category_id']] : 0;
}
$all['categories'] = $categories;
return $all;
} catch (Dibi\Exception $e) {
return false;
}
}
}
if(!function_exists('getallheaders')){
function getallheaders(){
$headers = array ();
foreach ($_SERVER as $name => $value){
if (substr($name, 0, 5) == 'HTTP_'){
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
}
}
return $headers;
}
}
function writeLoginLog($username, $authType) {
if(file_exists($GLOBALS['organizrLoginLog'])) {
$getLog = str_replace("\r\ndate", "date", file_get_contents($GLOBALS['organizrLoginLog']));
$gotLog = json_decode($getLog, true);
}
$logEntryFirst = array('logType' => 'login_log', 'auth' => array(array('date' => date("Y-m-d H:i:s"), 'utc_date' => $GLOBALS['currentTime'], 'username' => $username, 'ip' => userIP(), 'auth_type' => $authType)));
$logEntry = array('date' => date("Y-m-d H:i:s"), 'utc_date' => $GLOBALS['currentTime'], 'username' => $username, 'ip' => userIP(), 'auth_type' => $authType);
if(isset($gotLog)) {
array_push($gotLog["auth"], $logEntry);
$writeFailLog = str_replace("date", "\r\ndate", json_encode($gotLog));
} else {
$writeFailLog = str_replace("date", "\r\ndate", json_encode($logEntryFirst));
}
file_put_contents($GLOBALS['organizrLoginLog'], $writeFailLog);
};
function writeLog($type='error', $message, $username=null) {
$username = ($username) ? $username : $GLOBALS['organizrUser']['username'];
if(file_exists($GLOBALS['organizrLog'])) {
$getLog = str_replace("\r\ndate", "date", file_get_contents($GLOBALS['organizrLog']));
$gotLog = json_decode($getLog, true);
}
$logEntryFirst = array('logType' => 'organizr_log', 'log_items' => array(array('date' => date("Y-m-d H:i:s"), 'utc_date' => $GLOBALS['currentTime'], 'type' => $type, 'username' => $username, 'ip' => userIP(), 'message' => $message)));
$logEntry = array('date' => date("Y-m-d H:i:s"), 'utc_date' => $GLOBALS['currentTime'], 'type' => $type, 'username' => $username, 'ip' => userIP(), 'message' => $message);
if(isset($gotLog)) {
array_push($gotLog["log_items"], $logEntry);
$writeFailLog = str_replace("date", "\r\ndate", json_encode($gotLog));
} else {
$writeFailLog = str_replace("date", "\r\ndate", json_encode($logEntryFirst));
}
file_put_contents($GLOBALS['organizrLog'], $writeFailLog);
};
function getLog($type,$reverse=true){
switch ($type) {
case 'login':
case 'loginLog':
$file = $GLOBALS['organizrLoginLog'];
$parent = 'auth';
break;
case 'org':
case 'organizrLog':
$file = $GLOBALS['organizrLog'];
$parent = 'log_items';
default:
break;
}
if(!file_exists($file)){
return false;
}
$getLog = str_replace("\r\ndate", "date", file_get_contents($file));
$gotLog = json_decode($getLog, true);
return ($reverse) ? array_reverse($gotLog[$parent]) : $gotLog[$parent];
}
function random_ascii_string($len){
$string = "";
$max = strlen($this->ascii)-1;
while($len-->0) { $string .= $this->ascii[mt_rand(0, $max)]; }
return $string;
}
function encrypt($password, $key = null) {
$key = (isset($GLOBALS['organizrHash'])) ? $GLOBALS['organizrHash'] : $key;
return openssl_encrypt($password, 'AES-256-CBC', $key, 0, fillString($key,16));
}
function decrypt($password, $key = null) {
$key = (isset($GLOBALS['organizrHash'])) ? $GLOBALS['organizrHash'] : $key;
return openssl_decrypt($password, 'AES-256-CBC', $key, 0, fillString($key,16));
}
function fillString($string, $length){
$filler = '0123456789abcdefghijklmnopqrstuvwxyz!@#$%^&*';
if(strlen($string) < $length){
$diff = $length - strlen($string);
$filler = substr($filler,0,$diff);
return $string.$filler;
}elseif(strlen($string) > $length){
return substr($string,0,$length);
}else{
return $string;
}
return $diff;
}
function userIP() {
if (isset($_SERVER['HTTP_CLIENT_IP']))
$ipaddress = $_SERVER['HTTP_CLIENT_IP'];
else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
$ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_X_FORWARDED']))
$ipaddress = $_SERVER['HTTP_X_FORWARDED'];
else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
$ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_FORWARDED']))
$ipaddress = $_SERVER['HTTP_FORWARDED'];
else if(isset($_SERVER['REMOTE_ADDR']))
$ipaddress = $_SERVER['REMOTE_ADDR'];
else
$ipaddress = 'UNKNOWN';
if (strpos($ipaddress, ',') !== false) {
list($first, $last) = explode(",", $ipaddress);
return $first;
}else{
return $ipaddress;
}
}
function arrayIP($string){
if (strpos($string, ',') !== false) {
$result = explode(",", $string);
}else{
$result = array($string);
}
foreach($result as &$ip){
$ip = is_numeric(substr($ip, 0, 1)) ? $ip : gethostbyname($ip);
}
return $result;
}
function auth(){
$debug = false; //CAREFUL WHEN SETTING TO TRUE AS THIS OPENS AUTH UP
$ban = isset($_GET['ban']) ? strtoupper($_GET['ban']) : "";
$whitelist = isset($_GET['whitelist']) ? $_GET['whitelist'] : false;
$blacklist = isset($_GET['blacklist']) ? $_GET['blacklist'] : false;
$group = isset($_GET['group']) ? $_GET['group'] : 0;
$currentIP = userIP();
$currentUser = $GLOBALS['organizrUser']['username'];
if ($whitelist) {
if(in_array($currentIP, arrayIP($whitelist))) {
!$debug ? exit(http_response_code(200)) : die("$currentIP Whitelist Authorized");
}
}
if ($blacklist) {
if(in_array($currentIP, arrayIP($blacklist))) {
!$debug ? exit(http_response_code(401)) : die("$currentIP Blacklisted");
}
}
if($group !== null){
if(qualifyRequest($group)){
!$debug ? exit(http_response_code(200)) : die("$currentUser on $currentIP Authorized");
}else{
!$debug ? exit(http_response_code(401)) : die("$currentUser on $currentIP Not Authorized");
}
}else{
!$debug ? exit(http_response_code(401)) : die("Not Authorized Due To No Parameters Set");
}
}