>сижу не пойму :)
>подскажите можно ли его настроить на стандартный posixGroup ?
>и возможно ли его использовать как external_acl как LOGIN и SRC тип
>в полях значений memberUid? блин куча параметров и нифига не умеет :)
вообщем вот, кому надо:
/*
external acl for squid
group_ldap_acl.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <ldap.h>
#define SIZESTRING 256
ssize_t getline(char **, size_t *, FILE *);
void PrintHelp(const char *name){
fprintf(stderr, "Usage: %s [OPTIONS]\n", name);
fprintf(stderr, " -s\tserver LDAP\n");
fprintf(stderr, " -g\tfull DN to group\n");
fprintf(stderr, " -a\tsearch attributes (defaults memberUid)\n");
fprintf(stderr, " -h\tprint this help and exit\n");
exit(1);
}
int LdapSearch(LDAP *ldap, const char *fulldn, char *attr, const char *origin){
LDAPMessage *res = NULL;
LDAPMessage *entry = NULL;
BerElement *ber = NULL;
char **vals = NULL;
char *attrs[2];
int result = 0;
int i;
attrs[0] = attr;
attrs[1] = NULL;
ldap_search_s(ldap, fulldn, LDAP_SCOPE_BASE, NULL, attrs, 0, &res);
if(ldap_count_entries(ldap, res)){
entry = ldap_first_entry(ldap, res);
if(NULL != (attr = ldap_first_attribute(ldap, entry, &ber))){
vals = ldap_get_values(ldap, entry, attr);
for(i = 0; NULL != vals[i]; ++i) if(0 == strcasecmp(origin, vals[i])){ result = 1; break; }
ldap_value_free(vals);
ldap_memfree(attr);
}
}
if(ber) ber_free(ber, 0);
if(res) ldap_msgfree(res);
return result;
}
int main(int argc, char **argv){
opterr = 0;
int c = 0;
int port = 389;
const char *server = NULL;
const char *groupdn = NULL;
char *attr = "memberUid";
char *inputline = NULL;
LDAP *ldap = NULL;
size_t len = 0;
struct in_addr in;
struct hostent *hp;
while((c = getopt(argc, argv, "ha:g:s:")) != -1)
switch (c){
case 'a':
attr = optarg;
break;
case 'g':
groupdn = optarg;
break;
case 's':
server = optarg;
break;
case '?':
case 'h':
PrintHelp(argv[0]);
break;
default:
break;
}
if(!groupdn || !server) PrintHelp(argv[0]);
// ldap init
if(NULL == (ldap = ldap_init(server, port))){
fprintf(stderr, "error: ldap init.");
exit(1);
}
// ldap bind
c = ldap_simple_bind_s(ldap, NULL, NULL);
if(c){
fprintf(stderr,"%s\n", ldap_err2string(c));
exit(1);
}
// input buffer
if(NULL == (inputline = (char *) malloc(SIZESTRING))){
fprintf(stderr, "error: malloc, size: %d\n", SIZESTRING);
exit(1);
}
// stream stdout buffer off
setvbuf(stdout, NULL, _IONBF, 0);
// main cycle
len = SIZESTRING;
while(0 < getline(&inputline, &len, stdin)){
inputline[strlen(inputline) - 1] = '\0';
if(!(c = LdapSearch(ldap, groupdn, attr, inputline)) &&
inet_aton(inputline, &in) && (hp = gethostbyaddr((char *) &in.s_addr, sizeof(in.s_addr), AF_INET)))
c = LdapSearch(ldap, groupdn, attr, hp->h_name);
c ? fprintf(stdout, "OK\n") : fprintf(stdout, "ERR\n");
}
free(inputline);
if(ldap != NULL) ldap_unbind(ldap);
exit(0);
}
Теперь в posixGroup можно хранить и имена пользователей и имена компьютеров и по ip адресам, причем ищется в memberUid (изменяемый параметр -a)
компилировать с флагом -lldap
Использовать как пример:
external_acl_type EXT_DENYUSERS ttl=60 children=3 %LOGIN /etc/squid/group_ldap_acl -s ldap.local -g cn=squid_allow,ou=group,dc=local
acl USERS_DENY external EXT_DENYUSERS