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

📄 mod_nw_ssl.c

📁 apache的软件linux版本
💻 C
📖 第 1 页 / 共 3 页
字号:
    ulFlag = SO_TLS_ENABLE;    rcode = WSAIoctl(socketHnd, SO_TLS_SET_FLAGS, &ulFlag, sizeof(unsigned long), NULL, 0, NULL, NULL, NULL);    if(rcode)    {        ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,                     "Error: %d with WSAIoctl(SO_TLS_SET_FLAGS, SO_TLS_ENABLE)", WSAGetLastError());        goto ERR;    }            ulFlag = SO_TLS_SERVER;    rcode = WSAIoctl(socketHnd, SO_TLS_SET_FLAGS, &ulFlag, sizeof(unsigned long),NULL, 0, NULL, NULL, NULL);        if(rcode)    {        ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,                     "Error: %d with WSAIoctl(SO_TLS_SET_FLAGS, SO_TLS_SERVER)", WSAGetLastError());        goto ERR;    }        loc2uni(UNI_LOCAL_DEFAULT, SASKey, key, 0, 0);    //setup the tlsserveropts struct    sWS2Opts.wallet = SASKey;    sWS2Opts.walletlen = unilen(SASKey);    sWS2Opts.sidtimeout = 0;    sWS2Opts.sidentries = 0;    sWS2Opts.siddir = NULL;    sWS2Opts.options = &sNWTLSOpts;        //setup the nwtlsopts structure        sNWTLSOpts.walletProvider               = WAL_PROV_KMO;    sNWTLSOpts.keysList                     = NULL;    sNWTLSOpts.numElementsInKeyList         = 0;    sNWTLSOpts.reservedforfutureuse         = NULL;    sNWTLSOpts.reservedforfutureCRL         = NULL;    sNWTLSOpts.reservedforfutureCRLLen      = 0;    sNWTLSOpts.reserved1                    = NULL;    sNWTLSOpts.reserved2                    = NULL;    sNWTLSOpts.reserved3                    = NULL;            rcode = WSAIoctl(socketHnd,                      SO_TLS_SET_SERVER,                      &sWS2Opts,                      sizeof(struct tlsserveropts),                      NULL,                      0,                      NULL,                      NULL,                      NULL);    if(SOCKET_ERROR == rcode) {        ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,                     "Error: %d with WSAIoctl(SO_TLS_SET_SERVER)", WSAGetLastError());        goto ERR;    }    ERR:    return rcode;}static const char *set_secure_listener(cmd_parms *cmd, void *dummy,                                        const char *ips, const char* key,                                        const char* mutual){    NWSSLSrvConfigRec* sc = get_nwssl_cfg(cmd->server);    const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);    char *ports, *addr;    unsigned short port;    seclisten_rec *new;        if (err != NULL)         return err;    ports = strchr(ips, ':');        if (ports != NULL) {    	    if (ports == ips)	        return "Missing IP address";	    else if (ports[1] == '\0')	        return "Address must end in :<port-number>";	        	    *(ports++) = '\0';    }    else {	    ports = (char*)ips;    }        new = apr_pcalloc(cmd->pool, sizeof(seclisten_rec));     new->local_addr.sin_family = AF_INET;        if (ports == ips) {	    new->local_addr.sin_addr.s_addr = htonl(INADDR_ANY);        addr = apr_pstrdup(cmd->pool, "0.0.0.0");    }    else {	    new->local_addr.sin_addr.s_addr = parse_addr(ips, NULL);        addr = apr_pstrdup(cmd->pool, ips);    }        port = atoi(ports);        if (!port) 	    return "Port must be numeric";	        apr_table_add(sc->sltable, ports, addr);        new->local_addr.sin_port = htons(port);    new->fd = -1;    new->used = 0;    new->next = ap_seclisteners;    strcpy(new->key, key);    new->mutual = (mutual) ? 1 : 0;    new->addr = addr;    new->port = port;    ap_seclisteners = new;    return NULL;}static const char *set_secure_upgradeable_listener(cmd_parms *cmd, void *dummy,                                        const char *ips, const char* key){    NWSSLSrvConfigRec* sc = get_nwssl_cfg(cmd->server);    seclistenup_rec *listen_node;    const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);    char *ports, *addr;    unsigned short port;    seclistenup_rec *new;    if (err != NULL)         return err;    ports = strchr(ips, ':');        if (ports != NULL) {    	    if (ports == ips)	        return "Missing IP address";	    else if (ports[1] == '\0')	        return "Address must end in :<port-number>";	        	    *(ports++) = '\0';    }    else {	    ports = (char*)ips;    }        if (ports == ips) {        addr = apr_pstrdup(cmd->pool, "0.0.0.0");    }    else {        addr = apr_pstrdup(cmd->pool, ips);    }    port = atoi(ports);        if (!port) 	    return "Port must be numeric";    apr_table_set(sc->slutable, ports, addr);    new = apr_pcalloc(cmd->pool, sizeof(seclistenup_rec));     new->next = ap_seclistenersup;    strcpy(new->key, key);    new->addr = addr;    new->port = port;    ap_seclistenersup = new;    return err;}static apr_status_t nwssl_socket_cleanup(void *data){    ap_listen_rec* slr = (ap_listen_rec*)data;    ap_listen_rec* lr;    /* Remove our secure listener from the listener list */    for (lr = ap_listeners; lr; lr = lr->next) {        /* slr is at the head of the list */        if (lr == slr) {            ap_listeners = slr->next;            break;        }        /* slr is somewhere in between or at the end*/        if (lr->next == slr) {            lr->next = slr->next;            break;        }    }    return APR_SUCCESS;}static const char *set_trusted_certs(cmd_parms *cmd, void *dummy, char *arg){    char **ptr = (char **)apr_array_push(certlist);    *ptr = apr_pstrdup(cmd->pool, arg);    return NULL;}static int nwssl_pre_config(apr_pool_t *pconf, apr_pool_t *plog,                         apr_pool_t *ptemp){    ap_seclisteners = NULL;    ap_seclistenersup = NULL;    certlist = apr_array_make(pconf, 1, sizeof(char *));    return OK;}static int nwssl_pre_connection(conn_rec *c, void *csd){        if (apr_table_get(c->notes, "nwconv-ssl")) {        convert_secure_socket(c, (apr_socket_t*)csd);    }    else {        secsocket_data *csd_data = apr_palloc(c->pool, sizeof(secsocket_data));        csd_data->csd = (apr_socket_t*)csd;        csd_data->is_secure = 0;        ap_set_module_config(c->conn_config, &nwssl_module, (void*)csd_data);    }        return OK;}static int nwssl_post_config(apr_pool_t *pconf, apr_pool_t *plog,                          apr_pool_t *ptemp, server_rec *s){    seclisten_rec* sl;    ap_listen_rec* lr;    apr_socket_t*  sd;    apr_status_t status;    seclistenup_rec *slu;    int found;    for (sl = ap_seclisteners; sl != NULL; sl = sl->next) {        sl->fd = find_secure_listener(sl);        if (sl->fd < 0)            sl->fd = make_secure_socket(pconf, &sl->local_addr, sl->key, sl->mutual, s);                                if (sl->fd >= 0) {            apr_os_sock_info_t sock_info;            sock_info.os_sock = &(sl->fd);            sock_info.local = (struct sockaddr*)&(sl->local_addr);            sock_info.remote = NULL;            sock_info.family = APR_INET;            sock_info.type = SOCK_STREAM;            apr_os_sock_make(&sd, &sock_info, pconf);            lr = apr_pcalloc(pconf, sizeof(ap_listen_rec));                    if (lr) {				lr->sd = sd;                if ((status = apr_sockaddr_info_get(&lr->bind_addr, sl->addr, APR_UNSPEC, sl->port, 0,                                               pconf)) != APR_SUCCESS) {                    ap_log_perror(APLOG_MARK, APLOG_CRIT, status, pconf,                                 "alloc_listener: failed to set up sockaddr for %s:%d", sl->addr, sl->port);                    return HTTP_INTERNAL_SERVER_ERROR;                }                lr->next = ap_listeners;                ap_listeners = lr;                apr_pool_cleanup_register(pconf, lr, nwssl_socket_cleanup, apr_pool_cleanup_null);            }        } else {            return HTTP_INTERNAL_SERVER_ERROR;        }    }     for (slu = ap_seclistenersup; slu; slu = slu->next) {        /* Check the listener list for a matching upgradeable listener */        found = 0;        for (lr = ap_listeners; lr; lr = lr->next) {            if (slu->port == lr->bind_addr->port) {                found = 1;                break;            }        }        if (!found) {            ap_log_perror(APLOG_MARK, APLOG_WARNING, 0, plog,                         "No Listen directive found for upgradeable listener %s:%d", slu->addr, slu->port);        }    }        build_cert_list(pconf);    return OK;}static void *nwssl_config_server_create(apr_pool_t *p, server_rec *s){    NWSSLSrvConfigRec *new = apr_palloc(p, sizeof(NWSSLSrvConfigRec));    new->sltable = apr_table_make(p, 5);    new->slutable = apr_table_make(p, 5);    return new;}static void *nwssl_config_server_merge(apr_pool_t *p, void *basev, void *addv){    NWSSLSrvConfigRec *base = (NWSSLSrvConfigRec *)basev;    NWSSLSrvConfigRec *add  = (NWSSLSrvConfigRec *)addv;    NWSSLSrvConfigRec *merged  = (NWSSLSrvConfigRec *)apr_palloc(p, sizeof(NWSSLSrvConfigRec));    return merged;}static int compare_ipports(void *rec, const char *key, const char *value){    conn_rec *c = (conn_rec*)rec;    if (value &&         ((strcmp(value, "0.0.0.0") == 0) || (strcmp(value, c->local_ip) == 0)))     {        return 0;    }    return 1;}static int isSecureConnEx (const server_rec *s, const conn_rec *c, const apr_table_t *t){    char port[8];    itoa((c->local_addr)->port, port, 10);    if (!apr_table_do(compare_ipports, (void*)c, t, port, NULL))    {        return 1;    }    return 0;}static int isSecureConn (const server_rec *s, const conn_rec *c){    NWSSLSrvConfigRec *sc = get_nwssl_cfg(s);    return isSecureConnEx (s, c, sc->sltable);}static int isSecureConnUpgradeable (const server_rec *s, const conn_rec *c){    NWSSLSrvConfigRec *sc = get_nwssl_cfg(s);    return isSecureConnEx (s, c, sc->slutable);}static int isSecure (const request_rec *r){	return isSecureConn (r->server, r->connection);}static int isSecureUpgradeable (const request_rec *r){	return isSecureConnUpgradeable (r->server, r->connection);}static int isSecureUpgraded (const request_rec *r){    secsocket_data *csd_data = (secsocket_data*)ap_get_module_config(r->connection->conn_config, &nwssl_module);	return csd_data->is_secure;}static int nwssl_hook_Fixup(request_rec *r){    int i;    if (!isSecure(r) && !isSecureUpgraded(r))        return DECLINED;    apr_table_set(r->subprocess_env, "HTTPS", "on");    return DECLINED;}static const char *nwssl_hook_http_method (const request_rec *r){    if (isSecure(r) && !isSecureUpgraded(r))        return "https";    return NULL;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -