diff options
Diffstat (limited to '')
| -rw-r--r-- | src/php_snuffleupagus.h | 2 | ||||
| -rw-r--r-- | src/snuffleupagus.c | 2 | ||||
| -rw-r--r-- | src/sp_config.h | 7 | ||||
| -rw-r--r-- | src/sp_config_keywords.c | 20 | ||||
| -rw-r--r-- | src/sp_utils.c | 16 | ||||
| -rw-r--r-- | src/tests/broken_configuration/broken_conf_invalid_log_media.phpt | 2 | ||||
| -rw-r--r-- | src/tests/syslog_simulation.phpt | 1 |
7 files changed, 39 insertions, 11 deletions
diff --git a/src/php_snuffleupagus.h b/src/php_snuffleupagus.h index be37cfa..adaa6c0 100644 --- a/src/php_snuffleupagus.h +++ b/src/php_snuffleupagus.h | |||
| @@ -141,7 +141,7 @@ sp_config_eval config_eval; | |||
| 141 | sp_config_wrapper config_wrapper; | 141 | sp_config_wrapper config_wrapper; |
| 142 | sp_config_session config_session; | 142 | sp_config_session config_session; |
| 143 | sp_config_ini config_ini; | 143 | sp_config_ini config_ini; |
| 144 | char config_log_media; | 144 | sp_config_log config_log_media; |
| 145 | int config_log_max_len; | 145 | int config_log_max_len; |
| 146 | u_long config_max_execution_depth; | 146 | u_long config_max_execution_depth; |
| 147 | bool config_server_encode; | 147 | bool config_server_encode; |
diff --git a/src/snuffleupagus.c b/src/snuffleupagus.c index 6264d22..8b7f11d 100644 --- a/src/snuffleupagus.c +++ b/src/snuffleupagus.c | |||
| @@ -356,7 +356,7 @@ static void dump_config(void) { | |||
| 356 | // global | 356 | // global |
| 357 | add_assoc_bool(&arr, SP_TOKEN_GLOBAL "." SP_TOKEN_ENCRYPTION_KEY, SPCFG(encryption_key) && ZSTR_LEN(SPCFG(encryption_key))); | 357 | add_assoc_bool(&arr, SP_TOKEN_GLOBAL "." SP_TOKEN_ENCRYPTION_KEY, SPCFG(encryption_key) && ZSTR_LEN(SPCFG(encryption_key))); |
| 358 | ADD_ASSOC_ZSTR(&arr, SP_TOKEN_GLOBAL "." SP_TOKEN_ENV_VAR, SPCFG(cookies_env_var)); | 358 | ADD_ASSOC_ZSTR(&arr, SP_TOKEN_GLOBAL "." SP_TOKEN_ENV_VAR, SPCFG(cookies_env_var)); |
| 359 | add_assoc_long(&arr, SP_TOKEN_GLOBAL "." SP_TOKEN_LOG_MEDIA, SPCFG(log_media)); | 359 | //add_assoc_long(&arr, SP_TOKEN_GLOBAL "." SP_TOKEN_LOG_MEDIA, SPCFG(log_media)); |
| 360 | add_assoc_long(&arr, SP_TOKEN_GLOBAL "." SP_TOKEN_LOG_MAX_LEN, SPCFG(log_max_len)); | 360 | add_assoc_long(&arr, SP_TOKEN_GLOBAL "." SP_TOKEN_LOG_MAX_LEN, SPCFG(log_max_len)); |
| 361 | add_assoc_long(&arr, SP_TOKEN_GLOBAL "." SP_TOKEN_MAX_EXECUTION_DEPTH, SPCFG(max_execution_depth)); | 361 | add_assoc_long(&arr, SP_TOKEN_GLOBAL "." SP_TOKEN_MAX_EXECUTION_DEPTH, SPCFG(max_execution_depth)); |
| 362 | add_assoc_bool(&arr, SP_TOKEN_GLOBAL "." SP_TOKEN_SERVER_ENCODE, SPCFG(server_encode)); | 362 | add_assoc_bool(&arr, SP_TOKEN_GLOBAL "." SP_TOKEN_SERVER_ENCODE, SPCFG(server_encode)); |
diff --git a/src/sp_config.h b/src/sp_config.h index 6bfb009..8886bc6 100644 --- a/src/sp_config.h +++ b/src/sp_config.h | |||
| @@ -19,10 +19,15 @@ typedef enum { | |||
| 19 | SP_PHP_TYPE_REFERENCE = IS_REFERENCE | 19 | SP_PHP_TYPE_REFERENCE = IS_REFERENCE |
| 20 | } sp_php_type; | 20 | } sp_php_type; |
| 21 | 21 | ||
| 22 | typedef enum { SP_LOG_ZEND = 0, SP_LOG_SYSLOG = 1 } sp_log_media; | ||
| 23 | 22 | ||
| 24 | typedef enum { SP_INI_UNSET = 0, SP_INI_READONLY = 1, SP_INI_READWRITE = -1 } sp_ini_permission; | 23 | typedef enum { SP_INI_UNSET = 0, SP_INI_READONLY = 1, SP_INI_READWRITE = -1 } sp_ini_permission; |
| 25 | 24 | ||
| 25 | typedef enum { SP_LOG_ZEND = 0, SP_LOG_SYSLOG = 1, SP_LOG_FILE = 2 } sp_log_media_type; | ||
| 26 | typedef struct { | ||
| 27 | sp_log_media_type type; | ||
| 28 | char* path; | ||
| 29 | } sp_config_log; | ||
| 30 | |||
| 26 | typedef struct { | 31 | typedef struct { |
| 27 | int ip_version; | 32 | int ip_version; |
| 28 | union { | 33 | union { |
diff --git a/src/sp_config_keywords.c b/src/sp_config_keywords.c index a5b4c5d..7f41e38 100644 --- a/src/sp_config_keywords.c +++ b/src/sp_config_keywords.c | |||
| @@ -57,19 +57,27 @@ SP_PARSE_FN(parse_session) { | |||
| 57 | } | 57 | } |
| 58 | 58 | ||
| 59 | SP_PARSEKW_FN(parse_log_media) { | 59 | SP_PARSEKW_FN(parse_log_media) { |
| 60 | sp_config_log *cfg = (sp_config_log*)retval; | ||
| 61 | cfg->path = NULL; | ||
| 62 | |||
| 60 | SP_PARSE_ARG(value); | 63 | SP_PARSE_ARG(value); |
| 61 | 64 | ||
| 62 | if (!strcmp(ZSTR_VAL(value), "php")) { | 65 | if (!strcmp(ZSTR_VAL(value), "php")) { |
| 63 | *(char*)retval = SP_LOG_ZEND; | 66 | cfg->type = SP_LOG_ZEND; |
| 64 | zend_string_release_ex(value, 1); | 67 | zend_string_release_ex(value, 1); |
| 65 | return SP_PARSER_SUCCESS; | 68 | return SP_PARSER_STOP; |
| 66 | } else if (!strcmp(ZSTR_VAL(value), "syslog")) { | 69 | } else if (!strcmp(ZSTR_VAL(value), "syslog")) { |
| 67 | *(char*)retval = SP_LOG_SYSLOG; | 70 | cfg->type = SP_LOG_SYSLOG; |
| 71 | zend_string_release_ex(value, 1); | ||
| 72 | return SP_PARSER_STOP; | ||
| 73 | } else if (!strncmp(ZSTR_VAL(value), "file:", strlen("file:"))) { | ||
| 74 | cfg->type = SP_LOG_FILE; | ||
| 75 | cfg->path = strdup(ZSTR_VAL(value)+strlen("file:")); | ||
| 68 | zend_string_release_ex(value, 1); | 76 | zend_string_release_ex(value, 1); |
| 69 | return SP_PARSER_SUCCESS; | 77 | return SP_PARSER_STOP; |
| 70 | } | 78 | } |
| 71 | 79 | ||
| 72 | sp_log_err("config", "." SP_TOKEN_LOG_MEDIA "() only supports 'syslog' or 'php' on line %zu", kw->lineno); | 80 | sp_log_err("config", "." SP_TOKEN_LOG_MEDIA "() only supports 'syslog', 'file:' or 'php' on line %zu, got '%s' instead", kw->lineno, ZSTR_VAL(value)); |
| 73 | 81 | ||
| 74 | return SP_PARSER_ERROR; | 82 | return SP_PARSER_ERROR; |
| 75 | } | 83 | } |
diff --git a/src/sp_utils.c b/src/sp_utils.c index 775ff95..41eb638 100644 --- a/src/sp_utils.c +++ b/src/sp_utils.c | |||
| @@ -43,7 +43,7 @@ void sp_log_msgf(char const* const restrict feature, int level, int type, | |||
| 43 | break; | 43 | break; |
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | switch (SPCFG(log_media)) { | 46 | switch (SPCFG(log_media).type) { |
| 47 | case SP_LOG_SYSLOG: { | 47 | case SP_LOG_SYSLOG: { |
| 48 | const char* error_filename = zend_get_executed_filename(); | 48 | const char* error_filename = zend_get_executed_filename(); |
| 49 | int syslog_level = (level == E_ERROR) ? LOG_ERR : LOG_INFO; | 49 | int syslog_level = (level == E_ERROR) ? LOG_ERR : LOG_INFO; |
| @@ -54,6 +54,20 @@ void sp_log_msgf(char const* const restrict feature, int level, int type, | |||
| 54 | closelog(); | 54 | closelog(); |
| 55 | break; | 55 | break; |
| 56 | } | 56 | } |
| 57 | case SP_LOG_FILE: { | ||
| 58 | FILE* logf = fopen(SPCFG(log_media).path, "a"); | ||
| 59 | if (!logf) { | ||
| 60 | zend_error(level, "[snuffleupagus][%s][logging][log] unable to open %s to log", client_ip, | ||
| 61 | SPCFG(log_media).path); | ||
| 62 | } else { | ||
| 63 | int error_lineno = zend_get_executed_lineno(TSRMLS_C); | ||
| 64 | const char* error_filename = zend_get_executed_filename(); | ||
| 65 | fprintf(logf, "[snuffleupagus][%s][%s][%s] %s in %s on line %d\n", | ||
| 66 | client_ip, feature, logtype, msg, error_filename, error_lineno); | ||
| 67 | fclose(logf); | ||
| 68 | } | ||
| 69 | break; | ||
| 70 | } | ||
| 57 | case SP_LOG_ZEND: | 71 | case SP_LOG_ZEND: |
| 58 | default: | 72 | default: |
| 59 | zend_error(level, "[snuffleupagus][%s][%s][%s] %s", client_ip, feature, | 73 | zend_error(level, "[snuffleupagus][%s][%s][%s] %s", client_ip, feature, |
diff --git a/src/tests/broken_configuration/broken_conf_invalid_log_media.phpt b/src/tests/broken_configuration/broken_conf_invalid_log_media.phpt index af0d61f..fef055c 100644 --- a/src/tests/broken_configuration/broken_conf_invalid_log_media.phpt +++ b/src/tests/broken_configuration/broken_conf_invalid_log_media.phpt | |||
| @@ -7,7 +7,7 @@ sp.configuration_file={PWD}/config/broken_conf_invalid_log_media.ini | |||
| 7 | error_log=/dev/null | 7 | error_log=/dev/null |
| 8 | --FILE-- | 8 | --FILE-- |
| 9 | --EXPECTF-- | 9 | --EXPECTF-- |
| 10 | Fatal error: [snuffleupagus][0.0.0.0][config][log] .log_media() only supports 'syslog' or 'php' on line 1 in Unknown on line 0 | 10 | Fatal error: [snuffleupagus][0.0.0.0][config][log] .log_media() only supports 'syslog', 'file:' or 'php' on line 1, got 'pouet' instead in Unknown on line 0 |
| 11 | 11 | ||
| 12 | Fatal error: [snuffleupagus][0.0.0.0][config][log] Invalid configuration file in Unknown on line 0 | 12 | Fatal error: [snuffleupagus][0.0.0.0][config][log] Invalid configuration file in Unknown on line 0 |
| 13 | Could not startup. | 13 | Could not startup. |
diff --git a/src/tests/syslog_simulation.phpt b/src/tests/syslog_simulation.phpt index 4b12f58..ff78928 100644 --- a/src/tests/syslog_simulation.phpt +++ b/src/tests/syslog_simulation.phpt | |||
| @@ -9,3 +9,4 @@ sp.configuration_file={PWD}/config/syslog_simulation.ini | |||
| 9 | var_dump(unserialize('s:1:"a";')); | 9 | var_dump(unserialize('s:1:"a";')); |
| 10 | ?> | 10 | ?> |
| 11 | --EXPECTF-- | 11 | --EXPECTF-- |
| 12 | string(1) "a" | ||
