亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
精品国产乱码久久久久久蜜臀| 北条麻妃一区二区三区| 久久久不卡网国产精品二区 | 日韩久久久精品| 成人国产精品免费| 日韩精品高清不卡| 不卡的电视剧免费网站有什么| 亚洲欧洲日产国码二区| 欧美一区二区三区思思人| 国产成人超碰人人澡人人澡| 亚洲欧洲美洲综合色网| 亚洲老司机在线| 一区二区激情视频| 日韩制服丝袜先锋影音| 日日夜夜精品免费视频| 蜜臀精品久久久久久蜜臀| 欧美a一区二区| 国产一区二区在线影院| 在线观看日韩国产| 亚洲欧洲三级电影| 26uuu成人网一区二区三区| 欧美一区二区精品久久911| 欧美日韩激情一区二区三区| 91精品国产麻豆国产自产在线| 欧美日韩国产一二三| 精品国产91洋老外米糕| 国产精品久久夜| 五月综合激情婷婷六月色窝| 国产精品白丝jk白祙喷水网站| 91在线看国产| 日韩一区二区免费在线电影| 国产喷白浆一区二区三区| 一区二区三区蜜桃| 韩日精品视频一区| 91在线观看高清| 日韩欧美精品在线| 亚洲色图视频网| 另类小说综合欧美亚洲| 成人va在线观看| 日韩一区二区三区电影| 亚洲日本丝袜连裤袜办公室| 看电影不卡的网站| 一本色道久久综合精品竹菊| 日韩一级片网址| 亚洲一线二线三线视频| 久久国产人妖系列| 在线观看www91| 国产性天天综合网| 一区二区三区在线不卡| 国产一区亚洲一区| 7777精品伊人久久久大香线蕉经典版下载 | 色婷婷激情综合| 日韩视频免费观看高清完整版| 一区在线播放视频| 国模娜娜一区二区三区| 欧美日韩精品三区| 综合网在线视频| 国产一区二区伦理| 91精品国产综合久久精品性色 | 色婷婷激情综合| 日本一区二区三区免费乱视频| 玉足女爽爽91| 99re视频精品| 国产精品免费视频一区| 一区二区三区精品视频在线| 国产69精品久久久久777| 亚洲精品一区二区三区在线观看 | 成人免费的视频| 久久亚洲私人国产精品va媚药| 天堂在线一区二区| 欧美视频一区二区| 亚洲自拍偷拍综合| 欧美艳星brazzers| 亚洲一区二区三区在线看| 一本一道波多野结衣一区二区| 国产精品萝li| 91丨九色丨国产丨porny| 国产精品丝袜91| 波多野结衣在线aⅴ中文字幕不卡 波多野结衣在线一区 | 久久久久久免费毛片精品| 免费高清在线视频一区·| 欧美撒尿777hd撒尿| 亚洲欧洲国产日韩| 99精品视频一区| 亚洲视频一二三区| 成人精品免费视频| 一区二区三区国产豹纹内裤在线| 91浏览器在线视频| 亚洲综合一区二区三区| 欧美日韩一区不卡| 免费欧美在线视频| 欧美大尺度电影在线| 日韩专区中文字幕一区二区| 日韩欧美一区二区在线视频| 精品一区二区三区在线播放| 久久亚洲精品小早川怜子| 国产综合色精品一区二区三区| 久久久精品人体av艺术| 99综合电影在线视频| 一区二区三区欧美在线观看| 91精品国产综合久久久蜜臀图片 | 国产精品女同一区二区三区| 99re在线精品| 日本成人在线不卡视频| 欧美高清在线精品一区| 欧洲在线/亚洲| 国产一区激情在线| 亚洲一卡二卡三卡四卡无卡久久| 日韩视频一区在线观看| 成人性生交大片免费看中文网站| 亚洲一区二区三区三| 精品国产一区二区三区忘忧草| 99re视频这里只有精品| 国内偷窥港台综合视频在线播放| 亚洲人成精品久久久久| 精品国产乱码久久| 欧美色手机在线观看| 国产中文一区二区三区| 一区二区三区在线视频免费观看| 精品久久国产字幕高潮| 色偷偷一区二区三区| 蜜桃视频一区二区| 自拍av一区二区三区| 日韩一级完整毛片| 欧美色图在线观看| 国产一区二区三区免费看| 亚洲一区在线视频观看| 国产欧美精品一区| 91成人免费网站| 精品写真视频在线观看| 丝袜国产日韩另类美女| 中文字幕色av一区二区三区| 精品久久久久一区二区国产| 欧美美女一区二区| 91黄色小视频| 99v久久综合狠狠综合久久| 琪琪久久久久日韩精品| 亚洲欧美一区二区三区国产精品 | 欧美一区二区在线观看| av在线播放一区二区三区| 日韩电影在线观看一区| 亚洲一区二区三区视频在线| 亚洲女与黑人做爰| 最新国产成人在线观看| 欧美激情一区二区三区蜜桃视频| 精品国产乱码久久久久久久| 日韩欧美中文字幕公布| 777色狠狠一区二区三区| 欧美精三区欧美精三区| 色吧成人激情小说| 色婷婷国产精品综合在线观看| www.亚洲精品| 91视频www| 日本丰满少妇一区二区三区| 一本一道久久a久久精品| 91蝌蚪国产九色| 色噜噜狠狠成人网p站| 色哟哟一区二区三区| 色吧成人激情小说| 欧美片网站yy| 日韩一级视频免费观看在线| 精品国产凹凸成av人网站| 337p日本欧洲亚洲大胆精品| 久久久精品天堂| 亚洲欧洲日韩在线| 亚洲成av人在线观看| 日本特黄久久久高潮 | 欧美国产欧美亚州国产日韩mv天天看完整 | 国产精品初高中害羞小美女文| 国产精品入口麻豆原神| 亚洲日本护士毛茸茸| 三级一区在线视频先锋 | 欧美不卡一区二区三区| 久久久久久综合| 亚洲视频小说图片| 日韩黄色一级片| 国产成人啪免费观看软件| 91视频在线看| 日韩三级视频在线看| 欧美激情一区二区| 亚洲综合色丁香婷婷六月图片| 日本美女一区二区| 99精品久久久久久| 91精品国产综合久久精品性色| 久久久精品人体av艺术| 亚洲专区一二三| 国产成人免费网站| 欧美午夜精品电影| 久久久久久夜精品精品免费| 亚洲日本一区二区| 国产美女视频一区| 在线观看视频一区| 日本一区二区三区电影| 午夜电影一区二区| 成人av在线一区二区三区| 日韩一级二级三级| 亚洲精品久久久蜜桃| 国产麻豆精品在线观看| 欧美日韩综合不卡| 国产精品久久久久久久久图文区|