예제 #1
0
/**
 * 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" />&nbsp;<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" />&nbsp;<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'];
    }
예제 #3
0
/**
 * 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;
    }
}