static function select($path, $fields, $where, $order, $limit, $vars, $mfolder) { $type = $path; $filename = sys_find_module($type); $custom_schema = ""; if (!file_exists($filename)) { if (!is_numeric($path)) { $type = "sys_nodb_" . $vars["handler"]; } else { $row = db_select_first("simple_sys_tree", array("ftype", "folders"), "id=@id@", "", array("id" => $path)); if (empty($row["ftype"])) { throw new Exception("{t}Folder not found.{/t}"); } $type = $row["ftype"]; } $filename = sys_find_module($type); $custom_schema = db_select_value("simple_sys_tree", "custom_schema", "id=@id@", array("id" => $path)); } // TODO optimize $rows = db_select("simple_sys_custom_fields", array("custom_schema"), array("module=@schema@", "(ffolder='' or ffolder like @folder@)", "activated=1"), "", "", array("schema" => $type, "folder" => "%|" . $path . "|%")); if (is_array($rows) and count($rows) > 0) { $custom_schema = str_replace("</table>", "", $custom_schema); if (!strpos($custom_schema, "<table")) { $custom_schema = "<table>"; } foreach ($rows as $row) { $custom_schema .= $row["custom_schema"]; } $custom_schema .= "</table>"; } return array(array("id" => $filename, "filename" => $filename, "filemtime" => filemtime($filename), "filecontent" => sgsml_parser::file_get_contents($filename, $type, $custom_schema))); }
static function install($source, $filename) { $target = SIMPLE_EXT . substr($filename, 0, -3); setup::out("{t}Download{/t}: " . $source . " ..."); if ($fz = gzopen($source, "r") and $fp = fopen($target, "w")) { $i = 0; while (!gzeof($fz)) { $i++; setup::out(".", false); if ($i % 160 == 0) { setup::out(); } fwrite($fp, gzread($fz, 16384)); } gzclose($fz); fclose($fp); } else { sys_die("{t}Error{/t}: gzopen [2] " . $source); } setup::out(); if (!file_exists($target) or filesize($target) == 0 or filesize($target) % 10240 != 0) { sys_die("{t}Error{/t}: file-check [3] Filesize: " . filesize($target) . " " . $target); } setup::out(sprintf("{t}Processing %s ...{/t}", basename($target))); $tar_object = new Archive_Tar($target); $tar_object->setErrorHandling(PEAR_ERROR_PRINT); $tar_object->extract(SIMPLE_EXT); $file_list = $tar_object->ListContent(); if (!is_array($file_list) or !isset($file_list[0]["filename"]) or !is_dir(SIMPLE_EXT . $file_list[0]["filename"])) { sys_die("{t}Error{/t}: tar [4] " . $target); } self::update_modules_list(); $ext_folder = db_select_value("simple_sys_tree", "id", "anchor=@anchor@", array("anchor" => "extensions")); foreach ($file_list as $file) { sys_chmod(SIMPLE_EXT . $file["filename"]); setup::out(sprintf("{t}Processing %s ...{/t}", SIMPLE_EXT . $file["filename"])); if (basename($file["filename"]) == "install.php") { setup::out(""); require SIMPLE_EXT . $file["filename"]; setup::out(""); } if (basename($file["filename"]) == "readme.txt") { $data = file_get_contents(SIMPLE_EXT . $file["filename"]); setup::out(nl2br("\n" . q($data) . "\n")); } if (!empty($ext_folder) and basename($file["filename"]) == "folders.xml") { setup::out(sprintf("{t}Processing %s ...{/t}", "folder structure")); folders::create_default_folders(SIMPLE_EXT . $file["filename"], $ext_folder, false); } } }
<?php /** * @package Simple Groupware * @link http://www.simple-groupware.de * @copyright Simple Groupware Solutions Thomas Bley 2002-2012 * @license GPLv2 */ // TODO2 fix resize iframe with images (graphviz) define("NOCONTENT", true); define("NOSESSION", true); require "index.php"; sys_check_auth(); $folder_offline = db_select_value("simple_sys_tree", "id", "anchor=@anchor@", array("anchor" => "offline_" . $_SESSION["username"])); $rows = db_select("simple_offline", "*", "folder=@folder@", "id asc", "", array("folder" => (int) $folder_offline)); if (!is_array($rows)) { exit("No entries found."); } foreach ($rows as $key => $row) { $rows[$key] = populate_row($row); } uasort($rows, "sort_rows"); $tpl = new template(); $tpl->sync = isset($_REQUEST["sync"]) ? 1 : 0; $tpl->username = $_SESSION["username"]; $tpl->rows = $rows; echo $tpl->render("templates/offline.php"); function sort_rows($a, $b) { if ($a["path"] == $b["path"]) { return 0;
private static function _restore($filename) { ob_end_flush(); $filename = str_replace(" ", "+", $filename); $filename = SIMPLE_STORE . "/backup/" . basename($filename); if (!file_exists($filename)) { return "{t}file not found.{/t} (" . $filename . ")"; } if (filesize($filename) == 0) { return "{t}No entries found.{/t} (" . $filename . ")"; } self::_out("{t}Extracting files{/t}: " . $filename); self::_out(""); if (self::$_restore_here) { $ftitle = str_replace(array("__", "---", "--"), array("/", " ", " "), substr(modify::basename($filename), 0, -4)); $ftitle = substr($ftitle, strrpos($ftitle, "/") + 1); $id = folders::create(substr($ftitle, 0, 40), "blank", "", $_SESSION["folder"], false); self::$_restore_folder = $id; self::_out("{t}Insert{/t}: simple_sys_tree: " . $ftitle . " [" . $id . "]"); } $result = sys_exec(sys_find_bin("tar") . " -tf " . modify::realfilename($filename)); $file_list = explode("\n", $result); if (count($file_list) == 0) { return ""; } $base_dir = SIMPLE_STORE . "/restore_" . NOW . "/"; sys_mkdir($base_dir); $cmd = "cd " . modify::realfilename($base_dir) . " && " . sys_find_bin("tar") . " -xf " . modify::realfilename($filename); if (DEBUG) { self::_out("TAR: " . $cmd . "\n\n"); } echo sys_exec($cmd); $update_ids = array(); $update_folders = array(); $restore_maps = array(); $xml_file = array_shift($file_list); self::_out("{t}Parsing{/t}: " . $xml_file); $xml = simplexml_load_file($base_dir . $xml_file); foreach ($xml->table as $data) { $data = get_object_vars($data->assetfolder); unset($data["@attributes"]); $id = $data["id"]; if (!empty($data["anchor"])) { $existing = db_select_first("simple_sys_tree", array("id", "'' as lastmodified"), "anchor=@anchor@", "", array("anchor" => $data["anchor"])); if (!empty($existing["id"])) { unset($data["anchor"]); } } else { $existing = db_select_first("simple_sys_tree", array("id", "lastmodified"), "id=@id@", "", array("id" => $id)); } if (!isset($data["fdescription"])) { $data["fdescription"] = ""; } $ftype = $data["ftype"]; $keys = array("fsizecount", "fchsizecount", "fcount", "fchcount", "ffcount", "lft", "rgt", "flevel", "folder", "id", "ftype"); foreach ($keys as $key) { unset($data[$key]); } if (isset($restore_maps[$data["parent"]])) { $data["parent"] = $restore_maps[$data["parent"]]; } if (empty($existing["id"]) or self::$_restore_here) { $parent = db_select_value("simple_sys_tree", "id", "id=@id@", array("id" => $data["parent"])); if (empty($parent) or count($restore_maps) == 0 and self::$_restore_here) { $data["parent"] = self::$_restore_folder; } $id2 = folders::create($data["ftitle"], $ftype, $data["fdescription"], $data["parent"], false); self::_out("{t}Insert{/t}: simple_sys_tree: " . $data["ftitle"] . " [ID " . $id . " -> parent/id: " . $data["parent"] . "/" . $id2 . "]"); $restore_maps[$id] = $id2; $id = $id2; } else { $restore_maps[$id] = $existing["id"]; } if (!self::$_restore_missing and (!self::$_restore_onlynewer or $data["lastmodified"] > $existing["lastmodified"])) { self::_out("{t}Update{/t}: simple_sys_tree " . $id); $error = db_update("simple_sys_tree", $data, array("id=@id@"), array("id" => $id)); if ($error) { self::_out($error); } } } foreach ($xml->table as $table_item) { if (!isset($table_item->asset) or count($table_item->asset) == 0) { continue; } foreach ($table_item->asset as $asset) { $table = $table_item["name"]; if ($table == "simple_sys_tree") { continue; } $data = get_object_vars($asset); unset($data["@attributes"]); foreach ($data as $dkey => $val) { $obj = $asset->{$dkey}; if (!isset($obj["is_file"]) or $val == "") { continue; } $file_arr[$key] = ""; $file_arr = explode("|", trim($val, "|")); foreach ($file_arr as $key => $value) { foreach ($file_list as $file) { if (basename($file) != basename($value)) { continue; } $value = $base_dir . $file; break; } $file_arr[$key] = $value; } $data[$dkey] = "|" . implode("|", $file_arr) . "|"; } $id = $data["id"]; $existing = db_select_first($table, array("id", "lastmodified"), "id=@id@", "", array("id" => $id)); $folder = $data["folder"]; if (isset($restore_maps[$folder])) { $data["folder"] = $restore_maps[$folder]; } if (empty($existing["id"]) or self::$_restore_here) { if (self::$_restore_missing) { $data["id"] = $id; } else { $data["id"] = sql_genID($table) * 100; } self::_out("{t}Insert{/t}: " . $table . ": " . $data["id"]); $error = db_insert($table, $data); if ($error) { self::_out($error); } $update_folders[$data["folder"]] = $table; $update_ids[$data["folder"]][] = $data["id"]; } else { if (!self::$_restore_missing) { if (!self::$_restore_onlynewer or $data["lastmodified"] > $existing["lastmodified"]) { self::_out("{t}Update{/t}: " . $table . " " . $id); $error = db_update($table, $data, array("id=@id@"), array("id" => $id)); if ($error) { self::_out($error); } $update_folders[$data["folder"]] = $table; $update_ids[$data["folder"]][] = $id; } } } } } if (count($update_folders) > 0) { foreach ($update_folders as $folder => $table) { if (strpos($table, "nodb_")) { continue; } db_update_treesize($table, $folder); $ftype = str_replace("simple_", "", $table); $schema = db_get_schema(sys_find_module($ftype)); if (empty($schema["views"]["display"])) { continue; } if (!empty($schema["att"]["SQL_HANDLER"]) or !empty($schema["att"]["NO_SEARCH_INDEX"])) { continue; } self::_out("... "); $fields = $schema["fields"]; if (folder_in_trash($folder)) { continue; } foreach ($update_ids[$folder] as $id) { self::_out("{t}Rebuild search index{/t}: " . $table . " [" . $id . "]"); db_search_update($table, $id, $fields); } } } self::_out(""); $message = "{t}Restore complete{/t}: " . str_replace(array("__", "---", "--"), array("/", "] [", " ["), substr(modify::basename($filename), 0, -4)) . "]"; sys_log_message_log("info", $message); self::_out($message); return ""; }
private static function _import_delete($folder, $id, $tname, $module) { $where = array("folder=@folder@"); if ($id[0] == "_") { $where[] = "id=@id@"; } else { $where[] = "syncid=@id@"; } $row_id = db_select_value($tname, "id", $where, array("id" => trim($id, "_"), "folder" => $folder)); if (!empty($row_id)) { $trash = db_select_value("simple_sys_tree", "id", "anchor=@anchor@", array("anchor" => "trash")); if (empty($trash)) { sys_warning("{t}Error{/t}: {t}Trash folder not found.{/t}"); return; } $id = folders::create(sys_date("{t}m/d/Y{/t}"), "blank", "", $trash, true); $id2 = folders::create($module, str_replace("simple_", "", $tname), "", $id, true); $data = array("folder" => $id2, "history" => sprintf("{t}Item deleted by %s at %s{/t}\n", $_SESSION["username"], sys_date("{t}m/d/y g:i:s a{/t}"))); db_update($tname, $data, array("id=@id@"), array("id" => $row_id)); db_update_treesize($tname, $folder); db_search_delete($tname, $row_id, $folder); sys_log_stat("deleted_records", 1); } }
function install() { setup::out(' <html> <head> <title>Simple Groupware & CMS</title> <style> body { width:526px; margin:10px auto; } body, a { color: #666666; font-size: 13px; font-family: Arial, Helvetica, Verdana, sans-serif; } a { color: #0000FF; } </style> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <body> <div style="border-bottom: 1px solid #666666; letter-spacing: 2px; font-size: 18px; font-weight: bold;">Simple Groupware ' . CORE_VERSION_STRING . '</div> '); $_SESSION["groups"] = array(); $_SESSION["username"] = "******"; $_SESSION["password"] = ""; $_SESSION["permission_sql"] = "1=1"; $_SESSION["permission_sql_read"] = "1=1"; $_SESSION["permission_sql_write"] = "1=1"; define("SETUP_DB_TYPE", $_REQUEST["db_type"]); $update = sgsml_parser::table_column_exists("simple_sys_tree", "id"); setup::out('<img src="http://www.simple-groupware.de/cms/logo.php/' . CORE_VERSION . '/' . SETUP_DB_TYPE . '/' . PHP_VERSION . '/' . (int) $update . '" style="width:1px; height:1px;">', false); setup::out(t("{t}Processing %s ...{/t}", "schema updates")); setup_update::change_database_pre(); if (SETUP_DB_TYPE == "sqlite") { sql_query("begin"); admin::rebuild_schema(false); sql_query("commit"); } else { admin::rebuild_schema(false); } setup_update::change_database_post(); setup::out(t("{t}Processing %s ...{/t}", "sessions")); db_delete("simple_sys_session", array(), array()); setup::out(t("{t}Processing %s ...{/t}", "default groups")); $groups = array("admin_calendar", "admin_news", "admin_projects", "admin_bookmarks", "admin_contacts", "admin_inventory", "admin_helpdesk", "admin_organisation", "admin_files", "admin_payroll", "admin_surveys", "admin_hr", "admin_intranet", "users_self_registration"); foreach ($groups as $group) { trigger::creategroup($group); } setup_update::database_triggers(); setup::out(t("{t}Processing %s ...{/t}", "folder structure")); $count = db_select_value("simple_sys_tree", "id", array()); if (empty($count)) { $folders = "modules/core/folders.xml"; if (!empty($_REQUEST["folders"]) and file_exists(sys_custom($_REQUEST["folders"]))) { $folders = $_REQUEST["folders"]; } if (SETUP_DB_TYPE == "sqlite") { sql_query("begin"); folders::create_default_folders($folders, 0, true); sql_query("commit"); } else { folders::create_default_folders($folders, 0, true); } } setup_update::database_folders(); setup::out(t("{t}Processing %s ...{/t}", "css")); admin::build_css(); setup::out(t("{t}Processing %s ...{/t}", "js")); admin::build_js(); setup::out(t("{t}Processing %s ...{/t}", "icons")); admin::build_icons(); setup::out(t("{t}Processing %s ...{/t}", "config.php")); $vars = array("SETUP_DB_TYPE" => "'" . $_REQUEST["db_type"] . "'", "SETUP_DB_HOST" => "'" . $_REQUEST["db_host"] . "'", "SETUP_DB_NAME" => "'" . $_REQUEST["db_name"] . "'", "SETUP_DB_USER" => "'" . $_REQUEST["db_user"] . "'", "SETUP_DB_PW" => "'" . sys_encrypt($_REQUEST["db_pw"], sha1($_REQUEST["admin_user"])) . "'", "SETUP_ADMIN_USER" => "'" . $_REQUEST["admin_user"] . "'", "SETUP_ADMIN_PW" => "'" . (isset($_REQUEST["auto_update"]) ? $_REQUEST["admin_pw"] : sha1($_REQUEST["admin_pw"])) . "'"); setup::save_config($vars); setup::install_footer(); db_optimize_tables(); }
static function build_notification($module, $fields, $data_full, $data, $id, $data_row = array()) { if (!is_numeric($data_full["folder"])) { $folder_title = basename($data_full["folder"]); } else { $folder_title = db_select_value("simple_sys_tree", "ftitle", array("id=@id@"), array("id" => $data_full["folder"])); } if (!empty($data_full["folder"])) { $details = "http" . (sys_https() ? "s" : "") . "://" . $_SERVER['HTTP_HOST'] . dirname($_SERVER["SCRIPT_NAME"]); $details .= "/index.php?view=details&folder=" . $data_full["folder"] . "&item%5B%5D=" . $id; } else { $details = ""; } $message = substr($data["history"], 0, strpos($data["history"], "\n")) . "\n\n"; if (!empty($data_full["notification_summary"])) { $message .= "{t}Summary{/t}: " . trim($data_full["notification_summary"]) . "\n\n"; } $title = ""; foreach ($data_full as $key => $value) { if (!isset($data[$key]) and !isset($fields[$key]["REQUIRED"])) { continue; } if (!isset($fields[$key]["DISPLAYNAME"]) or !empty($fields[$key]["NO_SEARCH_INDEX"])) { continue; } if (is_array($value)) { $value = implode("|", $value); } if ($key != "notification_summary" and strlen($value) > 0) { if (!isset($data_row[$key])) { $data_row[$key] = ""; } $value = trim(self::build_history($fields[$key]["SIMPLE_TYPE"], $value, $data_row[$key])); if ($value != "") { $message .= $fields[$key]["DISPLAYNAME"] . ": " . $value . "\n"; if ($title == "") { $title = $fields[$key]["DISPLAYNAME"] . ": " . $value; } } } } if ($details) { $message .= "\n{t}Details{/t}:\n" . $details; } $attachment = ""; if ($module == "simple_calendar" and !empty($GLOBALS["t"])) { $attachment = implode("", sys_build_filename("invite.ics")); $ical_data = array(); foreach ($data_full as $key => $val) { $ical_data[$key] = array("data" => (array) $val, "filter" => (array) $val); } $ical_data["_id"] = $id; file_put_contents($attachment, export::icalendar_data($ical_data), LOCK_EX); } $smtp_data = array("efrom" => "", "eto" => $data_full["notification"], "subject" => SMTP_NOTIFICATION . " - " . $folder_title . " - " . $title, "message" => $message, "attachment" => $attachment, "folder" => $data_full["folder"]); return $smtp_data; }
function sys_credentials($mfolder, $mountpoint = "") { static $creds = array(); if ($mountpoint != "") { $mountpoint = sys_parse_folder($mountpoint); if (empty($mountpoint["mfolder"])) { return array(); } if ($mfolder == "") { $mfolder = $mountpoint["mfolder"]; } $creds[$mfolder] = array("server" => $mountpoint["mfolder"], "username" => $mountpoint["user"], "password" => $mountpoint["pass"], "port" => $mountpoint["port"], "ssl" => $mountpoint["ssl"], "options" => $mountpoint["options"]); return $mountpoint; } if (!isset($creds[$mfolder]) and isset($_SESSION["permission_sql_read"]) and $mountpoint == "" and $mfolder != "") { $mp = db_select_value("simple_sys_tree", "fmountpoint", array("id=@id@", $_SESSION["permission_sql_read"]), array("id" => $mfolder)); if (!empty($mp)) { sys_credentials($mfolder, $mp); } } if (!isset($creds[$mfolder])) { $creds[$mfolder] = array("server" => "", "username" => "", "password" => "", "port" => "", "ssl" => "", "options" => ""); } return $creds[$mfolder]; }
static function create_user($username, $data = array()) { $data["username"] = $username; $data["createdby"] = "auth_" . SETUP_AUTH; if (empty($data["password"])) { $data["password"] = "******"; } if (empty($data["email"])) { $data["email"] = $username; } if (!strpos($data["email"], "@")) { $data["email"] .= "@invalid.local"; } if (empty($_SESSION["username"])) { $_SESSION["username"] = "******"; $_SESSION["permission_sql"] = "1=1"; $_SESSION["permission_sql_read"] = "1=1"; $_SESSION["groups"] = array(); } $row_id = db_select_value("simple_sys_users", "id", "username=@username@", array("username" => $username)); if (!empty($row_id)) { return; } $row = db_select_first("simple_sys_tree", "id", "ftype=@ftype@", "lft asc", array("ftype" => "sys_users")); if (empty($row["id"])) { return; } $sgsml = new sgsml($row["id"], "new"); $result = $sgsml->insert($data); if (is_numeric($result)) { trigger::addgroupmember(0, array("username" => $username), array("users_self_registration")); sys_notification("{t}Item successfully created.{/t} (" . $result . ")"); } else { if (is_array($result) and count($result) > 0) { $message = array(); foreach ($result as $errors) { foreach ($errors as $error) { $message[] = $error[0] . ": " . $error[1]; } } sys_log_message_alert("login", implode("\n", $message)); } } }
static function folder_add_offline($folder, $view, $folder_name) { $offline_folder = db_select_value("simple_sys_tree", "id", "anchor=@anchor@", array("anchor" => "offline_" . $_SESSION["username"])); if (empty($offline_folder)) { exit(sprintf("{t}Item not found.{/t} (%s)", "{t}Offline folders{/t}")); } // TODO2 parameters for calendar, only future events ? $url = "index.php?folder=" . rawurlencode($folder) . "&view=" . $view . "&iframe=1&markdate=all&session_remove_request"; $duplicate = db_select_value("simple_offline", "id", array("folder=@folder@", "url=@url@"), array("url" => $url, "folder" => $offline_folder)); if (!empty($duplicate)) { return; } $id = sql_genID("simple_offline") * 100; $data = array("id" => $id, "url" => $url, "folder" => $offline_folder, "bookmarkname" => $folder_name); $error_sql = db_insert("simple_offline", $data); if ($error_sql == "") { db_update_treesize("simple_offline", $offline_folder); db_search_update("simple_offline", $id, array(), array("url" => "text", "bookmarkname" => "text")); sys_log_stat("new_records", 1); } }
public static function move($source, $folder) { if (empty($source) or empty($folder)) { return false; } if (!is_numeric($folder) and $pos = strpos($folder, ":")) { $handler = "lib_" . substr($folder, 0, $pos); if (method_exists($handler, "move_folder")) { return call_user_func(array($handler, "move_folder"), $folder); } return false; } $source = db_select_first("simple_sys_tree", array("id", "lft", "rgt", "flevel", "ftitle", "parent"), "id=@id@", "", array("id" => $source)); if (empty($source["parent"]) or $source["parent"] == $folder) { return false; } db_lock_tree(true); $target = db_select_first("simple_sys_tree", array("id", "lft", "rgt", "flevel"), "id=@id@", "", array("id" => $folder)); $success = false; $duplicate = "1"; $new_title = $source["ftitle"]; if (!empty($source["lft"]) and !empty($target["lft"]) and !($source["lft"] <= $target["lft"] and $source["rgt"] >= $target["rgt"])) { $step = 1; while ($step < 100) { $step++; $duplicate = db_select_value("simple_sys_tree", "id", array("parent=@parent@", "ftitle=@ftitle@"), array("ftitle" => $new_title, "parent" => $target["id"])); if (empty($duplicate)) { break; } $new_title = $source["ftitle"] . "_" . $step; } } if (empty($duplicate)) { $ids = db_select("simple_sys_tree", "id", "lft between @left@ and @right@", "", "", array("left" => $source["lft"], "right" => $source["rgt"])); if (is_array($ids) and count($ids) > 0) { foreach ($ids as $cid) { unset($_SESSION["folder_states"][$cid["id"]]); } } $last_child = db_select_first("simple_sys_tree", array("id", "rgt"), "parent=@parent@", "lft desc", array("parent" => $target["id"])); if (isset($last_child["id"])) { $left = $last_child["rgt"]; } else { $left = $target["lft"]; } $right = $target["rgt"]; if ($source["rgt"] - $source["lft"] + 1 >= $right - $left) { $diff = ($source["rgt"] - $source["lft"]) * 2; db_update("simple_sys_tree", array("rgt" => "rgt+" . $diff), array("rgt>=@right@"), array("right" => $right), array("quote" => false, "no_defaults" => true)); db_update("simple_sys_tree", array("lft" => "lft+" . $diff), array("lft>=@right@"), array("right" => $right), array("quote" => false, "no_defaults" => true)); $right += $diff; $source = db_select_first("simple_sys_tree", array("id", "lft", "rgt", "flevel", "parent"), "id=@id@", "", array("id" => $source["id"])); } $diff = floor(($right - $left - $source["rgt"] + $source["lft"]) / 2) + $left - $source["lft"]; $level_diff = $target["flevel"] - $source["flevel"] + 1; if ($diff < 0) { $diff = "-" . abs($diff); } else { $diff = "+" . $diff; } if ($level_diff < 0) { $level_diff = "-" . abs($level_diff); } else { $level_diff = "+" . $level_diff; } db_update("simple_sys_tree", array("parent" => $target["id"], "ftitle" => $new_title), array("id=@id@"), array("id" => $source["id"])); db_update("simple_sys_tree", array("lft" => "lft" . $diff, "rgt" => "rgt" . $diff, "flevel" => "flevel" . $level_diff), array("lft between @left@ and @right@"), array("left" => $source["lft"], "right" => $source["rgt"]), array("quote" => false)); db_update_subfolder_count($source["parent"]); db_update_subfolder_count($target["id"]); $success = true; } db_lock_tree(false); return $success; }
$tpl = new template(); $tpl->console = $_REQUEST["console"]; $code = ""; $tlimit = 0; $mlimit = 0; if (!empty($_REQUEST["code"])) { if (!sys_validate_token()) { sys_die(t("{t}Invalid security token{/t}")); } $code = $_REQUEST["code"]; } if (!empty($_REQUEST["name"])) { if (!sys_validate_token()) { sys_die(t("{t}Invalid security token{/t}")); } $code = db_select_value("simple_sys_console", "command", "name=@name@", array("name" => $_REQUEST["name"])); } if (!empty($_REQUEST["tlimit"])) { $tlimit = (int) $_REQUEST["tlimit"]; } if (!empty($_REQUEST["mlimit"])) { $mlimit = (int) $_REQUEST["mlimit"]; } $tpl->code = $code; $tpl->tlimit = $tlimit ? $tlimit : ""; $tpl->mlimit = $mlimit ? $mlimit : ""; if ($tlimit > 0) { set_time_limit($tlimit); } if ($mlimit > 0) { ini_set("memory_limit", $mlimit . "M");
private static function _createlocation($name) { $row_id = db_select_value("simple_locations", "id", "locationname=@name@", array("name" => $name)); $folder = folder_from_path("^locations"); if (empty($row_id) and !empty($folder)) { $id = sql_genID("simple_locations") * 100; $data = array("id" => $id, "locationname" => $name, "folder" => $folder); $error_sql = db_insert("simple_locations", $data); if ($error_sql == "") { db_update_treesize("simple_locations", $folder); db_search_update("simple_locations", $id, array(), array("locationname" => "text")); sys_log_stat("new_records", 1); } else { return $error_sql; } } return ""; }
private function _save(array &$data, $id = -1) { $insert = ($id > 0 or !is_numeric($id)) ? false : true; if (count($data) == 0) { return array(); } if (!empty($this->att["DEFAULT_SQL"]) and $this->att["DEFAULT_SQL"] == "no_select") { return self::_error("{t}Module{/t}", "{t}Access denied.{/t}"); } if (!empty($data["folder"])) { // check permissions if (!db_get_right($data["folder"], "write", $this->view)) { return self::_error("{t}Folder{/t}", "{t}Access denied.{/t}", "folder"); } $this->folder = $data["folder"]; } else { $data["folder"] = $this->folder; } // fill data array list($rdata, $data_row, $error) = $this->_complete_data($data, $id); if ($error) { return $error; } // validate if ($result = $this->_validate($rdata, $id)) { return $result; } if ($insert) { $id = sql_genID($this->tname) * 100; $sql_data = array("id" => $id, "dsize" => 0, "history" => sprintf("{t}Item created by %s at %s{/t}\n", $_SESSION["username"], sys_date("{t}m/d/y g:i:s a{/t}"))); } else { $sql_data = array("dsize" => 0, "history" => sprintf("{t}Item edited (%s) by %s at %s{/t}\n", "@fields@", $_SESSION["username"], sys_date("{t}m/d/y g:i:s a{/t}"))); } // count sizes, move files to store, delete old files foreach ($this->current_fields as $field_name => $field) { if ($field["SIMPLE_TYPE"] == "id") { continue; } if ($field["SIMPLE_TYPE"] == "files" and !empty($rdata[$field_name])) { foreach ($rdata[$field_name] as $val) { if (file_exists($val)) { $sql_data["dsize"] += filesize($val); } } // TODO 2 store handler? if (!empty($data_row[$field_name])) { $data_old = explode("|", trim($data_row[$field_name], "|")); foreach ($data_old as $filekey => $file) { if (in_array($file, $rdata[$field_name])) { continue; } if (ARCHIVE_DELETED_FILES and file_exists($file)) { $i = 1; $m = ""; $trash_name = SIMPLE_STORE . "/trash/" . $this->folder . "_" . $id . "_"; $trash_file = modify::basename($file); while (file_exists($trash_name . $m . $trash_file)) { $m = $i++ . "_"; } rename($file, $trash_name . $m . $trash_file); touch($trash_name . $m . $trash_file); } else { @unlink($file); } } } foreach ($rdata[$field_name] as $filekey => $file) { if ($file == "") { unset($rdata[$field_name][$filekey]); $data[$field_name] = implode("|", $rdata[$field_name]); continue; } if (file_exists(SIMPLE_CACHE . "/upload/" . basename($file))) { $filebase = modify::basename(basename($file)); list($target, $filename) = sys_build_filename($filebase, $this->tname); dirs_checkdir($target); $target .= sys_get_pathnum($id) . "/"; dirs_checkdir($target); $target .= md5($id) . $filename; rename(SIMPLE_CACHE . "/upload/" . basename($file), $target); $rdata[$field_name][$filekey] = $target; $data[$field_name] = implode("|", $rdata[$field_name]); } } $basenames = array(); foreach (array_reverse($rdata[$field_name]) as $filekey => $file) { $basename = modify::basename($file); if (isset($basenames[$basename])) { $old_filekey = $basenames[$basename]; $basename = preg_replace("|_rev\\d+|", "", $basename); $base = $basename; $i = 1; while (isset($basenames[$basename])) { if ($pos = strrpos($base, ".")) { $basename = substr($base, 0, $pos) . "_rev" . $i++ . substr($base, $pos); } else { $basename = $base . "_rev" . $i++; } } $target = str_replace(modify::basename($file), $basename, $file); if (rename($file, $target)) { // swap $rdata[$field_name][$filekey] = $rdata[$field_name][$old_filekey]; $rdata[$field_name][$old_filekey] = $target; $data[$field_name] = implode("|", $rdata[$field_name]); } } $basenames[$basename] = $filekey; } } if (!empty($field["STORE"]) and is_array($field["STORE"])) { foreach ($field["STORE"] as $store) { list($class, $function, $params) = sys_find_callback("modify", $store["FUNCTION"]); $rdata[$field_name] = call_user_func(array($class, $function), $rdata[$field_name], $rdata, $params); } } if (!isset($sql_data[$field_name]) and !is_null($rdata[$field_name])) { $sql_data[$field_name] = $rdata[$field_name]; } } // transform foreach ($sql_data as $key => $value) { $sql_data[$key] = self::scalarize($value, $this->fields[$key]); } // reduce to new values $sys_fields = array("history" => "", "dsize" => "", "seen" => ""); foreach ($sql_data as $data_key => $data_value) { if (isset($sys_fields[$data_key])) { continue; } $addfield = true; $field = $this->fields[$data_key]; if (!isset($this->current_fields[$data_key])) { $addfield = false; } if (isset($field["NOTINALL"])) { $addfield = false; } if (isset($field["NOTIN"]) and in_array($this->view, $field["NOTIN"])) { $addfield = false; } if (isset($field["READONLYIN"]) and (in_array($this->view, $field["READONLYIN"]) or in_array("all", $field["READONLYIN"]))) { $addfield = false; } if (isset($field["ONLYIN"])) { if (in_array($this->view, $field["ONLYIN"])) { $addfield = true; } else { $addfield = false; } } if (!$addfield) { unset($sql_data[$data_key]); } } // build history $sql_data = $this->build_history($sql_data, $data_row); if (!array_diff(array_keys($sql_data), array("history", "seen"))) { $sql_data = array(); } // save in db if ($insert) { $error_sql = db_insert($this->tname, $sql_data, array("handler" => $this->handler)); if ($error_sql != "") { return self::_error("{t}SQL failed.{/t}", $error_sql); } if ($this->notification) { sys_notification("{t}Item successfully created.{/t} (" . $id . ")"); } } else { if (count($sql_data) == 0) { return $id; } $error_sql = db_update($this->tname, $sql_data, array("id=@id@"), array("id" => $id, "folder" => $this->folder), array("handler" => $this->handler)); if ($error_sql != "") { return self::_error("{t}SQL failed.{/t}", $error_sql); } if ($this->notification) { sys_notification("{t}Item successfully updated.{/t} (" . (is_numeric($id) ? $id : 1) . ")"); } } if (empty($this->handler)) { db_update("simple_sys_tree", array("history" => "[" . $id . "/details] " . $sql_data["history"]), array("id=@id@"), array("id" => $this->folder)); db_update_treesize($this->tname, $this->folder); if (!$insert and $this->folder != $data_row["folder"]) { db_update("simple_sys_tree", array("history" => "[" . $id . "/details] " . $sql_data["history"]), array("id=@id@"), array("id" => $data_row["folder"])); db_update_treesize($this->tname, $data_row["folder"]); db_search_delete($this->tname, $id, $data_row["folder"]); } if (empty($this->att["NO_SEARCH_INDEX"])) { db_search_update($this->tname, $id, $this->fields); } sys_log_stat($insert ? "new_records" : "changed_records", 1); } // call triggers $trigger = ""; if ($insert and !empty($this->att["TRIGGER_NEW"])) { $trigger = $this->att["TRIGGER_NEW"]; } if (!$insert and !empty($this->att["TRIGGER_EDIT"])) { $trigger = $this->att["TRIGGER_EDIT"]; } if ($trigger and $result = asset_process_trigger($trigger, $id, $rdata, $this->tname)) { return self::_error("{t}Trigger failed{/t}", $result); } // send notification $tree_notification = db_select_value("simple_sys_tree", "notification", "id=@id@", array("id" => $this->folder)); if ($tree_notification != "") { $rdata["notification"] .= "," . $tree_notification; } if (!$insert and $this->folder != $data_row["folder"]) { $tree_notification = db_select_value("simple_sys_tree", "notification", "id=@id@", array("id" => $data_row["folder"])); if ($tree_notification != "") { $rdata["notification"] .= "," . $tree_notification; } } if (!empty($rdata["notification"])) { $rdata["notification"] = trim($rdata["notification"], ","); $smtp_data = asset::build_notification($this->att["NAME"], $this->current_fields, $rdata, $sql_data, $id, $data_row); if ($result = asset_process_trigger("sendmail", $id, $smtp_data)) { return self::_error("{t}Trigger failed{/t}", $result); } } // update stats if (!empty($this->handler)) { foreach ($sql_data as $data_key => $data_value) { $field = $this->fields[$data_key]; if ($field["SIMPLE_TYPE"] != "files") { continue; } foreach (explode("|", $data_value) as $file) { if (sys_strbegins($file, SIMPLE_CACHE . "/upload/")) { @unlink($file); } } } } return $id; }
function _upload_create_file($db_path, $target_lnk, $path, $filename) { list($id, $left, $unused) = _upload_process_folder_string($db_path . "/"); if ($left != 0 or $id == 0) { sys_error("path not found", "409 Conflict"); } $ftype = db_select_value("simple_sys_tree", "ftype", "id=@id@", array("id" => $id)); if (db_get_right($id, "write") and !empty($ftype) and $ftype == "files") { list($target, $a_filename) = sys_build_filename($filename, "simple_files"); dirs_checkdir($target); $target .= sys_get_pathnum($id) . "/"; dirs_checkdir($target); $target .= md5($id) . $a_filename; if ($fp = fopen("php://input", "r") and $ft = fopen($target, "wb")) { while (!feof($fp)) { fwrite($ft, fread($fp, 8192)); } fclose($fp); fclose($ft); $a_id = sql_genID("simple_files") * 100; $data = array("id" => $a_id, "folder" => $id, "dsize" => filesize($target), "filedata" => "|" . $target . "|", "filename" => $filename, "rread_users" => "|anonymous|", "rwrite_users" => "|anonymous|", "history" => t("{t}Item created by %s at %s{/t}", $_SESSION["username"], sys_date(t("{t}m/d/y g:i:s a{/t}"))) . "\n"); $error_sql = db_insert("simple_files", $data); if ($error_sql == "") { db_update_treesize("simple_files", $id); $fields = array("filename" => "text", "filedata" => "files", "folder" => "id", "id" => "id"); db_search_update("simple_files", $a_id, array(), $fields); sys_log_stat("new_records", 1); file_put_contents($target_lnk, $path . "/" . $a_id . "_0__" . $filename . "\n" . $target, LOCK_EX); _upload_success(); } } } sys_error("cant write new", "403 Forbidden"); }
static function dbvalue($value, $params, $vars) { $vars["value"] = $value; $result = db_select_value($params[0], $params[1], $params[2], $vars); if ($result == "") { return $value; } else { return $result; } }