pidgin/pidgin

Make sure we remove all the files we install.
release-2.x.y
2021-04-11, Gary Kramlich
5407cbf3c5dd
Make sure we remove all the files we install.

Patch was provided by Johann Lochner.

Testing Done:
Build and ran the installer and uninstaller and verified that `C:\Program Files (x86)\Pidgin` was empty and therefore removed.

Bugs closed: PIDGIN-17515

Reviewed at https://reviews.imfreedom.org/r/612/
#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((gchar *)gba->data, gba->len);
g_byte_array_free(gba, TRUE);
OUTPUT:
RETVAL
SV*
purple_certificate_get_fingerprint_sha256(crt, sha1_fallback)
Purple::Certificate crt
gboolean sha1_fallback
PREINIT:
GByteArray *gba = NULL;
CODE:
gba = purple_certificate_get_fingerprint_sha256(crt, sha1_fallback);
RETVAL = newSVpv((gchar *)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
SV *cb_data
PREINIT:
GList *l = NULL;
int len = 0, i = 0;
struct cb_data *d = NULL;
PPCODE:
len = av_len(cert_chain);
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