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

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

?? httpauth.c

?? 站點映像程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*    HTTP Authentication routines   Copyright (C) 1999, Joe Orton <joe@orton.demon.co.uk>                                                                        This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2 of the License, or   (at your option) any later version.     This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.     You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.   $Id: httpauth.c,v 1.10.2.8 1999/07/26 10:49:12 joe Exp $*/#include <config.h>#ifdef HAVE_STDLIB_H#include <stdlib.h>#endif#include <stdio.h>#ifdef HAVE_STRING_H#include <string.h>#endif#include <time.h>#include "dates.h"#include "base64.h"#include "md5.h"#include "strsplit.h"#include "common.h"#include "httpdav.h"#include "httpauth.h"/* HTTP Authentication, as per RFC2617. *//* The challenge parameters */typedef struct {    http_auth_scheme_t scheme;    char *realm;    char *domain;    char *nonce;    char *opaque;    bool stale;    http_auth_algorithm_t alg;    bool got_qop; /* we were given a qop directive */    bool qop_auth; /* "auth" token in qop attrib */    bool qop_auth_int; /* "auth-int" token in qop attrib */} http_auth_chall_t;const char *http_auth_qop_values[] = {    NULL,    "auth",    "auth-int"};const char *http_auth_alg_names[] = {    "MD5",    "MD5-sess",    NULL};char *http_auth_get_cnonce(void);void http_auth_clean( http_auth_session_t *sess );bool http_auth_challenge_digest( http_auth_session_t *, http_auth_chall_t * );bool http_auth_challenge_basic( http_auth_session_t *, http_auth_chall_t * );char *http_auth_request_digest( http_auth_session_t * );char *http_auth_request_basic( http_auth_session_t * );/* Initialize an auth session */void http_auth_init( http_auth_session_t *sess, 		     const char *username, const char *password ) {    /* Initialize the session information */    memset( sess, 0, sizeof( http_auth_session_t ) );    /* Remember the username+password */    sess->username = username;    sess->password = password;}/* Start a new request */void http_auth_new_request( http_auth_session_t *sess,			    const char *method, const char *uri,			    const char *body_buffer, FILE *body_stream ) {    sess->uri = uri;    sess->method = method;    sess->got_body = (body_buffer!=NULL) || (body_stream!=NULL);    sess->body_buffer = body_buffer;    sess->body_stream = body_stream;    md5_init_ctx( &sess->response_body );}void http_auth_clean( http_auth_session_t *sess ) {#define DOFREE( x ) \    if( x != NULL ) {					\	DEBUG( DEBUG_HTTPAUTH, "Freeing " #x "\n" ); 	\	free( x ); x = NULL; 				\    } else {						\	DEBUG( DEBUG_HTTPAUTH, "Not freeing " #x "\n" );	\    }    DOFREE( sess->basic );    DOFREE( sess->unq_realm );    DOFREE( sess->unq_nonce );    DOFREE( sess->unq_cnonce );    DOFREE( sess->opaque );#undef DOFREE}void http_auth_finish( http_auth_session_t *sess ) {    sess->scheme = http_auth_scheme_none;    http_auth_clean( sess );}/* Returns cnonce-value. We just use base64( time ). * TODO: Could improve this? */char *http_auth_get_cnonce(void) {    char *ret, *tmp;    tmp = rfc1123_date( time(NULL) );    ret = base64( tmp );    free( tmp );    return ret;}/* Add authentication creditials to a request */char *http_auth_request( http_auth_session_t *sess) {    switch( sess->scheme ) {    case http_auth_scheme_basic:	return http_auth_request_basic( sess );	break;    case http_auth_scheme_digest:	return http_auth_request_digest( sess );	break;    default:	break;    }    return NULL;}/* Examine a Basic auth challenge */bool http_auth_challenge_basic( http_auth_session_t *sess, 				http_auth_chall_t *parms ) {    char *tmp;    /* Verify challenge... must have realm, even though we ignore it. */    if( parms->realm == NULL )	return false;    DEBUG( DEBUG_HTTPAUTH, "Got Basic challenge with realm [%s]\n", 	   parms->realm );    sess->scheme = http_auth_scheme_basic;    /* +2 = one for ':' + one for '\0' */    tmp = malloc( strlen(sess->username) + strlen(sess->password) +		  2 );    strcpy( tmp, sess->username );    strcat( tmp, ":" );    strcat( tmp, sess->password );        sess->basic = base64( tmp );    free( tmp );    return true;    }/* Add Basic authentication credentials to a request */char *http_auth_request_basic( http_auth_session_t *sess ) {    char *buf;    /* 6 for "Basic ", 2 for \r\n, 1 for \0 */    buf = malloc( 6 + strlen(sess->basic) + 2 + 1 );    strcpy( buf, "Basic " );    strcat( buf, sess->basic );    strcat( buf, "\r\n" );    return buf;}bool http_auth_challenge_digest( http_auth_session_t *sess,				 http_auth_chall_t *parms ) {    struct md5_ctx a1, tmp;    unsigned char a1_md5[16], tmp_md5[16];    char tmp_md5_ascii[33];    /* Do we understand this challenge? */    if( parms->alg == http_auth_alg_unknown ) {	DEBUG( DEBUG_HTTPAUTH, "Unknown algorithm.\n" );	return false;    }    if( (parms->alg == http_auth_alg_md5_sess) &&	!( parms->qop_auth || parms->qop_auth_int ) ) {	DEBUG( DEBUG_HTTPAUTH, "Server did not give qop with MD5-session alg.\n" );	return false;    }    if( (parms->realm==NULL) || (parms->nonce==NULL) ) {	DEBUG( DEBUG_HTTPAUTH, "Challenge missing nonce or realm.\n" );	return false;    }    DEBUG( DEBUG_HTTPAUTH, "In digest challenge.\n" );    sess->alg = parms->alg;    sess->scheme = http_auth_scheme_digest;    sess->unq_realm = strstrip(parms->realm, '"' );    sess->unq_nonce = strstrip(parms->nonce, '"' );    sess->unq_cnonce = http_auth_get_cnonce();    if( parms->opaque != NULL ) {	sess->opaque = strdup( parms->opaque ); /* don't strip the quotes */    }    if( parms->got_qop ) {	/* What type of qop are we to apply to the message? */	DEBUG( DEBUG_HTTPAUTH, "Got qop directive.\n" );	sess->nonce_count = 0;	if( parms->qop_auth_int ) {	    sess->qop = http_auth_qop_auth_int;	} else {	    sess->qop = http_auth_qop_auth;	}    } else {	/* No qop at all/ */	sess->qop = http_auth_qop_none;    }    if( sess->alg == http_auth_alg_md5_sess ) {	/* Calculate the session H(A1)	 *  tmp = H( unq(username-value) ":" unq(realm-value) ":" passwd )	 */	DEBUG( DEBUG_HTTPAUTH, "Calculating H(A1) for session.\n" );	md5_init_ctx( &a1 );	md5_init_ctx( &tmp );	md5_process_bytes( sess->username, strlen(sess->username), &tmp);	md5_process_bytes( ":", 1, &tmp );	md5_process_bytes( sess->unq_realm, strlen(sess->unq_realm), &tmp );	md5_process_bytes( ":", 1, &tmp );	md5_process_bytes( sess->password, strlen(sess->password), &tmp);	md5_finish_ctx( &tmp, tmp_md5 );	md5_hexify( tmp_md5, tmp_md5_ascii );	/* Now we calculate A1 proper:	 *    A1 = H( ...above...) ":" unq(nonce-value) ":" unq(cnonce-value) 	 */	md5_process_bytes( tmp_md5_ascii, 32, &a1 );	md5_process_bytes( ":", 1, &a1 );	md5_process_bytes( sess->unq_nonce, strlen(sess->unq_nonce), &a1 );	md5_process_bytes( ":", 1, &a1 );	md5_process_bytes( sess->unq_cnonce, strlen(sess->unq_cnonce), &a1 );	md5_finish_ctx( &a1, a1_md5 );	md5_hexify( a1_md5, sess->h_a1 );	DEBUG( DEBUG_HTTPAUTH, "Session H(A1) is [%s]\n", sess->h_a1 );    }    DEBUG( DEBUG_HTTPAUTH, "I like this Digest challenge.\n" );    return true;}/* Return Digest authentication credentials header value for the given * session. */char *http_auth_request_digest( http_auth_session_t *sess ) {    struct md5_ctx a1, a2, rdig;    unsigned char a1_md5[16], a2_md5[16], rdig_md5[16];    char a1_md5_ascii[33], a2_md5_ascii[33], rdig_md5_ascii[33];    char nc_value[9] = {0}, *ret;    const char *qop_value; /* qop-value */    size_t retlen;    /* Increase the nonce-count */    if( sess->qop != http_auth_qop_none ) {	sess->nonce_count++;	sprintf( nc_value, "%08x", sess->nonce_count );	DEBUG( DEBUG_HTTPAUTH, "Nonce count is %d, nc is [%s]\n", 	       sess->nonce_count, nc_value );    }    qop_value = http_auth_qop_values[sess->qop];    /* If we are not using MD5-session, calculate H(A1) etc */    if( sess->alg == http_auth_alg_md5 ) {	md5_init_ctx( &a1 );	md5_process_bytes( sess->username, strlen( sess->username ), &a1 );	md5_process_bytes( ":", 1, &a1 );	md5_process_bytes( sess->unq_realm, strlen( sess->unq_realm ), &a1 );	md5_process_bytes( ":", 1, &a1 );	md5_process_bytes( sess->password, strlen( sess->password ), &a1 );	md5_finish_ctx( &a1, a1_md5 );	md5_hexify( a1_md5, a1_md5_ascii );	DEBUG( DEBUG_HTTPAUTH, "New H(A1): %s\n", a1_md5_ascii );    } /* Otherwise, we reuse the session H(A1) */    /* Calculate H(A2). */    md5_init_ctx( &a2 );    md5_process_bytes( sess->method, strlen(sess->method), &a2 );    md5_process_bytes( ":", 1, &a2 );    md5_process_bytes( sess->uri, strlen(sess->uri), &a2 );    if( sess->qop == http_auth_qop_auth_int ) {	/* Calculate H(entity-body) */	if( sess->got_body ) {	    char tmp_md5_ascii[33], tmp_md5[16];	    if( sess->body_stream != NULL ) {		DEBUG( DEBUG_HTTPAUTH, "Digesting body stream.\n" );		md5_stream( sess->body_stream, tmp_md5 );		rewind( sess->body_stream ); /* leave it at the beginning */	    } else if( sess->body_buffer ) {		DEBUG( DEBUG_HTTPAUTH, "Digesting body buffer.\n" );		md5_buffer( sess->body_buffer, strlen(sess->body_buffer), 			    tmp_md5 );	    }	    md5_hexify( tmp_md5, tmp_md5_ascii );	    DEBUG( DEBUG_HTTPAUTH, "H(entity-body) is [%s]\n", tmp_md5_ascii );	    /* Append to A2 */	    md5_process_bytes( ":", 1, &a2 );	    md5_process_bytes( tmp_md5_ascii, 32, &a2 );	} else {	    /* No entity-body. */	    DEBUG( DEBUG_HTTPAUTH, "Digesting empty entity-body.\n" );	    md5_process_bytes( ":d41d8cd98f00b204e9800998ecf8427e", 33, &a2 );	}    }    md5_finish_ctx( &a2, a2_md5 );    md5_hexify( a2_md5, a2_md5_ascii );    DEBUG( DEBUG_HTTPAUTH, "H(A2): %s\n", a2_md5_ascii );    DEBUG( DEBUG_HTTPAUTH, "Calculating Request-Digest.\n" );    /* Now, calculation of the Request-Digest.     * The first section is the regardless of qop value     *     H(A1) ":" unq(nonce-value) ":" */    md5_init_ctx( &rdig );    if( sess->alg == http_auth_alg_md5 ) {	/* Use the calculated H(A1) */	md5_process_bytes( a1_md5_ascii, 32, &rdig );    } else {	/* Use the session H(A1) */	md5_process_bytes( sess->h_a1, 32, &rdig );    }    md5_process_bytes( ":", 1, &rdig );    md5_process_bytes( sess->unq_nonce, strlen(sess->unq_nonce), &rdig );    md5_process_bytes( ":", 1, &rdig );    if( sess->qop != http_auth_qop_none ) {	/* Add on:	 *    nc-value ":" unq(cnonce-value) ":" unq(qop-value) ":"	 */	DEBUG( DEBUG_HTTPAUTH, "Have qop directive, digesting: [%s:%s:%s]\n",	       nc_value, sess->unq_cnonce, qop_value );	md5_process_bytes( nc_value, 8, &rdig );	md5_process_bytes( ":", 1, &rdig );	md5_process_bytes( sess->unq_cnonce, strlen(sess->unq_cnonce), &rdig );	md5_process_bytes( ":", 1, &rdig );	/* Store a copy of this structure */	sess->stored_rdig = rdig;	md5_process_bytes( qop_value, strlen(qop_value), &rdig );	md5_process_bytes( ":", 1, &rdig );    } else {	/* Store a copy of this structure */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
热久久国产精品| 国产精品不卡在线观看| 五月天欧美精品| 欧美精品一级二级三级| 亚洲国产精品久久艾草纯爱| 欧美伊人久久大香线蕉综合69 | 欧美一区二区视频网站| 亚洲成人精品在线观看| 日韩一区二区三区高清免费看看| 美女免费视频一区二区| 久久色视频免费观看| 成人ar影院免费观看视频| 亚洲色图欧美偷拍| 欧美日韩国产欧美日美国产精品| 日韩成人精品视频| 国产偷国产偷亚洲高清人白洁| 成人在线综合网站| 亚洲精品老司机| 日韩午夜在线观看视频| 国产宾馆实践打屁股91| 亚洲视频中文字幕| 欧美一级一区二区| 成人免费电影视频| 亚洲妇女屁股眼交7| 久久综合中文字幕| 91免费看片在线观看| 青青草国产成人av片免费| 中国av一区二区三区| 欧美视频中文字幕| 国产电影一区在线| 午夜精品免费在线| 国产片一区二区三区| 欧美无砖专区一中文字| 国产精品一区二区视频| 亚洲成人一区二区| 国产精品久久久爽爽爽麻豆色哟哟| 在线观看一区不卡| 国产精品一区二区男女羞羞无遮挡 | 亚洲18女电影在线观看| 亚洲精品一区二区三区四区高清| 色综合天天综合在线视频| 免费观看日韩av| 一区二区在线看| 久久久精品日韩欧美| 91精品国产欧美日韩| 一本一道久久a久久精品| 国产激情视频一区二区在线观看| 亚洲国产欧美在线| ...中文天堂在线一区| 精品入口麻豆88视频| 欧美无砖专区一中文字| 91视频你懂的| 成人综合激情网| 国产美女在线观看一区| 五月天精品一区二区三区| 亚洲日本青草视频在线怡红院| 精品va天堂亚洲国产| 欧美日韩亚洲高清一区二区| 成人精品鲁一区一区二区| 九九视频精品免费| 日韩不卡一区二区| 石原莉奈一区二区三区在线观看| 亚洲色图色小说| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 国产精品久久三区| 国产欧美日韩在线| 久久精品水蜜桃av综合天堂| 日韩欧美精品在线| 5858s免费视频成人| 欧美体内she精高潮| 色婷婷久久综合| 91在线精品一区二区三区| 成人精品视频一区二区三区 | 欧美一区二区三区色| 欧洲精品一区二区| 91蝌蚪国产九色| 99久久精品情趣| 99久久综合狠狠综合久久| 成人国产精品免费观看| 不卡视频一二三| 99视频一区二区| 91精品福利视频| 欧美亚洲愉拍一区二区| 欧美日免费三级在线| 欧美系列在线观看| 欧美精品第一页| 日韩一区二区电影| 久久免费午夜影院| 日本一区二区三区四区| 亚洲欧洲性图库| 夜夜嗨av一区二区三区四季av| 亚洲亚洲人成综合网络| 日本在线播放一区二区三区| 激情综合色综合久久| 国产成人免费在线观看不卡| 成人黄色免费短视频| 91老司机福利 在线| 51午夜精品国产| 精品久久久久av影院| 中文字幕av一区二区三区免费看| 国产精品美女一区二区在线观看| 国产精品白丝在线| 亚洲图片欧美视频| 精品无人码麻豆乱码1区2区 | 精品视频色一区| 日韩一区二区三区在线视频| 久久久99精品久久| 一区二区三区日韩| 日韩二区三区在线观看| 国产精品自产自拍| 91高清在线观看| 欧美xfplay| 一区二区三区不卡在线观看| 日韩av午夜在线观看| 国产精品99久久久久久久vr| 色婷婷av一区二区三区之一色屋| 日韩一区二区高清| 亚洲人成精品久久久久久| 日本特黄久久久高潮| 懂色av中文字幕一区二区三区| 91成人免费在线视频| 久久先锋影音av鲁色资源网| 亚洲卡通欧美制服中文| 精品一区二区三区在线观看国产| 99久久伊人网影院| 日韩欧美专区在线| 亚洲最大色网站| 福利视频网站一区二区三区| 欧美美女网站色| 亚洲特黄一级片| 国产精品夜夜嗨| 日韩一区二区免费在线观看| 亚洲三级在线免费| 国产在线精品国自产拍免费| 在线观看亚洲成人| 国产精品免费久久久久| 国内外精品视频| 日韩西西人体444www| 亚洲精品福利视频网站| 国产精品一二三四| 日韩欧美区一区二| 石原莉奈在线亚洲二区| 欧美最猛性xxxxx直播| 亚洲同性gay激情无套| 国产一区二区三区观看| 91精品国产综合久久福利软件| 亚洲精品国产精华液| 成人av免费在线观看| 久久精品网站免费观看| 六月丁香综合在线视频| 91精品在线免费| 亚洲成人黄色影院| 在线观看91精品国产入口| 国产精品美女久久久久久| 国产乱码字幕精品高清av| 欧美一区二区精品久久911| 亚洲 欧美综合在线网络| 欧美亚洲国产一区二区三区va | 国产偷国产偷精品高清尤物| 六月丁香综合在线视频| 日韩一区二区三| 老司机精品视频在线| 91精品国产欧美日韩| 日韩精品成人一区二区三区| 欧美视频精品在线| 亚洲成人免费在线观看| 欧美久久久久久久久中文字幕| 亚洲大片免费看| 欧美精品电影在线播放| 视频一区在线视频| 日韩一区二区视频| 精品一二三四在线| 国产午夜精品美女毛片视频| 国产成人av自拍| 国产精品素人一区二区| 不卡高清视频专区| 亚洲日本在线观看| 在线观看日韩精品| 同产精品九九九| 日韩免费观看高清完整版| 久久成人久久爱| 国产日韩精品视频一区| 国产91精品一区二区麻豆网站| 国产精品久99| 欧美日免费三级在线| 裸体在线国模精品偷拍| 日韩精品一区二区三区视频播放| 国产一区二区三区香蕉| 中文字幕av一区二区三区| 91丝袜美女网| 全国精品久久少妇| 国产亚洲成av人在线观看导航| 99久久精品久久久久久清纯| 一区二区三区免费观看| 日韩片之四级片| 99精品视频一区| 日本一不卡视频| √…a在线天堂一区| 8v天堂国产在线一区二区| 国产一区二区三区久久悠悠色av |