?? vmysql.c
字號:
#ifdef VALIAS valias_delete_domain( domain);#endif#ifdef ENABLE_AUTH_LOGGING qnprintf( SqlBufUpdate, SQL_BUF_SIZE, "delete from lastauth where domain = '%s'", domain ); if (mysql_query(&mysql_update,SqlBufUpdate)) { return(-1); } #endif vdel_limits(domain); return(0);}int vauth_deluser( char *user, char *domain ){ char *tmpstr; int err = 0; if ( (err=vauth_open_update()) != 0 ) return(err); vset_default_domain( domain );#ifndef MANY_DOMAINS if ( domain == NULL || domain[0] == 0 ) { tmpstr = MYSQL_LARGE_USERS_TABLE; } else { tmpstr = vauth_munch_domain( domain ); }#else tmpstr = MYSQL_DEFAULT_TABLE;#endif qnprintf( SqlBufUpdate, SQL_BUF_SIZE, DELETE_USER, tmpstr, user#ifdef MANY_DOMAINS, domain#endif ); if (mysql_query(&mysql_update,SqlBufUpdate)) { err = -1; } #ifdef ENABLE_AUTH_LOGGING qnprintf( SqlBufUpdate, SQL_BUF_SIZE, "delete from lastauth where user = '%s' and domain = '%s'", user, domain ); if (mysql_query(&mysql_update,SqlBufUpdate)) { err = -1; } #endif return(err);}int vauth_setquota( char *username, char *domain, char *quota){ char *tmpstr; int err; if ( strlen(username) > MAX_PW_NAME ) return(VA_USER_NAME_TOO_LONG);#ifdef USERS_BIG_DIR if ( strlen(username) == 1 ) return(VA_ILLEGAL_USERNAME);#endif if ( strlen(domain) > MAX_PW_DOMAIN ) return(VA_DOMAIN_NAME_TOO_LONG); if ( strlen(quota) > MAX_PW_QUOTA ) return(VA_QUOTA_TOO_LONG); if ( (err=vauth_open_update()) != 0 ) return(err); vset_default_domain( domain );#ifndef MANY_DOMAINS tmpstr = vauth_munch_domain( domain );#else tmpstr = MYSQL_DEFAULT_TABLE; #endif qnprintf( SqlBufUpdate, SQL_BUF_SIZE, SETQUOTA, tmpstr, quota, username#ifdef MANY_DOMAINS, domain#endif); if (mysql_query(&mysql_update,SqlBufUpdate)) { fprintf(stderr, "vmysql: sql error[4]: %s\n", mysql_error(&mysql_update)); return(-1); } return(0);}struct vqpasswd *vauth_getall(char *domain, int first, int sortit){ char *domstr = NULL; static struct vqpasswd vpw; static int more = 0; int err; vset_default_domain( domain );#ifdef MANY_DOMAINS domstr = MYSQL_DEFAULT_TABLE; #else domstr = vauth_munch_domain( domain );#endif if ( first == 1 ) { if ( (err=vauth_open_read_getall()) != 0 ) return(NULL); qnprintf(SqlBufRead, SQL_BUF_SIZE, GETALL, domstr#ifdef MANY_DOMAINS ,domain#endif ); if ( sortit == 1 ) { strncat( SqlBufRead, " order by pw_name", SQL_BUF_SIZE); } if (res_read!=NULL) mysql_free_result(res_read_getall); res_read = NULL; if (mysql_query(&mysql_read_getall,SqlBufRead)) { fprintf(stderr, "vmysql: sql error[5]: %s\n", mysql_error(&mysql_read_getall)); return(NULL); } if (!(res_read_getall=mysql_store_result(&mysql_read_getall))) { fprintf(stderr, "vmysql: store result failed 2\n"); return(NULL); } } else if ( more == 0 ) { return(NULL); } memset(IUser, 0, sizeof(IUser)); memset(IPass, 0, sizeof(IPass)); memset(IGecos, 0, sizeof(IGecos)); memset(IDir, 0, sizeof(IDir)); memset(IShell, 0, sizeof(IShell)); memset(IClearPass, 0, sizeof(IClearPass)); vpw.pw_name = IUser; vpw.pw_passwd = IPass; vpw.pw_gecos = IGecos; vpw.pw_dir = IDir; vpw.pw_shell = IShell; vpw.pw_clear_passwd = IClearPass; if ((row_getall = mysql_fetch_row(res_read_getall)) != NULL) { strncpy(vpw.pw_name,row_getall[0],SMALL_BUFF); if (row_getall[1]!=0) strncpy(vpw.pw_passwd,row_getall[1],SMALL_BUFF); if (row_getall[2]!=0) vpw.pw_uid = atoi(row_getall[2]); if (row_getall[3]!=0) vpw.pw_gid = atoi(row_getall[3]); if (row_getall[4]!=0) strncpy(vpw.pw_gecos,row_getall[4],SMALL_BUFF); if (row_getall[5]!=0) strncpy(vpw.pw_dir,row_getall[5],SMALL_BUFF); if (row_getall[6]!=0) { strncpy(vpw.pw_shell, row_getall[6],SMALL_BUFF); }#ifdef CLEAR_PASS if (row_getall[7]!=0) { strncpy(vpw.pw_clear_passwd, row_getall[7],SMALL_BUFF); }#endif more = 1; return(&vpw); } more = 0; mysql_free_result(res_read_getall); res_read_getall = NULL; return(NULL);}void vauth_end_getall(){ if ( res_read_getall != NULL ) { mysql_free_result(res_read_getall); } res_read_getall = NULL;}char *vauth_munch_domain( char *domain ){ int i; static char tmpbuf[50]; if ( domain == NULL || domain[0] == 0 ) return(domain); for(i=0;domain[i]!=0;++i){ tmpbuf[i] = domain[i]; if ( domain[i] == '.' || domain[i] == '-' ) { tmpbuf[i] = MYSQL_DOT_CHAR; } } tmpbuf[i] = 0; return(tmpbuf);}int vauth_setpw( struct vqpasswd *inpw, char *domain ){ char *tmpstr; uid_t myuid; uid_t uid; gid_t gid; int err; err = vcheck_vqpw(inpw, domain); if ( err != 0 ) return(err); vget_assign(domain,NULL,0,&uid,&gid); myuid = geteuid(); if ( myuid != 0 && myuid != uid ) { return(VA_BAD_UID); } if ( (err=vauth_open_update()) != 0 ) return(err); vset_default_domain( domain );#ifndef MANY_DOMAINS tmpstr = vauth_munch_domain( domain );#else tmpstr = MYSQL_DEFAULT_TABLE; #endif qnprintf( SqlBufUpdate,SQL_BUF_SIZE,SETPW, tmpstr, inpw->pw_passwd, inpw->pw_uid, inpw->pw_gid, inpw->pw_gecos, inpw->pw_dir, inpw->pw_shell, #ifdef CLEAR_PASS inpw->pw_clear_passwd,#endif inpw->pw_name#ifdef MANY_DOMAINS ,domain#endif ); if (mysql_query(&mysql_update,SqlBufUpdate)) { fprintf(stderr, "vmysql: sql error[6]: %s\n", mysql_error(&mysql_update)); return(-1); } #ifdef SQWEBMAIL_PASS vsqwebmail_pass( inpw->pw_dir, inpw->pw_passwd, uid, gid);#endif return(0);}#ifdef POP_AUTH_OPEN_RELAYint vopen_smtp_relay(){ char *ipaddr; time_t mytime; int err; int rows; mytime = time(NULL); ipaddr = get_remote_ip(); if ( ipaddr == NULL ) { return 0; } if ( (err=vauth_open_update()) != 0 ) return 0; qnprintf( SqlBufUpdate, SQL_BUF_SIZE,"replace into relay ( ip_addr, timestamp ) values ( '%s', %d )", ipaddr, (int)mytime); if (mysql_query(&mysql_update,SqlBufUpdate)) { vcreate_relay_table(); if (mysql_query(&mysql_update,SqlBufUpdate)) { fprintf(stderr, "vmysql: sql error[7]: %s\n", mysql_error(&mysql_update)); } } rows = mysql_affected_rows(&mysql_update); /* return true if only INSERT (didn't exist) */ /* would return 2 if replaced, or -1 if error */ return rows == 1;}void vupdate_rules(int fdm){ if (vauth_open_read() != 0) return; snprintf(SqlBufRead, SQL_BUF_SIZE, "select ip_addr from relay"); if (mysql_query(&mysql_read,SqlBufRead)) { vcreate_relay_table(); if (mysql_query(&mysql_read,SqlBufRead)) { fprintf(stderr, "vmysql: sql error[8]: %s\n", mysql_error(&mysql_read)); return; } } if (!(res_read = mysql_store_result(&mysql_read))) { fprintf(stderr, "vmysql: store result failed 3\n"); return; } while((row = mysql_fetch_row(res_read))) { snprintf(SqlBufRead, SQL_BUF_SIZE, "%s:allow,RELAYCLIENT=\"\",RBLSMTPD=\"\"\n", row[0]); write(fdm,SqlBufRead, strlen(SqlBufRead)); } mysql_free_result(res_read);}void vclear_open_smtp(time_t clear_minutes, time_t mytime){ time_t delete_time; int err; if ( (err=vauth_open_update()) != 0 ) return; delete_time = mytime - clear_minutes; snprintf( SqlBufUpdate, SQL_BUF_SIZE, "delete from relay where timestamp <= %d", (int)delete_time); if (mysql_query(&mysql_update,SqlBufUpdate)) { vcreate_relay_table(); return; }}void vcreate_relay_table(){ vauth_create_table ("relay", RELAY_TABLE_LAYOUT, 1); return;}#endifint vmkpasswd( char *domain ){ return(0);}void vclose(){ if (read_open == 1 ) { mysql_close(&mysql_read); read_open = 0; } if (read_getall_open == 1 ) { mysql_close(&mysql_read_getall); read_getall_open = 0; } if (update_open == 1 ) { mysql_close(&mysql_update); update_open = 0; }}#ifdef IP_ALIAS_DOMAINSvoid vcreate_ip_map_table(){ vauth_create_table ("ip_alias_map", IP_ALIAS_TABLE_LAYOUT, 1); return;}int vget_ip_map( char *ip, char *domain, int domain_size){ int ret = -1; if ( ip == NULL || strlen(ip) <= 0 ) return(-1); if ( domain == NULL ) return(-2); if ( vauth_open_read() != 0 ) return(-3); qnprintf(SqlBufRead, SQL_BUF_SIZE, "select domain from ip_alias_map where ip_addr = '%s'", ip); if (mysql_query(&mysql_read,SqlBufRead)) { return(-1); } if (!(res_read = mysql_store_result(&mysql_read))) { fprintf(stderr, "vget_ip_map: store result failed 4\n"); return(-4); } while((row = mysql_fetch_row(res_read))) { ret = 0; strncpy(domain, row[0], domain_size); } mysql_free_result(res_read); return(ret);}int vadd_ip_map( char *ip, char *domain) { if ( ip == NULL || strlen(ip) <= 0 ) return(-1); if ( domain == NULL || strlen(domain) <= 0 ) return(-1); if ( vauth_open_update() != 0 ) return(-1); qnprintf(SqlBufUpdate,SQL_BUF_SIZE, "replace into ip_alias_map ( ip_addr, domain ) values ( '%s', '%s' )", ip, domain); if (mysql_query(&mysql_update,SqlBufUpdate)) { vcreate_ip_map_table(); if (mysql_query(&mysql_update,SqlBufUpdate)) { return(-1); } } return(0);}int vdel_ip_map( char *ip, char *domain) { if ( ip == NULL || strlen(ip) <= 0 ) return(-1); if ( domain == NULL || strlen(domain) <= 0 ) return(-1); if ( vauth_open_update() != 0 ) return(-1); qnprintf( SqlBufUpdate,SQL_BUF_SIZE, "delete from ip_alias_map where ip_addr = '%s' and domain = '%s'", ip, domain); if (mysql_query(&mysql_update,SqlBufUpdate)) { return(0); } return(0);}int vshow_ip_map( int first, char *ip, char *domain ){ static int more = 0; if ( ip == NULL ) return(-1); if ( domain == NULL ) return(-1); if ( vauth_open_read() != 0 ) return(-1); if ( first == 1 ) { snprintf(SqlBufRead,SQL_BUF_SIZE, "select ip_addr, domain from ip_alias_map"); if (res_read!=NULL) mysql_free_result(res_read); res_read = NULL; if (mysql_query(&mysql_read,SqlBufRead)) { vcreate_ip_map_table(); if (mysql_query(&mysql_read,SqlBufRead)) { return(0); } } if (!(res_read = mysql_store_result(&mysql_read))) { fprintf(stderr, "vmysql: store result failed 5\n"); return(0); } } else if ( more == 0 ) { return(0); } if ((row = mysql_fetch_row(res_read)) != NULL) { strncpy(ip, row[0], 18); strncpy(domain, row[1], 156); more = 1; return(1); } more = 0; mysql_free_result(res_read); res_read = NULL; return(0);}#endifint vread_dir_control(vdir_type *vdir, char *domain, uid_t uid, gid_t gid){ int found = 0; if ( vauth_open_read() != 0 ) return(-1); qnprintf(SqlBufRead, SQL_BUF_SIZE, "select %s from dir_control where domain = '%s'", DIR_CONTROL_SELECT, domain ); if (mysql_query(&mysql_read,SqlBufRead)) { vcreate_dir_control(domain); qnprintf(SqlBufRead, SQL_BUF_SIZE, "select %s from dir_control where domain = '%s'", DIR_CONTROL_SELECT, domain ); if (mysql_query(&mysql_read,SqlBufRead)) { return(-1); } } if (!(res_read = mysql_store_result(&mysql_read))) { fprintf(stderr, "vread_dir_control: store result failed 6\n"); return(0); } if ((row = mysql_fetch_row(res_read)) != NULL) { found = 1; vdir->cur_users = atol(row[0]); vdir->level_cur = atoi(row[1]); vdir->level_max = atoi(row[2]); vdir->level_start[0] = atoi(row[3]); vdir->level_start[1] = atoi(row[4]); vdir->level_start[2] = atoi(row[5]); vdir->level_end[0] = atoi(row[6]); vdir->level_end[1] = atoi(row[7]); vdir->level_end[2] = atoi(row[8]); vdir->level_mod[0] = atoi(row[9]); vdir->level_mod[1] = atoi(row[10]); vdir->level_mod[2] = atoi(row[11]); vdir->level_index[0] = atoi(row[12]); vdir->level_index[1] = atoi(row[13]); vdir->level_index[2] = atoi(row[14]); strncpy(vdir->the_dir, row[15], MAX_DIR_NAME); } mysql_free_result(res_read); if ( found == 0 ) {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -