⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vldap.c

📁 相当优秀的 UNIX 进程管理工具
💻 C
📖 第 1 页 / 共 3 页
字号:
            strncpy(dir_control_file, pw->pw_dir, MAX_DIR_NAME);        /* all else fails return a blank string */        } else {            return("");        }        /* stick on the rest of the path */        strncat(dir_control_file, "/" DOMAINS_DIR "/.dir-control", MAX_DIR_NAME);    }    return(dir_control_file);}int vread_dir_control(vdir_type *vdir, char *domain, uid_t uid, gid_t gid){ FILE *fs; char dir_control_file[MAX_DIR_NAME]; int i;    strncpy(dir_control_file,dc_filename(domain, uid, gid),MAX_DIR_NAME);    if ( (fs = fopen(dir_control_file, "r")) == NULL ) {        vdir->cur_users = 0;        for(i=0;i<MAX_DIR_LEVELS;++i){            vdir->level_start[i] = 0;            vdir->level_end[i] = MAX_DIR_LIST-1;            vdir->level_index[i] = 0;        }        vdir->level_mod[0] = 0;        vdir->level_mod[1] = 2;        vdir->level_mod[2] = 4;        vdir->level_cur = 0;        vdir->level_max = MAX_DIR_LEVELS;        vdir->the_dir[0] = 0;        return(-1);    }    fgets(dir_control_file, MAX_DIR_NAME, fs );    vdir->cur_users = atol(dir_control_file);    fgets(dir_control_file, MAX_DIR_NAME, fs );    vdir->level_cur = atoi(dir_control_file);    fgets(dir_control_file, MAX_DIR_NAME, fs );    vdir->level_max = atoi(dir_control_file);    fgets(dir_control_file, MAX_DIR_NAME, fs );    vdir->level_start[0] = atoi(dir_control_file);    for(i=0;dir_control_file[i]!=' ';++i); ++i;    vdir->level_start[1] = atoi(&dir_control_file[i]);    for(i=0;dir_control_file[i]!=' ';++i); ++i;    vdir->level_start[2] = atoi(&dir_control_file[i]);    fgets(dir_control_file, MAX_DIR_NAME, fs );    vdir->level_end[0] = atoi(dir_control_file);    for(i=0;dir_control_file[i]!=' ';++i); ++i;    vdir->level_end[1] = atoi(&dir_control_file[i]);    for(i=0;dir_control_file[i]!=' ';++i); ++i;    vdir->level_end[2] = atoi(&dir_control_file[i]);    fgets(dir_control_file, MAX_DIR_NAME, fs );    vdir->level_mod[0] = atoi(dir_control_file);    for(i=0;dir_control_file[i]!=' ';++i); ++i;    vdir->level_mod[1] = atoi(&dir_control_file[i]);    for(i=0;dir_control_file[i]!=' ';++i); ++i;    vdir->level_mod[2] = atoi(&dir_control_file[i]);    fgets(dir_control_file, MAX_DIR_NAME, fs );    vdir->level_index[0] = atoi(dir_control_file);    for(i=0;dir_control_file[i]!=' ';++i); ++i;    vdir->level_index[1] = atoi(&dir_control_file[i]);    for(i=0;dir_control_file[i]!=' ';++i); ++i;    vdir->level_index[2] = atoi(&dir_control_file[i]);    fgets(dir_control_file, MAX_DIR_NAME, fs );    for(i=0;dir_control_file[i]!=0;++i) {        if (dir_control_file[i] == '\n') {            dir_control_file[i] = 0;        }    }    fgets(dir_control_file, MAX_DIR_NAME, fs );    for(i=0;dir_control_file[i]!=0;++i) {        if (dir_control_file[i] == '\n') {            dir_control_file[i] = 0;        }    }    strncpy(vdir->the_dir, dir_control_file, MAX_DIR_NAME);    fclose(fs);    return(0);}int vwrite_dir_control(vdir_type *vdir, char *domain, uid_t uid, gid_t gid){ FILE *fs; char dir_control_file[MAX_DIR_NAME]; char dir_control_tmp_file[MAX_DIR_NAME];    strncpy(dir_control_file,dc_filename(domain, uid, gid),MAX_DIR_NAME);    snprintf(dir_control_tmp_file, MAX_DIR_NAME,        "%s.%d", dir_control_file, getpid());    if ( (fs = fopen(dir_control_tmp_file, "w+")) == NULL ) {        return(-1);    }    fprintf(fs, "%lu\n", vdir->cur_users);    fprintf(fs, "%d\n", vdir->level_cur);    fprintf(fs, "%d\n", vdir->level_max);    fprintf(fs, "%d %d %d\n",        vdir->level_start[0],        vdir->level_start[1],        vdir->level_start[2]);    fprintf(fs, "%d %d %d\n",        vdir->level_end[0],        vdir->level_end[1],        vdir->level_end[2]);    fprintf(fs, "%d %d %d\n",        vdir->level_mod[0],        vdir->level_mod[1],        vdir->level_mod[2]);    fprintf(fs, "%d %d %d\n",        vdir->level_index[0],        vdir->level_index[1],        vdir->level_index[2]);    fprintf(fs, "%s\n", vdir->the_dir);    fclose(fs);    rename( dir_control_tmp_file, dir_control_file);    chown(dir_control_file,uid, gid);    return(0);}int vdel_dir_control(char *domain){ char dir_control_file[MAX_DIR_NAME];    vget_assign(domain, dir_control_file, 156, NULL,NULL);    strncat(dir_control_file,"/.dir-control", MAX_DIR_NAME);    return(unlink(dir_control_file));}/***************************************************************************/#ifdef ENABLE_AUTH_LOGGINGint vset_lastauth_time(char *user, char *domain, char *remoteip, time_t cur_time ) {    char *tmpbuf;    FILE *fs;    struct vqpasswd *vpw;    struct utimbuf ubuf;    uid_t uid;    gid_t gid;    if ((vpw = vauth_getpw( user, domain )) == NULL)        return (0);    tmpbuf = (char *) safe_malloc(MAX_BUFF);    sprintf(tmpbuf, "%s/lastauth", vpw->pw_dir);    if ( (fs = fopen(tmpbuf,"w+")) == NULL ) {        safe_free((void **) &tmpbuf);        return(-1);    }    fprintf(fs, "%s", remoteip);    fclose(fs);    ubuf.actime = cur_time;    ubuf.modtime = cur_time;    utime(tmpbuf, &ubuf);    vget_assign(domain,NULL,0,&uid,&gid);    chown(tmpbuf,uid,gid);    safe_free((void **) &tmpbuf);    return(0);}int vset_lastauth(char *user, char *domain, char *remoteip ) {    return(vset_lastauth_time(user, domain, remoteip, time(NULL) ));}time_t vget_lastauth( struct vqpasswd *pw, char *domain) {    char *tmpbuf;    struct stat mystatbuf;    tmpbuf = (char *) safe_malloc(MAX_BUFF);    sprintf(tmpbuf, "%s/lastauth", pw->pw_dir);    if ( stat(tmpbuf,&mystatbuf) == -1 ) {        safe_free((void **) &tmpbuf);        return(0);    }    safe_free((void **) &tmpbuf);    return(mystatbuf.st_mtime);}char *vget_lastauthip( struct vqpasswd *pw, char *domain) {    static char tmpbuf[MAX_BUFF];    FILE *fs;    snprintf(tmpbuf, MAX_BUFF, "%s/lastauth", pw->pw_dir);    if ( (fs=fopen(tmpbuf,"r"))==NULL)        return(NULL);    fgets(tmpbuf,MAX_BUFF,fs);    fclose(fs);    return(tmpbuf);}#endif /* ENABLE_AUTH_LOGGING *//***************************************************************************/#ifdef IP_ALIAS_DOMAINSint vget_ip_map( char *ip, char *domain, int domain_size) {    FILE *fs;    char tmpbuf[156];    char *tmpstr;    if ( ip == NULL || strlen(ip) <= 0 )        return(-1);    /* open the ip_alias_map file */    snprintf(tmpbuf, 156, "%s/%s", VPOPMAILDIR, IP_ALIAS_MAP_FILE);    if ( (fs = fopen(tmpbuf,"r")) == NULL )        return(-1);    while( fgets(tmpbuf, 156, fs) != NULL ) {        tmpstr = strtok(tmpbuf, IP_ALIAS_TOKENS);        if ( tmpstr == NULL )            continue;        if ( strcmp(ip, tmpstr) != 0 )            continue;        tmpstr = strtok(NULL, IP_ALIAS_TOKENS);        if ( tmpstr == NULL )            continue;        strncpy(domain, tmpstr, domain_size);        fclose(fs);        return(0);    }    fclose(fs);    return(-1);}/***************************************************************************//* * Add an ip to domain mapping * It will remove any duplicate entry before adding it * */int vadd_ip_map( char *ip, char *domain) {    FILE *fs;    char tmpbuf[156];    if ( ip == NULL || strlen(ip) <= 0 )        return(-1);    if ( domain == NULL || strlen(domain) <= 0 )        return(-10);    vdel_ip_map( ip, domain );    snprintf(tmpbuf, 156, "%s/%s", VPOPMAILDIR, IP_ALIAS_MAP_FILE);    if ( (fs = fopen(tmpbuf,"a+")) == NULL )        return(-1);    fprintf( fs, "%s %s\n", ip, domain);    fclose(fs);    return(0);}int vdel_ip_map( char *ip, char *domain) {    FILE *fs;    FILE *fs1;    char file1[156];    char file2[156];    char tmpbuf[156];    char tmpbuf1[156];    char *ip_f;    char *domain_f;    if ( ip == NULL || strlen(ip) <= 0 )        return(-1);    if ( domain == NULL || strlen(domain) <= 0 )        return(-1);    snprintf(file1, 156, "%s/%s", VPOPMAILDIR, IP_ALIAS_MAP_FILE);    if ( (fs = fopen(file1,"r")) == NULL )        return(-1);    snprintf(file2, 156,             "%s/%s.%d", VPOPMAILDIR, IP_ALIAS_MAP_FILE, getpid());    if ( (fs1 = fopen(file2,"w")) == NULL ) {        fclose(fs);        return(-1);    }    while( fgets(tmpbuf, 156, fs) != NULL ) {        strncpy(tmpbuf1,tmpbuf, 156);        ip_f = strtok(tmpbuf, IP_ALIAS_TOKENS);        if ( ip_f == NULL )            continue;        domain_f = strtok(NULL, IP_ALIAS_TOKENS);        if ( domain_f == NULL )            continue;        if ( strcmp(ip, ip_f) == 0 && strcmp(domain,domain_f) == 0)            continue;        fprintf(fs1, tmpbuf1);    }    fclose(fs);    fclose(fs1);    if ( rename( file2, file1) < 0 )        return(-1);    return(0);}int vshow_ip_map( int first, char *ip, char *domain) {    static FILE *fs = NULL;    char tmpbuf[156];    char *tmpstr;    if ( ip == NULL )        return(-1);    if ( domain == NULL )        return(-1);    if ( first == 1 ) {        if ( fs != NULL ) {            fclose(fs);            fs = NULL;        }        snprintf(tmpbuf, 156, "%s/%s", VPOPMAILDIR, IP_ALIAS_MAP_FILE);        if ( (fs = fopen(tmpbuf,"r")) == NULL )            return(-1);    }    if ( fs == NULL )        return(-1);    while (1) {        if (fgets(tmpbuf, 156, fs) == NULL ) {            fclose(fs);            fs = NULL;            return(0);        }        tmpstr = strtok(tmpbuf, IP_ALIAS_TOKENS);        if ( tmpstr == NULL )            continue;        strcpy( ip, tmpstr);        tmpstr = strtok(NULL, IP_ALIAS_TOKENS);        if ( tmpstr == NULL )            continue;        strcpy( domain, tmpstr);        return(1);    }    return(-1);}#endif/***************************************************************************//* take a given domain, and set dn to be a string of this format : * ou=somedomain,o=vpopmail */int compose_dn (char **dn, char *domain) {    size_t len = 0;    len = strlen(domain) + strlen(VLDAP_BASEDN) + 5;    *dn = (char *)safe_malloc(len);    memset((char *)*dn, 0, len);    snprintf(*dn,len,"ou=%s,%s",domain,VLDAP_BASEDN);    return 0;}/***************************************************************************/int ldap_connect () {    int ret = 0;    /* Set verror here and unset it when successful, is ok, because if one of these    three steps fail the whole auth_connection failed */    verrori = VA_NO_AUTH_CONNECTION;    ld = ldap_init(VLDAP_SERVER, VLDAP_PORT);    if (ld == NULL) {        ldap_perror(ld,"Failed to inititialize LDAP-Connection");        return -99;    }    ret = ldap_set_option( ld, LDAP_OPT_PROTOCOL_VERSION, &ldapversion );    if (ret != LDAP_OPT_SUCCESS) {        ldap_perror(ld,"Failed to set LDAP-Option");        return -99;    }    ret = ldap_simple_bind_s(ld, VLDAP_USER, VLDAP_PASSWORD);    if (ret != LDAP_SUCCESS) {        ldap_perror(ld,"Error");        return (VA_NO_AUTH_CONNECTION);    }    verrori = 0;    return VA_SUCCESS;}/***************************************************************************/void safe_free (void **p) {    if (*p) {        free (*p);        *p = 0;    }}/***************************************************************************/char *safe_strdup (const char *s) {    char *p;    size_t l;    if (!s || !*s)        return 0;    l = strlen (s) + 1;    p = (char *)safe_malloc (l);    memcpy (p, s, l);    return (p);}/***************************************************************************/void *safe_malloc (size_t siz) {    void *p;    if (siz == 0)        return 0;    if ((p = (void *) malloc (siz)) == 0) {        printf("No more memory...exiting\n");        exit (1);    }    return (p);}/***************************************************************************/int vauth_crypt(char *user,char *domain,char *clear_pass,struct vqpasswd *vpw) {    if ( vpw == NULL )        return(-1);    return(strcmp(crypt(clear_pass,vpw->pw_passwd),vpw->pw_passwd));}/***************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -