function _localCleanup() { // Remove the package directory, we do it backwards because the "deepest" files are last $contents = @array_reverse(BigTree::directoryContents(SERVER_ROOT . "cache/package/")); foreach ((array) $contents as $file) { @unlink($file); @rmdir($file); } @rmdir(SERVER_ROOT . "cache/package/"); }
} } // Include related CSS/JS files if named properly if (file_exists(SERVER_ROOT . "custom/admin/css/" . $module["route"] . ".css")) { $p["files"][] = SERVER_ROOT . "custom/admin/css/" . $module["route"] . ".css"; } if (file_exists(SERVER_ROOT . "custom/admin/js/" . $module["route"] . ".js")) { $p["files"][] = SERVER_ROOT . "custom/admin/js/" . $module["route"] . ".js"; } } } // Bring in files for templates foreach ((array) $templates as $template) { if ($template) { if (is_dir(SERVER_ROOT . "templates/routed/{$template}/")) { $contents = BigTree::directoryContents(SERVER_ROOT . "templates/routed/{$template}/"); foreach ($contents as $c) { if (is_file($c)) { $p["files"][] = $c; } } } elseif (file_exists(SERVER_ROOT . "templates/basic/{$template}.php")) { $p["files"][] = SERVER_ROOT . "templates/basic/{$template}.php"; } } } // Files for callouts foreach ((array) $callouts as $callout) { if ($callout) { if (file_exists(SERVER_ROOT . "templates/callouts/{$callout}.php")) { $p["files"][] = SERVER_ROOT . "templates/callouts/{$callout}.php";
$type["use_cases"] = array("templates" => $type["pages"], "modules" => $type["modules"], "callouts" => $type["callouts"], "settings" => $type["settings"]); } $use_cases = is_array($type["use_cases"]) ? sqlescape(json_encode($type["use_cases"])) : sqlescape($type["use_cases"]); $self_draw = $type["self_draw"] ? "'on'" : "NULL"; sqlquery("INSERT INTO bigtree_field_types (`id`,`name`,`use_cases`,`self_draw`) VALUES ('" . sqlescape($type["id"]) . "','" . sqlescape($type["name"]) . "','{$use_cases}',{$self_draw})"); } } // Import files foreach ($json["files"] as $file) { BigTree::copyFile(SERVER_ROOT . "cache/package/{$file}", SERVER_ROOT . $file); } // Run SQL foreach ($json["sql"] as $sql) { sqlquery($sql); } // Empty view cache sqlquery("DELETE FROM bigtree_module_view_cache"); // Remove the package directory, we do it backwards because the "deepest" files are last $contents = @array_reverse(BigTree::directoryContents(SERVER_ROOT . "cache/package/")); foreach ($contents as $file) { @unlink($file); @rmdir($file); } @rmdir(SERVER_ROOT . "cache/package/"); // Clear module class cache and field type cache. @unlink(SERVER_ROOT . "cache/bigtree-module-class-list.json"); @unlink(SERVER_ROOT . "cache/bigtree-form-field-types.json"); sqlquery("INSERT INTO bigtree_extensions (`id`,`type`,`name`,`version`,`last_updated`,`manifest`) VALUES ('" . sqlescape($json["id"]) . "','package','" . sqlescape($json["title"]) . "','" . sqlescape($json["version"]) . "',NOW(),'" . sqlescape(json_encode($json)) . "')"); sqlquery("SET foreign_key_checks = 1"); $admin->growl("Developer", "Installed Package"); BigTree::redirect(DEVELOPER_ROOT . "packages/install/complete/");
function installExtension($manifest, $upgrade = false) { $bigtree["group_match"] = $bigtree["module_match"] = $bigtree["route_match"] = $bigtree["class_name_match"] = $bigtree["form_id_match"] = $bigtree["view_id_match"] = $bigtree["report_id_match"] = array(); $extension = sqlescape($manifest["id"]); // Turn off foreign key checks so we can reference the extension before creating it sqlquery("SET foreign_key_checks = 0"); // Upgrades drop existing modules, templates, etc -- we don't drop settings because they have user data if (is_array($upgrade)) { sqlquery("DELETE FROM bigtree_module_groups WHERE extension = '{$extension}'"); sqlquery("DELETE FROM bigtree_modules WHERE extension = '{$extension}'"); sqlquery("DELETE FROM bigtree_templates WHERE extension = '{$extension}'"); sqlquery("DELETE FROM bigtree_callouts WHERE extension = '{$extension}'"); sqlquery("DELETE FROM bigtree_field_types WHERE extension = '{$extension}'"); sqlquery("DELETE FROM bigtree_feeds WHERE extension = '{$extension}'"); // Import tables for new installs } else { foreach ($manifest["components"]["tables"] as $table_name => $sql_statement) { sqlquery("DROP TABLE IF EXISTS `{$table_name}`"); sqlquery($sql_statement); } } // Import module groups foreach ($manifest["components"]["module_groups"] as &$group) { if ($group) { $bigtree["group_match"][$group["id"]] = $this->createModuleGroup($group["name"]); // Update the group ID since we're going to save this manifest locally for uninstalling $group["id"] = $bigtree["group_match"][$group["id"]]; sqlquery("UPDATE bigtree_module_groups SET extension = '{$extension}' WHERE id = '" . $group["id"] . "'"); } } // Import modules foreach ($manifest["components"]["modules"] as &$module) { if ($module) { $group = $module["group"] && isset($bigtree["group_match"][$module["group"]]) ? $bigtree["group_match"][$module["group"]] : "NULL"; $gbp = sqlescape(is_array($module["gbp"]) ? BigTree::json($module["gbp"]) : $module["gbp"]); // Find a unique route $oroute = $route = $module["route"]; $x = 2; while (sqlrows(sqlquery("SELECT * FROM bigtree_modules WHERE route = '" . sqlescape($route) . "'"))) { $route = $oroute . "-{$x}"; $x++; } // Create the module sqlquery("INSERT INTO bigtree_modules (`name`,`route`,`class`,`icon`,`group`,`gbp`,`extension`) VALUES ('" . sqlescape($module["name"]) . "','" . sqlescape($route) . "','" . sqlescape($module["class"]) . "','" . sqlescape($module["icon"]) . "',{$group},'{$gbp}','{$extension}')"); $module_id = sqlid(); $bigtree["module_match"][$module["id"]] = $module_id; $bigtree["route_match"][$module["route"]] = $route; // Update the module ID since we're going to save this manifest locally for uninstalling $module["id"] = $module_id; // Create the embed forms foreach ($module["embed_forms"] as $form) { $this->createModuleEmbedForm($module_id, $form["title"], $form["table"], is_array($form["fields"]) ? $form["fields"] : json_decode($form["fields"], true), $form["hooks"], $form["default_position"], $form["default_pending"], $form["css"], $form["redirect_url"], $form["thank_you_message"]); } // Create views foreach ($module["views"] as $view) { $bigtree["view_id_match"][$view["id"]] = $this->createModuleView($module_id, $view["title"], $view["description"], $view["table"], $view["type"], is_array($view["options"]) ? $view["options"] : json_decode($view["options"], true), is_array($view["fields"]) ? $view["fields"] : json_decode($view["fields"], true), is_array($view["actions"]) ? $view["actions"] : json_decode($view["actions"], true), $view["suffix"], $view["preview_url"]); } // Create regular forms foreach ($module["forms"] as $form) { $bigtree["form_id_match"][$form["id"]] = $this->createModuleForm($module_id, $form["title"], $form["table"], is_array($form["fields"]) ? $form["fields"] : json_decode($form["fields"], true), $form["hooks"], $form["default_position"], $form["return_view"] ? $bigtree["view_id_match"][$form["return_view"]] : false, $form["return_url"], $form["tagging"]); } // Create reports foreach ($module["reports"] as $report) { $bigtree["report_id_match"][$report["id"]] = $this->createModuleReport($module_id, $report["title"], $report["table"], $report["type"], is_array($report["filters"]) ? $report["filters"] : json_decode($report["filters"], true), is_array($report["fields"]) ? $report["fields"] : json_decode($report["fields"], true), $report["parser"], $report["view"] ? $bigtree["view_id_match"][$report["view"]] : false); } // Create actions foreach ($module["actions"] as $action) { $this->createModuleAction($module_id, $action["name"], $action["route"], $action["in_nav"], $action["class"], $bigtree["form_id_match"][$action["form"]], $bigtree["view_id_match"][$action["view"]], $bigtree["report_id_match"][$action["report"]], $action["level"], $action["position"]); } } } // Import templates foreach ($manifest["components"]["templates"] as $template) { if ($template) { $resources = sqlescape(is_array($template["resources"]) ? BigTree::json($template["resources"]) : $template["resources"]); sqlquery("INSERT INTO bigtree_templates (`id`,`name`,`module`,`resources`,`level`,`routed`,`extension`) VALUES ('" . sqlescape($template["id"]) . "','" . sqlescape($template["name"]) . "','" . $bigtree["module_match"][$template["module"]] . "','{$resources}','" . sqlescape($template["level"]) . "','" . sqlescape($template["routed"]) . "','{$extension}')"); } } // Import callouts foreach ($manifest["components"]["callouts"] as $callout) { if ($callout) { $resources = sqlescape(is_array($callout["resources"]) ? BigTree::json($callout["resources"]) : $callout["resources"]); sqlquery("INSERT INTO bigtree_callouts (`id`,`name`,`description`,`display_default`,`display_field`,`resources`,`level`,`position`,`extension`) VALUES ('" . sqlescape($callout["id"]) . "','" . sqlescape($callout["name"]) . "','" . sqlescape($callout["description"]) . "','" . sqlescape($callout["display_default"]) . "','" . sqlescape($callout["display_field"]) . "','{$resources}','" . sqlescape($callout["level"]) . "','" . sqlescape($callout["position"]) . "','{$extension}')"); } } // Import Settings foreach ($manifest["components"]["settings"] as $setting) { if ($setting) { $this->createSetting($setting); sqlquery("UPDATE bigtree_settings SET extension = '{$extension}' WHERE id = '" . sqlescape($setting["id"]) . "'"); } } // Import Feeds foreach ($manifest["components"]["feeds"] as $feed) { if ($feed) { $fields = sqlescape(is_array($feed["fields"]) ? BigTree::json($feed["fields"]) : $feed["fields"]); $options = sqlescape(is_array($feed["options"]) ? BigTree::json($feed["options"]) : $feed["options"]); sqlquery("INSERT INTO bigtree_feeds (`route`,`name`,`description`,`type`,`table`,`fields`,`options`,`extension`) VALUES ('" . sqlescape($feed["route"]) . "','" . sqlescape($feed["name"]) . "','" . sqlescape($feed["description"]) . "','" . sqlescape($feed["type"]) . "','" . sqlescape($feed["table"]) . "','{$fields}','{$options}','{$extension}')"); } } // Import Field Types foreach ($manifest["components"]["field_types"] as $type) { if ($type) { $self_draw = $type["self_draw"] ? "'on'" : "NULL"; $use_cases = sqlescape(is_array($type["use_cases"]) ? json_encode($type["use_cases"]) : $type["use_cases"]); sqlquery("INSERT INTO bigtree_field_types (`id`,`name`,`use_cases`,`self_draw`,`extension`) VALUES ('" . sqlescape($type["id"]) . "','" . sqlescape($type["name"]) . "','{$use_cases}',{$self_draw},'{$extension}')"); } } // Upgrades don't drop tables, we run the SQL revisions instead if (is_array($upgrade)) { $old_revision = $upgrade["revision"]; $sql_revisions = $manifest["sql_revisions"]; // Go through all the SQL updates, we ksort first to ensure if the manifest somehow got out of order that we run the SQL update sequentially ksort($sql_revisions); foreach ($sql_revisions as $key => $statements) { if ($key > $old_revision) { foreach ($statements as $sql_statement) { sqlquery($sql_statement); } } } // Update the extension sqlquery("UPDATE bigtree_extensions SET name = '" . sqlescape($manifest["title"]) . "', version = '" . sqlescape($manifest["version"]) . "', last_updated = NOW(), manifest = '" . BigTree::json($manifest, true) . "' WHERE id = '" . sqlescape($manifest["id"]) . "'"); // Straight installs move files into place locally } else { // Make sure destination doesn't exist $destination_path = SERVER_ROOT . "extensions/" . $manifest["id"] . "/"; BigTree::deleteDirectory($destination_path); // Move the package to the extension directory rename(SERVER_ROOT . "cache/package/", $destination_path); BigTree::setDirectoryPermissions($destination_path); // Create the extension sqlquery("INSERT INTO bigtree_extensions (`id`,`type`,`name`,`version`,`last_updated`,`manifest`) VALUES ('" . sqlescape($manifest["id"]) . "','extension','" . sqlescape($manifest["title"]) . "','" . sqlescape($manifest["version"]) . "',NOW(),'" . BigTree::json($manifest, true) . "')"); } // Re-enable foreign key checks sqlquery("SET foreign_key_checks = 1"); // Empty view cache sqlquery("DELETE FROM bigtree_module_view_cache"); // Move public files into the site directory $public_dir = SERVER_ROOT . "extensions/" . $manifest["id"] . "/public/"; $site_contents = file_exists($public_dir) ? BigTree::directoryContents($public_dir) : array(); foreach ($site_contents as $file_path) { $destination_path = str_replace($public_dir, SITE_ROOT . "extensions/" . $manifest["id"] . "/", $file_path); BigTree::copyFile($file_path, $destination_path); } // Clear module class cache and field type cache. @unlink(SERVER_ROOT . "cache/bigtree-module-class-list.json"); @unlink(SERVER_ROOT . "cache/bigtree-form-field-types.json"); return $manifest; }
$package["sql_revisions"][$revision][] = $create_statement; } } // Clean up the revisions (if we don't have any) $package["sql_revisions"] = array_filter($package["sql_revisions"]); } // Write the manifest file $json = BigTree::json($package); BigTree::putFile(SERVER_ROOT . "extensions/{$id}/manifest.json", $json); // Create the zip, clear caches since we may have moved the routes of field types and modules @unlink(SERVER_ROOT . "cache/package.zip"); @unlink(SERVER_ROOT . "cache/bigtree-form-field-types.json"); @unlink(SERVER_ROOT . "cache/bigtree-module-class-list.json"); include BigTree::path("inc/lib/pclzip.php"); $zip = new PclZip(SERVER_ROOT . "cache/package.zip"); $zip->create(BigTree::directoryContents(SERVER_ROOT . "extensions/{$id}/"), PCLZIP_OPT_REMOVE_PATH, SERVER_ROOT . "extensions/{$id}/"); // Store it in the database for future updates -- existing packages might be replaced if (sqlrows(sqlquery("SELECT id FROM bigtree_extensions WHERE id = '" . sqlescape($id) . "'"))) { sqlquery("UPDATE bigtree_extensions SET type = 'extension', name = '" . sqlescape($title) . "', version = '" . sqlescape($version) . "', last_updated = NOW(), manifest = '" . sqlescape($json) . "' WHERE id = '" . sqlescape($id) . "'"); } else { sqlquery("INSERT INTO bigtree_extensions (`id`,`type`,`name`,`version`,`last_updated`,`manifest`) VALUES ('" . sqlescape($id) . "','extension','" . sqlescape($title) . "','" . sqlescape($version) . "',NOW(),'" . sqlescape($json) . "')"); } // Turn foreign key checks back on sqlquery("SET foreign_key_checks = 1"); ?> <div class="container"> <section> <p>Extension created successfully.</p> </section> <footer> <a href="<?php
// Files for field types -- we use the $p version here because we may have added some when checking the module foreach ((array) $p["field_types"] as $type) { if ($type) { if (file_exists(SERVER_ROOT . "custom/admin/form-field-types/draw/{$type}.php")) { $p["files"][] = SERVER_ROOT . "custom/admin/form-field-types/draw/{$type}.php"; } if (file_exists(SERVER_ROOT . "custom/admin/form-field-types/process/{$type}.php")) { $p["files"][] = SERVER_ROOT . "custom/admin/form-field-types/process/{$type}.php"; } if (file_exists(SERVER_ROOT . "custom/admin/ajax/developer/field-options/{$type}.php")) { $p["files"][] = SERVER_ROOT . "custom/admin/ajax/developer/field-options/{$type}.php"; } } } // Add all the files in the extension directories $contents = array_merge((array) BigTree::directoryContents(SITE_ROOT . "extensions/" . $p["id"] . "/"), (array) BigTree::directoryContents(SERVER_ROOT . "extensions/" . $p["id"] . "/")); foreach ($contents as $file) { if (!is_dir($file) && file_exists($file)) { $p["files"][] = $file; } } // Make sure we have no dupes $p["module_groups"] = array_unique($p["module_groups"]); $p["modules"] = array_unique($p["modules"]); $p["templates"] = array_unique($p["templates"]); $p["callouts"] = array_unique($p["callouts"]); $p["settings"] = array_unique($p["settings"]); $p["feeds"] = array_unique($p["feeds"]); $p["field_types"] = array_unique($p["field_types"]); $p["files"] = array_unique($p["files"]); $p["tables"] = array_unique($p["tables"]);
$package["components"]["tables"][] = $table; } $package["sql"][] = "SET foreign_key_checks = 1"; foreach ((array) $files as $file) { $file = str_replace(SERVER_ROOT, "", $file); BigTree::copyFile(SERVER_ROOT . $file, SERVER_ROOT . "cache/package/" . $file); $package["files"][] = $file; } // Write the manifest file $json = BigTree::json($package); BigTree::putFile(SERVER_ROOT . "cache/package/manifest.json", $json); // Create the zip @unlink(SERVER_ROOT . "cache/package.zip"); include BigTree::path("inc/lib/pclzip.php"); $zip = new PclZip(SERVER_ROOT . "cache/package.zip"); $zip->create(BigTree::directoryContents(SERVER_ROOT . "cache/package/"), PCLZIP_OPT_REMOVE_PATH, SERVER_ROOT . "cache/package/"); // Remove the package directory BigTree::deleteDirectory(SERVER_ROOT . "cache/package/"); // Store it in the database for future updates if (sqlrows(sqlquery("SELECT * FROM bigtree_extensions WHERE id = '" . sqlescape($id) . "'"))) { sqlquery("UPDATE bigtree_extensions SET name = '" . sqlescape($title) . "', version = '" . sqlescape($version) . "', last_updated = NOW(), manifest = '" . sqlescape($json) . "' WHERE id = '" . sqlescape($id) . "'"); } else { sqlquery("INSERT INTO bigtree_extensions (`id`,`type`,`name`,`version`,`last_updated`,`manifest`) VALUES ('" . sqlescape($id) . "','package','" . sqlescape($title) . "','" . sqlescape($version) . "',NOW(),'" . sqlescape($json) . "')"); } ?> <div class="container"> <section> <p>Package created successfully.</p> </section> <footer> <a href="<?php
static function directoryContents($directory, $recurse = true, $extension = false) { $contents = array(); $d = @opendir($directory); if (!$d) { return false; } while ($r = readdir($d)) { if ($r != "." && $r != ".." && $r != ".DS_Store") { $path = rtrim($directory, "/") . "/" . $r; if ($extension === false || substr($path, -1 * strlen($extension)) == $extension) { $contents[] = $path; } if (is_dir($path) && $recurse) { $contents = array_merge($contents, BigTree::directoryContents($path, $recurse, $extension)); } } } return $contents; }
<input type="submit" class="button blue" value="Set FTP Directory" /> </footer> </div> </form> <?php } else { $ftp_root = "/" . trim($ftp_root, "/") . "/"; // Create backups folder $ftp->createDirectory($ftp_root . "backups/"); // Move old core $ftp->rename($ftp_root . "core/", $ftp_root . "backups/core-" . BIGTREE_VERSION . "/"); // Backup database $admin->backupDatabase(SERVER_ROOT . "cache/backup.sql"); $ftp->rename($ftp_root . "cache/backup.sql", $ftp_root . "backups/core-" . BIGTREE_VERSION . "/backup.sql"); // Move new core into place $ftp->rename($ftp_root . "cache/update/core/", $ftp_root . "core/"); // Delete old files $contents = array_reverse(BigTree::directoryContents(SERVER_ROOT . "cache/update/")); foreach ($contents as $file) { if (is_dir($file)) { rmdir($file); } else { unlink($file); } } rmdir(SERVER_ROOT . "cache/update/"); unlink(SERVER_ROOT . "cache/update.zip"); BigTree::redirect(DEVELOPER_ROOT . "upgrade/database/"); } } }
function extract() { include_once SERVER_ROOT . "core/inc/lib/pclzip.php"; $zip = new PclZip(SERVER_ROOT . "cache/update.zip"); // If the temporary update directory doesn't exist, create it BigTree::makeDirectory(SERVER_ROOT . "cache/update/"); // Figure out if we have just a single directory at the root $zip_root = $this->zipRoot($zip); if ($zip_root) { $zip->extract(PCLZIP_OPT_PATH, SERVER_ROOT . "cache/update/", PCLZIP_OPT_REMOVE_PATH, $zip_root); } else { $zip->extract(PCLZIP_OPT_PATH, SERVER_ROOT . "cache/update/"); } // Error occurred extracting? Return false if ($zip->errorName() != "PCLZIP_ERR_NO_ERROR") { return false; } // Make sure everything extracted is 777 -- if we're writing as Apache we want bust permissions for the user. $contents = BigTree::directoryContents(SERVER_ROOT . "cache/update/"); foreach ($contents as $file) { chmod($file, 0777); } return true; }
<?php $email .= $d["label"] . "\n"; $email .= str_repeat("-", strlen($d["label"])) . "\n"; if ($_FILES[$field_name]["tmp_name"]) { if ($d["directory"]) { $directory = rtrim($d["directory"], "/") . "/"; } else { $directory = "files/form-builder/"; } if (BigTree::directoryContents($directory) === false) { BigTree::makeDirectory($directory); } $value = $storage->store($_FILES[$field_name]["tmp_name"], $_FILES[$field_name]["name"], $directory); $email .= $cms->replaceRelativeRoots($value); } else { $email .= "No File Uploaded"; if ($d["required"]) { $errors[] = $field_name; } $value = ""; } $email .= "\n\n";