#include <net.h> // vim syntax=lpc
/* Wrapper for using the tls_check_certificate() efun.
*
* If for example the efun returns this raw data:
*
* ({
* 20,
* ({
* "2.5.4.6",
* "countryName",
* "DE",
* "2.5.4.10",
* "organizationName",
* "mabber.com",
* "2.5.4.11",
* "organizationalUnitName",
* "businessprofile.geotrust.com/get.jsp?GT94033690",
* "2.5.4.11",
* "organizationalUnitName",
* "See www.rapidssl.com/cps (c)05",
* "2.5.4.11",
* "organizationalUnitName",
* "Domain Control Validated - RapidSSL(R)",
* "2.5.4.3",
* "commonName",
* "mabber.com"
* }),
* ({
* 0,
* 0,
* 0,
* 0,
* 0,
* 0,
* 0,
* 0,
* 0,
* 0,
* 0,
* 0,
* 0,
* 0,
* 0,
* 0,
* 0,
* 0
* })
* })
*
* the wrapper will transform it into:
*
* ([
* 0: 20,
* "2.5.4.10": "mabber.com",
* "2.5.4.11": ({
* "businessprofile.geotrust.com/get.jsp?GT94033690",
* "See www.rapidssl.com/cps (c)05",
* "Domain Control Validated - RapidSSL(R)"
* }),
* "2.5.4.3": "mabber.com",
* "2.5.4.6": "DE"
* ])
*
*
*/
mapping tls_certificate(object who, int longnames) {
mixed *extra, extensions;
mapping cert;
int i, j;
cert = ([ ]);
#if __EFUN_DEFINED__(tls_check_certificate)
# ifdef WANT_S2S_SASL
extra = tls_check_certificate(who, 1);
unless (extra) return 0;
cert[0] = extra[0];
extensions = extra[2];
extra = extra[1];
for (i = 0; i < sizeof(extra); i += 3) {
mixed t;
t = cert[extra[i]];
unless (t) {
cert[extra[i]] = extra[i+2];
} else if (stringp(t)) {
cert[extra[i]] = ({ t, extra[i+2] });
} else if (pointerp(t)) {
cert[extra[i]] += ({ extra[i+2] });
} else {
// should not happen
}
}
if (longnames) {
// set up short/long names
for (i = 0; i < sizeof(extra); i +=3) {
cert[extra[i+1]] = cert[extra[i]];
}
}
for (i = 0; i < sizeof(extensions); i += 3) {
string key, mkey;
mixed *val;
unless(extensions[i]) continue;
key = extensions[i];
val = extensions[i+2];
for (j = 0; j < sizeof(val); j += 3) {
mixed t;
mkey = key + ":" + val[j];
t = cert[mkey];
unless (t) {
cert[mkey] = val[j+2];
} else if (stringp(t)) {
cert[mkey] = ({ t, val[j+2] });
} else if (pointerp(t)) {
cert[mkey] += ({ val[j+2] });
} else {
// should not happen
}
}
}
# endif
#endif
return cert;
}