?? vldap.c
字號:
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 + -