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

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

?? ssl-nss.c

?? Linux下的多協議即時通訊程序源代碼
?? C
字號:
/** * @file ssl-nss.c Mozilla NSS SSL plugin. * * purple * * Copyright (C) 2003 Christian Hammond <chipx86@gnupdate.org> * * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include "internal.h"#include "debug.h"#include "plugin.h"#include "sslconn.h"#include "version.h"#define SSL_NSS_PLUGIN_ID "ssl-nss"#ifdef HAVE_NSS#undef HAVE_LONG_LONG /* Make Mozilla less angry. If angry, Mozilla SMASH! */#include <nspr.h>#include <nss.h>#include <pk11func.h>#include <prio.h>#include <secerr.h>#include <secmod.h>#include <ssl.h>#include <sslerr.h>#include <sslproto.h>/* This is defined in NSPR's <private/pprio.h>, but to avoid including a * private header we duplicate the prototype here */NSPR_API(PRFileDesc*)  PR_ImportTCPSocket(PRInt32 osfd);typedef struct{	PRFileDesc *fd;	PRFileDesc *in;	guint handshake_handler;} PurpleSslNssData;#define PURPLE_SSL_NSS_DATA(gsc) ((PurpleSslNssData *)gsc->private_data)static const PRIOMethods *_nss_methods = NULL;static PRDescIdentity _identity;/* Thank you, Evolution */static voidset_errno(int code){	/* FIXME: this should handle more. */	switch (code) {	case PR_INVALID_ARGUMENT_ERROR:		errno = EINVAL;		break;	case PR_PENDING_INTERRUPT_ERROR:		errno = EINTR;		break;	case PR_IO_PENDING_ERROR:		errno = EAGAIN;		break;	case PR_WOULD_BLOCK_ERROR:		errno = EAGAIN;		/*errno = EWOULDBLOCK; */		break;	case PR_IN_PROGRESS_ERROR:		errno = EINPROGRESS;		break;	case PR_ALREADY_INITIATED_ERROR:		errno = EALREADY;		break;	case PR_NETWORK_UNREACHABLE_ERROR:		errno = EHOSTUNREACH;		break;	case PR_CONNECT_REFUSED_ERROR:		errno = ECONNREFUSED;		break;	case PR_CONNECT_TIMEOUT_ERROR:	case PR_IO_TIMEOUT_ERROR:		errno = ETIMEDOUT;		break;	case PR_NOT_CONNECTED_ERROR:		errno = ENOTCONN;		break;	case PR_CONNECT_RESET_ERROR:		errno = ECONNRESET;		break;	case PR_IO_ERROR:	default:		errno = EIO;		break;	}}static voidssl_nss_init_nss(void){	char *lib;	PR_Init(PR_SYSTEM_THREAD, PR_PRIORITY_NORMAL, 1);	NSS_NoDB_Init(".");	/* TODO: Fix this so autoconf does the work trying to find this lib. */#ifndef _WIN32	lib = g_strdup(LIBDIR "/libnssckbi.so");#else	lib = g_strdup("nssckbi.dll");#endif	SECMOD_AddNewModule("Builtins", lib, 0, 0);	g_free(lib);	NSS_SetDomesticPolicy();	_identity = PR_GetUniqueIdentity("Purple");	_nss_methods = PR_GetDefaultIOMethods();}static SECStatusssl_auth_cert(void *arg, PRFileDesc *socket, PRBool checksig,			  PRBool is_server){	return SECSuccess;#if 0	CERTCertificate *cert;	void *pinArg;	SECStatus status;	cert = SSL_PeerCertificate(socket);	pinArg = SSL_RevealPinArg(socket);	status = CERT_VerifyCertNow((CERTCertDBHandle *)arg, cert, checksig,								certUsageSSLClient, pinArg);	if (status != SECSuccess) {		purple_debug_error("nss", "CERT_VerifyCertNow failed\n");		CERT_DestroyCertificate(cert);		return status;	}	CERT_DestroyCertificate(cert);	return SECSuccess;#endif}static SECStatusssl_bad_cert(void *arg, PRFileDesc *socket){	SECStatus status = SECFailure;	PRErrorCode err;	if (arg == NULL)		return status;	*(PRErrorCode *)arg = err = PORT_GetError();	switch (err)	{		case SEC_ERROR_INVALID_AVA:		case SEC_ERROR_INVALID_TIME:		case SEC_ERROR_BAD_SIGNATURE:		case SEC_ERROR_EXPIRED_CERTIFICATE:		case SEC_ERROR_UNKNOWN_ISSUER:		case SEC_ERROR_UNTRUSTED_CERT:		case SEC_ERROR_CERT_VALID:		case SEC_ERROR_EXPIRED_ISSUER_CERTIFICATE:		case SEC_ERROR_CRL_EXPIRED:		case SEC_ERROR_CRL_BAD_SIGNATURE:		case SEC_ERROR_EXTENSION_VALUE_INVALID:		case SEC_ERROR_CA_CERT_INVALID:		case SEC_ERROR_CERT_USAGES_INVALID:		case SEC_ERROR_UNKNOWN_CRITICAL_EXTENSION:			status = SECSuccess;			break;		default:			status = SECFailure;			break;	}	purple_debug_error("nss", "Bad certificate: %d\n", err);	return status;}static gbooleanssl_nss_init(void){   return TRUE;}static voidssl_nss_uninit(void){	PR_Cleanup();	_nss_methods = NULL;}static voidssl_nss_handshake_cb(gpointer data, int fd, PurpleInputCondition cond){	PurpleSslConnection *gsc = (PurpleSslConnection *)data;	PurpleSslNssData *nss_data = gsc->private_data;	/* I don't think this the best way to do this...	 * It seems to work because it'll eventually use the cached value	 */	if(SSL_ForceHandshake(nss_data->in) != SECSuccess) {		set_errno(PR_GetError());		if (errno == EAGAIN || errno == EWOULDBLOCK)			return;		purple_debug_error("nss", "Handshake failed %d\n", PR_GetError());		if (gsc->error_cb != NULL)			gsc->error_cb(gsc, PURPLE_SSL_HANDSHAKE_FAILED, gsc->connect_cb_data);		purple_ssl_close(gsc);		return;	}	purple_input_remove(nss_data->handshake_handler);	nss_data->handshake_handler = 0;	gsc->connect_cb(gsc->connect_cb_data, gsc, cond);}static voidssl_nss_connect(PurpleSslConnection *gsc){	PurpleSslNssData *nss_data = g_new0(PurpleSslNssData, 1);	PRSocketOptionData socket_opt;	gsc->private_data = nss_data;	nss_data->fd = PR_ImportTCPSocket(gsc->fd);	if (nss_data->fd == NULL)	{		purple_debug_error("nss", "nss_data->fd == NULL!\n");		if (gsc->error_cb != NULL)			gsc->error_cb(gsc, PURPLE_SSL_CONNECT_FAILED, gsc->connect_cb_data);		purple_ssl_close((PurpleSslConnection *)gsc);		return;	}	socket_opt.option = PR_SockOpt_Nonblocking;	socket_opt.value.non_blocking = PR_TRUE;	if (PR_SetSocketOption(nss_data->fd, &socket_opt) != PR_SUCCESS)		purple_debug_warning("nss", "unable to set socket into non-blocking mode: %d\n", PR_GetError());	nss_data->in = SSL_ImportFD(NULL, nss_data->fd);	if (nss_data->in == NULL)	{		purple_debug_error("nss", "nss_data->in == NUL!\n");		if (gsc->error_cb != NULL)			gsc->error_cb(gsc, PURPLE_SSL_CONNECT_FAILED, gsc->connect_cb_data);		purple_ssl_close((PurpleSslConnection *)gsc);		return;	}	SSL_OptionSet(nss_data->in, SSL_SECURITY,            PR_TRUE);	SSL_OptionSet(nss_data->in, SSL_HANDSHAKE_AS_CLIENT, PR_TRUE);	SSL_AuthCertificateHook(nss_data->in,							(SSLAuthCertificate)ssl_auth_cert,							(void *)CERT_GetDefaultCertDB());	SSL_BadCertHook(nss_data->in, (SSLBadCertHandler)ssl_bad_cert, NULL);	if(gsc->host)		SSL_SetURL(nss_data->in, gsc->host);#if 0	/* This seems like it'd the be the correct way to implement the	nonblocking stuff, but it doesn't seem to work */	SSL_HandshakeCallback(nss_data->in,		(SSLHandshakeCallback) ssl_nss_handshake_cb, gsc);#endif	SSL_ResetHandshake(nss_data->in, PR_FALSE);	nss_data->handshake_handler = purple_input_add(gsc->fd,		PURPLE_INPUT_READ, ssl_nss_handshake_cb, gsc);	ssl_nss_handshake_cb(gsc, gsc->fd, PURPLE_INPUT_READ);}static voidssl_nss_close(PurpleSslConnection *gsc){	PurpleSslNssData *nss_data = PURPLE_SSL_NSS_DATA(gsc);	if(!nss_data)		return;	if (nss_data->in) {		PR_Close(nss_data->in);		gsc->fd = -1;	} else if (nss_data->fd) {		PR_Close(nss_data->fd);		gsc->fd = -1;	}	if (nss_data->handshake_handler)		purple_input_remove(nss_data->handshake_handler);	g_free(nss_data);	gsc->private_data = NULL;}static size_tssl_nss_read(PurpleSslConnection *gsc, void *data, size_t len){	ssize_t ret;	PurpleSslNssData *nss_data = PURPLE_SSL_NSS_DATA(gsc);	ret = PR_Read(nss_data->in, data, len);	if (ret == -1)		set_errno(PR_GetError());	return ret;}static size_tssl_nss_write(PurpleSslConnection *gsc, const void *data, size_t len){	ssize_t ret;	PurpleSslNssData *nss_data = PURPLE_SSL_NSS_DATA(gsc);	if(!nss_data)		return 0;	ret = PR_Write(nss_data->in, data, len);	if (ret == -1)		set_errno(PR_GetError());	return ret;}static PurpleSslOps ssl_ops ={	ssl_nss_init,	ssl_nss_uninit,	ssl_nss_connect,	ssl_nss_close,	ssl_nss_read,	ssl_nss_write,	/* padding */	NULL,	NULL,	NULL,	NULL};#endif /* HAVE_NSS */static gbooleanplugin_load(PurplePlugin *plugin){#ifdef HAVE_NSS	if (!purple_ssl_get_ops()) {		purple_ssl_set_ops(&ssl_ops);	}	/* Init NSS now, so others can use it even if sslconn never does */	ssl_nss_init_nss();	return TRUE;#else	return FALSE;#endif}static gbooleanplugin_unload(PurplePlugin *plugin){#ifdef HAVE_NSS	if (purple_ssl_get_ops() == &ssl_ops) {		purple_ssl_set_ops(NULL);	}#endif	return TRUE;}static PurplePluginInfo info ={	PURPLE_PLUGIN_MAGIC,	PURPLE_MAJOR_VERSION,	PURPLE_MINOR_VERSION,	PURPLE_PLUGIN_STANDARD,                             /**< type           */	NULL,                                             /**< ui_requirement */	PURPLE_PLUGIN_FLAG_INVISIBLE,                       /**< flags          */	NULL,                                             /**< dependencies   */	PURPLE_PRIORITY_DEFAULT,                            /**< priority       */	SSL_NSS_PLUGIN_ID,                             /**< id             */	N_("NSS"),                                        /**< name           */	VERSION,                                          /**< version        */	                                                  /**  summary        */	N_("Provides SSL support through Mozilla NSS."),	                                                  /**  description    */	N_("Provides SSL support through Mozilla NSS."),	"Christian Hammond <chipx86@gnupdate.org>",	PURPLE_WEBSITE,                                     /**< homepage       */	plugin_load,                                      /**< load           */	plugin_unload,                                    /**< unload         */	NULL,                                             /**< destroy        */	NULL,                                             /**< ui_info        */	NULL,                                             /**< extra_info     */	NULL,                                             /**< prefs_info     */	NULL,                                             /**< actions        */	/* padding */	NULL,	NULL,	NULL,	NULL};static voidinit_plugin(PurplePlugin *plugin){}PURPLE_INIT_PLUGIN(ssl_nss, init_plugin, info)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99re8在线精品视频免费播放| 亚洲欧美另类图片小说| 色综合天天天天做夜夜夜夜做| 日韩成人一区二区三区在线观看| 亚洲人成人一区二区在线观看| 欧美精品一区二区三| 91精品国产综合久久精品麻豆| 99久久国产综合精品女不卡| av在线这里只有精品| 成人精品小蝌蚪| 91亚洲精品久久久蜜桃| 色欧美88888久久久久久影院| 成人午夜私人影院| 色偷偷成人一区二区三区91| 91久久精品一区二区三区| 欧美性猛交xxxx黑人交| 在线观看av不卡| 欧美日韩一区视频| 欧美变态tickling挠脚心| 国产亚洲精品久| 国产精品家庭影院| 亚洲国产日韩a在线播放性色| 亚洲精品大片www| 日韩电影免费一区| 国产成人亚洲综合a∨猫咪| av在线不卡网| 这里只有精品电影| 久久久电影一区二区三区| 日韩一区在线看| 天堂蜜桃91精品| 国产精品1024| 欧美人伦禁忌dvd放荡欲情| 精品日韩99亚洲| 亚洲欧洲av在线| 日韩国产在线观看| 91在线精品一区二区三区| 欧美乱妇20p| 国产精品视频你懂的| 性久久久久久久久久久久| 久久99精品国产| 欧美又粗又大又爽| 久久九九久久九九| 午夜欧美在线一二页| 成人精品国产福利| 日韩免费性生活视频播放| 亚洲免费观看高清完整版在线 | 欧美猛男gaygay网站| 欧美tickling网站挠脚心| 亚洲欧美日韩在线| 国产曰批免费观看久久久| 在线观看亚洲专区| 亚洲欧洲av色图| 国产一区二区精品久久91| 欧美日韩不卡一区| 亚洲区小说区图片区qvod| 国产老肥熟一区二区三区| 91精品黄色片免费大全| 亚洲免费观看高清完整版在线观看 | 亚洲伦理在线免费看| 久久精品99国产国产精| 欧美日韩一区二区三区不卡| 欧美一级精品在线| 亚洲国产精品人人做人人爽| 99re成人在线| 国产精品成人免费精品自在线观看| 亚洲 欧美综合在线网络| 色域天天综合网| 中文字幕在线观看一区| 顶级嫩模精品视频在线看| 精品日韩成人av| 精品在线一区二区三区| 日韩一级片网址| 日本欧美加勒比视频| 日韩一区二区免费高清| 美女一区二区在线观看| 日韩欧美高清一区| 久久国产视频网| 日韩欧美精品在线| 国产一区二区视频在线| 亚洲精品在线网站| 韩国av一区二区三区| 久久精品一区二区三区av| 国产成人av资源| 中文字幕中文字幕在线一区 | 95精品视频在线| 亚洲欧洲www| 91传媒视频在线播放| 亚洲午夜在线视频| 欧美日韩精品一区二区三区蜜桃| 亚洲精品免费在线观看| 欧美群妇大交群中文字幕| 日日夜夜一区二区| 精品毛片乱码1区2区3区 | 精品捆绑美女sm三区| 精品在线亚洲视频| 国产精品久久久久久久久免费丝袜| 国产成人综合在线播放| 亚洲天堂免费在线观看视频| 欧美日韩精品欧美日韩精品| 久久精品国产精品亚洲精品| 国产日韩欧美麻豆| 欧美性大战xxxxx久久久| 日本美女一区二区三区视频| 国产偷国产偷精品高清尤物| 色妞www精品视频| 日韩av电影天堂| 国产精品福利影院| 欧美成人国产一区二区| av不卡在线观看| 老司机午夜精品| 亚洲精品成人天堂一二三| 欧美成人精品1314www| www..com久久爱| 麻豆国产91在线播放| 亚洲狼人国产精品| 久久久久久久综合日本| 欧美亚男人的天堂| 国产精品99久久久久久久女警| 国产精品国产三级国产普通话三级| 91年精品国产| 国内精品久久久久影院一蜜桃| 国产精品丝袜黑色高跟| 日韩女优av电影| 欧美日韩精品一区二区在线播放| 精品亚洲欧美一区| 亚洲一区在线电影| 国产日韩欧美综合在线| 欧美一级艳片视频免费观看| 色av成人天堂桃色av| 国产99久久久国产精品| 日av在线不卡| 午夜天堂影视香蕉久久| 亚洲少妇最新在线视频| 久久久久久久久一| 日韩欧美国产高清| 91精品国产品国语在线不卡| 91极品美女在线| 国产成人精品亚洲午夜麻豆| 麻豆成人久久精品二区三区小说| 中文字幕日韩一区| 久久午夜老司机| 日韩精品一区二区在线| 欧美日韩日本视频| 欧美在线你懂得| 色天天综合久久久久综合片| av网站免费线看精品| zzijzzij亚洲日本少妇熟睡| 国产激情视频一区二区三区欧美| 亚洲午夜一二三区视频| 亚洲激情成人在线| 伊人性伊人情综合网| 亚洲精品中文字幕乱码三区| 亚洲免费观看视频| 亚洲一二三级电影| 日韩极品在线观看| 日产精品久久久久久久性色| 免费成人在线观看| 国产中文字幕一区| 国产91丝袜在线播放九色| 不卡av在线免费观看| 91在线国内视频| 欧美在线免费视屏| 欧美电影一区二区三区| 精品欧美黑人一区二区三区| 久久亚区不卡日本| 国产精品妹子av| 一区二区三区**美女毛片| 亚洲小说欧美激情另类| 青娱乐精品视频| 国产资源在线一区| caoporen国产精品视频| 欧美三区在线观看| 日韩久久免费av| 国产欧美一区二区精品秋霞影院| 国产欧美日韩亚州综合| 亚洲情趣在线观看| 日本成人中文字幕| 国产夫妻精品视频| 色先锋aa成人| 日韩欧美亚洲另类制服综合在线 | 奇米影视7777精品一区二区| 激情综合色播激情啊| 岛国av在线一区| 欧美在线免费观看亚洲| 2欧美一区二区三区在线观看视频| 精品国产一区a| 中文字幕一区二区三区乱码在线| 亚洲综合一区二区| 韩国女主播一区二区三区| 一本色道久久综合狠狠躁的推荐| 在线免费观看日韩欧美| 精品处破学生在线二十三| 亚洲人成伊人成综合网小说| 麻豆中文一区二区| 成人福利视频网站| 日韩午夜在线影院| 亚洲一区二区成人在线观看| 国内不卡的二区三区中文字幕| 91丨九色porny丨蝌蚪| 欧美va天堂va视频va在线|