📄 vactivedir.c
字号:
} ad_clean_packet(&adir); close(sock); if ( strncmp(adir.p1,"yes",3) != 0 ) return(-1); return(0);}void vclose() { }#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); snprint(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);}#endifint 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(char *user, char *domain, char *remoteip ){ char *tmpbuf; FILE *fs; struct vqpasswd *vpw; uid_t uid; gid_t gid; if( (vpw = vauth_getpw( user, domain )) == NULL) return(0); tmpbuf = malloc(MAX_BUFF); snprintf(tmpbuf, MAX_BUFF, "%s/lastauth", vpw->pw_dir); if ( (fs = fopen(tmpbuf,"w+")) == NULL ) { free(tmpbuf); return(-1); } fprintf(fs, "%s", remoteip); fclose(fs); vget_assign(domain,NULL,0,&uid,&gid); chown(tmpbuf,uid,gid); free(tmpbuf); return(0);}time_t vget_lastauth( struct vqpasswd *pw, char *domain){ char *tmpbuf; struct stat mystatbuf; tmpbuf = malloc(MAX_BUFF); snprintf(tmpbuf, MAX_BUFF, "%s/lastauth", pw->pw_dir); if ( stat(tmpbuf,&mystatbuf) == -1 ) { free(tmpbuf); return(0); } free(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 */char *dc_filename(char *domain, uid_t uid, gid_t gid){ static char dir_control_file[MAX_DIR_NAME]; struct passwd *pw; /* if we are lucky the domain is in the assign file */ if ( vget_assign(domain,dir_control_file,MAX_DIR_NAME,NULL,NULL)!=NULL ) { strncat(dir_control_file, "/.dir-control", MAX_DIR_NAME); /* it isn't in the assign file so we have to get it from /etc/passwd */ } else { /* save some time if this is the vpopmail user */ if ( uid == VPOPMAILUID ) { strncpy(dir_control_file, VPOPMAILDIR, MAX_DIR_NAME); /* for other users, look them up in /etc/passwd */ } else if ( (pw=getpwuid(uid))!=NULL ) { 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 vauth_crypt(char *user,char *domain,char *clear_pass,struct vqpasswd *vpw){ static struct actdirvp adir; int sock; if ( (sock=ad_open_conn())==-1){ printf("could not connect\n"); return(-1); } memset(&adir,' ',sizeof(struct actdirvp)); memcpy( adir.cmd, "auth", 4); memcpy( adir.pw_name, user, strlen(user)); memcpy( adir.pw_domain, domain, strlen(domain)); memcpy( adir.pw_clear_passwd, clear_pass, strlen(clear_pass)); if ( write(sock,&adir, sizeof(struct actdirvp))<0){ close(sock); printf("write failed\n"); return(-1); } if ( read(sock,&adir, sizeof(struct actdirvp))<0) { close(sock); printf("read failed\n"); return(-1); } ad_clean_packet(&adir); /*ad_print_packet(&adir);*/ close(sock); if ( strncmp(adir.p1,"yes",3) == 0 ) return(0); return(-1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -