(acl_string_processing): Moved the string processing code out of check_acl() and into it's own function because it now does two (2) tests. If the ACL string is a complete host name, in other words doesn't start with a period, than a reverse DNS look-up is done on the host name and compared to the IP address of the client; otherwise, the normal text string comparison is done.
(check_acl): Moved the string text out of the function and removed some logging code by jumping to the "Deny" code at the end of the function.
This commit is contained in:
parent
5e74b6e011
commit
b697ebf16b
119
src/acl.c
119
src/acl.c
@ -1,10 +1,10 @@
|
|||||||
/* $Id: acl.c,v 1.15 2002-05-23 18:20:27 rjkaes Exp $
|
/* $Id: acl.c,v 1.16 2002-06-05 16:59:21 rjkaes Exp $
|
||||||
*
|
*
|
||||||
* This system handles Access Control for use of this daemon. A list of
|
* This system handles Access Control for use of this daemon. A list of
|
||||||
* domains, or IP addresses (including IP blocks) are stored in a list
|
* domains, or IP addresses (including IP blocks) are stored in a list
|
||||||
* which is then used to compare incoming connections.
|
* which is then used to compare incoming connections.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2000 Robert James Kaes (rjkaes@flarenet.com)
|
* Copyright (C) 2000,2002 Robert James Kaes (rjkaes@flarenet.com)
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License as published by the
|
* under the terms of the GNU General Public License as published by the
|
||||||
@ -133,17 +133,87 @@ insert_acl(char *location, acl_access_t access_type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Checks whether file descriptor is allowed.
|
* This function is called whenever a "string" access control is found in
|
||||||
|
* the ACL. From here we do both a text based string comparison, along with
|
||||||
|
* a reverse name lookup comparison of the IP addresses.
|
||||||
|
*
|
||||||
|
* Return: 0 if host is denied
|
||||||
|
* 1 if host is allowed
|
||||||
|
* -1 if no tests match, so skip
|
||||||
|
*/
|
||||||
|
static inline int
|
||||||
|
acl_string_processing(struct acl_s* aclptr,
|
||||||
|
const char* ip_address,
|
||||||
|
const char* string_address)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
struct hostent* result;
|
||||||
|
size_t test_length, match_length;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the first character of the ACL string is a period, we need to
|
||||||
|
* do a string based test only; otherwise, we can do a reverse
|
||||||
|
* lookup test as well.
|
||||||
|
*/
|
||||||
|
if (aclptr->location[0] != '.') {
|
||||||
|
/* It is not a partial domain, so do a reverse lookup. */
|
||||||
|
result = gethostbyname(aclptr->location);
|
||||||
|
if (!result)
|
||||||
|
goto STRING_TEST;
|
||||||
|
|
||||||
|
for (i = 0; result->h_addr_list[i]; ++i) {
|
||||||
|
if (strcmp(ip_address,
|
||||||
|
inet_ntoa(*((struct in_addr*)result->h_addr_list[i]))) == 0) {
|
||||||
|
/* We have a match */
|
||||||
|
if (aclptr->acl_access == ACL_DENY) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
DEBUG2("Matched using reverse domain lookup: %s", ip_address);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If we got this far, the reverse didn't match, so drop down
|
||||||
|
* to a standard string test.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
STRING_TEST:
|
||||||
|
test_length = strlen(string_address);
|
||||||
|
match_length = strlen(aclptr->location);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the string length is shorter than AC string, return a -1 so
|
||||||
|
* that the "driver" will skip onto the next control in the list.
|
||||||
|
*/
|
||||||
|
if (test_length < match_length)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (strcasecmp(string_address + (test_length - match_length), aclptr->location) == 0) {
|
||||||
|
if (aclptr->acl_access == ACL_DENY)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Indicate that no tests succeeded, so skip to next control. */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Checks whether file descriptor is allowed.
|
||||||
*
|
*
|
||||||
* Returns:
|
* Returns:
|
||||||
* 1 if allowed
|
* 1 if allowed
|
||||||
* 0 if denied
|
* 0 if denied
|
||||||
* -1 if error
|
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
check_acl(int fd, const char* ip_address, const char* string_address)
|
check_acl(int fd, const char* ip_address, const char* string_address)
|
||||||
{
|
{
|
||||||
struct acl_s *aclptr;
|
struct acl_s* aclptr;
|
||||||
|
int ret;
|
||||||
|
|
||||||
assert(fd >= 0);
|
assert(fd >= 0);
|
||||||
assert(ip_address != NULL);
|
assert(ip_address != NULL);
|
||||||
@ -158,26 +228,16 @@ check_acl(int fd, const char* ip_address, const char* string_address)
|
|||||||
|
|
||||||
while (aclptr) {
|
while (aclptr) {
|
||||||
if (aclptr->type == ACL_STRING) {
|
if (aclptr->type == ACL_STRING) {
|
||||||
size_t test_length = strlen(string_address);
|
ret = acl_string_processing(aclptr,
|
||||||
size_t match_length = strlen(aclptr->location);
|
ip_address,
|
||||||
|
|
||||||
if (test_length < match_length) {
|
|
||||||
aclptr = aclptr->next;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcasecmp
|
|
||||||
(string_address + (test_length - match_length),
|
|
||||||
aclptr->location) == 0) {
|
|
||||||
if (aclptr->acl_access == ACL_DENY) {
|
|
||||||
log_message(LOG_NOTICE,
|
|
||||||
"Unauthorized access from \"%s\"",
|
|
||||||
string_address);
|
string_address);
|
||||||
return 0;
|
if (ret == 0)
|
||||||
} else {
|
goto UNAUTHORIZED;
|
||||||
return 1;
|
else if (ret == 1)
|
||||||
}
|
return 1;
|
||||||
}
|
|
||||||
|
aclptr = aclptr->next;
|
||||||
|
continue;
|
||||||
} else {
|
} else {
|
||||||
struct in_addr test_addr, match_addr;
|
struct in_addr test_addr, match_addr;
|
||||||
in_addr_t netmask_addr;
|
in_addr_t netmask_addr;
|
||||||
@ -194,14 +254,10 @@ check_acl(int fd, const char* ip_address, const char* string_address)
|
|||||||
|
|
||||||
if ((test_addr.s_addr & netmask_addr) ==
|
if ((test_addr.s_addr & netmask_addr) ==
|
||||||
(match_addr.s_addr & netmask_addr)) {
|
(match_addr.s_addr & netmask_addr)) {
|
||||||
if (aclptr->acl_access == ACL_DENY) {
|
if (aclptr->acl_access == ACL_DENY)
|
||||||
log_message(LOG_NOTICE,
|
goto UNAUTHORIZED;
|
||||||
"Unauthorized access from [%s].",
|
else
|
||||||
ip_address);
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -214,6 +270,7 @@ check_acl(int fd, const char* ip_address, const char* string_address)
|
|||||||
/*
|
/*
|
||||||
* Deny all connections by default.
|
* Deny all connections by default.
|
||||||
*/
|
*/
|
||||||
|
UNAUTHORIZED:
|
||||||
log_message(LOG_NOTICE, "Unauthorized connection from \"%s\" [%s].",
|
log_message(LOG_NOTICE, "Unauthorized connection from \"%s\" [%s].",
|
||||||
string_address, ip_address);
|
string_address, ip_address);
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user