You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
357 lines
8.2 KiB
357 lines
8.2 KiB
--- a/crack.c 2016-12-19 16:04:09.244782234 -0500
|
|
+++ b/crack.c 2016-12-20 09:20:11.903140742 -0500
|
|
@@ -36,13 +36,31 @@
|
|
/* True global resources - no need for thread safety here */
|
|
static int le_crack;
|
|
|
|
+ZEND_BEGIN_ARG_INFO_EX(crack_opendict_args, 0, ZEND_RETURN_VALUE, 1)
|
|
+ ZEND_ARG_INFO(0, dictionary)
|
|
+ZEND_END_ARG_INFO()
|
|
+
|
|
+ZEND_BEGIN_ARG_INFO_EX(crack_closedict_args, 0, ZEND_RETURN_VALUE, 0)
|
|
+ ZEND_ARG_INFO(0, dictionary)
|
|
+ZEND_END_ARG_INFO()
|
|
+
|
|
+ZEND_BEGIN_ARG_INFO_EX(crack_check_args, 0, ZEND_RETURN_VALUE, 1)
|
|
+ ZEND_ARG_INFO(0, password)
|
|
+ ZEND_ARG_INFO(0, username)
|
|
+ ZEND_ARG_INFO(0, gecos)
|
|
+ ZEND_ARG_INFO(0, dictionary)
|
|
+ZEND_END_ARG_INFO()
|
|
+
|
|
+ZEND_BEGIN_ARG_INFO_EX(crack_getlastmessage_args, 0, ZEND_RETURN_VALUE, 0)
|
|
+ZEND_END_ARG_INFO()
|
|
+
|
|
/* {{{ crack_functions[]
|
|
*/
|
|
zend_function_entry crack_functions[] = {
|
|
- PHP_FE(crack_opendict, NULL)
|
|
- PHP_FE(crack_closedict, NULL)
|
|
- PHP_FE(crack_check, NULL)
|
|
- PHP_FE(crack_getlastmessage, NULL)
|
|
+ ZEND_FE(crack_opendict, crack_opendict_args)
|
|
+ ZEND_FE(crack_closedict, crack_closedict_args)
|
|
+ ZEND_FE(crack_check, crack_check_args)
|
|
+ ZEND_FE(crack_getlastmessage, crack_getlastmessage_args)
|
|
{NULL, NULL, NULL}
|
|
};
|
|
/* }}} */
|
|
@@ -55,7 +73,7 @@
|
|
#endif
|
|
"crack",
|
|
crack_functions,
|
|
- PHP_MINIT(crack),
|
|
+ PHP_MINIT(crack),
|
|
PHP_MSHUTDOWN(crack),
|
|
PHP_RINIT(crack),
|
|
PHP_RSHUTDOWN(crack),
|
|
@@ -84,7 +102,11 @@
|
|
static void php_crack_init_globals(zend_crack_globals *crack_globals)
|
|
{
|
|
crack_globals->last_message = NULL;
|
|
+#if PHP_VERSION_ID >= 70000
|
|
+ crack_globals->default_dict = NULL;
|
|
+#else
|
|
crack_globals->default_dict = -1;
|
|
+#endif
|
|
}
|
|
/* }}} */
|
|
|
|
@@ -95,7 +117,7 @@
|
|
char *filename;
|
|
int filename_len;
|
|
int result = SUCCESS;
|
|
-
|
|
+
|
|
#if PHP_VERSION_ID < 50400
|
|
if (PG(safe_mode)) {
|
|
filename_len = strlen(path) + 10;
|
|
@@ -103,7 +125,7 @@
|
|
if (NULL == filename) {
|
|
return FAILURE;
|
|
}
|
|
-
|
|
+
|
|
memset(filename, '\0', filename_len);
|
|
strcpy(filename, path);
|
|
strcat(filename, ".pwd");
|
|
@@ -111,7 +133,7 @@
|
|
efree(filename);
|
|
return FAILURE;
|
|
}
|
|
-
|
|
+
|
|
memset(filename, '\0', filename_len);
|
|
strcpy(filename, path);
|
|
strcat(filename, ".pwi");
|
|
@@ -119,7 +141,7 @@
|
|
efree(filename);
|
|
return FAILURE;
|
|
}
|
|
-
|
|
+
|
|
memset(filename, '\0', filename_len);
|
|
strcpy(filename, path);
|
|
strcat(filename, ".hwm");
|
|
@@ -129,39 +151,64 @@
|
|
}
|
|
}
|
|
#endif
|
|
-
|
|
+
|
|
if (php_check_open_basedir(path TSRMLS_CC)) {
|
|
return FAILURE;
|
|
}
|
|
-
|
|
+
|
|
return SUCCESS;
|
|
}
|
|
/* }}} */
|
|
|
|
/* {{{ php_crack_set_default_dict
|
|
*/
|
|
+#if PHP_VERSION_ID >= 70000
|
|
+static void php_crack_set_default_dict(zend_resource *id)
|
|
+{
|
|
+ if (CRACKG(default_dict) != NULL) {
|
|
+ zend_list_close(CRACKG(default_dict));
|
|
+ }
|
|
+
|
|
+ CRACKG(default_dict) = id;
|
|
+ id->gc.refcount++;
|
|
+}
|
|
+#else
|
|
static void php_crack_set_default_dict(int id TSRMLS_DC)
|
|
{
|
|
if (CRACKG(default_dict) != -1) {
|
|
zend_list_delete(CRACKG(default_dict));
|
|
}
|
|
-
|
|
+
|
|
CRACKG(default_dict) = id;
|
|
zend_list_addref(id);
|
|
}
|
|
+#endif
|
|
/* }}} */
|
|
|
|
/* {{{ php_crack_get_default_dict
|
|
*/
|
|
+#if PHP_VERSION_ID >= 70000
|
|
+static zend_resource * php_crack_get_default_dict(INTERNAL_FUNCTION_PARAMETERS)
|
|
+#else
|
|
static int php_crack_get_default_dict(INTERNAL_FUNCTION_PARAMETERS)
|
|
+#endif
|
|
{
|
|
+#if PHP_VERSION_ID >= 70000
|
|
+ if ((NULL == CRACKG(default_dict)) && (NULL != CRACKG(default_dictionary))) {
|
|
+#else
|
|
if ((-1 == CRACKG(default_dict)) && (NULL != CRACKG(default_dictionary))) {
|
|
+#endif
|
|
CRACKLIB_PWDICT *pwdict;
|
|
printf("trying to open: %s\n", CRACKG(default_dictionary));
|
|
pwdict = cracklib_pw_open(CRACKG(default_dictionary), "r");
|
|
if (NULL != pwdict) {
|
|
+#if PHP_VERSION_ID >= 70000
|
|
+ ZVAL_RES(return_value, zend_register_resource(pwdict, le_crack));
|
|
+ php_crack_set_default_dict(Z_RES_P(return_value));
|
|
+#else
|
|
ZEND_REGISTER_RESOURCE(return_value, pwdict, le_crack);
|
|
php_crack_set_default_dict(Z_LVAL_P(return_value) TSRMLS_CC);
|
|
+#endif
|
|
}
|
|
}
|
|
|
|
@@ -171,7 +218,11 @@
|
|
|
|
/* {{{ php_crack_module_dtor
|
|
*/
|
|
+#if PHP_VERSION_ID >= 70000
|
|
+static void php_crack_module_dtor(zend_resource *rsrc)
|
|
+#else
|
|
static void php_crack_module_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
|
|
+#endif
|
|
{
|
|
CRACKLIB_PWDICT *pwdict = (CRACKLIB_PWDICT *) rsrc->ptr;
|
|
|
|
@@ -191,7 +242,9 @@
|
|
|
|
REGISTER_INI_ENTRIES();
|
|
le_crack = zend_register_list_destructors_ex(php_crack_module_dtor, NULL, "crack dictionary", module_number);
|
|
+#if PHP_VERSION_ID < 70000
|
|
Z_TYPE(crack_module_entry) = type;
|
|
+#endif
|
|
|
|
return SUCCESS;
|
|
}
|
|
@@ -210,7 +263,11 @@
|
|
PHP_RINIT_FUNCTION(crack)
|
|
{
|
|
CRACKG(last_message) = NULL;
|
|
+#if PHP_VERSION_ID >= 70000
|
|
+ CRACKG(default_dict) = NULL;
|
|
+#else
|
|
CRACKG(default_dict) = -1;
|
|
+#endif
|
|
|
|
return SUCCESS;
|
|
}
|
|
@@ -245,7 +302,7 @@
|
|
PHP_FUNCTION(crack_opendict)
|
|
{
|
|
char *path;
|
|
- int path_len;
|
|
+ size_t path_len;
|
|
CRACKLIB_PWDICT *pwdict;
|
|
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &path, &path_len) == FAILURE) {
|
|
@@ -265,9 +322,14 @@
|
|
#endif
|
|
RETURN_FALSE;
|
|
}
|
|
-
|
|
+
|
|
+#if PHP_VERSION_ID >= 70000
|
|
+ RETURN_RES(zend_register_resource(pwdict, le_crack));
|
|
+ php_crack_set_default_dict(Z_RES_P(return_value));
|
|
+#else
|
|
ZEND_REGISTER_RESOURCE(return_value, pwdict, le_crack);
|
|
php_crack_set_default_dict(Z_LVAL_P(return_value) TSRMLS_CC);
|
|
+#endif
|
|
}
|
|
/* }}} */
|
|
|
|
@@ -276,7 +338,11 @@
|
|
PHP_FUNCTION(crack_closedict)
|
|
{
|
|
zval *dictionary = NULL;
|
|
+#if PHP_VERSION_ID >= 70000
|
|
+ zend_resource *id;
|
|
+#else
|
|
int id = -1;
|
|
+#endif
|
|
CRACKLIB_PWDICT *pwdict;
|
|
|
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &dictionary)) {
|
|
@@ -285,7 +351,11 @@
|
|
|
|
if (NULL == dictionary) {
|
|
id = php_crack_get_default_dict(INTERNAL_FUNCTION_PARAM_PASSTHRU);
|
|
+#if PHP_VERSION_ID >= 70000
|
|
+ if (id == NULL) {
|
|
+#else
|
|
if (id == -1) {
|
|
+#endif
|
|
#if ZEND_MODULE_API_NO >= 20021010
|
|
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not open default crack dicionary");
|
|
#else
|
|
@@ -294,8 +364,21 @@
|
|
RETURN_FALSE;
|
|
}
|
|
}
|
|
+#if PHP_VERSION_ID >= 70000
|
|
+ if((pwdict = (CRACKLIB_PWDICT *)zend_fetch_resource(Z_RES_P(dictionary), "crack dictionary", le_crack)) == NULL)
|
|
+ {
|
|
+ RETURN_FALSE;
|
|
+ }
|
|
+ if (NULL == dictionary) {
|
|
+ zend_list_close(CRACKG(default_dict));
|
|
+ CRACKG(default_dict) = NULL;
|
|
+ }
|
|
+ else {
|
|
+ zend_list_close(Z_RES_P(dictionary));
|
|
+ }
|
|
+#else
|
|
ZEND_FETCH_RESOURCE(pwdict, CRACKLIB_PWDICT *, &dictionary, id, "crack dictionary", le_crack);
|
|
-
|
|
+
|
|
if (NULL == dictionary) {
|
|
zend_list_delete(CRACKG(default_dict));
|
|
CRACKG(default_dict) = -1;
|
|
@@ -303,7 +386,7 @@
|
|
else {
|
|
zend_list_delete(Z_RESVAL_P(dictionary));
|
|
}
|
|
-
|
|
+#endif
|
|
RETURN_TRUE;
|
|
}
|
|
/* }}} */
|
|
@@ -314,14 +397,18 @@
|
|
{
|
|
zval *dictionary = NULL;
|
|
char *password = NULL;
|
|
- int password_len;
|
|
+ size_t password_len;
|
|
char *username = NULL;
|
|
- int username_len;
|
|
+ size_t username_len;
|
|
char *gecos = NULL;
|
|
- int gecos_len;
|
|
+ size_t gecos_len;
|
|
char *message;
|
|
CRACKLIB_PWDICT *pwdict;
|
|
+#if PHP_VERSION_ID >= 70000
|
|
+ zend_resource *crack_res;
|
|
+#else
|
|
int id = -1;
|
|
+#endif
|
|
|
|
if (NULL != CRACKG(last_message)) {
|
|
efree(CRACKG(last_message));
|
|
@@ -335,6 +422,21 @@
|
|
}
|
|
|
|
if (NULL == dictionary) {
|
|
+#if PHP_VERSION_ID >= 70000
|
|
+ crack_res = php_crack_get_default_dict(INTERNAL_FUNCTION_PARAM_PASSTHRU);
|
|
+ if (crack_res == NULL || crack_res->ptr == NULL) {
|
|
+ php_error(E_WARNING, "Could not open default crack dicionary");
|
|
+ RETURN_FALSE;
|
|
+ }
|
|
+
|
|
+ }
|
|
+ else {
|
|
+ if((pwdict = (CRACKLIB_PWDICT *)zend_fetch_resource(Z_RES_P(dictionary), "crack dictionary", le_crack)) == NULL) {
|
|
+ php_error(E_WARNING, "Could not open crack dicionary resource");
|
|
+ RETURN_FALSE;
|
|
+ }
|
|
+ }
|
|
+#else
|
|
id = php_crack_get_default_dict(INTERNAL_FUNCTION_PARAM_PASSTHRU);
|
|
if (id == -1) {
|
|
#if ZEND_MODULE_API_NO >= 20021010
|
|
@@ -346,6 +448,7 @@
|
|
}
|
|
}
|
|
ZEND_FETCH_RESOURCE(pwdict, CRACKLIB_PWDICT *, &dictionary, id, "crack dictionary", le_crack);
|
|
+#endif
|
|
|
|
message = cracklib_fascist_look_ex(pwdict, password, username, gecos);
|
|
|
|
@@ -377,7 +480,11 @@
|
|
RETURN_FALSE;
|
|
}
|
|
|
|
+#if PHP_VERSION_ID >= 70000
|
|
+ RETURN_STRING(CRACKG(last_message));
|
|
+#else
|
|
RETURN_STRING(CRACKG(last_message), 1);
|
|
+#endif
|
|
}
|
|
/* }}} */
|
|
|
|
--- a/php_crack.h 2005-09-21 05:00:06.000000000 -0400
|
|
+++ b/php_crack.h 2016-12-19 16:51:22.449321851 -0500
|
|
@@ -52,7 +52,11 @@
|
|
ZEND_BEGIN_MODULE_GLOBALS(crack)
|
|
char *default_dictionary;
|
|
char *last_message;
|
|
+#if PHP_VERSION_ID >= 70000
|
|
+ zend_resource *default_dict;
|
|
+#else
|
|
int default_dict;
|
|
+#endif
|
|
ZEND_END_MODULE_GLOBALS(crack)
|
|
|
|
#ifdef ZTS
|