mirror of
https://github.com/owasp-modsecurity/ModSecurity.git
synced 2026-01-13 06:57:10 +03:00
Implemented SecUploadFileMode. See #448.
This commit is contained in:
@@ -69,6 +69,7 @@ void *create_directory_config(apr_pool_t *mp, char *path) {
|
||||
dcfg->upload_dir = NOT_SET_P;
|
||||
dcfg->upload_keep_files = NOT_SET;
|
||||
dcfg->upload_validates_files = NOT_SET;
|
||||
dcfg->upload_filemode = NOT_SET;
|
||||
|
||||
/* These are only used during the configuration process. */
|
||||
dcfg->tmp_chain_starter = NULL;
|
||||
@@ -346,6 +347,8 @@ void *merge_directory_configs(apr_pool_t *mp, void *_parent, void *_child) {
|
||||
? parent->upload_keep_files : child->upload_keep_files);
|
||||
merged->upload_validates_files = (child->upload_validates_files == NOT_SET
|
||||
? parent->upload_validates_files : child->upload_validates_files);
|
||||
merged->upload_filemode = (child->upload_filemode == NOT_SET
|
||||
? parent->upload_filemode : child->upload_filemode);
|
||||
|
||||
/* Misc */
|
||||
merged->data_dir = (child->data_dir == NOT_SET_P
|
||||
@@ -407,6 +410,7 @@ void init_directory_config(directory_config *dcfg) {
|
||||
if (dcfg->upload_dir == NOT_SET_P) dcfg->upload_dir = NULL;
|
||||
if (dcfg->upload_keep_files == NOT_SET) dcfg->upload_keep_files = KEEP_FILES_OFF;
|
||||
if (dcfg->upload_validates_files == NOT_SET) dcfg->upload_validates_files = 0;
|
||||
if (dcfg->upload_filemode == NOT_SET) dcfg->upload_filemode = 0600;
|
||||
|
||||
/* Misc */
|
||||
if (dcfg->data_dir == NOT_SET_P) dcfg->data_dir = NULL;
|
||||
@@ -1058,6 +1062,26 @@ static const char *cmd_upload_dir(cmd_parms *cmd, void *_dcfg, const char *p1) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static const char *cmd_upload_filemode(cmd_parms *cmd, void *_dcfg, const char *p1) {
|
||||
directory_config *dcfg = (directory_config *)_dcfg;
|
||||
|
||||
if (dcfg == NULL) return NULL;
|
||||
|
||||
if (strcasecmp(p1, "default") == 0) {
|
||||
dcfg->upload_filemode = NOT_SET;
|
||||
}
|
||||
else {
|
||||
long int mode = strtol(p1, NULL, 8); /* expects octal mode */
|
||||
if ((mode == LONG_MAX)||(mode == LONG_MIN)||(mode <= 0)||(mode > 0777)) {
|
||||
return apr_psprintf(cmd->pool, "ModSecurity: Invalid value for SecUploadFileMode: %s", p1);
|
||||
}
|
||||
|
||||
dcfg->upload_filemode = (int)mode;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static const char *cmd_upload_keep_files(cmd_parms *cmd, void *_dcfg, const char *p1) {
|
||||
directory_config *dcfg = (directory_config *)_dcfg;
|
||||
|
||||
@@ -1362,6 +1386,14 @@ const command_rec module_directives[] = {
|
||||
"" // TODO
|
||||
),
|
||||
|
||||
AP_INIT_TAKE1 (
|
||||
"SecUploadFileMode",
|
||||
cmd_upload_filemode,
|
||||
NULL,
|
||||
CMD_SCOPE_ANY,
|
||||
"octal permissions mode for uploaded files"
|
||||
),
|
||||
|
||||
AP_INIT_TAKE1 (
|
||||
"SecUploadKeepFiles",
|
||||
cmd_upload_keep_files,
|
||||
|
||||
@@ -377,6 +377,7 @@ struct directory_config {
|
||||
const char *upload_dir;
|
||||
int upload_keep_files;
|
||||
int upload_validates_files;
|
||||
int upload_filemode;
|
||||
|
||||
/* Used only in the configuration phase. */
|
||||
msre_rule *tmp_chain_starter;
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
*
|
||||
*/
|
||||
#include <ctype.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "msc_multipart.h"
|
||||
#include "msc_util.h"
|
||||
@@ -377,6 +378,21 @@ static int multipart_process_part_data(modsec_rec *msr, char **error_msg) {
|
||||
|
||||
msr_log(msr, 4, "Multipart: Created temporary file: %s",
|
||||
log_escape_nq(msr->mp, msr->mpd->mpp->tmp_file_name));
|
||||
|
||||
#if (!(defined(WIN32) || defined(NETWARE)))
|
||||
if (msr->txcfg->debuglog_level >= 9) {
|
||||
msr_log(msr, 9, "Multipart: Changing file mode to %04o: %s", msr->txcfg->upload_filemode, log_escape_nq(msr->mp, msr->mpd->mpp->tmp_file_name));
|
||||
}
|
||||
if (fchmod(msr->mpd->mpp->tmp_file_fd, msr->txcfg->upload_filemode) < 0) {
|
||||
|
||||
char errbuf[256];
|
||||
if (msr->txcfg->debuglog_level >= 3) {
|
||||
msr_log(msr, 3, "Multipart: Could not change mode on \"%s\" (%d): %s",
|
||||
log_escape_nq(msr->mp, msr->mpd->mpp->tmp_file_name),
|
||||
errno, apr_strerror(APR_FROM_OS_ERROR(errno), errbuf, 256));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* write the reserve first */
|
||||
|
||||
Reference in New Issue
Block a user