use Bitrix\Main\Localization\Loc;
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php");
/**
* @global CUser $USER
* @global CMain $APPLICATION
*/
$module_id = "fileman";
//Functions
function BXCreateSection(&$fileContent, &$sectionFileContent, &$absoluteFilePath, &$sectionPath)
{
//Check quota
$quota = new CDiskQuota();
if (!$quota->CheckDiskQuota(Array("FILE_SIZE" => mb_strlen($fileContent) + mb_strlen($sectionFileContent))))
{
$GLOBALS["APPLICATION"]->ThrowException($quota->LAST_ERROR, "BAD_QUOTA");
return false;
}
$io = CBXVirtualIo::GetInstance();
//Create dir
if (!$io->CreateDirectory($absoluteFilePath))
{
$GLOBALS["APPLICATION"]->ThrowException(GetMessage("PAGE_NEW_FOLDER_CREATE_ERROR")."
(".htmlspecialcharsbx($absoluteFilePath).")", "DIR_NOT_CREATE");
return false;
}
//Create .section.php
$io->GetFile($absoluteFilePath."/.section.php");
if (!$GLOBALS["APPLICATION"]->SaveFileContent($absoluteFilePath."/.section.php", $sectionFileContent))
return false;
//Create index.php
if (!$GLOBALS["APPLICATION"]->SaveFileContent($absoluteFilePath."/index.php", $fileContent))
return false;
else
{
if(COption::GetOptionString("fileman", "log_page", "Y")=="Y")
{
$res_log['path'] = $sectionPath."/index.php";
CEventLog::Log(
"content",
"PAGE_ADD",
"main",
"",
serialize($res_log)
);
}
}
return true;
}
//2 wizards: create page and create section
$createNewFolder = (isset($_REQUEST["newFolder"]) && $_REQUEST["newFolder"] == "Y");
if($createNewFolder)
{
Loc::loadLanguageFile($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/public/folder_new.php");
}
else
{
Loc::loadLanguageFile(__FILE__);
}
$popupWindow = new CJSPopup(GetMessage("PAGE_NEW_WINDOW_TITLE"), array("SUFFIX"=>($_GET['subdialog'] == 'Y'? 'subdialog':'')));
//Check fileman permissions
$canEditNewPage = true;
if(IsModuleInstalled("fileman"))
{
if ($createNewFolder && (!$USER->CanDoOperation("fileman_admin_folders") || !$USER->CanDoOperation("fileman_admin_files")) )
$popupWindow->ShowError(GetMessage("PAGE_NEW_ACCESS_DENIED"));
elseif (!$USER->CanDoOperation("fileman_admin_files"))
$popupWindow->ShowError(GetMessage("PAGE_NEW_ACCESS_DENIED"));
if (!$USER->CanDoOperation("fileman_edit_existent_files"))
$canEditNewPage = false;
}
$io = CBXVirtualIo::GetInstance();
//Page path
$path = "/";
if(isset($_REQUEST["path"]) && $_REQUEST["path"] <> '')
$path = $io->CombinePath("/", $_REQUEST["path"]);
$documentRoot = CSite::GetSiteDocRoot($site);
//Site ID
$site = SITE_ID;
if(isset($_REQUEST["site"]) && $_REQUEST["site"] <> '')
{
$obSite = CSite::GetByID($_REQUEST["site"]);
if($arSite = $obSite->Fetch())
$site = $arSite["ID"];
}
//Check permissions
if($createNewFolder && (!$USER->CanDoFileOperation("fm_create_new_folder", Array($site, $path)) || !$USER->CanDoFileOperation("fm_create_new_file", Array($site, $path))) )
$popupWindow->ShowError(GetMessage("PAGE_NEW_ACCESS_DENIED"));
elseif(!$USER->CanDoFileOperation("fm_create_new_file", Array($site, $path)))
$popupWindow->ShowError(GetMessage("PAGE_NEW_ACCESS_DENIED"));
elseif(!$io->DirectoryExists($documentRoot.$path))
$popupWindow->ShowError(GetMessage("PAGE_NEW_FOLDER_NOT_FOUND")." (".htmlspecialcharsbx($path).")");
if(!$USER->CanDoFileOperation("fm_edit_existent_file", Array($site, $path)))
$canEditNewPage = false;
//Lang
if(!isset($_REQUEST["lang"]) || $_REQUEST["lang"] == '')
$lang = LANGUAGE_ID;
//BackUrl
$back_url = ($_REQUEST["back_url"] ?? "");
//Template ID
$templateID = false;
if(isset($_REQUEST["templateID"]) && $_REQUEST["templateID"] <> '')
{
$obTemplate = CSiteTemplate::GetByID($_REQUEST["templateID"]);
if($arSiteTemplate = $obTemplate->Fetch())
$templateID = $_REQUEST["templateID"];
}
if($templateID === false)
{
//Get default template if templateID not set
$obTemplate = CSite::GetTemplateList($site);
while ($arSiteTemplate = $obTemplate->Fetch())
{
if ($arSiteTemplate["CONDITION"] == '' )
{
$templateID = $arSiteTemplate["TEMPLATE"];
break;
}
}
}
//default edit groups - need to limit access
$edit_groups = explode(",", COption::GetOptionString('fileman', 'default_edit_groups', ''));
$arGroupList = array();
$arEditGroups = array();
$gr = CGroup::GetList("sort", "asc", array("ACTIVE"=>"Y", "ADMIN"=>"N", "ANONYMOUS"=>"N"));
while($group = $gr->Fetch())
{
$arGroupList[$group["ID"]] = $group;
if(in_array($group["ID"], $edit_groups))
$arEditGroups[$group["ID"]] = $group["ID"];
}
$bAdmin = $USER->CanDoFileOperation("fm_edit_permission", Array($site, $path));
$strWarning = "";
//Check post values
if($_SERVER["REQUEST_METHOD"] == "POST" && isset($_REQUEST["save"]))
{
CUtil::JSPostUnescape();
$fileName = ($_REQUEST["fileName"] ?? "");
$pageTitle = ($_REQUEST["pageTitle"] ?? "");
$editAfterSave = (isset($_REQUEST["editAfterSave"]) && $_REQUEST["editAfterSave"] == "Y");
$addToMenu = (isset($_REQUEST["addToMenu"]) && $_REQUEST["addToMenu"] == "Y");
$menuName = ($_REQUEST["menuName"] ?? "");
$menuType = ($_REQUEST["menuType"] ?? false);
$pageTags = ($_REQUEST["pageTags"] ?? false);
$menuItemPosition = (isset($_REQUEST["menuItemPosition"]) ? intval($_REQUEST["menuItemPosition"]) : 0);
$absoluteFilePath = $io->CombinePath($documentRoot, $path, $fileName);
//Check filename
if ($fileName == '')
$strWarning = GetMessage("PAGE_NEW_FILE_NAME_EMPTY");
elseif (!$io->ValidateFilenameString($fileName))
$strWarning = GetMessage("PAGE_NEW_FILE_NAME_VALID_SYMBOLS");
// elseif (!$createNewFolder && !preg_match("/\.php$/", $fileName))
// $strWarning = GetMessage("PAGE_NEW_FILE_NAME_PHP_EXT");
elseif (!$createNewFolder && $fileName[0] == ".")
$strWarning = GetMessage("PAGE_NEW_FILE_NAME_DOT_FIRST");
elseif ($io->FileExists($absoluteFilePath))
$strWarning = GetMessage("PAGE_NEW_FILE_EXISTS");
elseif ($io->DirectoryExists($absoluteFilePath))
$strWarning = GetMessage("PAGE_NEW_FOLDER_EXISTS");
if (!check_bitrix_sessid())
$strWarning = GetMessage("MAIN_SESSION_EXPIRED");
}
else
{
//Default form values
$currentFileDir = $documentRoot.rtrim($path, "/")."/";
for ($fileNumber = ""; ; $fileNumber++)
{
$fileName = ($createNewFolder ? "folder".$fileNumber : "page".$fileNumber.".php");
if ($createNewFolder && !$io->DirectoryExists($currentFileDir.$fileName)
|| !$createNewFolder && !$io->FileExists($currentFileDir.$fileName))
break;
}
$pageTitle = GetMessage("PAGE_NEW_DEFAULT_TITLE").($fileNumber != "" ? " (".$fileNumber.")": "");
$editAfterSave = true;
$addToMenu = true;
$menuName = "";
$menuType = false;
$menuItemPosition = -1;
$pageTags = "";
}
//Get Menu
$arMenu = Array();
if (IsModuleInstalled("fileman") && $USER->CanDoOperation("fileman_add_element_to_menu"))
{
$arMenuTypes = GetMenuTypes($site);
foreach ($arMenuTypes as $type => $name)
{
$menu = new CMenu($type);
$menu->Init($path);
$actualDir = $menu->MenuDir;
$currentDir = rtrim($path, "/")."/";
if ($actualDir <> '')
{
$actualMenuFile = $actualDir.".".$type.".menu.php";
$fileOperation = ($io->FileExists($documentRoot.$actualMenuFile) ? "fm_edit_existent_file" : "fm_create_new_file" );
if (!$USER->CanDoFileOperation("fm_add_to_menu", Array($site, $actualMenuFile)) || !$USER->CanDoFileOperation($fileOperation, Array($site, $actualMenuFile)))
$actualDir = false;
}
else
$actualDir = false;
$currentMenuFile = $currentDir.".".$type.".menu.php";
$fileOperation = ($io->FileExists($documentRoot.$currentMenuFile) ? "fm_edit_existent_file" : "fm_create_new_file" );
if (!$USER->CanDoFileOperation('fm_add_to_menu', Array($site, $currentMenuFile)) || !$USER->CanDoFileOperation($fileOperation, Array($site, $currentMenuFile)))
$currentDir = false;
if ($currentDir === false && $actualDir === false)
continue;
$arMenuItems = Array();
foreach ($menu->arMenu as $arItem)
{
if (isset($arItem[0]))
$arMenuItems[] = $arItem[0];
}
$arMenu[$type] = Array(
"NAME" => $name,
"ACTUAL_FILE" => ($actualDir === false ? $currentMenuFile : $actualMenuFile),
"CURRENT_FILE" => $currentMenuFile,
"CAN_CREATE_NEW" => ($actualDir !== false && $currentDir !== false && $actualDir != $currentDir),
"ITEMS" => (($actualMenuFile == $currentMenuFile) ? $arMenuItems : array()),
"TEMPLATE" => $menu->template
);
}
}
if(empty($arMenu))
$addToMenu = false;
//page template object
$obPageTemplate = false;
if(isset($_REQUEST['wiz_template']) && $_REQUEST['wiz_template'] <> '')
$obPageTemplate = CPageTemplate::GetTemplate($_REQUEST['wiz_template'], array($templateID));
//Save page settings
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_REQUEST["save"]) && $strWarning == "")
{
//Get page template content
$fileContent = false;
if($obPageTemplate !== false)
{
$arParams = array(
"path"=>($createNewFolder? $io->CombinePath("/", $path, $fileName)."/" : $path),
"file"=>($createNewFolder? "index.php" : $fileName),
"site"=>$site
);
$fileContent = $obPageTemplate->GetContent($arParams);
}
else
{
$template_file = '';
if(isset($_REQUEST['page_template']) && $_REQUEST['page_template'] <> '')
{
$template_file = $_REQUEST['page_template'];
}
else
{
$arPageTemplates = GetFileTemplates($site, array($templateID));
if(!empty($arPageTemplates) && isset($arPageTemplates[0]['file']))
$template_file = $arPageTemplates[0]['file'];
}
if($template_file <> '')
$fileContent = GetTemplateContent($template_file, $site, array($templateID));
}
if (!$fileContent)
$fileContent = '<'.'?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");?'.'>'.GetMessage("PAGE_NEW_CONTENT").'<'.'?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>';
//Title
$strSectionName = "";
if ($pageTitle <> '')
{
$fileContent = SetPrologTitle($fileContent, $pageTitle);
if ($createNewFolder)
$strSectionName = "\$sSectionName = \"".EscapePHPString($pageTitle)."\";\n";
}
//Properties
$strDirProperties = "";
if (isset($_POST["PROPERTY"]) && is_array($_POST["PROPERTY"]))
{
$bNeedComma = false;
foreach ($_POST["PROPERTY"] as $arProperty)
{
$arProperty["CODE"] = (isset($arProperty["CODE"]) ? trim($arProperty["CODE"]) : "");
$arProperty["VALUE"] = (isset($arProperty["VALUE"]) ? trim($arProperty["VALUE"]) : "");
if (preg_match("/[a-zA-Z_-~]+/i", $arProperty["CODE"]))
{
if ($createNewFolder && $arProperty["VALUE"] <> '')
{
if($bNeedComma)
$strDirProperties .= ",\n";
$strDirProperties .= " \"".EscapePHPString($arProperty["CODE"])."\" => \"".EscapePHPString($arProperty["VALUE"])."\"";
$bNeedComma = true;
}
else
$fileContent = SetPrologProperty($fileContent, $arProperty["CODE"], $arProperty["VALUE"]);
}
}
}
if ($createNewFolder)
{
$sectionFileContent = "<"."?\n".$strSectionName."\$arDirProperties = Array(\n".$strDirProperties."\n);\n"."?".">";
$sectionPath = mb_substr($path, 1).$fileName;
$success = BXCreateSection($fileContent, $sectionFileContent, $absoluteFilePath, $sectionPath);
$arUndoParams = array(
'module' => 'fileman',
'undoType' => 'new_section',
'undoHandler' => 'CFileman::UndoNewSection',
'arContent' => array(
'absPath' => $absoluteFilePath,
'path' => rtrim($path, "/")."/".$fileName,
'site' => $site
)
);
}
else
{
//Tags only for pages
if ($pageTags !== false && IsModuleInstalled("search"))
$fileContent = SetPrologProperty($fileContent, COption::GetOptionString("search", "page_tag_property","tags"), $pageTags);
$arUndoParams = array(
'module' => 'fileman',
'undoType' => 'new_file',
'undoHandler' => 'CFileman::UndoNewFile',
'arContent' => array(
'absPath' => $absoluteFilePath,
'path' => rtrim($path, "/")."/".$fileName,
'site' => $site,
'public' => 'Y'
)
);
$success = $APPLICATION->SaveFileContent($absoluteFilePath, $fileContent);
}
if ($success === false && ($exception = $APPLICATION->GetException()))
{
$strWarning = $exception->msg;
}
else
{
if(COption::GetOptionString($module_id, "log_page", "Y")=="Y")
{
$res_log['path'] = mb_substr($arUndoParams['arContent']['path'], 1);
if (!$createNewFolder)
CEventLog::Log(
"content",
"PAGE_ADD",
"main",
"",
serialize($res_log)
);
else
CEventLog::Log(
"content",
"SECTION_ADD",
"main",
"",
serialize($res_log)
);
}
// Limit access
if (isset($_REQUEST["limitAccess"]) && $_REQUEST["limitAccess"] == "Y")
{
$arGroups = false;
if($bAdmin)
{
//operation fm_edit_permission
if (isset($_REQUEST["limitAccessWho"]) && $_REQUEST["limitAccessWho"] == 'extended')
{
$arGroups = array();
foreach($_REQUEST["limitGroupList"] as $group)
{
$group = intval($group);
if(isset($arGroupList[$group]))
$arGroups[$group] = $group;
}
}
else
{
$arGroups = $arEditGroups;
}
}
elseif(!empty($arEditGroups))
{
$arGroups = $arEditGroups;
}
//write permissions
if($arGroups !== false)
{
$arPermission = array("*"=>"D");
foreach($arGroups as $group)
$arPermission[$group] = 'X';
$APPLICATION->SetFileAccessPermission(array($site, rtrim($path, "/")."/".$fileName), $arPermission);
}
}
$relativePath = rtrim($path, "/")."/".$fileName.($createNewFolder ? "/" : "");
//Save menu
if ($addToMenu && array_key_exists($menuType, $arMenu) && CModule::IncludeModule("fileman"))
{
$menuFile = $arMenu[$menuType]["CURRENT_FILE"];
$arResult = CFileMan::GetMenuArray($documentRoot.$menuFile);
$arMenuItems = $arResult["aMenuLinks"];
$menuTemplate = $arResult["sMenuTemplate"];
if ($menuItemPosition > count($arMenuItems))
$menuItemPosition = 0;
//move to the right all items greater current item
for ($i = count($arMenuItems) - 1; $i >= $menuItemPosition; $i--)
$arMenuItems[$i+1] = $arMenuItems[$i];
$arMenuItems[$menuItemPosition] = Array($menuName, $relativePath, Array(), Array(), "");
CFileMan::SaveMenu(Array($site, $menuFile), $arMenuItems, $menuTemplate);
$arUndoParams['arContent']['menu'] = array(
'menuFile' => $menuFile,
'menuName' => $menuName,
'menuPath' => $relativePath
);
if(COption::GetOptionString($module_id, "log_page", "Y")=="Y")
{
$mt = COption::GetOptionString("fileman", "menutypes", $default_value, $site);
$mt = unserialize(str_replace("\\", "", $mt), ['allowed_classes' => false]);
$res_log['menu_name'] = $mt[$menuType];
$res_log['path'] = mb_substr(dirname($arUndoParams['arContent']['path']), 1);
CEventLog::Log(
"content",
"MENU_EDIT",
"main",
"",
serialize($res_log)
);
}
}
$ID = CUndo::Add($arUndoParams);
CUndo::ShowUndoMessage($ID);
$pathToEdit = $relativePath.($createNewFolder ? "index.php" : "");
if (!$USER->CanDoFileOperation("fm_edit_existent_file", Array($site, $pathToEdit)))
$canEditNewPage = false;
//Open edit dialog
if ($editAfterSave && $canEditNewPage):
?>