# HG changeset patch # User Daniel Atallah # Date 1218081803 0 # Node ID 9d7ebd28d339e26f005f9f9f136d349a2b67a3e6 # Parent ae3263bfd3f564a4398e368c9f3ae909b2956f2a Another Perl patch from Zsombor Welker to add more functions. Fixes #5957 diff -r ae3263bfd3f5 -r 9d7ebd28d339 libpurple/plugins/perl/common/Certificate.xs --- /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 + diff -r ae3263bfd3f5 -r 9d7ebd28d339 libpurple/plugins/perl/common/Idle.xs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/plugins/perl/common/Idle.xs Thu Aug 07 04:03:23 2008 +0000 @@ -0,0 +1,12 @@ +#include "module.h" + +MODULE = Purple::Idle PACKAGE = Purple::Idle PREFIX = purple_idle_ +PROTOTYPES: ENABLE + +void +purple_idle_touch() + +void +purple_idle_set(time) + time_t time + diff -r ae3263bfd3f5 -r 9d7ebd28d339 libpurple/plugins/perl/common/Makefile.mingw --- a/libpurple/plugins/perl/common/Makefile.mingw Thu Aug 07 03:27:21 2008 +0000 +++ b/libpurple/plugins/perl/common/Makefile.mingw Thu Aug 07 04:03:23 2008 +0000 @@ -39,11 +39,13 @@ BuddyList.xs \ Cipher.xs \ Cmds.xs \ + Certificate.xs \ Connection.xs \ Conversation.xs \ Core.xs \ Debug.xs \ FT.xs \ + Idle.xs \ Purple.xs \ ImgStore.xs \ Log.xs \ @@ -67,6 +69,7 @@ Status.xs \ Stringref.xs \ Util.xs \ + Whiteboard.xs \ XMLNode.xs #FALLBACKS = const-c.inc const-xs.inc diff -r ae3263bfd3f5 -r 9d7ebd28d339 libpurple/plugins/perl/common/Purple.xs --- a/libpurple/plugins/perl/common/Purple.xs Thu Aug 07 03:27:21 2008 +0000 +++ b/libpurple/plugins/perl/common/Purple.xs Thu Aug 07 04:03:23 2008 +0000 @@ -6,6 +6,7 @@ PURPLE_PERL_BOOT_PROTO(Account__Option); PURPLE_PERL_BOOT_PROTO(Buddy__Icon); PURPLE_PERL_BOOT_PROTO(BuddyList); +PURPLE_PERL_BOOT_PROTO(Certificate); PURPLE_PERL_BOOT_PROTO(Cipher); PURPLE_PERL_BOOT_PROTO(Cmd); PURPLE_PERL_BOOT_PROTO(Connection); @@ -13,6 +14,7 @@ PURPLE_PERL_BOOT_PROTO(Core); PURPLE_PERL_BOOT_PROTO(Debug); PURPLE_PERL_BOOT_PROTO(Xfer); +PURPLE_PERL_BOOT_PROTO(Idle); PURPLE_PERL_BOOT_PROTO(ImgStore); PURPLE_PERL_BOOT_PROTO(Log); PURPLE_PERL_BOOT_PROTO(Network); @@ -35,6 +37,7 @@ PURPLE_PERL_BOOT_PROTO(Status); PURPLE_PERL_BOOT_PROTO(Stringref); PURPLE_PERL_BOOT_PROTO(Util); +PURPLE_PERL_BOOT_PROTO(Whiteboard); PURPLE_PERL_BOOT_PROTO(XMLNode); MODULE = Purple PACKAGE = Purple PREFIX = purple_ @@ -45,6 +48,7 @@ PURPLE_PERL_BOOT(Account__Option); PURPLE_PERL_BOOT(Buddy__Icon); PURPLE_PERL_BOOT(BuddyList); + PURPLE_PERL_BOOT(Certificate); PURPLE_PERL_BOOT(Cipher); PURPLE_PERL_BOOT(Cmd); PURPLE_PERL_BOOT(Connection); @@ -52,6 +56,7 @@ PURPLE_PERL_BOOT(Core); PURPLE_PERL_BOOT(Debug); PURPLE_PERL_BOOT(Xfer); + PURPLE_PERL_BOOT(Idle); PURPLE_PERL_BOOT(ImgStore); PURPLE_PERL_BOOT(Log); PURPLE_PERL_BOOT(Network); @@ -74,6 +79,7 @@ PURPLE_PERL_BOOT(Status); PURPLE_PERL_BOOT(Stringref); PURPLE_PERL_BOOT(Util); + PURPLE_PERL_BOOT(Whiteboard); PURPLE_PERL_BOOT(XMLNode); guint diff -r ae3263bfd3f5 -r 9d7ebd28d339 libpurple/plugins/perl/common/Whiteboard.xs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/plugins/perl/common/Whiteboard.xs Thu Aug 07 04:03:23 2008 +0000 @@ -0,0 +1,78 @@ +#include "module.h" + +MODULE = Purple::Whiteboard PACKAGE = Purple::Whiteboard PREFIX = purple_whiteboard_ +PROTOTYPES: ENABLE + +void +purple_whiteboard_clear(wb) + Purple::Whiteboard wb + +Purple::Whiteboard +purple_whiteboard_create(account, who, state) + Purple::Account account + const char* who + int state + +void +purple_whiteboard_destroy(wb) + Purple::Whiteboard wb + +void +purple_whiteboard_draw_line(wb, x1, y1, x2, y2, color, size) + Purple::Whiteboard wb + int x1 + int y1 + int x2 + int y2 + int color + int size + +void +purple_whiteboard_draw_point(wb, x, y, color, size) + Purple::Whiteboard wb + int x + int y + int color + int size + +Purple::Whiteboard +purple_whiteboard_get_session(account, who) + Purple::Account account + const char* who + +void +purple_whiteboard_send_brush(wb, size, color) + Purple::Whiteboard wb + int size + int color + +void +purple_whiteboard_send_clear(wb) + Purple::Whiteboard wb + +void +purple_whiteboard_set_brush(wb, size, color) + Purple::Whiteboard wb + int size + int color + +void +purple_whiteboard_set_dimensions(wb, width, height) + Purple::Whiteboard wb + int width + int height + +gboolean +purple_whiteboard_get_brush(wb, OUTLIST int size, OUTLIST int color) + Purple::Whiteboard wb + PROTOTYPE: $ + +gboolean +purple_whiteboard_get_dimensions(wb, OUTLIST int width, OUTLIST int height) + Purple::Whiteboard wb + PROTOTYPE: $ + +void +purple_whiteboard_start(wb) + Purple::Whiteboard wb + diff -r ae3263bfd3f5 -r 9d7ebd28d339 libpurple/plugins/perl/common/module.h --- a/libpurple/plugins/perl/common/module.h Thu Aug 07 03:27:21 2008 +0000 +++ b/libpurple/plugins/perl/common/module.h Thu Aug 07 04:03:23 2008 +0000 @@ -20,6 +20,7 @@ #include "accountopt.h" #include "blist.h" #include "buddyicon.h" +#include "certificate.h" #include "cipher.h" #include "cmds.h" #include "connection.h" @@ -36,6 +37,7 @@ #include "gtkconv.h" #include "gtkutils.h" #endif +#include "idle.h" #include "imgstore.h" #include "network.h" #include "notify.h" @@ -59,6 +61,7 @@ /* Ewww. perl has it's own util.h which is in the include path :( */ #include "libpurple/util.h" #include "value.h" +#include "whiteboard.h" #include "xmlnode.h" /* account.h */ @@ -81,6 +84,14 @@ /* buddyicon.h */ typedef PurpleBuddyIcon * Purple__Buddy__Icon; +/* certificate.h */ +typedef PurpleCertificate * Purple__Certificate; +typedef PurpleCertificatePool * Purple__Certificate__Pool; +typedef PurpleCertificateScheme * Purple__Certificate__Scheme; +typedef PurpleCertificateVerifier * Purple__Certificate__Verifier; +typedef PurpleCertificateVerificationRequest * Purple__Certificate__VerificationRequest; +typedef PurpleCertificateVerificationStatus Purple__Certificate__VerificationStatus; + /* cipher.h */ typedef PurpleCipher * Purple__Cipher; typedef PurpleCipherCaps Purple__CipherCaps; @@ -274,6 +285,9 @@ /* value.h */ typedef PurpleValue * Purple__Value; +/* whiteboard.h */ +typedef PurpleWhiteboard * Purple__Whiteboard; + /* xmlnode.h */ typedef xmlnode * Purple__XMLNode; typedef XMLNodeType XMLNode__Type; @@ -287,3 +301,4 @@ const char *name; IV iv; } constiv; + diff -r ae3263bfd3f5 -r 9d7ebd28d339 libpurple/plugins/perl/common/typemap --- a/libpurple/plugins/perl/common/typemap Thu Aug 07 03:27:21 2008 +0000 +++ b/libpurple/plugins/perl/common/typemap Thu Aug 07 04:03:23 2008 +0000 @@ -175,6 +175,14 @@ /* enums */ +/* certificate.h */ +Purple::Certificate T_PurpleObj +Purple::Certificate::Pool T_PurpleObj +Purple::Certificate::Scheme T_PurpleObj +Purple::Certificate::Verifier T_PurpleObj +Purple::Certificate::VerificationRequest T_PurpleObj +Purple::Certificate::VerificationStatus T_IV + /* cipher.h */ Purple::Cipher::BatchMode T_IV @@ -186,7 +194,7 @@ /* conversation.h */ Purple::ConvChatBuddyFlags T_IV Purple::ConvUpdateType T_IV -Purple::ConversationType T_IV +Purple::ConversationType T_IV Purple::MessageFlags T_IV Purple::TypingState T_IV Purple::UnseenState T_IV @@ -195,6 +203,9 @@ Purple::ConnectionFlags T_IV Purple::ConnectionState T_IV +/* whiteboard.h */ +Purple::Whiteboard T_PurpleObj + INPUT T_PurpleObj