Fixed command calling crash
[silc.git] / lib / silcclient / client_attrs.c
index bee7ca746b32f24f576da02ac9c52d5670cc8748..a7825270e4e450cd242f64b53def19c311a6d008 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 2002 - 2004, 2006 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
@@ -35,6 +35,7 @@ static void silc_client_attributes_process_foreach(void *key, void *context,
   SilcAttributePayload attr = context;
   SilcAttrForeach *f = user_context;
   const unsigned char *data;
+  unsigned char tmp[32];
   SilcUInt32 data_len;
 
   if (!context) {
@@ -54,17 +55,17 @@ static void silc_client_attributes_process_foreach(void *key, void *context,
   SILC_LOG_DEBUG(("Attribute %d found", attribute));
   data = silc_attribute_get_data(attr, &data_len);
 
-#if 0
   /* We replace the TIMEZONE with valid value here */
   if (attribute == SILC_ATTRIBUTE_TIMEZONE) {
-    data = (const unsigned char *)silc_get_time(0);
-    data_len = strlen(data);
-    f->buffer = silc_attribute_payload_encode(f->buffer, attribute,
-                                             SILC_ATTRIBUTE_FLAG_VALID,
-                                             (void *)data, data_len);
+    if (silc_timezone(tmp, sizeof(tmp))) {
+      data = tmp;
+      data_len = strlen(tmp);
+      f->buffer = silc_attribute_payload_encode(f->buffer, attribute,
+                                               SILC_ATTRIBUTE_FLAG_VALID,
+                                               (void *)data, data_len);
+    }
     return;
   }
-#endif
 
   f->buffer = silc_attribute_payload_encode_data(f->buffer, attribute,
                                                 SILC_ATTRIBUTE_FLAG_VALID,
@@ -89,8 +90,10 @@ SilcBuffer silc_client_attributes_process(SilcClient client,
 
   /* If nothing is set by application assume that we don't want to use
      attributes, ignore the request. */
-  if (!conn->internal->attrs)
+  if (!conn->internal->attrs) {
+    SILC_LOG_DEBUG(("User has not set any attributes"));
     return NULL;
+  }
 
   /* Always put our public key. */
   pk.type = "silc-rsa";
@@ -123,7 +126,7 @@ SilcBuffer silc_client_attributes_process(SilcClient client,
   /* Finally compute the digital signature of all the data we provided. */
   if (silc_pkcs_sign(conn->private_key, silc_buffer_data(buffer),
                     silc_buffer_len(buffer), sign, sizeof(sign), &sign_len,
-                    conn->internal->sha1hash)) {
+                    TRUE, conn->internal->sha1hash)) {
     pk.type = NULL;
     pk.data = sign;
     pk.data_len = sign_len;
@@ -184,9 +187,9 @@ static void silc_client_attribute_del_foreach(void *key, void *context,
 /* Delete one attribute */
 
 SilcBool silc_client_attribute_del(SilcClient client,
-                              SilcClientConnection conn,
-                              SilcAttribute attribute,
-                              SilcAttributePayload attr)
+                                  SilcClientConnection conn,
+                                  SilcAttribute attribute,
+                                  SilcAttributePayload attr)
 {
   SilcBool ret;
 
@@ -236,6 +239,7 @@ SilcBuffer silc_client_attributes_request(SilcAttribute attribute, ...)
 
   if (!attribute)
     return silc_client_attributes_request(SILC_ATTRIBUTE_USER_INFO,
+                                         SILC_ATTRIBUTE_USER_ICON,
                                          SILC_ATTRIBUTE_SERVICE,
                                          SILC_ATTRIBUTE_STATUS_MOOD,
                                          SILC_ATTRIBUTE_STATUS_FREETEXT,