diff libpurple/plugins/perl/common/Certificate.xs @ 23658:9d7ebd28d339

Another Perl patch from Zsombor Welker to add more functions. Fixes #5957
author Daniel Atallah <daniel.atallah@gmail.com>
date Thu, 07 Aug 2008 04:03:23 +0000
parents
children bf2ca2c5ac40
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/plugins/perl/common/Certificate.xs	Thu Aug 07 04:03:23 2008 +0000
@@ -0,0 +1,302 @@
+#include "module.h"
+
+struct cb_data {
+	SV *cb;
+	SV *user_data;
+};
+
+static void cb_cert_verify(PurpleCertificateVerificationStatus st, struct cb_data *d) {
+	dSP;
+
+	ENTER;
+	SAVETMPS;
+
+	PUSHMARK(SP);
+
+	XPUSHs(sv_2mortal(newSViv(st)));
+	XPUSHs(d->user_data);
+
+	PUTBACK;
+
+	call_sv(d->cb, G_VOID | G_EVAL);
+
+	if(SvTRUE(ERRSV)) {
+		STRLEN l_a;
+		purple_debug_warning("perl", "Failed to run 'certificate verify' callback: %s\n", SvPV(ERRSV, l_a));
+	}
+
+	FREETMPS;
+	LEAVE;
+
+	SvREFCNT_dec(d->cb);
+	SvREFCNT_dec(d->user_data);
+
+	g_free(d);
+}
+
+MODULE = Purple::Certificate  PACKAGE = Purple::Certificate  PREFIX = purple_certificate_
+PROTOTYPES: ENABLE
+
+BOOT:
+{
+	HV *stash = gv_stashpv("Purple::Certificate", 1);
+
+	static const constiv *civ, const_iv[] = {
+#define const_iv(name) {#name, (IV)PURPLE_CERTIFICATE_##name}
+		const_iv(INVALID),
+		const_iv(VALID),
+	};
+
+	for (civ = const_iv + sizeof(const_iv) / sizeof(const_iv[0]); civ-- > const_iv; )
+		newCONSTSUB(stash, (char *)civ->name, newSViv(civ->iv));
+}
+
+void
+purple_certificate_add_ca_search_path(path)
+	const char* path
+
+gboolean
+purple_certificate_check_subject_name(crt, name)
+	Purple::Certificate crt
+	const gchar* name
+
+Purple::Certificate
+purple_certificate_copy(crt)
+	Purple::Certificate crt
+
+void
+purple_certificate_destroy(crt)
+	Purple::Certificate crt
+
+void
+purple_certificate_display_x509(crt)
+	Purple::Certificate crt
+
+## changed order of arguments, so that $cert->export($file) could be used
+gboolean
+purple_certificate_export(crt, filename)
+	const gchar* filename
+	Purple::Certificate crt
+	C_ARGS:
+		filename, crt
+
+Purple::Certificate::Pool
+purple_certificate_find_pool(scheme_name, pool_name)
+	const gchar* scheme_name
+	const gchar* pool_name
+
+Purple::Certificate::Scheme
+purple_certificate_find_scheme(name)
+	const gchar* name
+
+Purple::Certificate::Verifier
+purple_certificate_find_verifier(scheme_name, ver_name)
+	const gchar* scheme_name
+	const gchar* ver_name
+
+Purple::Handle
+purple_certificate_get_handle()
+
+gchar_own*
+purple_certificate_get_issuer_unique_id(crt)
+	Purple::Certificate crt
+
+gchar_own*
+purple_certificate_get_subject_name(crt)
+	Purple::Certificate crt
+
+gchar_own*
+purple_certificate_get_unique_id(crt)
+	Purple::Certificate crt
+
+Purple::Certificate
+purple_certificate_import(scheme, filename)
+	Purple::Certificate::Scheme scheme
+	const gchar* filename
+
+gboolean
+purple_certificate_register_pool(pool)
+	Purple::Certificate::Pool pool
+
+gboolean
+purple_certificate_register_scheme(scheme)
+	Purple::Certificate::Scheme scheme
+
+gboolean
+purple_certificate_register_verifier(vr)
+	Purple::Certificate::Verifier vr
+
+gboolean
+purple_certificate_signed_by(crt, issuer)
+	Purple::Certificate crt
+	Purple::Certificate issuer
+
+gboolean
+purple_certificate_unregister_pool(pool)
+	Purple::Certificate::Pool pool
+
+gboolean
+purple_certificate_unregister_scheme(scheme)
+	Purple::Certificate::Scheme scheme
+
+gboolean
+purple_certificate_unregister_verifier(vr)
+	Purple::Certificate::Verifier vr
+
+void
+purple_certificate_verify_complete(vrq, st)
+	Purple::Certificate::VerificationRequest vrq
+	Purple::Certificate::VerificationStatus st
+
+gboolean
+purple_certificate_get_times(crt, OUTLIST time_t activation, OUTLIST time_t expiration)
+	Purple::Certificate crt
+	PROTOTYPE: $
+
+void
+purple_certificate_destroy_list(...)
+	PREINIT:
+	GList* l = NULL;
+	int i = 0;
+	CODE:
+		for(i = 0; i < items; i++) { /* PurpleCertificate */
+			l = g_list_prepend(l, purple_perl_ref_object(ST(i)));
+		}
+		purple_certificate_destroy_list(l);
+
+void
+purple_certificate_get_pools()
+	PREINIT:
+		GList *l;
+	PPCODE:
+		for(l = purple_certificate_get_pools(); l; l = l->next) {
+			XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::Certificate::Pool")));
+		}
+
+void
+purple_certificate_get_schemes()
+	PREINIT:
+		GList *l;
+	PPCODE:
+		for(l = purple_certificate_get_schemes(); l; l = l->next) {
+			XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::Certificate::Scheme")));
+		}
+
+void
+purple_certificate_get_verifiers()
+	PREINIT:
+		GList *l;
+	PPCODE:
+		for(l = purple_certificate_get_verifiers(); l; l = l->next) {
+			XPUSHs(sv_2mortal(purple_perl_bless_object(l->data, "Purple::Certificate::Verifier")));
+		}
+
+void
+purple_certificate_check_signature_chain(...)
+	PREINIT:
+		GList *l = NULL;
+		gboolean ret;
+		int i;
+	PPCODE:
+		for(i = 0; i < items; i++) { /* PurpleCertificate */
+			l = g_list_prepend(l, purple_perl_ref_object(ST(i)));
+		}
+		l = g_list_reverse(l);
+		ret = purple_certificate_check_signature_chain(l);
+		g_list_free(l);
+		if(ret) XSRETURN_YES;
+		XSRETURN_NO;
+
+SV*
+purple_certificate_get_fingerprint_sha1(crt)
+	Purple::Certificate crt
+	PREINIT:
+		GByteArray *gba = NULL;
+	CODE:
+		gba = purple_certificate_get_fingerprint_sha1(crt);
+		RETVAL = newSVpv(gba->data, gba->len);
+		g_byte_array_free(gba, TRUE);
+	OUTPUT:
+		RETVAL
+
+void
+purple_certificate_verify(verifier, subject_name, cert_chain, cb, cb_data)
+	Purple::Certificate::Verifier verifier
+	const gchar* subject_name
+	AV* cert_chain
+	CV *cb
+	SV *cb_data
+	PREINIT:
+		GList *l = NULL;
+		int len = 0, i = 0;
+		struct cb_data *d = NULL;
+	PPCODE:
+		len = av_len(cert_chain) + 1;
+		for(i = 0; i < len; i++) {
+			SV **sv = av_fetch(cert_chain, i, 0);
+			if(!sv || !purple_perl_is_ref_object(*sv)) {
+				g_list_free(l);
+				warn("Purple::Certificate::verify: cert_chain: non-purple object in array...");
+				XSRETURN_UNDEF;
+			}
+			l = g_list_prepend(l, purple_perl_ref_object(*sv));
+		}
+		l = g_list_reverse(l);
+
+		d = g_new0(struct cb_data, 1);
+		d->cb = newSVsv(ST(3));
+		d->user_data = newSVsv(cb_data);
+		
+		purple_certificate_verify(verifier, subject_name, l, (PurpleCertificateVerifiedCallback) cb_cert_verify, d);
+
+		g_list_free(l);
+
+MODULE = Purple::Certificate  PACKAGE = Purple::Certificate::Pool  PREFIX = purple_certificate_pool_
+PROTOTYPES: ENABLE
+
+void
+purple_certificate_pool_get_idlist(pool)
+	Purple::Certificate::Pool pool
+	PREINIT:
+		GList *l, *b;
+	PPCODE:
+		b = purple_certificate_pool_get_idlist(pool);
+		for(l = b; l; l = l->next) {
+			XPUSHs(sv_2mortal(newSVpv(l->data, 0)));
+		}
+		purple_certificate_pool_destroy_idlist(b);
+
+gboolean
+purple_certificate_pool_contains(pool, id)
+	Purple::Certificate::Pool pool
+	const gchar* id
+
+gboolean
+purple_certificate_pool_delete(pool, id)
+	Purple::Certificate::Pool pool
+	const gchar* id
+
+Purple::Certificate::Scheme
+purple_certificate_pool_get_scheme(pool)
+	Purple::Certificate::Pool pool
+
+gchar_own*
+purple_certificate_pool_mkpath(pool, id)
+	Purple::Certificate::Pool pool
+	const gchar* id
+
+Purple::Certificate
+purple_certificate_pool_retrieve(pool, id)
+	Purple::Certificate::Pool pool
+	const gchar* id
+
+gboolean
+purple_certificate_pool_store(pool, id, crt)
+	Purple::Certificate::Pool pool
+	const gchar* id
+	Purple::Certificate crt
+
+gboolean
+purple_certificate_pool_usable(pool)
+	Purple::Certificate::Pool pool
+