/** * This function lists and allows updating of multiple attachments paths. */ function ManageAttachmentPaths() { global $modSettings, $scripturl, $context, $txt, $sourcedir, $boarddir, $smcFunc; // Since this needs to be done eventually. if (!is_array($modSettings['attachmentUploadDir'])) { $modSettings['attachmentUploadDir'] = unserialize($modSettings['attachmentUploadDir']); } if (!isset($modSettings['attachment_basedirectories'])) { $modSettings['attachment_basedirectories'] = array(); } elseif (!is_array($modSettings['attachment_basedirectories'])) { $modSettings['attachment_basedirectories'] = unserialize($modSettings['attachment_basedirectories']); } $errors = array(); // Saving? if (isset($_REQUEST['save'])) { checkSession(); $_POST['current_dir'] = (int) $_POST['current_dir']; $new_dirs = array(); foreach ($_POST['dirs'] as $id => $path) { $id = (int) $id; if ($id < 1) { continue; } // Hmm, a new path maybe? if (!array_key_exists($id, $modSettings['attachmentUploadDir'])) { // or is it? if (in_array($path, $modSettings['attachmentUploadDir']) || in_array($boarddir . DIRECTORY_SEPARATOR . $path, $modSettings['attachmentUploadDir'])) { $errors[] = $path . ': ' . $txt['attach_dir_duplicate_msg']; continue; } // OK, so let's try to create it then. require_once $sourcedir . '/Attachments.php'; if (automanage_attachments_create_directory($path)) { $_POST['current_dir'] = $modSettings['currentAttachmentUploadDir']; } else { $errors[] = $path . ': ' . $txt[$context['dir_creation_error']]; } } // Changing a directory name? if (!empty($modSettings['attachmentUploadDir'][$id]) && !empty($path) && $path != $modSettings['attachmentUploadDir'][$id]) { if ($path != $modSettings['attachmentUploadDir'][$id] && !is_dir($path)) { if (!@rename($modSettings['attachmentUploadDir'][$id], $path)) { $errors[] = $path . ': ' . $txt['attach_dir_no_rename']; $path = $modSettings['attachmentUploadDir'][$id]; } } else { $errors[] = $path . ': ' . $txt['attach_dir_exists_msg']; $path = $modSettings['attachmentUploadDir'][$id]; } // Update the base directory path if (!empty($modSettings['attachment_basedirectories']) && array_key_exists($id, $modSettings['attachment_basedirectories'])) { $modSettings['attachment_basedirectories'][$id] = $path; $update = array('attachment_basedirectories' => serialize($modSettings['attachment_basedirectories'])); } } if (empty($path)) { $path = $modSettings['attachmentUploadDir'][$id]; // It's not a good idea to delete the current directory. if ($id == (!empty($_POST['current_dir']) ? $_POST['current_dir'] : $modSettings['currentAttachmentUploadDir'])) { $errors[] = $path . ': ' . $txt['attach_dir_is_current']; } elseif (!empty($modSettings['basedirectory_for_attachments']) && $modSettings['basedirectory_for_attachments'] == $modSettings['attachmentUploadDir'][$id]) { $errors[] = $path . ': ' . $txt['attach_dir_is_current_bd']; } else { // Let's not try to delete a path with files in it. $request = $smcFunc['db_query']('', ' SELECT COUNT(id_attach) AS num_attach FROM {db_prefix}attachments WHERE id_folder = {int:id_folder}', array('id_folder' => (int) $id)); list($num_attach) = $smcFunc['db_fetch_row']($request); $smcFunc['db_free_result']($request); // A check to see if it's a used base dir. if (!empty($modSettings['attachment_basedirectories'])) { // Count any sub-folders. foreach ($modSettings['attachmentUploadDir'] as $sub) { if (strpos($sub, $path . DIRECTORY_SEPARATOR) !== false) { $num_attach++; } } } // It's safe to delete. So try to delete the folder also if ($num_attach == 0) { if (is_dir($path)) { $doit = true; } elseif (is_dir($boarddir . DIRECTORY_SEPARATOR . $path)) { $doit = true; $path = $boarddir . DIRECTORY_SEPARATOR . $path; } if (isset($doit)) { unlink($path . '/.htaccess'); unlink($path . '/index.php'); if (!@rmdir($path)) { $errors[] = $path . ': ' . $txt['attach_dir_no_delete']; } } } else { $errors[] = $path . ': ' . $txt['attach_dir_no_remove']; } // Remove it from the base directory list. if (empty($errors) && !empty($modSettings['attachment_basedirectories'])) { unset($modSettings['attachment_basedirectories'][$id]); updateSettings(array('attachment_basedirectories' => serialize($modSettings['attachment_basedirectories']))); } if (empty($errors)) { continue; } } } $new_dirs[$id] = $path; } // We need to make sure the current directory is right. if (empty($_POST['current_dir']) && !empty($modSettings['currentAttachmentUploadDir'])) { $_POST['current_dir'] = $modSettings['currentAttachmentUploadDir']; } // Find the current directory if there's no value carried, if (empty($_POST['current_dir']) || empty($new_dirs[$_POST['current_dir']])) { if (in_array($modSettings['currentAttachmentUploadDir'], $modSettings['attachmentUploadDir'])) { $_POST['current_dir'] = $modSettings['currentAttachmentUploadDir']; } else { $_POST['current_dir'] = max(array_keys($modSettings['attachmentUploadDir'])); } } // Going back to just one path? if (count($new_dirs) == 1) { // We might need to reset the paths. This loop will just loop through once. foreach ($new_dirs as $id => $dir) { if ($id != 1) { $smcFunc['db_query']('', ' UPDATE {db_prefix}attachments SET id_folder = {int:default_folder} WHERE id_folder = {int:current_folder}', array('default_folder' => 1, 'current_folder' => $id)); } $update = array('currentAttachmentUploadDir' => 1, 'attachmentUploadDir' => serialize(array(1 => $dir))); } } else { // Save it to the database. $update = array('currentAttachmentUploadDir' => $_POST['current_dir'], 'attachmentUploadDir' => serialize($new_dirs)); } if (!empty($update)) { updateSettings($update); } if (!empty($errors)) { $_SESSION['errors']['dir'] = $errors; } redirectexit('action=admin;area=manageattachments;sa=attachpaths;' . $context['session_var'] . '=' . $context['session_id']); } // Saving a base directory? if (isset($_REQUEST['save2'])) { checkSession(); // Changing the current base directory? $_POST['current_base_dir'] = (int) $_POST['current_base_dir']; if (empty($_POST['new_base_dir']) && !empty($_POST['current_base_dir'])) { if ($modSettings['basedirectory_for_attachments'] != $modSettings['attachmentUploadDir'][$_POST['current_base_dir']]) { $update = array('basedirectory_for_attachments' => $modSettings['attachmentUploadDir'][$_POST['current_base_dir']]); } $modSettings['attachmentUploadDir'] = serialize($modSettings['attachmentUploadDir']); } // Or adding a new one? if (!empty($_POST['new_base_dir'])) { require_once $sourcedir . '/Attachments.php'; $_POST['new_base_dir'] = htmlspecialchars($_POST['new_base_dir'], ENT_QUOTES); $current_dir = $modSettings['currentAttachmentUploadDir']; if (!in_array($_POST['new_base_dir'], $modSettings['attachmentUploadDir'])) { if (!automanage_attachments_create_directory($_POST['new_base_dir'])) { $errors[] = $_POST['new_base_dir'] . ': ' . $txt['attach_dir_base_no_create']; } else { $errors[] = $_POST['new_base_dir'] . ': ' . $txt['attach_dir_base_dupe_msg']; } } $modSettings['currentAttachmentUploadDir'] = array_search($_POST['new_base_dir'], $modSettings['attachmentUploadDir']); if (!in_array($_POST['new_base_dir'], $modSettings['attachment_basedirectories'])) { $modSettings['attachment_basedirectories'][$modSettings['currentAttachmentUploadDir']] = $_POST['new_base_dir']; } ksort($modSettings['attachment_basedirectories']); $update = array('attachment_basedirectories' => serialize($modSettings['attachment_basedirectories']), 'basedirectory_for_attachments' => $_POST['new_base_dir'], 'currentAttachmentUploadDir' => $current_dir); } if (!empty($errors)) { $_SESSION['base'] = $errors; } if (!empty($update)) { updateSettings($update); } redirectexit('action=admin;area=manageattachments;sa=attachpaths;' . $context['session_var'] . '=' . $context['session_id']); } if (isset($_SESSION['errors'])) { $errors = $_SESSION['errors']; unset($_SESSION['errors']); } $listOptions = array('id' => 'attach_paths', 'base_href' => $scripturl . '?action=admin;area=manageattachments;sa=attachpaths;' . $context['session_var'] . '=' . $context['session_id'], 'title' => $txt['attach_paths'], 'get_items' => array('function' => 'list_getAttachDirs'), 'columns' => array('current_dir' => array('header' => array('value' => $txt['attach_current']), 'data' => array('function' => create_function('$rowData', ' return \'<input type="radio" name="current_dir" value="\' . $rowData[\'id\'] . \'" \' . ($rowData[\'current\'] ? \' checked="checked"\' : \'\') . (!empty($rowData[\'disable_current\']) ? \' disabled="disabled"\' : \'\') . \' class="input_radio" />\'; '), 'style' => 'text-align: center; width: 10%;')), 'path' => array('header' => array('value' => $txt['attach_path']), 'data' => array('function' => create_function('$rowData', ' return \'<input type="hidden" name="dirs[\' . $rowData[\'id\'] . \']" value="\' . $rowData[\'path\'] . \'" /><input type="text" size="40" name="dirs[\' . $rowData[\'id\'] . \']" value="\' . $rowData[\'path\'] . \'"\' . (!empty($rowData[\'disable_base_dir\']) ? \' disabled="disabled"\' : \'\') . \' class="input_text" style="width: 100%" />\'; '), 'style' => 'text-align: center; width: 40%;')), 'current_size' => array('header' => array('value' => $txt['attach_current_size']), 'data' => array('db' => 'current_size', 'style' => 'text-align: center; width: 15%;')), 'num_files' => array('header' => array('value' => $txt['attach_num_files']), 'data' => array('db' => 'num_files', 'style' => 'text-align: center; width: 15%;')), 'status' => array('header' => array('value' => $txt['attach_dir_status']), 'data' => array('db' => 'status', 'style' => 'text-align: center; width: 25%;'))), 'form' => array('href' => $scripturl . '?action=admin;area=manageattachments;sa=attachpaths;' . $context['session_var'] . '=' . $context['session_id']), 'additional_rows' => array(array('position' => 'below_table_data', 'value' => '<input type="hidden" name="' . $context['session_var'] . '" value="' . $context['session_id'] . '" /><input type="submit" name="new_path" value="' . $txt['attach_add_path'] . '" class="button_submit" /> <input type="submit" name="save" value="' . $txt['save'] . '" class="button_submit" />', 'style' => 'text-align: right;'), empty($errors['dir']) ? array('position' => 'top_of_list', 'value' => $txt['attach_dir_desc'], 'style' => 'text-align: left; padding: 5px 10px', 'class' => 'windowbg2 smalltext') : array('position' => 'top_of_list', 'value' => $txt['attach_dir_save_problem'] . '<br />' . implode('<br />', $errors['dir']), 'style' => 'text-align: left;', 'class' => 'noticebox'))); require_once $sourcedir . '/Subs-List.php'; createList($listOptions); if (!empty($modSettings['attachment_basedirectories'])) { $listOptions2 = array('id' => 'base_paths', 'base_href' => $scripturl . '?action=admin;area=manageattachments;sa=attachpaths;' . $context['session_var'] . '=' . $context['session_id'], 'title' => $txt['attach_base_paths'], 'get_items' => array('function' => 'list_getBaseDirs'), 'columns' => array('current_dir' => array('header' => array('value' => $txt['attach_current']), 'data' => array('function' => create_function('$rowData', ' return \'<input type="radio" name="current_base_dir" value="\' . $rowData[\'id\'] . \'" \' . ($rowData[\'current\'] ? \' checked="checked"\' : \'\') . \' class="input_radio" />\'; '), 'style' => 'text-align: center; width: 10%;')), 'path' => array('header' => array('value' => $txt['attach_path']), 'data' => array('db' => 'path', 'style' => 'width: 45%;')), 'num_dirs' => array('header' => array('value' => $txt['attach_num_dirs']), 'data' => array('db' => 'num_dirs', 'style' => 'text-align: center; width: 15%;')), 'status' => array('header' => array('value' => $txt['attach_dir_status']), 'data' => array('db' => 'status', 'style' => 'text-align: center; width: 15%;'))), 'form' => array('href' => $scripturl . '?action=admin;area=manageattachments;sa=attachpaths;' . $context['session_var'] . '=' . $context['session_id']), 'additional_rows' => array(array('position' => 'below_table_data', 'value' => '<input type="hidden" name="' . $context['session_var'] . '" value="' . $context['session_id'] . '" /><input type="submit" name="new_base_path" value="' . $txt['attach_add_path'] . '" class="button_submit" /> <input type="submit" name="save2" value="' . $txt['save'] . '" class="button_submit" />', 'style' => 'text-align: right;'), empty($errors['base']) ? array('position' => 'top_of_list', 'value' => $txt['attach_dir_base_desc'], 'style' => 'text-align: left; padding: 5px 10px', 'class' => 'windowbg2 smalltext') : array('position' => 'top_of_list', 'value' => $txt['attach_dir_save_problem'] . '<br />' . implode('<br />', $errors['base']), 'style' => 'text-align: left;', 'class' => 'noticebox'))); createList($listOptions2); } // Fix up our template. $context[$context['admin_menu_name']]['current_subsection'] = 'attachpaths'; $context['page_title'] = $txt['attach_path_manage']; $context['sub_template'] = 'attachment_paths'; }
/** * This function lists and allows updating of multiple attachments paths. */ public function action_attachpaths() { global $modSettings, $scripturl, $context, $txt; require_once SUBSDIR . '/Attachments.subs.php'; require_once SUBSDIR . '/ManageAttachments.subs.php'; // Since this needs to be done eventually. if (!is_array($modSettings['attachmentUploadDir'])) { $modSettings['attachmentUploadDir'] = unserialize($modSettings['attachmentUploadDir']); } if (!isset($modSettings['attachment_basedirectories'])) { $modSettings['attachment_basedirectories'] = array(); } elseif (!is_array($modSettings['attachment_basedirectories'])) { $modSettings['attachment_basedirectories'] = unserialize($modSettings['attachment_basedirectories']); } $errors = array(); // Saving? if (isset($_REQUEST['save'])) { checkSession(); $_POST['current_dir'] = isset($_POST['current_dir']) ? (int) $_POST['current_dir'] : 0; $new_dirs = array(); require_once SUBSDIR . '/Themes.subs.php'; $themes = installedThemes(); $reserved_dirs = array(BOARDDIR, SOURCEDIR, SUBSDIR, CONTROLLERDIR, CACHEDIR, EXTDIR, LANGUAGEDIR, ADMINDIR); foreach ($themes as $theme) { $reserved_dirs[] = $theme['theme_dir']; } foreach ($_POST['dirs'] as $id => $path) { $error = ''; $id = (int) $id; if ($id < 1) { continue; } $real_path = rtrim(trim($path), DIRECTORY_SEPARATOR); // If it doesn't look like a directory, probably is not a directory if (preg_match('~[/\\\\]~', $real_path) !== 1) { $real_path = realpath(BOARDDIR . DIRECTORY_SEPARATOR . ltrim($real_path, DIRECTORY_SEPARATOR)); } // Hmm, a new path maybe? if (!array_key_exists($id, $modSettings['attachmentUploadDir'])) { // or is it? if (in_array($path, $modSettings['attachmentUploadDir']) || in_array(BOARDDIR . DIRECTORY_SEPARATOR . $path, $modSettings['attachmentUploadDir'])) { $errors[] = $path . ': ' . $txt['attach_dir_duplicate_msg']; continue; } // or is it a system dir? if (in_array($real_path, $reserved_dirs)) { $errors[] = $real_path . ': ' . $txt['attach_dir_reserved']; continue; } // OK, so let's try to create it then. if (automanage_attachments_create_directory($path)) { $_POST['current_dir'] = $modSettings['currentAttachmentUploadDir']; } else { $errors[] = $path . ': ' . $txt[$context['dir_creation_error']]; } } // Changing a directory name? if (!empty($modSettings['attachmentUploadDir'][$id]) && !empty($path) && $real_path != $modSettings['attachmentUploadDir'][$id]) { if ($real_path != $modSettings['attachmentUploadDir'][$id] && !is_dir($real_path)) { if (!@rename($modSettings['attachmentUploadDir'][$id], $real_path)) { $errors[] = $real_path . ': ' . $txt['attach_dir_no_rename']; $real_path = $modSettings['attachmentUploadDir'][$id]; } } else { $errors[] = $real_path . ': ' . $txt['attach_dir_exists_msg']; $real_path = $modSettings['attachmentUploadDir'][$id]; } // Update the base directory path if (!empty($modSettings['attachment_basedirectories']) && array_key_exists($id, $modSettings['attachment_basedirectories'])) { $base = $modSettings['basedirectory_for_attachments'] == $modSettings['attachmentUploadDir'][$id] ? $real_path : $modSettings['basedirectory_for_attachments']; $modSettings['attachment_basedirectories'][$id] = $real_path; updateSettings(array('attachment_basedirectories' => serialize($modSettings['attachment_basedirectories']), 'basedirectory_for_attachments' => $base)); $modSettings['attachment_basedirectories'] = unserialize($modSettings['attachment_basedirectories']); } } if (empty($path)) { $real_path = $modSettings['attachmentUploadDir'][$id]; // It's not a good idea to delete the current directory. if ($id == (!empty($_POST['current_dir']) ? $_POST['current_dir'] : $modSettings['currentAttachmentUploadDir'])) { $errors[] = $real_path . ': ' . $txt['attach_dir_is_current']; } elseif (!empty($modSettings['basedirectory_for_attachments']) && $modSettings['basedirectory_for_attachments'] == $modSettings['attachmentUploadDir'][$id]) { $errors[] = $real_path . ': ' . $txt['attach_dir_is_current_bd']; } else { // Let's not try to delete a path with files in it. $num_attach = countAttachmentsInFolders($id); // A check to see if it's a used base dir. if (!empty($modSettings['attachment_basedirectories'])) { // Count any sub-folders. foreach ($modSettings['attachmentUploadDir'] as $sub) { if (strpos($sub, $real_path . DIRECTORY_SEPARATOR) !== false) { $num_attach++; } } } // It's safe to delete. So try to delete the folder also if ($num_attach == 0) { if (is_dir($real_path)) { $doit = true; } elseif (is_dir(BOARDDIR . DIRECTORY_SEPARATOR . $real_path)) { $doit = true; $real_path = BOARDDIR . DIRECTORY_SEPARATOR . $real_path; } if (isset($doit)) { unlink($real_path . '/.htaccess'); unlink($real_path . '/index.php'); if (!@rmdir($real_path)) { $error = $real_path . ': ' . $txt['attach_dir_no_delete']; } } // Remove it from the base directory list. if (empty($error) && !empty($modSettings['attachment_basedirectories'])) { unset($modSettings['attachment_basedirectories'][$id]); updateSettings(array('attachment_basedirectories' => serialize($modSettings['attachment_basedirectories']))); $modSettings['attachment_basedirectories'] = unserialize($modSettings['attachment_basedirectories']); } } else { $error = $real_path . ': ' . $txt['attach_dir_no_remove']; } if (empty($error)) { continue; } else { $errors[] = $error; } } } $new_dirs[$id] = $real_path; } // We need to make sure the current directory is right. if (empty($_POST['current_dir']) && !empty($modSettings['currentAttachmentUploadDir'])) { $_POST['current_dir'] = $modSettings['currentAttachmentUploadDir']; } // Find the current directory if there's no value carried, if (empty($_POST['current_dir']) || empty($new_dirs[$_POST['current_dir']])) { if (array_key_exists($modSettings['currentAttachmentUploadDir'], $modSettings['attachmentUploadDir'])) { $_POST['current_dir'] = $modSettings['currentAttachmentUploadDir']; } else { $_POST['current_dir'] = max(array_keys($modSettings['attachmentUploadDir'])); } } // If the user wishes to go back, update the last_dir array if ($_POST['current_dir'] != $modSettings['currentAttachmentUploadDir'] && !empty($modSettings['last_attachments_directory']) && (isset($modSettings['last_attachments_directory'][$_POST['current_dir']]) || isset($modSettings['last_attachments_directory'][0]))) { if (!is_array($modSettings['last_attachments_directory'])) { $modSettings['last_attachments_directory'] = unserialize($modSettings['last_attachments_directory']); } $num = substr(strrchr($modSettings['attachmentUploadDir'][$_POST['current_dir']], '_'), 1); if (is_numeric($num)) { // Need to find the base folder. $bid = -1; $use_subdirectories_for_attachments = 0; if (!empty($modSettings['attachment_basedirectories'])) { foreach ($modSettings['attachment_basedirectories'] as $bid => $base) { if (strpos($modSettings['attachmentUploadDir'][$_POST['current_dir']], $base . DIRECTORY_SEPARATOR) !== false) { $use_subdirectories_for_attachments = 1; break; } } } if ($use_subdirectories_for_attachments == 0 && strpos($modSettings['attachmentUploadDir'][$_POST['current_dir']], BOARDDIR . DIRECTORY_SEPARATOR) !== false) { $bid = 0; } $modSettings['last_attachments_directory'][$bid] = (int) $num; $modSettings['basedirectory_for_attachments'] = !empty($modSettings['basedirectory_for_attachments']) ? $modSettings['basedirectory_for_attachments'] : ''; $modSettings['use_subdirectories_for_attachments'] = !empty($modSettings['use_subdirectories_for_attachments']) ? $modSettings['use_subdirectories_for_attachments'] : 0; updateSettings(array('last_attachments_directory' => serialize($modSettings['last_attachments_directory']), 'basedirectory_for_attachments' => $bid == 0 ? $modSettings['basedirectory_for_attachments'] : $modSettings['attachment_basedirectories'][$bid], 'use_subdirectories_for_attachments' => $use_subdirectories_for_attachments)); } } // Going back to just one path? if (count($new_dirs) == 1) { // We might need to reset the paths. This loop will just loop through once. foreach ($new_dirs as $id => $dir) { if ($id != 1) { updateAttachmentIdFolder($id, 1); } $update = array('currentAttachmentUploadDir' => 1, 'attachmentUploadDir' => serialize(array(1 => $dir))); } } else { // Save it to the database. $update = array('currentAttachmentUploadDir' => $_POST['current_dir'], 'attachmentUploadDir' => serialize($new_dirs)); } if (!empty($update)) { updateSettings($update); } if (!empty($errors)) { $_SESSION['errors']['dir'] = $errors; } redirectexit('action=admin;area=manageattachments;sa=attachpaths;' . $context['session_var'] . '=' . $context['session_id']); } // Saving a base directory? if (isset($_REQUEST['save2'])) { checkSession(); // Changing the current base directory? $_POST['current_base_dir'] = (int) $_POST['current_base_dir']; if (empty($_POST['new_base_dir']) && !empty($_POST['current_base_dir'])) { if ($modSettings['basedirectory_for_attachments'] != $modSettings['attachmentUploadDir'][$_POST['current_base_dir']]) { $update = array('basedirectory_for_attachments' => $modSettings['attachmentUploadDir'][$_POST['current_base_dir']]); } //$modSettings['attachmentUploadDir'] = serialize($modSettings['attachmentUploadDir']); } if (isset($_POST['base_dir'])) { foreach ($_POST['base_dir'] as $id => $dir) { if (!empty($dir) && $dir != $modSettings['attachmentUploadDir'][$id]) { if (@rename($modSettings['attachmentUploadDir'][$id], $dir)) { $modSettings['attachmentUploadDir'][$id] = $dir; $modSettings['attachment_basedirectories'][$id] = $dir; $update = array('attachmentUploadDir' => serialize($modSettings['attachmentUploadDir']), 'attachment_basedirectories' => serialize($modSettings['attachment_basedirectories']), 'basedirectory_for_attachments' => $modSettings['attachmentUploadDir'][$_POST['current_base_dir']]); } } if (empty($dir)) { if ($id == $_POST['current_base_dir']) { $errors[] = $modSettings['attachmentUploadDir'][$id] . ': ' . $txt['attach_dir_is_current']; continue; } unset($modSettings['attachment_basedirectories'][$id]); $update = array('attachment_basedirectories' => serialize($modSettings['attachment_basedirectories']), 'basedirectory_for_attachments' => $modSettings['attachmentUploadDir'][$_POST['current_base_dir']]); } } } // Or adding a new one? if (!empty($_POST['new_base_dir'])) { require_once SUBSDIR . '/Attachments.subs.php'; $_POST['new_base_dir'] = htmlspecialchars($_POST['new_base_dir'], ENT_QUOTES, 'UTF-8'); $current_dir = $modSettings['currentAttachmentUploadDir']; if (!in_array($_POST['new_base_dir'], $modSettings['attachmentUploadDir'])) { if (!automanage_attachments_create_directory($_POST['new_base_dir'])) { $errors[] = $_POST['new_base_dir'] . ': ' . $txt['attach_dir_base_no_create']; } } $modSettings['currentAttachmentUploadDir'] = array_search($_POST['new_base_dir'], $modSettings['attachmentUploadDir']); if (!in_array($_POST['new_base_dir'], $modSettings['attachment_basedirectories'])) { $modSettings['attachment_basedirectories'][$modSettings['currentAttachmentUploadDir']] = $_POST['new_base_dir']; } ksort($modSettings['attachment_basedirectories']); $update = array('attachment_basedirectories' => serialize($modSettings['attachment_basedirectories']), 'basedirectory_for_attachments' => $_POST['new_base_dir'], 'currentAttachmentUploadDir' => $current_dir); } if (!empty($errors)) { $_SESSION['errors']['base'] = $errors; } if (!empty($update)) { updateSettings($update); } redirectexit('action=admin;area=manageattachments;sa=attachpaths;' . $context['session_var'] . '=' . $context['session_id']); } if (isset($_SESSION['errors'])) { if (is_array($_SESSION['errors'])) { $errors = array(); if (!empty($_SESSION['errors']['dir'])) { foreach ($_SESSION['errors']['dir'] as $error) { $errors['dir'][] = Util::htmlspecialchars($error, ENT_QUOTES); } } if (!empty($_SESSION['errors']['base'])) { foreach ($_SESSION['errors']['base'] as $error) { $errors['base'][] = Util::htmlspecialchars($error, ENT_QUOTES); } } } unset($_SESSION['errors']); } $listOptions = array('id' => 'attach_paths', 'base_href' => $scripturl . '?action=admin;area=manageattachments;sa=attachpaths;' . $context['session_var'] . '=' . $context['session_id'], 'title' => $txt['attach_paths'], 'get_items' => array('function' => 'list_getAttachDirs'), 'columns' => array('current_dir' => array('header' => array('value' => $txt['attach_current'], 'class' => 'centertext'), 'data' => array('function' => create_function('$rowData', ' return \'<input type="radio" name="current_dir" value="\' . $rowData[\'id\'] . \'" \' . ($rowData[\'current\'] ? \' checked="checked"\' : \'\') . (!empty($rowData[\'disable_current\']) ? \' disabled="disabled"\' : \'\') . \' class="input_radio" />\'; '), 'style' => 'width: 10%;', 'class' => 'centertext')), 'path' => array('header' => array('value' => $txt['attach_path']), 'data' => array('function' => create_function('$rowData', ' return \'<input type="hidden" name="dirs[\' . $rowData[\'id\'] . \']" value="\' . $rowData[\'path\'] . \'" /><input type="text" size="40" name="dirs[\' . $rowData[\'id\'] . \']" value="\' . $rowData[\'path\'] . \'"\' . (!empty($rowData[\'disable_base_dir\']) ? \' disabled="disabled"\' : \'\') . \' class="input_text"/>\'; '), 'style' => 'width: 40%;')), 'current_size' => array('header' => array('value' => $txt['attach_current_size']), 'data' => array('db' => 'current_size', 'style' => 'width: 15%;')), 'num_files' => array('header' => array('value' => $txt['attach_num_files']), 'data' => array('db' => 'num_files', 'style' => 'width: 15%;')), 'status' => array('header' => array('value' => $txt['attach_dir_status']), 'data' => array('db' => 'status', 'style' => 'width: 25%;'))), 'form' => array('href' => $scripturl . '?action=admin;area=manageattachments;sa=attachpaths;' . $context['session_var'] . '=' . $context['session_id']), 'additional_rows' => array(array('class' => 'submitbutton', 'position' => 'below_table_data', 'value' => ' <input type="hidden" name="' . $context['session_var'] . '" value="' . $context['session_id'] . '" /> <input type="submit" name="save" value="' . $txt['save'] . '" class="right_submit" /> <input type="submit" name="new_path" value="' . $txt['attach_add_path'] . '" class="right_submit" />'), empty($errors['dir']) ? array('position' => 'top_of_list', 'value' => $txt['attach_dir_desc'], 'style' => 'padding: 5px 10px;', 'class' => 'windowbg2 smalltext') : array('position' => 'top_of_list', 'value' => $txt['attach_dir_save_problem'] . '<br />' . implode('<br />', $errors['dir']), 'style' => 'padding-left: 35px;', 'class' => 'warningbox'))); require_once SUBSDIR . '/GenericList.class.php'; createList($listOptions); if (!empty($modSettings['attachment_basedirectories'])) { $listOptions2 = array('id' => 'base_paths', 'base_href' => $scripturl . '?action=admin;area=manageattachments;sa=attachpaths;' . $context['session_var'] . '=' . $context['session_id'], 'title' => $txt['attach_base_paths'], 'get_items' => array('function' => 'list_getBaseDirs'), 'columns' => array('current_dir' => array('header' => array('value' => $txt['attach_current'], 'class' => 'centertext'), 'data' => array('function' => create_function('$rowData', ' return \'<input type="radio" name="current_base_dir" value="\' . $rowData[\'id\'] . \'" \' . ($rowData[\'current\'] ? \' checked="checked"\' : \'\') . \' class="input_radio" />\'; '), 'style' => 'width: 10%;', 'class' => 'centertext')), 'path' => array('header' => array('value' => $txt['attach_path']), 'data' => array('db' => 'path', 'style' => 'width: 45%;')), 'num_dirs' => array('header' => array('value' => $txt['attach_num_dirs']), 'data' => array('db' => 'num_dirs', 'style' => 'width: 15%;')), 'status' => array('header' => array('value' => $txt['attach_dir_status']), 'data' => array('db' => 'status', 'style' => 'width: 15%;'))), 'form' => array('href' => $scripturl . '?action=admin;area=manageattachments;sa=attachpaths;' . $context['session_var'] . '=' . $context['session_id']), 'additional_rows' => array(array('class' => 'submitbutton', 'position' => 'below_table_data', 'value' => '<input type="hidden" name="' . $context['session_var'] . '" value="' . $context['session_id'] . '" /> <input type="submit" name="save2" value="' . $txt['save'] . '" class="right_submit" /> <input type="submit" name="new_base_path" value="' . $txt['attach_add_path'] . '" class="right_submit" />'), empty($errors['base']) ? array('position' => 'top_of_list', 'value' => $txt['attach_dir_base_desc'], 'style' => 'padding: 5px 10px;', 'class' => 'windowbg2 smalltext') : array('position' => 'top_of_list', 'value' => $txt['attach_dir_save_problem'] . '<br />' . implode('<br />', $errors['base']), 'style' => 'padding-left: 35px', 'class' => 'warningbox'))); createList($listOptions2); } // Fix up our template. $context[$context['admin_menu_name']]['current_subsection'] = 'attachpaths'; $context['page_title'] = $txt['attach_path_manage']; }
/** * Determines the current base directory and attachment directory * * What it does: * - Increments the above directory to the next availble slot * - Uses automanage_attachments_create_directory to create the incremental directory * * @package Attachments */ function automanage_attachments_by_space() { global $modSettings; if (!isset($modSettings['automanage_attachments']) || !empty($modSettings['automanage_attachments']) && $modSettings['automanage_attachments'] != 1) { return; } $basedirectory = !empty($modSettings['use_subdirectories_for_attachments']) ? $modSettings['basedirectory_for_attachments'] : BOARDDIR; // Just to be sure: I don't want directory separators at the end $sep = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' ? '\\/' : DIRECTORY_SEPARATOR; $basedirectory = rtrim($basedirectory, $sep); // Get the current base directory if (!empty($modSettings['use_subdirectories_for_attachments']) && !empty($modSettings['attachment_basedirectories'])) { $base_dir = array_search($modSettings['basedirectory_for_attachments'], $modSettings['attachment_basedirectories']); $base_dir = !empty($modSettings['automanage_attachments']) ? $base_dir : 0; } else { $base_dir = 0; } // Get the last attachment directory for that base directory if (empty($modSettings['last_attachments_directory'][$base_dir])) { $modSettings['last_attachments_directory'][$base_dir] = 0; } // And increment it. $modSettings['last_attachments_directory'][$base_dir]++; $updir = $basedirectory . DIRECTORY_SEPARATOR . 'attachments_' . $modSettings['last_attachments_directory'][$base_dir]; // make sure it exists and is writable if (automanage_attachments_create_directory($updir)) { $modSettings['currentAttachmentUploadDir'] = array_search($updir, $modSettings['attachmentUploadDir']); updateSettings(array('last_attachments_directory' => serialize($modSettings['last_attachments_directory']), 'currentAttachmentUploadDir' => $modSettings['currentAttachmentUploadDir'])); $modSettings['last_attachments_directory'] = unserialize($modSettings['last_attachments_directory']); return true; } else { return false; } }