static function init() { self::$selects["default_style"] = array("{t}Default theme{/t}", select::themes()); self::$selects["timezone"] = array("{t}Time zone{/t}, {t}current time{/t}: " . sys_date("{t}g:i a{/t}"), select::timezones(true)); self::$selects["lang"] = array("{t}Default language{/t}", select::languages()); $modules = select::modules_all(); asort($modules); self::$multi_selects["disabled_modules"] = array("{t}Disabled modules{/t}", $modules); if (empty($_REQUEST["setup_auth_ldap_groups"])) { $_POST["setup_auth_ldap_groups"] = 0; $_REQUEST["setup_auth_ldap_groups"] = 0; } }
static function build_history($type, $value, $data_old) { if ($value == "0" and in_array($type, array("folder", "date", "datetime", "time"))) { return ""; } switch ($type) { case "folder": $value = modify::getpathfull($value, false, "/") . " ([/" . $value . "])"; break; case "password": $value = ""; break; case "date": $value = sys_date("{t}m/d/Y{/t}", $value); break; case "datetime": $value = sys_date("{t}m/d/Y g:i a{/t}", $value); break; case "time": $value = sys_date("{t}g:i a{/t}", $value); break; case "dateselect": $data = array(); foreach (explode("|", trim($value, "|")) as $date) { $data[] = sys_date("{t}m/d/Y{/t}", $date); } $value = implode(", ", $data); break; case "files": $new = explode("|", trim($value, "|")); $old = explode("|", trim($data_old, "|")); $value = array(""); foreach ($new as $file) { if ($file != "" and !in_array($file, $old)) { $value[] = "+ " . modify::basename($file); } } foreach ($old as $file) { if ($file != "" and !in_array($file, $new)) { $value[] = "- " . modify::basename($file); } } $value = rtrim(implode("\n ", $value)); break; case "select": $value = str_replace("|", ", ", trim($value, "|")); break; case "checkbox": $value = $value ? "{t}yes{/t}" : "{t}no{/t}"; break; case "textarea": $value = self::build_diff($data_old, $value); break; default: if (is_call_type($type)) { $value = call_type($type, "build_history", $data_old, $value); } break; } return $value; }
static function build_datebox($today, $mark, $weekstart) { $today_arr = sys_getdate($today); $current_month = $today_arr["mon"]; $weekdays = array("{t}Su{/t}", "{t}Mo{/t}", "{t}Tu{/t}", "{t}We{/t}", "{t}Th{/t}", "{t}Fr{/t}", "{t}Sa{/t}"); $months = array("", "{t}January{/t}", "{t}February{/t}", "{t}March{/t}", "{t}April{/t}", "{t}May{/t}", "{t}June{/t}", "{t}July{/t}", "{t}August{/t}", "{t}September{/t}", "{t}October{/t}", "{t}November{/t}", "{t}December{/t}"); if ($mark == "year") { $dates_months = range($today_arr["mon"], $today_arr["mon"] + 11); } else { $dates_months = array($today_arr["mon"]); } $dow = array(); for ($i = 0; $i < 7; $i++) { $index = ($i + $weekstart) % 7; $dow[] = array("date_d" => $weekdays[$index], "date_w" => $index); } $dates = array(); $fstinmonths = array(); foreach ($dates_months as $mon) { $year = $today_arr["year"]; if ($mon > 12) { $mon -= 12; $year++; } $start_day = mktime(0, 0, 0, $mon, 1, $year); $last_day = mktime(0, 0, 0, $mon + 1, 1, $year); $fstinmonths[$mon] = $start_day; $num = sys_date("w", $start_day); if ($num != $weekstart) { $start_day = strtotime("-" . (7 + $num - $weekstart) % 7 . " days", $start_day); } $num = sys_date("w", $last_day); if ((int) $num != (int) $weekstart) { $last_day = strtotime("+" . (7 + $weekstart - $num) % 7 . " days", $last_day); } $date_n = 12; if ($mon != 1) { $date_n = $mon - 1; } $start_week = sys_date("W", $start_day + 86400); for ($i = 0; $i < 42; $i++) { $date_j = sys_date("j", $start_day); if ($date_j == 1) { $date_n++; } if ($date_n == 13) { $date_n = 1; } $week_key = floor($i / 7) + $start_week; if ($week_key > 52) { $week_key = $week_key % 52; } $dates[$mon][$week_key][] = array("timestamp" => $start_day, "j" => $date_j, "n" => $date_n); $start_day = strtotime("+1 day", $start_day); if ($start_day == $last_day) { break; } } } $next_date = strtotime("+1 month", $today); $prev_date = strtotime("-1 month", $today); if ($mark == "year") { $next_date_year = strtotime("+1 year", $today); $prev_date_year = strtotime("-1 year", $today); } else { $next_date_year = $next_date; $prev_date_year = $prev_date; } if ($mark == "month" or $mark == "year" or $mark == "gantt") { $start_day = mktime(0, 0, 0, $today_arr["mon"], 1, $today_arr["year"]); if ($mark == "month" or $mark == "gantt") { $last_day = strtotime("+1 month", $start_day); } else { $last_day = mktime(0, 0, 0, $today_arr["mon"], 1, $today_arr["year"] + 1); } $num = sys_date("w", $last_day); if ((int) $num != (int) $weekstart) { $last_day = strtotime("+" . (7 + $weekstart - $num) % 7 . " days", $last_day); } $num = sys_date("w", $start_day); if ($num != $weekstart) { $start_day = strtotime("-" . (7 + $num - $weekstart) % 7 . " days", $start_day); } $today = $start_day; $tomorrow = $last_day - 1; } else { if ($mark == "week") { $num = sys_date("w", $today); if ($num != $weekstart) { $today = strtotime("-" . (7 + $num - $weekstart) % 7 . " days", $today); } $tomorrow = strtotime("+1 week -1 second", $today); } else { if ($mark == "day") { $tomorrow = $today + 86399; } else { $today = 0; $tomorrow = 0; } } } sys::$smarty->assign("datebox", array("dow" => $dow, "dates" => $dates, "realtoday" => strtotime("00:00:00"), "today" => $today, "week" => sys_date("W", $today + 86400), "month" => $current_month, "year" => sys_date("Y", $fstinmonths[$current_month]), "months" => $months, "mark" => $mark, "next_date" => $next_date, "prev_date" => $prev_date, "next_date" => $next_date, "prev_date" => $prev_date, "next_date_year" => $next_date_year, "prev_date_year" => $prev_date_year, "fstinmonths" => $fstinmonths)); if ($mark != "all") { $today_arr = sys_getdate($today); $tomorrow_arr = sys_getdate($tomorrow); self::_build_datebox_sql($today, $today_arr, $tomorrow, $tomorrow_arr, $mark); } }
static function simple_contacts($id, $data) { if (empty($data["birthday"])) { return ""; } $delivery = strtotime("-2 days " . sys_date("Y-m-d", $data["birthday"])); $subject = sprintf("{t}Birthday{/t}: %s, %s - %s", $data["lastname"], $data["firstname"], SMTP_REMINDER); $message = self::_message($id, $data, array("lastname", "firstname", "company", "email", "birthday"), "contacts"); db_notification_add("simple_contacts|" . $id . "&birthday", $data["notification"], $subject, $message, $delivery, "+1 year"); return ""; }
" name="iframe_<?php echo q($key); ?> " style="width:100%; height:350px; border:0px; margin-top:5px; margin-bottom:9px;"></iframe> </td></tr></table> <?php } if (!$this->rows) { ?> {t}No entries found.{/t} ({t}Offline folders{/t})<br> <?php } ?> <br> <div id="online"> {t}Read this page offline:{/t}<br/> <ul> <li>Android: Context menu -> Save for offline reading</li> <li>Safari: Reading List -> Add page</li> <li>Firefox: Install the "Readability" or "Read it later" extension</li> </ul> </div> <span style="float:right;"><?php echo sys_date("{t}m/d/y g:i:s a{/t}"); ?> </span> <div style="white-space:nowrap; border-top: 1px solid black;"> <a href="http://www.simple-groupware.de" class="lnotice" target="_blank" onmouseover="set_html(this,'Powered by Simple Groupware, Copyright (C) 2002-2012 by Thomas Bley.');" onmouseout="set_html(this,'Powered by Simple Groupware.');">Powered by Simple Groupware.</a> </div> </body> </html>
function sys_log_stat($action, $weight) { if (empty($_SESSION["username"])) { return; } if ($weight == 0) { return; } db_insert("simple_sys_stats", array("id" => sql_genID("simple_sys_stats") * 100, "username" => $_SESSION["username"], "loghour" => sys_date("H"), "logday" => sys_date("d"), "logweek" => sys_date("W"), "logweekpart" => floor((sys_date("w") * 24 + sys_date("H") + 1) / 6), "action" => $action, "uri" => substr(_sys_request_uri(), 0, 250), "weight" => $weight)); }
function show_table($data, $full_texts = false, $vertical = true) { if (count($data) == 0) { return ""; } $limit = Max(round(220 / count($data[0])), 20); if ($vertical) { $limit = 150; } $content = "<table border='0' cellpadding='0' cellspacing='0'>"; if (!$vertical) { $content .= "<tr>"; foreach (array_keys($data[0]) as $value) { if ($full_texts and strlen($value) > $limit) { $value = substr($value, 0, $limit) . "..."; } $content .= "<td nowrap><b>" . q($value) . "</b></td>"; } $content .= "</tr>"; } foreach ($data as $dataset) { if ($vertical) { foreach ($dataset as $key => $value) { if ($value == "") { continue; } $content .= "<tr onmouseover='this.style.backgroundColor=\"#EFEFEF\";' onmouseout='this.style.backgroundColor=\"\";'>"; $content .= "<td style='width:25%;' valign='top'><b>" . q($key) . "</b></td>"; $hint = $value; if (is_numeric($value) and strlen($value) == 10) { $value .= " / " . sys_date("Y-m-d H:i:s a", $value); } if (!$full_texts and strlen($value) > $limit) { $value = substr($value, 0, $limit) . "..."; } $content .= "<td title='" . q($hint) . "'>" . nl2br(q($value)) . "</td></tr>"; } $content .= "<tr><td colspan='2'><hr></td></tr>"; } else { $content .= "<tr onmouseover='this.style.backgroundColor=\"#EFEFEF\";' onmouseout='this.style.backgroundColor=\"\";'>"; foreach ($dataset as $key => $value) { if ($vertical) { if ($full_texts and strlen($key) > $limit) { $key = substr($key, 0, $limit) . "..."; } $content .= "<td nowrap><b>" . q($key) . "</b></td>"; } $hint = $value; if (is_numeric($value) and strlen($value) == 10) { $hint = sys_date("Y-m-d H:i:s a", $value); } if (!$full_texts and strlen($value) > $limit) { $value = substr($value, 0, $limit) . "..."; } $content .= "<td nowrap title='" . q($hint) . "'>" . q($value) . "</td>"; } $content .= "</tr>"; } } return $content . "</table>"; }
static function select($folder, $fields, $where, $order, $limit, $vars, $mfolder) { $tname = "simple_sys_stats"; $today = $_SESSION[$tname]["_" . $folder]["today"]; $today_arr = sys_getdate($today); $weekdays = array("{t}Su{/t}", "{t}Mo{/t}", "{t}Tu{/t}", "{t}We{/t}", "{t}Th{/t}", "{t}Fr{/t}", "{t}Sa{/t}"); $weekstart = $_SESSION[$tname]["_" . $folder]["weekstart"]; $t_today = date::$today; $t_then = date::$then; $s_today = $t_today; $s_then = $t_then; if ($_SESSION[$tname]["_" . $folder]["markdate"] == "day") { $dstrings = array(sys_date("Y_M_d", $today), 24, "loghour"); $labels = range(1, 24); } else { if ($_SESSION[$tname]["_" . $folder]["markdate"] == "week") { $dstrings = array(sys_date("Y_W_", $today) . $_SESSION[$tname]["_" . $folder]["weekstart"], 28, "logweekpart"); $labels = array($weekdays[$weekstart], "", "", "", $weekdays[($weekstart + 1) % 7], "", "", "", $weekdays[($weekstart + 2) % 7], "", "", "", $weekdays[($weekstart + 3) % 7], "", "", "", $weekdays[($weekstart + 4) % 7], "", "", "", $weekdays[($weekstart + 5) % 7], "", "", "", $weekdays[($weekstart + 6) % 7], "", "", ""); } else { if ($_SESSION[$tname]["_" . $folder]["markdate"] == "month") { $s_today = mktime(0, 0, 0, $today_arr["mon"], 1, $today_arr["year"]); $s_then = strtotime("+1 month -1 day", $s_today); $dstrings = array(sys_date("Y_M", $today), 31, "logday"); $labels = range(1, 31); } else { $s_today = mktime(0, 0, 0, 1, 1, $today_arr["year"]); $s_then = mktime(0, 0, 0, 12, 31, $today_arr["year"]); $dstrings = array(sys_date("Y", $today), 52, "logweek"); $labels = range(1, 52); } } } if ($t_today != "" and $t_today != $s_today) { foreach ($where as $key => $val) { if (strpos($val, (string) $t_today)) { $where[$key] = str_replace(array($t_today, $t_then), array($s_today, $s_then), $val); } } } $rows = array(); if (in_array("id in (@item@)", $where)) { unset($where[array_search("id in (@item@)", $where)]); } $rows2 = db_select("simple_sys_stats", array("action", $dstrings[2] . " as id", "sum(weight) as weight"), $where, "", "", $vars, array("groupby" => "action, " . $dstrings[2])); $data_all = array("logins" => array(), "pages" => array(), "downloads" => array()); if (is_array($rows2) and count($rows2) > 0) { foreach ($rows2 as $row) { if (!isset($data_all[$row["action"]]) or count($data_all[$row["action"]]) == 0) { $data_all[$row["action"]] = array_fill(0, $dstrings[1], ""); } $data_all[$row["action"]][$row["id"] - 1] = $row["weight"]; } } if (count($data_all) > 0) { foreach ($data_all as $stat => $data) { if (count($data) == 0) { continue; } $id = md5($_SESSION["style"] . $stat . $dstrings[0]); $stat = str_replace("_", " ", ucfirst($stat)); $filename = "preview.php?type=bar&stat=" . $stat . "&style=" . $_SESSION["style"] . "&width=550&height=175&data=" . implode(",", array_slice($data, 0, $dstrings[1])) . "&labels=" . implode(",", array_slice($labels, 0, $dstrings[1])); $row = array(); foreach ($fields as $field) { switch ($field) { case "id": $row[$field] = $id; break; case "created": $row[$field] = 0; break; case "lastmodified": $row[$field] = 0; break; case "lastmodifiedby": $row[$field] = ""; break; case "image": $row[$field] = "<img src='" . $filename . "'/>"; break; case "title": $row[$field] = $stat; break; case "searchcontent": $row[$field] = $stat; break; } } if (sys_select_where($row, $where, $vars)) { $rows[] = $row; } } $rows = sys_select($rows, $order, $limit, $fields); } return $rows; }
static function calcappointment($id, $data, $unused, $table) { if ($data["begin"] > $data["ending"]) { $tmp = $data["begin"]; $data["begin"] = $data["ending"]; $data["ending"] = $tmp; } if (isset($data["allday"]) and $data["allday"] == "1") { $begin_arr = sys_getdate($data["begin"]); $data["begin"] = mktime(0, 0, 0, $begin_arr["mon"], $begin_arr["mday"], $begin_arr["year"]); $end_arr = sys_getdate($data["ending"]); $data["ending"] = mktime(23, 59, 0, $end_arr["mon"], $end_arr["mday"], $end_arr["year"]); } $repeatbegin = 0; $repeatend = 0; if (!empty($data["recurrence"])) { switch ($data["recurrence"]) { case "weeks": $repeatbegin = sys_date("w", $data["begin"]); $repeatend = sys_date("w", $data["ending"]); break; case "months": $repeatbegin = sys_date("j", $data["begin"]); $repeatend = sys_date("j", $data["ending"]); break; case "years": $repeatbegin = sys_date("z", $data["begin"]); $repeatend = sys_date("z", $data["ending"]); if ($repeatbegin > 58) { $repeatbegin--; } // leap year if ($repeatend > 58) { $repeatend++; } break; } } $datas = array("begin" => $data["begin"], "ending" => $data["ending"], "duration" => $data["ending"] - $data["begin"], "repeatbegin" => $repeatbegin, "repeatend" => $repeatend); $begin = strtotime("00:00:00", $data["begin"]); $days = min(ceil(($data["ending"] - $begin) / 86400), 31); $occurs = array(); $occurs_weeks = array(); self::_get_occurrence($begin, $days, $occurs, $occurs_weeks); $diff = $data["begin"] - $begin; $max_recurrence = strtotime("+3 years", NOW); $recurs = array(); if (!empty($data["recurrence"])) { $recurs[] = $begin + $diff; $excludes = explode("|", $data["repeatexcludes"]); $counter = 0; while ($data["repeatcount"] != 1 and $counter < 150 and $begin < $max_recurrence) { $begin = strtotime("+" . (int) $data["repeatinterval"] . " " . $data["recurrence"], $begin); if ($data["repeatuntil"] != 0 and $begin > $data["repeatuntil"]) { break; } if (in_array($begin, $excludes)) { continue; } self::_get_occurrence($begin, $days, $occurs, $occurs_weeks); $recurs[] = $begin + $diff; if ($data["repeatcount"] != 0) { $data["repeatcount"]--; } $counter++; } } if (!empty($occurs)) { $datas["until"] = strtotime(preg_replace("!(\\d{2})(\\d{2})(\\d{2})!", "\\1-\\2-\\3", $occurs[count($occurs) - 1])); } else { $datas["until"] = $data["ending"]; } $datas["occurs"] = self::_scalarize($occurs); $datas["occurs_weeks"] = self::_scalarize(array_unique($occurs_weeks)); $datas["recurs"] = self::_scalarize($recurs); if ($id != "") { db_update($table, $datas, array("id=@id@"), array("id" => $id)); self::notify($id, array_merge($data, $datas), array(), $table); } else { return $datas; } return ""; }
private static function _move($ccp, $folder, $sgsml) { if (empty($sgsml->att["DISABLE_TRIGGER_CCP"]) and (!empty($sgsml->att["TRIGGER_NEW"]) or !empty($sgsml->att["TRIGGER_DELETE"]))) { $ccp["data_fields"] = array("*"); } else { if (in_array("notification", $ccp["data_fields"])) { $ccp["data_fields"] = array("id", "folder", "notification"); foreach ($sgsml->fields as $key => $field) { if (isset($field["REQUIRED"]) and !in_array($key, $ccp["data_fields"])) { $ccp["data_fields"][] = $key; } } } else { $ccp["data_fields"] = array("id", "folder"); } } $vars = array("handler" => $ccp["handler"], "sqlvarsnoquote" => $ccp["vars_noquote"], "custom_name" => $ccp["custom_name"], "default_sql" => $ccp["default_sql"]); $rows = db_select($ccp["tname"], $ccp["data_fields"], $ccp["where"], "", "", array("item" => $ccp["items"], "folder" => $ccp["folder"], "folders" => $ccp["folders"]), $vars); if (is_array($rows) and count($rows) < count($ccp["items"])) { exit("{t}Item(s) not found or access denied.{/t}"); } $default_values = folder_get_default_values($folder); $messages = array(); foreach ($rows as $row) { $folder_source = $row["folder"]; if (empty($folder_source) or $folder_source == $folder or !db_get_right($folder_source, "write")) { continue; } $sgsml->vars["id"] = array($row["id"]); $sgsml->vars["folders"] = array($folder_source); if (!empty($sgsml->att["DISABLE_TRIGGER_CCP"])) { unset($sgsml->att["TRIGGER_EDIT"]); } $result = 0; if (!is_numeric($folder)) { $sgsml->vars["id"] = $row["id"]; $sgsml->vars["folder_source"] = $folder_source; $sql_data = array_merge($default_values, array("folder" => $folder)); $sql_data["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}")); $sql_data = $sgsml->build_history($sql_data, $row); $error_sql = db_update($sgsml->tname, $sql_data, array("id=@id@"), $sgsml->vars, array("handler" => $sgsml->handler)); if ($error_sql != "") { $messages[] = "{t}SQL failed.{/t} " . $error_sql; } if (!empty($sgsml->att["TRIGGER_EDIT"]) and empty($sgsml->att["DISABLE_TRIGGER_CCP"])) { $return = asset_process_trigger($sgsml->att["TRIGGER_EDIT"], $row["id"], $row, $sgsml->tname); if ($return != "") { $messages[] = "{t}Trigger failed{/t}: " . $return; } } if (!empty($row["notification"])) { $row["folder"] = $folder; $smtp_data = asset::build_notification($sgsml->tname, $sgsml->fields, $row, $sql_data, $row["id"]); $return = asset_process_trigger("sendmail", $row["id"], $smtp_data); if ($return != "") { $messages[] = "{t}Trigger failed{/t}: " . $return; } } } else { $sql_data = array_merge($default_values, array("folder" => $folder)); $result = $sgsml->update($sql_data, $row["id"]); } if (!is_numeric($result)) { if (is_array($result) and count($result) > 0) { $message = "{t}Error pasting asset{/t}:"; foreach ($result as $field => $errors) { foreach ($errors as $error) { $message .= "\n" . $error[0] . ": " . $error[1]; } } } else { $message = $result; } $messages[] = $message; } else { sys_log_stat("moved_records", 1); } } return $messages; }
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 replymessage($value, $args, $data) { if ($value != "") { $value = trim(str_replace("\n", "\n> ", "\n" . wordwrap($value))); if (!empty($data["efrom"]["data"][0]) and !empty($data["created"])) { $value = self::dateformat($data["created"], array("", "{t}m/d/Y{/t}")) . ", " . $data["efrom"]["data"][0] . ":\n" . $value; } $value = "\n\n\n" . $value; } if (isset($_REQUEST["return_receipt"])) { $value = sprintf("{t}Your message was read on %s.{/t}", sys_date("r")) . $value; } return $value; }
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); } }
static function delete($folder) { $row = db_select_first("simple_sys_tree", array("id", "rgt", "lft", "ftitle", "parent"), "id=@id@", "", array("id" => $folder)); $rows = array(); if (!empty($row["id"])) { $rows = db_select("simple_sys_tree", array("id", "ftype"), "lft between @left@ and @right@", "lft asc", "", array("left" => $row["lft"], "right" => $row["rgt"])); } if (!is_array($rows) or count($rows) == 0) { return ""; } if (!folder_in_trash($folder)) { $trash = db_select_value("simple_sys_tree", "id", "anchor=@anchor@", array("anchor" => "trash")); if (empty($trash)) { exit("{t}Error{/t}: {t}Trash folder not found.{/t}"); } $id = self::create(sys_date("{t}m/d/Y{/t}"), "blank", "", $trash, true); $old_path = modify::getpath($folder); if (!self::move($row["id"], $id, true)) { exit("{t}The folder cannot be deleted.{/t}"); } $data = array("rread_users" => "", "rread_groups" => "", "rwrite_users" => "", "rwrite_groups" => "", "radmin_users" => "", "radmin_groups" => "", "rexception_users" => "", "rexception_groups" => "", "anchor" => ""); $data["history"] = sprintf("{t}Item deleted by %s at %s{/t}\n", $_SESSION["username"], sys_date("{t}m/d/y g:i:s a{/t}")); foreach ($rows as $folder) { db_update("simple_sys_tree", $data, array("id=@id@"), array("id" => $folder["id"])); } db_update("simple_sys_tree", array("history" => "{t}Origin{/t}: " . $old_path . "\n"), array("id=@id@"), array("id" => $rows[0]["id"])); sys_log_stat("deleted_folders", count($rows)); } else { foreach ($rows as $folder) { if ($folder["ftype"] != "sys_tree") { $schema_data = db_get_schema(sys_find_module($folder["ftype"])); $tname = $schema_data["att"]["NAME"]; if (!strpos($tname, "_nodb_")) { $delete_fields = array(); foreach ($schema_data["fields"] as $key => $field) { if ($field["SIMPLE_TYPE"] == "files") { $delete_fields[] = $key; } } if (count($delete_fields) > 0) { $data = db_select($tname, $delete_fields, "folder=@folder@", "created asc", "", array("folder" => $folder["id"])); if (is_array($data) and count($data) > 0) { foreach ($data as $ditem) { foreach ($delete_fields as $field) { $files = explode("|", $ditem[$field]); sys_unlink($files); } } } } db_delete($tname, array("folder=@folder@"), array("folder" => $folder["id"])); } } db_search_delete("simple_sys_tree", $folder["id"], $folder["id"]); db_search_delete_folder($folder["id"]); db_delete("simple_sys_tree", array("id=@id@"), array("id" => $folder["id"])); } db_update_subfolder_count($row["parent"]); } $folder = $row["id"]; if (isset($_SESSION["folder_states"][$folder])) { foreach ($_SESSION["folder_states"][$folder] as $child) { unset($_SESSION["folder_states"][$child]); } unset($_SESSION["folder_states"][$folder]); } return $row["parent"]; }
private static function _create_backup($folder) { $bfolder = db_select_first("simple_sys_tree", "*", "id=@id@", "lft asc", array("id" => $folder)); $folders = db_select("simple_sys_tree", "*", "lft between @lft@ and @rgt@", "lft asc", "", array("lft" => $bfolder["lft"], "rgt" => $bfolder["rgt"])); if (empty($bfolder["id"]) or !is_array($folders)) { return ""; } $folder_path = self::_get_backup_folderpath($bfolder); $rand_str = NOW . "-" . sha1(uniqid(rand(), true) . uniqid(rand(), true)); $tarfile = SIMPLE_STORE . "/backup/" . $rand_str . "--" . urlencode(str_replace("/", "__", $folder_path)) . "--" . sys_date("Y-m-d---H-i-s") . ".tar"; $cachefile = SIMPLE_CACHE . "/backup/" . $rand_str . "--" . urlencode(str_replace("/", "__", $folder_path)) . "--" . sys_date("Y-m-d---H-i-s") . "_content.xml"; $files = array(); file_put_contents($cachefile, "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<data>\n", LOCK_EX); foreach ($folders as $folder) { $data = self::_build_backupdata($folder); $files = array_merge($files, $data["files"]); sys_file_append($cachefile, $data["output"]); } sys_file_append($cachefile, "</data>\n"); $cmd = sys_find_bin("tar") . " -cf " . modify::realfilename($tarfile); $files = array_merge(array($cachefile), $files); foreach ($files as $file) { $cmd .= " " . str_replace("\\", "/", modify::realfilename($file)); } if (DEBUG) { self::_out("TAR: " . $cmd . "\n\n"); } echo sys_exec($cmd); if (file_exists($cachefile)) { unlink($cachefile); } $message = "{t}Backup{/t}: " . $folder_path . " [" . $bfolder["id"] . "]"; sys_log_message_log("info", $message); self::_out($message); return ""; }
static function process_login($username, $password = "") { $id = session_id(); if (!APC_SESSION and $id and (empty($_SESSION["username"]) or $_SESSION["username"] != $username)) { $row = db_select_first("simple_sys_session", array("id", "data", "expiry"), "username=@username@", "lastmodified desc", array("username" => $username)); if (!empty($row["id"])) { $_SESSION = array(); session_decode(rawurldecode($row["data"])); if ($row["expiry"] < NOW) { db_delete("simple_sys_session", array("id=@id@"), array("id" => $row["id"])); } } if (!db_count("simple_sys_session", array("id=@id@"), array("id" => $id))) { db_insert("simple_sys_session", array("expiry" => NOW + LOGIN_TIMEOUT, "id" => $id)); } } $_SESSION["username"] = $username; if ($password != "") { $_SESSION["password"] = sys_encrypt($password, $id); } if (!isset($_SESSION["history"])) { $_SESSION["history"] = array(); } $_SESSION["groups"] = array(); $_SESSION["folder_states"] = array(); $base = dirname($_SERVER["SCRIPT_FILENAME"]) . "/"; if (sys_is_super_admin($_SESSION["username"])) { $_SESSION["ALLOWED_PATH"] = array($base . SIMPLE_STORE . "/home/", $base . SIMPLE_CACHE . "/debug/", $base . SIMPLE_STORE . "/trash/", $base . SIMPLE_CACHE . "/preview/", $base . SIMPLE_STORE . "/backup/"); } else { $_SESSION["ALLOWED_PATH"] = array($base . SIMPLE_STORE . "/home/" . $_SESSION["username"] . "/", $base . SIMPLE_CACHE . "/preview/"); } foreach (explode(",", SIMPLE_IMPORT) as $folder) { if ($folder == "" or !is_dir($folder)) { continue; } if ($folder[0] != "/" and !strpos($folder, ":")) { $folder = $base . $folder; } $_SESSION["ALLOWED_PATH"][] = rtrim(str_replace("\\", "/", $folder), "/") . "/"; } // TODO2 put in extra function and configure it with setup to fetch groups from somewhere else if (sys_is_super_admin($_SESSION["username"])) { $_SESSION["permission_sql"] = "1=1"; $_SESSION["permission_sql_exception"] = "1=0"; $_SESSION["disabled_modules"] = array(); } else { $_SESSION["permission_sql"] = sql_regexp("r@right@_users", array($username, "anonymous")); $_SESSION["permission_sql_exception"] = "(rexception_users!='' and " . sql_regexp("rexception_users", array($username, "anonymous"), "|@view@:@right@:%s|") . ")"; $_SESSION["disabled_modules"] = array_flip(explode("|", DISABLED_MODULES)); $rows = db_select("simple_sys_groups", "groupname", array("activated=1", "members like @username_sql@"), "", "", array("username_sql" => "%|" . $username . "|%")); if (is_array($rows) and count($rows) > 0) { foreach ($rows as $val) { $_SESSION["groups"][] = $val["groupname"]; } $_SESSION["permission_sql"] = "(" . $_SESSION["permission_sql"] . " or " . sql_regexp("r@right@_groups", $_SESSION["groups"]) . ")"; $_SESSION["permission_sql_exception"] = "(" . $_SESSION["permission_sql_exception"] . " or (rexception_groups!='' and " . sql_regexp("rexception_groups", $_SESSION["groups"], "|@view@:@right@:%s|") . "))"; } } $_SESSION["permission_sql_read"] = str_replace("@right@", "read", $_SESSION["permission_sql"]); $_SESSION["permission_sql_write"] = str_replace("@right@", "write", $_SESSION["permission_sql"]); $_SESSION["ip"] = _login_get_remoteaddr(); $_SESSION["tickets"] = array("templates" => array("dbselect", "simple_templates", array("tplcontent", "tplname"), array("tplname like @search@"), "tplname asc")); $_SESSION["treevisible"] = true; $row = db_select_first("simple_sys_users", "*", "username=@username@", "", array("username" => $username)); if (!empty($row["cal_day_begin"])) { $_SESSION["day_begin"] = sys_date("G", $row["cal_day_begin"] - 1) * 3600; $_SESSION["day_end"] = sys_date("G", $row["cal_day_end"]) * 3600; } else { $_SESSION["day_begin"] = 25200; // 7:00 = 7*3600 $_SESSION["day_end"] = 64800; // 18:00 = 18*3600 } if (!empty($row["enabled_modules"])) { $row["enabled_modules"] = array_flip(explode("|", trim($row["enabled_modules"], "|"))); $_SESSION["disabled_modules"] = array_diff_key($_SESSION["disabled_modules"], $row["enabled_modules"]); } if (!empty($row["timezone"])) { $_SESSION["timezone"] = $row["timezone"]; } else { $_SESSION["timezone"] = ""; } if (!empty($row["theme"])) { $_SESSION["theme"] = $row["theme"]; } else { $_SESSION["theme"] = "core"; } if (!empty($row["home_folder"])) { $_SESSION["home_folder"] = "index.php?folder=" . rawurlencode($row["home_folder"]); } else { if (sys_is_super_admin($username)) { $anchor = "system"; } else { $anchor = "home_" . $username; } $_SESSION["home_folder"] = "index.php?folder=^" . $anchor; } if ($id or isset($_REQUEST["login"])) { sys_log_stat("logins", 1); sys_log_message_log("login", sprintf("{t}login %s from %s with %s{/t}", $_SESSION["username"], $_SESSION["ip"], sys::$browser)); } trigger::login(); if (!empty($row["pwdexpires"]) and $row["pwdexpires"] < NOW) { sys_warning(sprintf("{t}Password expired. (password of %s has expired){/t}", $username)); self::_redirect("index.php?view=changepwd&find=asset|simple_sys_users|1|username="******"username"]); } else { if (!empty($_REQUEST["page"])) { if (CMS_REAL_URL) { self::_redirect(CMS_REAL_URL . $_REQUEST["page"]); } self::_redirect("cms.php/" . $_REQUEST["page"]); } else { if (!empty($_REQUEST["redirect"])) { self::_redirect($_SESSION["home_folder"]); } } } }
private static function _date($time) { return sys_date("Y-m-d\\TH:i:s", $time) . "+00:00"; }
static function showlist() { setup::out("\n\t<div style='color:#ff0000;'>\n\t<b>{t}Warning{/t}</b>:<br>\n\t- Please make a complete backup of your database (e.g. using phpMyAdmin)<br>\n\t- Please make a complete backup of your sgs folder (e.g. /var/www/htdocs/sgs/)<br>\n\t- Make sure both backups are complete!\n </div>\n "); setup::out("{t}Downloading extension list{/t} ...<br>"); $url = "http://sourceforge.net/projects/simplgroup/files/simplegroupware_modules/modules.xml"; if (!($data = sys_cache_get("modules.xml"))) { $data = @file_get_contents($url); sys_cache_set("modules.xml", $data, 3600); } if ($xml = @simplexml_load_string($data)) { foreach ($xml as $package) { $php_version = (string) $package->php_version; $sgs_version = (string) $package->require_version; $target = SIMPLE_EXT . substr(basename($package->filename), 0, -3); if (file_exists($target)) { continue; } $id = md5($package->filename); if (version_compare(PHP_VERSION, $php_version, "<")) { setup::out(sprintf("{t}Setup needs php with at least version %s !{/t} ", $php_version), false); } else { if (version_compare(CORE_VERSION_STRING, $sgs_version, "<")) { setup::out(sprintf("{t}Setup needs Simple Groupware with at least version %s !{/t} ", $sgs_version), false); } else { setup::out("<a href='extensions.php?token=" . modify::get_form_token() . "&extension=" . $package->name . "&filename=" . $package->filename . "'>{t}I n s t a l l{/t}</a> ", false); } } setup::out($package->title . " <a href='#' onclick='return showhide(\"" . $id . "\")'>{t}Info{/t}</a>", false); setup::out("<br><div class='description' style='display:none;' id='" . $id . "'>" . nl2br(trim($package->description)) . "</div>"); } } else { setup::out(sprintf("{t}Connection error: %s [%s]{/t}", $url, "HTTP") . "<br>" . strip_tags($data, "<br><p><h1><center>")); } setup::out("{t}Package from local file system (.tar.gz){/t}:<br/>{t}current path{/t}: " . str_replace("\\", "/", getcwd()) . "/<br/>"); $dir = opendir("./"); while ($file = readdir($dir)) { if ($file != "." and $file != ".." and preg_match("|^SimpleGroupware\\_.*?.tar\\.gz\$|i", $file)) { setup::out("<a href='extensions.php?token=" . modify::get_form_token() . "&cfile=" . $file . "'>{t}I n s t a l l{/t}</a> " . $file . "<br/>"); } } closedir($dir); setup::out("<form method='POST'><input type='hidden' name='token' value='" . modify::get_form_token() . "'><input type='text' name='cfile' value='/tmp/SimpleGroupware_SomeExtension_0.x.tar.gz' style='width:300px;'> <input type='submit' class='submit' value='{t}I n s t a l l{/t}'><br>"); $can_uninstall = false; foreach (scandir(SIMPLE_EXT) as $file) { if ($file[0] == "." or !is_dir(SIMPLE_EXT . $file) or !file_exists(SIMPLE_EXT . $file . "/package.xml")) { continue; } $package = simplexml_load_file(SIMPLE_EXT . $file . "/package.xml"); $id = md5($package->filename); setup::out("<a onclick='if (!confirm(\"{t}Really uninstall the module ?{/t}\")) return false;' href='extensions.php?token=" . modify::get_form_token() . "&uninstall=" . $package->filename . "'>{t}U n i n s t a l l{/t}</a> " . $package->title, false); setup::out(" <a href='#' onclick='return showhide(\"" . $id . "\")'>{t}Info{/t}</a>", false); setup::out(" ({t}installed{/t} " . sys_date("{t}m/d/Y{/t}", filemtime(SIMPLE_EXT . $file)) . ")"); setup::out("<div class='description' style='display:none;' id='" . $id . "'>" . nl2br(trim($package->description)) . "</div>"); $can_uninstall = true; } if ($can_uninstall) { setup::out("<b>{t}Note{/t}:</b> {t}Uninstall does not delete any data in the database.{/t}<br>"); } setup::out_exit('<div style="border-top: 1px solid black;">Powered by Simple Groupware, Copyright (C) 2002-2012 by Thomas Bley.</div></div></body></html>'); }