Author: Pekka Riikonen <priikone@silcnet.org>
- Copyright (C) 2002 - 2005 Pekka Riikonen
+ Copyright (C) 2002 - 2007 Pekka Riikonen
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
/* Implementation of Attribute Payload routines */
/* $Id$ */
-#include "silcincludes.h"
+#include "silc.h"
#include "silcattrs.h"
/******************************************************************************
case SILC_ATTRIBUTE_USER_INFO:
{
+#ifdef SILC_DIST_VCARD
SilcVCard vcard = object;
if (object_size != sizeof(*vcard))
return NULL;
if (!str)
return NULL;
object = str;
+#endif /* SILC_DIST_VCARD */
}
break;
len = strlen(service->address);
len2 = strlen(service->signon);
tmpbuf = silc_buffer_alloc_size(13 + len + len2);
+ if (!tmpbuf)
+ return NULL;
silc_buffer_format(tmpbuf,
SILC_STR_UI_INT(service->port),
SILC_STR_UI_SHORT(len),
case SILC_ATTRIBUTE_EXTENSION:
case SILC_ATTRIBUTE_USER_ICON:
{
- SilcAttributeObjMime *mime = object;
+ SilcMime mime = object;
if (object_size != sizeof(*mime))
return NULL;
- object = (void *)mime->mime;
- object_size = mime->mime_len;
+ str = silc_mime_encode(mime, &object_size);
+ if (!str)
+ return NULL;
+ object = str;
}
break;
}
break;
+ case SILC_ATTRIBUTE_PHONE_NUMBER:
+ {
+ SilcAttributeObjPN *pn = object;
+ if (object_size != sizeof(*pn))
+ return NULL;
+ if (!pn->number || strlen(pn->number) < 5)
+ return NULL;
+ tmpbuf = silc_buffer_alloc(0);
+ if (!tmpbuf)
+ return NULL;
+ if (silc_buffer_format(tmpbuf,
+ SILC_STR_UI_INT(pn->format),
+ SILC_STR_UI_SHORT(strlen(pn->number)),
+ SILC_STR_UI16_STRING(pn->number),
+ SILC_STR_END) < 0)
+ return NULL;
+ object = tmpbuf->data;
+ object_size = silc_buffer_len(tmpbuf);
+ }
+ break;
+
case SILC_ATTRIBUTE_USER_PUBLIC_KEY:
case SILC_ATTRIBUTE_SERVER_PUBLIC_KEY:
{
len = 4 + (SilcUInt16)data_len;
buffer = silc_buffer_realloc(buffer,
- (buffer ? silc_buffer_truelen(buffer) + len : len));
+ (buffer ? silc_buffer_truelen(buffer) +
+ len : len));
if (!buffer)
return NULL;
silc_buffer_pull(buffer, silc_buffer_len(buffer));
/* Construct digital signature verification data */
unsigned char *silc_attribute_get_verify_data(SilcDList attrs,
- bool server_verification,
+ SilcBool server_verification,
SilcUInt32 *data_len)
{
SilcAttributePayload attr;
/* Return parsed attribute object */
-bool silc_attribute_get_object(SilcAttributePayload payload,
- void *object, SilcUInt32 object_size)
+SilcBool silc_attribute_get_object(SilcAttributePayload payload,
+ void *object, SilcUInt32 object_size)
{
SilcUInt16 len;
- bool ret = FALSE;
+ SilcBool ret = FALSE;
if (!object || payload->flags & SILC_ATTRIBUTE_FLAG_INVALID)
return FALSE;
switch (payload->attribute) {
case SILC_ATTRIBUTE_USER_INFO:
{
+#ifdef SILC_DIST_VCARD
SilcVCard vcard = object;
if (object_size != sizeof(*vcard))
break;
if (!silc_vcard_decode(payload->data, payload->data_len, vcard))
break;
ret = TRUE;
+#endif /* SILC_DIST_VCARD */
}
break;
case SILC_ATTRIBUTE_EXTENSION:
case SILC_ATTRIBUTE_USER_ICON:
{
- SilcAttributeObjMime *mime = object;
+ SilcMime mime = object;
if (object_size != sizeof(*mime))
break;
- mime->mime = (const unsigned char *)payload->data;
- mime->mime_len = payload->data_len;
+ if (!silc_mime_decode(mime, payload->data, payload->data_len))
+ break;
ret = TRUE;
}
break;
}
break;
+ case SILC_ATTRIBUTE_PHONE_NUMBER:
+ {
+ SilcAttributeObjPN *pn = object;
+ SilcBufferStruct buffer;
+ SilcUInt32 pn_format;
+ int res;
+ if (object_size != sizeof(*pn))
+ break;
+ silc_buffer_set(&buffer, (unsigned char *)payload->data,
+ payload->data_len);
+ res =
+ silc_buffer_unformat(&buffer,
+ SILC_STR_UI_INT(&pn_format),
+ SILC_STR_UI16_STRING_ALLOC(&pn->number),
+ SILC_STR_END);
+ if (res == -1)
+ break;
+ pn->format = pn_format;
+ ret = TRUE;
+ }
+ break;
+
case SILC_ATTRIBUTE_USER_PUBLIC_KEY:
case SILC_ATTRIBUTE_SERVER_PUBLIC_KEY:
{