Skip to content

Commit 7794925

Browse files
committed
Merge branch 'pr-225'
2 parents 9836acc + a21750f commit 7794925

File tree

3 files changed

+85
-2
lines changed

3 files changed

+85
-2
lines changed

tests/util_test.c

+21
Original file line numberDiff line numberDiff line change
@@ -279,8 +279,29 @@ static void test_filter_printf(void) {
279279
printf("test_filter_printf OK\n");
280280
}
281281

282+
static void test_rfc4515_replace(void) {
283+
assert(rfc4515_length("", NULL) == 1);
284+
assert(rfc4515_length(" ", NULL) == 2);
285+
assert(rfc4515_length("test1234567890_.", NULL) == 17);
286+
assert(rfc4515_length("\\test\\test\\", NULL) == 18);
287+
assert(rfc4515_length("*test*test*", NULL) == 18);
288+
assert(rfc4515_length("(test(test(", NULL) == 18);
289+
assert(rfc4515_length(")test)test)", NULL) == 18);
290+
assert(rfc4515_length("\\\\**(())", NULL) == 25);
291+
292+
assert(!strcmp(rfc4515_replace(""), ""));
293+
assert(!strcmp(rfc4515_replace(" "), " "));
294+
assert(!strcmp(rfc4515_replace("test1234567890_."), "test1234567890_."));
295+
assert(!strcmp(rfc4515_replace("\\test\\test\\"), "\\5Ctest\\5Ctest\\5C"));
296+
assert(!strcmp(rfc4515_replace("*test*test*"), "\\2Atest\\2Atest\\2A"));
297+
assert(!strcmp(rfc4515_replace("(test(test("), "\\28test\\28test\\28"));
298+
assert(!strcmp(rfc4515_replace(")test)test)"), "\\29test\\29test\\29"));
299+
assert(!strcmp(rfc4515_replace("\\\\**(())"), "\\5C\\5C\\2A\\2A\\28\\28\\29\\29"));
300+
printf("test_rfc4515_replace OK\n");
301+
}
282302
int main (void) {
283303
test_filter_printf();
304+
test_rfc4515_replace();
284305
test_get_user_cfgfile_path();
285306
test_check_user_token();
286307
#if HAVE_CR

util.c

+61-2
Original file line numberDiff line numberDiff line change
@@ -783,7 +783,66 @@ size_t filter_result_len(const char *filter, const char *user, char *output) {
783783
}
784784

785785
char *filter_printf(const char *filter, const char *user) {
786-
char *result = malloc(filter_result_len(filter, user, NULL));
787-
filter_result_len(filter, user, result);
786+
char *user_rfc4515 = rfc4515_replace(user);
787+
char *result = malloc(filter_result_len(filter, user_rfc4515, NULL));
788+
filter_result_len(filter, user_rfc4515, result);
789+
free(user_rfc4515);
788790
return result;
789791
}
792+
793+
size_t rfc4515_length (const char* in, char* out)
794+
{
795+
const char* pos = NULL;
796+
size_t result = 0;
797+
const char specials[] = "\\*()";
798+
799+
do
800+
{
801+
pos = strpbrk(in, specials);
802+
803+
size_t len = 0;
804+
if(pos != NULL)
805+
{
806+
len = pos - in;
807+
}
808+
else
809+
{
810+
len = strlen(in);
811+
}
812+
813+
if(out != NULL)
814+
{
815+
strncpy(out, in, len);
816+
out += len;
817+
}
818+
819+
result += len;
820+
in += len;
821+
822+
if(pos != NULL)
823+
{
824+
if(out != NULL)
825+
{
826+
snprintf(out, 4, "%c%02X", 0x5c, *pos);
827+
out += 3;
828+
}
829+
830+
in += sizeof(char);
831+
result += 3;
832+
}
833+
} while (pos != NULL);
834+
835+
if(out != NULL)
836+
{
837+
*out = '\0';
838+
}
839+
840+
return (result + sizeof(char));
841+
}
842+
843+
char* rfc4515_replace(const char* in)
844+
{
845+
char* result = (char*)malloc(rfc4515_length(in, NULL));
846+
rfc4515_length (in, result);
847+
return result;
848+
}

util.h

+3
Original file line numberDiff line numberDiff line change
@@ -103,4 +103,7 @@ int challenge_response(YK_KEY *yk, int slot,
103103
size_t filter_result_len(const char *filter, const char *user, char *output);
104104
char *filter_printf(const char *filter, const char *user);
105105

106+
size_t rfc4515_length ( const char* in, char* out );
107+
char* rfc4515_replace ( const char* in );
108+
106109
#endif /* __PAM_YUBICO_UTIL_H_INCLUDED__ */

0 commit comments

Comments
 (0)