亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mod_auth_pg.c

?? AuthPG用戶身份驗證程序
?? C
字號:
/*                                                                         *//*  mod_auth_pg.c       Copyright 1998-2000 Min Sik Kim <minskim@bawi.org> *//*                                                                         */#include <libpq-fe.h>#include "httpd.h"#include "http_config.h"#include "http_core.h"#define AUTH_PG_VERSION "1.2"typedef struct {    int cookie;     /* on/off */    char *host;     /* Host name     */    char *port;     /* Port number   */    char *user;     /* Username to connect to database with */    char *password; /* Password to connect to database with */    char *options;  /* Options */    char *database; /* Database name */    char *usr_table; /* password table name */    char *grp_table; /* group table name */    char *pwd_field; /* password field name */    char *uname_field; /* user name field name */    char *gname_field; /* group name field name */    char *query;     /* query to use instead of the default one */    int virtual; /* Use user@domain style userids */    char *domain_field; /* domain name field name */    int anonymous;    char *anonymous_username;    int encrypted;    int authoritative;    char *cookie_name;    char *separator;} auth_pg_config;void *create_auth_pg_dir_config(pool *p, char *d){    auth_pg_config *sec	= (auth_pg_config *)ap_pcalloc(p, sizeof(auth_pg_config));    if (!sec) {	fprintf(stderr, "mod_auth_pg: Memory allocation error\n");	return NULL;    }    sec->cookie = 0;    sec->host = NULL;    sec->port = NULL;    sec->user = NULL;    sec->password = NULL;    sec->options = NULL;    sec->database = NULL;    sec->usr_table = NULL;    sec->grp_table = NULL;    sec->pwd_field = "password";    sec->uname_field = "userid";    sec->gname_field = NULL;    sec->query = NULL;    sec->virtual = 0;    sec->domain_field = NULL;    sec->anonymous = 0;    sec->anonymous_username = "guest";    sec->encrypted = 1;    sec->authoritative = 1;    sec->cookie_name = "AUTHPG";    sec->separator = ":";    return sec;}command_rec auth_pg_cmds[] = {    { "AuthPGCookie", ap_set_flag_slot,      (void*)XtOffsetOf(auth_pg_config, cookie),      OR_AUTHCFG, FLAG, NULL },    { "AuthPGHost", ap_set_string_slot,      (void*)XtOffsetOf(auth_pg_config, host),      OR_AUTHCFG, TAKE1, "The host name of the postgreSQL server." },    { "AuthPGPort", ap_set_string_slot,      (void*)XtOffsetOf(auth_pg_config, port),      OR_AUTHCFG, TAKE1, "Port number." },    { "AuthPGUser", ap_set_string_slot,      (void*)XtOffsetOf(auth_pg_config, user),      OR_AUTHCFG, TAKE1, "The username to connect to the database with." },    { "AuthPGPassword", ap_set_string_slot,      (void*)XtOffsetOf(auth_pg_config, password),      OR_AUTHCFG, TAKE1, "The password to connect to the database with." },    { "AuthPGOptions", ap_set_string_slot,      (void*)XtOffsetOf(auth_pg_config, options),      OR_AUTHCFG, TAKE1, "Options." },    { "AuthPGDatabase", ap_set_string_slot,      (void*)XtOffsetOf(auth_pg_config, database),      OR_AUTHCFG, TAKE1, "Name of database which contains the password tables." },    { "AuthPGUserTable", ap_set_string_slot,      (void*)XtOffsetOf(auth_pg_config, usr_table),      OR_AUTHCFG, TAKE1, "Name of the table which contains the password/user-name combination." },    { "AuthPGGroupTable", ap_set_string_slot,      (void*)XtOffsetOf(auth_pg_config, grp_table),      OR_AUTHCFG, TAKE1, "Name of the table which contains the groups" },    { "AuthPGPasswordField", ap_set_string_slot,      (void*)XtOffsetOf(auth_pg_config, pwd_field),      OR_AUTHCFG, TAKE1, NULL },    { "AuthPGUserNameField", ap_set_string_slot,      (void*)XtOffsetOf(auth_pg_config, uname_field),      OR_AUTHCFG, TAKE1, NULL },    { "AuthPGGroupNameField", ap_set_string_slot,      (void*)XtOffsetOf(auth_pg_config, gname_field),      OR_AUTHCFG, TAKE1, NULL },    { "AuthPGQuery", ap_set_string_slot,      (void*)XtOffsetOf(auth_pg_config, query),      OR_AUTHCFG, TAKE1, NULL },    { "AuthPGVirtual", ap_set_flag_slot,      (void*)XtOffsetOf(auth_pg_config, virtual),      OR_AUTHCFG, FLAG, NULL },    { "AuthPGDomainField", ap_set_string_slot,      (void*)XtOffsetOf(auth_pg_config, domain_field),      OR_AUTHCFG, TAKE1, NULL },    { "AuthPGAnonymous", ap_set_flag_slot,      (void*)XtOffsetOf(auth_pg_config, anonymous),      OR_AUTHCFG, FLAG, NULL },    { "AuthPGAnonymousUserName", ap_set_string_slot,      (void *) XtOffsetOf (auth_pg_config, anonymous_username),      OR_AUTHCFG, TAKE1, NULL },    { "AuthPGEncrypted", ap_set_flag_slot,      (void*)XtOffsetOf(auth_pg_config, encrypted),      OR_AUTHCFG, FLAG, NULL },    { "AuthPGAuthoritative", ap_set_flag_slot,      (void*)XtOffsetOf(auth_pg_config, authoritative),      OR_AUTHCFG, FLAG, NULL },    { "AuthPGCookieName", ap_set_string_slot,      (void*)XtOffsetOf(auth_pg_config, cookie_name),      OR_AUTHCFG, FLAG, NULL },    { "AuthPGCookieSeparator", ap_set_string_slot,      (void*)XtOffsetOf(auth_pg_config, separator),      OR_AUTHCFG, FLAG, NULL },    { NULL }};module auth_pg_module;char query[8192], dbconnect[1024];void auth_pg_init(server_rec *s, pool *p){    ap_add_version_component("AuthPG/" AUTH_PG_VERSION);}char *get_pg_pw(request_rec *r, char *user, auth_pg_config *sec, char errstr[]){    char *userid, *passwd, *domain = NULL;    PGconn *conn;    PGresult *res;    userid = ap_pstrdup(r->pool, user);    if (sec->query == NULL) {      if (sec->virtual) {        if (domain = strchr(userid,'@')) {          *domain++ = '\0';          ap_snprintf(query, sizeof(query),            "select %s from %s where %s='%s' and %s='%s'",            sec->pwd_field, sec->usr_table, sec->uname_field,            userid, sec->domain_field, domain);        } else {          ap_snprintf(query, sizeof(query),            "select %s from %s where %s='%s' and (%s='' or %s is null)",            sec->pwd_field, sec->usr_table, sec->uname_field,            userid, sec->domain_field, sec->domain_field);        }      } else {        ap_snprintf(query, sizeof(query), "select %s from %s where %s='%s'",          sec->pwd_field, sec->usr_table, sec->uname_field, userid);      }    } else {      ap_snprintf(query, sizeof(query), sec->query, userid);    }    ap_snprintf(dbconnect,sizeof(dbconnect),"dbname=%s%s%s%s%s%s%s%s%s%s%s",      sec->database,      sec->host ? " host=" : "",      sec->host ? sec->host : "",      sec->port ? " port=" : "",      sec->port ? sec->port : "",      sec->user ? " user=" : "",      sec->user ? sec->user : "",      sec->password ? " password=" : "",      sec->password ? sec->password : "",      sec->options ? " options=" : "",      sec->options ? sec->options : ""    );    conn = PQconnectdb(dbconnect);    if (PQstatus(conn) == CONNECTION_BAD) {      ap_snprintf(errstr, MAX_STRING_LEN, "Could not connect to postgreSQL backend (%s)", PQerrorMessage(conn));      PQfinish(conn);      return NULL;    }    res = PQexec(conn, query);    if (PQresultStatus(res) != PGRES_TUPLES_OK) {	PQclear(res);	PQfinish(conn);	ap_snprintf(errstr, MAX_STRING_LEN, "Could not execute the query: %s",		    query);	return NULL;    }    if (PQntuples(res) > 1) {	PQclear(res);	PQfinish(conn);	ap_snprintf(errstr, MAX_STRING_LEN, "User %s has several passwords.",		    user);	return NULL;    }    if (PQntuples(res) == 0) {	PQclear(res);	PQfinish(conn);	return NULL;    }    passwd = ap_pstrdup(r->pool, PQgetvalue(res, 0, 0));    PQclear(res);    PQfinish(conn);    return passwd;}table *groups_for_pg_user(pool *p, const char *user, auth_pg_config *sec,			  char errstr[]){    char *userid, *domain = NULL;    table *grps;    PGconn *conn;    PGresult *res;    int i;    userid = ap_pstrdup(p, user);    if (sec->virtual) {      if (domain = strchr(userid,'@')) {        *domain++ = '\0';        ap_snprintf(query, sizeof(query),          "select %s from %s where %s='%s' and %s='%s'",          sec->gname_field, sec->grp_table, sec->uname_field,          userid, sec->domain_field, domain);      } else {        ap_snprintf(query, sizeof(query),          "select %s from %s where %s='%s' and (%s='' or %s is null)",          sec->gname_field, sec->grp_table, sec->uname_field,          userid, sec->domain_field, sec->domain_field);      }    } else {      ap_snprintf(query, sizeof(query), "select %s from %s where %s='%s'",        sec->gname_field, sec->grp_table, sec->uname_field, userid);    }    ap_snprintf(dbconnect, sizeof(dbconnect), "dbname=%s%s%s%s%s%s%s%s%s%s%s",      sec->database,      sec->host ? " host=" : "",      sec->host ? sec->host : "",      sec->port ? " port=" : "",      sec->port ? sec->port : "",      sec->user ? " user=" : "",      sec->user ? sec->user : "",      sec->password ? " password=" : "",      sec->password ? sec->password : "",      sec->options ? " options=" : "",      sec->options ? sec->options : ""    );    conn = PQconnectdb(dbconnect);    if (PQstatus(conn) == CONNECTION_BAD) {	ap_snprintf(errstr, MAX_STRING_LEN, "Could not connect to postgreSQL backend (%s)", PQerrorMessage(conn));	PQfinish(conn);	return NULL;    }    res = PQexec(conn, query);    if (!res || PQresultStatus(res) != PGRES_TUPLES_OK) {      PQclear(res); /*- When res is NULL, I don't have to clear. */      PQfinish(conn);      ap_snprintf(errstr, MAX_STRING_LEN, "Could not execute the query.");      return NULL;    }    grps = ap_make_table(p, PQntuples(res));    for (i = 0; i < PQntuples(res); i++) {	ap_table_set(grps, PQgetvalue(res, i, 0), "in");    }    PQclear(res);    PQfinish(conn);    return grps;}/* * Determine user ID, and check if it really is that user, * for HTTP basic authentication. */int pg_authenticate_basic_user(request_rec *r){    char *crypt(const char *key, const char *salt);    auth_pg_config *sec =	(auth_pg_config *)ap_get_module_config(r->per_dir_config,					       &auth_pg_module);    conn_rec *c = r->connection;    char *sent_pw, *str;    const char *cstr;    char errstr[MAX_STRING_LEN];    int res;    if (!(sec->database) || !(sec->query) && !(sec->usr_table))	if (sec->authoritative) {	    ap_note_basic_auth_failure(r);	    return AUTH_REQUIRED;	} else return DECLINED;    if (sec->cookie) {	char *cookie;	if (!(cstr = ap_table_get(r->headers_in, "Cookie")))	    if (sec->authoritative) {		ap_log_reason("No cookie available.", r->uri, r);		ap_note_basic_auth_failure(r);		return AUTH_REQUIRED;	    } else return DECLINED;	res = strlen(cstr);  /* length of cookie */	if (!(cookie = (char*) ap_palloc(r->pool, res + 2))) {	    ap_log_reason("Could not allocate memory for a cookie", r->uri, r);	    return SERVER_ERROR;	}	memcpy(cookie, cstr, res);	cookie[res++] = ';';	cookie[res] = '\0';	for (cookie = strtok(cookie, " ;\n\r\t\f"); cookie;	     cookie = strtok(NULL, " ;\n\r\t\f")) {	    if (!(str = strchr (cookie, '='))) /* Invalid cookie */		continue;	    *(str++) = '\0';	    if (strcmp(cookie, sec->cookie_name) == 0) {		sent_pw = strchr(str, sec->separator[0]);		if (sent_pw) *(sent_pw++) = '\0';		else sent_pw = "";		c->user = str;		break;	    }	}    } else	if ((res = ap_get_basic_auth_pw(r, &sent_pw)))	    return res;    if ((sec->anonymous) &&	strcmp(c->user, sec->anonymous_username) == 0) return OK;    errstr[0] = '\0';    if (!(str = get_pg_pw(r, c->user, sec, errstr))) {	if (errstr[0] == '\0') {	    if (!(sec->authoritative))		return DECLINED;	    ap_snprintf(errstr, sizeof(errstr), "user %s not found", c->user);	}	ap_log_reason(errstr, r->uri, r); /*- How about r->filename? */	ap_note_basic_auth_failure(r);	return AUTH_REQUIRED;    }    if (strcmp(str, sec->encrypted ? crypt(sent_pw, str) : sent_pw)) {	ap_snprintf(errstr, sizeof(errstr),		 "user %s: password mismatch", c->user);	ap_log_reason(errstr, r->uri, r);	ap_note_basic_auth_failure(r);	return AUTH_REQUIRED;    }    return OK;}/* * Checking ID */int pg_check_user_auth(request_rec *r){    auth_pg_config *sec =	(auth_pg_config *)ap_get_module_config(r->per_dir_config,					    &auth_pg_module);    char *user = r->connection->user;    int m = r->method_number;    register int x;    const char *t, *w;    table *grpstatus = NULL;    const array_header *reqs_arr = ap_requires(r);    require_line *reqs;    char errstr[MAX_STRING_LEN];    /* If there is no "require" directive, then any user will do. */    if (!reqs_arr) return OK;    if (sec->anonymous && strcmp(user, sec->anonymous_username) == 0) return OK;    reqs = (require_line *)reqs_arr->elts;    for (x = 0; x < reqs_arr->nelts; x++) {	if (!(reqs[x].method_mask & (1 << m))) continue;	t = reqs[x].requirement;	w = ap_getword(r->pool, &t, ' ');	if (!strcmp(w, "valid-user"))	    return OK;	if (!strcmp(w, "user")) {	    while (t[0]) {		w = ap_getword_conf(r->pool, &t);		if (!strcmp(user, w))		    return OK;	    }	} else if (!strcmp(w, "group")) {	    if (sec->grp_table && sec->gname_field)		grpstatus = groups_for_pg_user(r->pool, user, sec, errstr);	    if (!grpstatus) {	        if (sec->authoritative) {		    ap_snprintf(errstr, sizeof(errstr), "user %s denied, no access rules specified.", user);		    ap_log_reason(errstr, r->uri, r);		    ap_note_basic_auth_failure(r);		    return AUTH_REQUIRED;		}		return DECLINED;	    }	    while (t[0]) {		w = ap_getword_conf(r->pool, &t);		if (ap_table_get(grpstatus, w))		    return OK;	    }	}    }    if (!(sec->authoritative))	return DECLINED;    ap_note_basic_auth_failure(r); /*-log?*/    return AUTH_REQUIRED;}module auth_pg_module = {    STANDARD_MODULE_STUFF,    auth_pg_init,               /* initializer */    create_auth_pg_dir_config,  /* dir config creater */    NULL,                       /* dir merger --- default is to override */    NULL,                       /* server config */    NULL,                       /* merge server config */    auth_pg_cmds,               /* command table */    NULL,                       /* handlers */    NULL,                       /* filename translation */    pg_authenticate_basic_user, /* check_user_id */    pg_check_user_auth,         /* check auth */    NULL,                       /* check access */    NULL,                       /* type_checker */    NULL,                       /* fixups */    NULL,                       /* logger */    NULL                        /* header parser */};

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产一区二区亚洲人成毛片| 日韩av一区二区在线影视| 国产精品久久久久久久第一福利| 欧美国产精品中文字幕| 中文字幕在线观看不卡| 亚洲国产视频网站| 99久久伊人精品| 91麻豆国产精品久久| 欧美日韩你懂的| 久久精品免费在线观看| 一区二区久久久久| 激情欧美一区二区| 91色婷婷久久久久合中文| 欧美精品在欧美一区二区少妇| 2022国产精品视频| 亚洲午夜精品一区二区三区他趣| 久久机这里只有精品| 99久久er热在这里只有精品15| 欧美群妇大交群中文字幕| 国产色产综合产在线视频| 亚洲人吸女人奶水| 经典三级一区二区| 欧美在线视频日韩| 国产欧美一区二区三区沐欲| 亚洲第一福利视频在线| 国产激情91久久精品导航| 欧美伊人久久大香线蕉综合69| 2020日本不卡一区二区视频| 亚洲高清免费观看高清完整版在线观看| 久久精品久久99精品久久| 色综合天天综合| 国产精品99久久不卡二区| 成人福利视频在线看| 色综合久久中文综合久久97 | voyeur盗摄精品| 日本韩国一区二区三区视频| 欧美视频一区二区| 日韩女优制服丝袜电影| 国产精品免费看片| 亚洲国产色一区| 国产美女在线观看一区| av中文字幕在线不卡| 欧美吻胸吃奶大尺度电影| 欧美成人精品1314www| 中文字幕av一区二区三区高| 亚洲女人的天堂| 毛片基地黄久久久久久天堂| 成人美女在线观看| 欧美日韩精品一二三区| 国产欧美一区二区三区鸳鸯浴| 亚洲人123区| 久久国产视频网| 972aa.com艺术欧美| 欧美日韩精品综合在线| 久久精品免视看| 亚洲成人av中文| 成人性视频免费网站| 欧美一区二区不卡视频| 中文字幕成人av| 秋霞影院一区二区| 日本久久精品电影| 久久综合九色综合97婷婷女人 | 秋霞成人午夜伦在线观看| 国产成人午夜精品5599| 欧美日高清视频| 国产精品电影一区二区三区| 蜜臀av性久久久久蜜臀aⅴ | 欧美日本高清视频在线观看| 日本一区二区视频在线| 日本女优在线视频一区二区| jvid福利写真一区二区三区| 日韩视频国产视频| 亚洲一区影音先锋| 成人av电影免费在线播放| 91精品国产麻豆国产自产在线| 亚洲日穴在线视频| 精品一区二区av| 欧美精品在线观看一区二区| 亚洲精品一卡二卡| 国产麻豆精品在线| 91精品国产欧美一区二区成人 | 色中色一区二区| 欧美高清一级片在线观看| 久久精品国产亚洲a| 欧美视频三区在线播放| 中文字幕日韩av资源站| 久久精品国产第一区二区三区| 91福利小视频| 亚洲精品免费播放| 99久久婷婷国产综合精品电影 | 亚洲午夜激情av| 91污在线观看| 亚洲欧洲精品一区二区精品久久久 | 9191久久久久久久久久久| 亚洲精选视频在线| 91首页免费视频| 中文字幕亚洲综合久久菠萝蜜| 国内精品久久久久影院一蜜桃| 制服丝袜中文字幕亚洲| 亚洲一卡二卡三卡四卡无卡久久 | 欧美亚日韩国产aⅴ精品中极品| 国产精品视频一二三区| 国产ts人妖一区二区| 精品成人在线观看| 精品在线观看视频| 欧美一区日韩一区| 青青草一区二区三区| 日韩欧美国产综合在线一区二区三区| 亚洲成a人v欧美综合天堂| 欧美视频一区二区三区| 亚洲高清久久久| 5858s免费视频成人| 日本不卡视频一二三区| 欧美一级夜夜爽| 久久精品国产精品亚洲综合| 26uuu另类欧美亚洲曰本| 蜜臀精品久久久久久蜜臀| 精品国产乱码久久久久久闺蜜| 麻豆精品视频在线| 精品裸体舞一区二区三区| 国产一本一道久久香蕉| 中文一区二区完整视频在线观看| av电影在线观看不卡 | 99免费精品在线观看| 亚洲欧洲日本在线| 欧美亚洲动漫精品| 日本成人在线网站| 亚洲精品伦理在线| 欧美二区三区91| 国产一区二区三区最好精华液| 久久久久9999亚洲精品| 91在线丨porny丨国产| 亚洲国产裸拍裸体视频在线观看乱了 | 国产99精品国产| 中文字幕一区二区三区在线不卡| 91蝌蚪porny九色| 亚洲福利视频一区| 精品国产一区二区三区久久久蜜月 | 成人高清视频在线观看| 亚洲一区二区三区在线看| 欧美一级免费大片| 国产精品一区专区| 亚洲综合激情小说| 欧美一级电影网站| 国产aⅴ综合色| 亚洲www啪成人一区二区麻豆| 欧美一区二区不卡视频| 成人激情午夜影院| 亚洲成人动漫一区| 精品国产99国产精品| 99视频精品在线| 日本不卡一区二区三区| 国产日产欧美一区二区三区| 在线精品观看国产| 极品尤物av久久免费看| ...中文天堂在线一区| 884aa四虎影成人精品一区| 高清av一区二区| 亚洲专区一二三| 久久一留热品黄| 成人在线综合网| 亚洲va韩国va欧美va精品| 国产精品久久三| 久久久精品免费观看| 欧美精品一区二区久久久| 欧美丰满一区二区免费视频| 欧美三级电影一区| 色综合久久精品| 一二三四社区欧美黄| 精品少妇一区二区三区免费观看| 91丨porny丨国产| 国产精品77777竹菊影视小说| 亚洲色图视频免费播放| 日韩免费观看高清完整版 | 欧美激情综合网| 91超碰这里只有精品国产| 99r国产精品| 国产成人高清视频| 久久av资源站| 成人福利视频在线| 久久99国产精品久久99果冻传媒| 婷婷综合在线观看| 五月婷婷另类国产| 香蕉成人啪国产精品视频综合网| 一个色妞综合视频在线观看| 欧美一级黄色大片| 国产成人精品影院| 精品在线免费视频| 美日韩黄色大片| 日韩激情视频在线观看| 一区二区三区在线观看视频| 国产精品视频麻豆| 久久久精品欧美丰满| 欧美成人激情免费网| 日韩一级高清毛片| 91行情网站电视在线观看高清版| 一区二区三区美女| 日本高清不卡视频| 男人的天堂久久精品| 久久久久久**毛片大全|