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

📄 vcdb.c

📁 相当优秀的 UNIX 进程管理工具
💻 C
📖 第 1 页 / 共 2 页
字号:
	/* get the owner of the domain */	vget_assign(domain,NULL,0,&uid,&gid);	/* get the current effective user */    myuid = geteuid();	/* 	 * if it is not the owner, vpopmail or root	 * then reject this operation	 */    if ( myuid != 0 && myuid != uid ) {		return(VA_BAD_UID);    }    set_vpasswd_files( domain );#ifdef FILE_LOCKING	fs3 = fopen(vpasswd_lock_file, "w+");	if ( get_write_lock(fs3) < 0 ) return(-2);#endif    fs1 = fopen(vpasswd_bak_file, "w+");    if ( (fs2 = fopen(vpasswd_file, "r+")) == NULL ) {    	fs2 = fopen(vpasswd_file, "w+");	}    if ( fs1 == NULL || fs2 == NULL ) {		if ( fs1 != NULL ) fclose(fs1);		if ( fs2 != NULL ) fclose(fs2);#ifdef FILE_LOCKING		unlock_lock(fileno(fs3), 0, SEEK_SET, 0);		fclose(fs3);#endif        return(-1);    }    vcdb_strip_char( inpw->pw_gecos );#ifndef CLEAR_PASS    vcdb_strip_char( inpw->pw_clear_passwd );#endif    while (fgets(tmpbuf1,MAX_BUFF,fs2)!=NULL){        strncpy(tmpbuf2, tmpbuf1, MAX_BUFF);        tmpstr = strtok(tmpbuf2,":\n");                if ( strcmp(inpw->pw_name, tmpstr) != 0) {            fputs(tmpbuf1, fs1);        } else {#ifndef CLEAR_PASS            fprintf(fs1, "%s:%s:%d:%d:%s:%s:%s\n",                inpw->pw_name,                inpw->pw_passwd,                inpw->pw_uid,                inpw->pw_gid,                inpw->pw_gecos,                inpw->pw_dir,                inpw->pw_shell);#else            fprintf(fs1, "%s:%s:%d:%d:%s:%s:%s:%s\n",                inpw->pw_name,                inpw->pw_passwd,                inpw->pw_uid,                inpw->pw_gid,                inpw->pw_gecos,                inpw->pw_dir,                inpw->pw_shell, inpw->pw_clear_passwd);#endif        }    }    fclose(fs1);    fclose(fs2);    rename(vpasswd_bak_file, vpasswd_file);    make_vpasswd_cdb(domain);#ifdef FILE_LOCKING	unlock_lock(fileno(fs3), 0, SEEK_SET, 0);	fclose(fs3);#endif#ifdef SQWEBMAIL_PASS	tmpstr = vget_assign(domain, NULL, 0, &uid, &gid );    vsqwebmail_pass( inpw->pw_dir, inpw->pw_passwd, uid, gid);#endif    return(0);}int vauth_adduser_line( FILE *fs1,     char *user,     char *pass,     char *domain,     char *gecos,     char *dir, int apop ){ char Dir[156]; uid_t uid; gid_t gid; char crypted[100];	if ( vget_assign(domain, Dir, 156, &uid, &gid ) == NULL ) {		strcpy(Dir, VPOPMAILDIR);        }         if ( pass[0] != 0 ) {            mkpasswd3(pass,crypted, 100);        } else {            crypted[0] = 0;        }        fprintf(fs1,"%s:", user );        if ( apop == USE_POP ) fprintf(fs1, "%s:1:", crypted);        else fprintf(fs1, "%s:2:", crypted);        fprintf(fs1, "0:%s:%s", gecos, Dir);                if ( strlen(domain) <= 0 ) {            if ( strlen(dir) > 0 ) {                fprintf(fs1, "/users/%s/%s:", dir, user);            } else {                fprintf(fs1, "/users/%s:", user);            }        } else {            if ( strlen(dir) > 0 ) {                fprintf(fs1,"/%s/%s:", dir,user);            } else {                fprintf(fs1, "/%s:", user);            }        }        fprintf(fs1, "NOQUOTA");#ifndef CLEAR_PASS        fprintf(fs1, "\n");#else        fprintf(fs1, ":%s\n", pass);#endif        return(0);}int vmkpasswd( char *domain ){#ifdef FILE_LOCKING FILE *fs3;#endif char Dir[156]; uid_t uid; gid_t gid; char *tmpstr;    getcwd(TmpBuf1, MAX_BUFF);	tmpstr = vget_assign(domain, Dir, 156, &uid, &gid );    if ( chdir(Dir) != 0 ) return(VA_BAD_DIR);    lowerit(domain);    set_vpasswd_files( domain );#ifdef FILE_LOCKING	fs3 = fopen(vpasswd_lock_file, "w+");	if ( get_write_lock(fs3) < 0 ) return(-2);#endif    make_vpasswd_cdb(domain);#ifdef FILE_LOCKING	unlock_lock(fileno(fs3), 0, SEEK_SET, 0);	fclose(fs3);#endif    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);	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);}#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);}void vcdb_strip_char( char *instr ){ char *nextstr;    nextstr = instr;    while (*instr != 0 ) {       if ( *instr == ':' ) ++instr;       if ( nextstr != instr ) *nextstr = *instr;       ++nextstr;       ++instr;    }}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 + -