5 Author: Pekka Riikonen <priikone@silcnet.org>
7 Copyright (C) 2002 Pekka Riikonen
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; version 2 of the License.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
23 #include "silc-queries.h"
30 #include "fe-common/core/printtext.h"
31 #include "fe-common/core/fe-channels.h"
32 #include "fe-common/core/keyboard.h"
33 #include "fe-common/silc/module-formats.h"
35 QUERY_REC *silc_query_create(const char *server_tag,
36 const char *nick, int automatic)
40 g_return_val_if_fail(nick != NULL, NULL);
42 rec = g_new0(QUERY_REC, 1);
43 rec->chat_type = SILC_PROTOCOL;
44 rec->name = g_strdup(nick);
45 rec->server_tag = g_strdup(server_tag);
46 query_init(rec, automatic);
50 void silc_queries_init(void)
54 void silc_queries_deinit(void)
60 void command_attr(const char *data, SILC_SERVER_REC *server,
66 SilcUInt32 *argv_lens, *argv_types;
70 /* Now parse all arguments */
71 tmp = g_strconcat("ATTR", " ", data, NULL);
72 silc_parse_command_line(tmp, &argv, &argv_lens, &argv_types, &argc, 3);
76 /* Show all attributes */
77 printformat_module("fe-common/silc", server, NULL,
78 MSGLEVEL_CRAP, SILCTXT_ATTR_HEADER);
80 allowed = settings_get_bool("attr_allow");
81 printformat_module("fe-common/silc", server, NULL,
82 MSGLEVEL_CRAP, SILCTXT_ATTR_ALLOW,
83 allowed ? "Yes" : "No");
85 sv = settings_get_str("attr_vcard");
87 printformat_module("fe-common/silc", server, NULL,
88 MSGLEVEL_CRAP, SILCTXT_ATTR_VCARD_FILE, sv);
90 sv = settings_get_str("attr_services");
92 printformat_module("fe-common/silc", server, NULL,
93 MSGLEVEL_CRAP, SILCTXT_ATTR_SERVICES, sv);
95 sv = settings_get_str("attr_status_mood");
97 printformat_module("fe-common/silc", server, NULL,
98 MSGLEVEL_CRAP, SILCTXT_ATTR_STATUS_MOOD, sv);
100 sv = settings_get_str("attr_status_text");
102 printformat_module("fe-common/silc", server, NULL,
103 MSGLEVEL_CRAP, SILCTXT_ATTR_STATUS_TEXT, sv);
105 sv = settings_get_str("attr_status_message");
107 printformat_module("fe-common/silc", server, NULL,
108 MSGLEVEL_CRAP, SILCTXT_ATTR_STATUS_MESSAGE_FILE,
111 sv = settings_get_str("attr_preferred_language");
113 printformat_module("fe-common/silc", server, NULL,
114 MSGLEVEL_CRAP, SILCTXT_ATTR_PREFERRED_LANGUAGE,
117 sv = settings_get_str("attr_preferred_contact");
119 printformat_module("fe-common/silc", server, NULL,
120 MSGLEVEL_CRAP, SILCTXT_ATTR_PREFERRED_CONTACT,
123 sv = settings_get_str("attr_geolocation");
125 printformat_module("fe-common/silc", server, NULL,
126 MSGLEVEL_CRAP, SILCTXT_ATTR_GEOLOCATION,
129 sv = settings_get_str("attr_device_info");
131 printformat_module("fe-common/silc", server, NULL,
132 MSGLEVEL_CRAP, SILCTXT_ATTR_DEVICE_INFO,
135 sv = settings_get_str("attr_public_keys");
137 printformat_module("fe-common/silc", server, NULL,
138 MSGLEVEL_CRAP, SILCTXT_ATTR_PUBLIC_KEYS,
141 allowed = settings_get_bool("attr_timezone");
142 printformat_module("fe-common/silc", server, NULL,
143 MSGLEVEL_CRAP, SILCTXT_ATTR_TIMEZONE_ALLOW,
144 allowed ? "Yes" : "No");
146 printformat_module("fe-common/silc", server, NULL,
147 MSGLEVEL_CRAP, SILCTXT_ATTR_FOOTER);
152 cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS);
154 if (!strcasecmp(argv[1], "-del")) {
155 /* Delete attribute */
156 if (!strcasecmp(argv[1], "vcard")) {
157 silc_client_attribute_del(silc_client, server->conn,
158 SILC_ATTRIBUTE_USER_INFO, NULL);
159 settings_set_str("attr_vcard", "");
160 } else if (!strcasecmp(argv[1], "services")) {
161 silc_client_attribute_del(silc_client, server->conn,
162 SILC_ATTRIBUTE_SERVICE, NULL);
163 settings_set_str("attr_services", argv[2]);
164 } else if (!strcasecmp(argv[1], "status_mood")) {
165 silc_client_attribute_del(silc_client, server->conn,
166 SILC_ATTRIBUTE_STATUS_MOOD, NULL);
167 settings_set_str("attr_status_mood", "");
168 } else if (!strcasecmp(argv[1], "status_text")) {
169 silc_client_attribute_del(silc_client, server->conn,
170 SILC_ATTRIBUTE_STATUS_FREETEXT, NULL);
171 settings_set_str("attr_status_text", "");
172 } else if (!strcasecmp(argv[1], "status_message")) {
173 silc_client_attribute_del(silc_client, server->conn,
174 SILC_ATTRIBUTE_STATUS_MESSAGE, NULL);
175 settings_set_str("attr_status_message", "");
176 } else if (!strcasecmp(argv[1], "preferred_langauge")) {
177 silc_client_attribute_del(silc_client, server->conn,
178 SILC_ATTRIBUTE_PREFERRED_LANGUAGE, NULL);
179 settings_set_str("attr_preferred_language", "");
180 } else if (!strcasecmp(argv[1], "preferred_contact")) {
181 silc_client_attribute_del(silc_client, server->conn,
182 SILC_ATTRIBUTE_PREFERRED_CONTACT, NULL);
183 settings_set_str("attr_preferred_contact", "");
184 } else if (!strcasecmp(argv[1], "timezone")) {
186 } else if (!strcasecmp(argv[1], "geolocation")) {
187 silc_client_attribute_del(silc_client, server->conn,
188 SILC_ATTRIBUTE_GEOLOCATION, NULL);
189 settings_set_str("attr_geolocation", "");
190 } else if (!strcasecmp(argv[1], "device_info")) {
191 silc_client_attribute_del(silc_client, server->conn,
192 SILC_ATTRIBUTE_DEVICE_INFO, NULL);
193 settings_set_str("attr_device_info", "");
194 } else if (!strcasecmp(argv[1], "public_keys")) {
195 silc_client_attribute_del(silc_client, server->conn,
196 SILC_ATTRIBUTE_USER_PUBLIC_KEY, NULL);
197 settings_set_str("attr_public_keys", "");
199 cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS);
204 /* Add new attribute */
205 if (!strcasecmp(argv[1], "allow")) {
206 allowed = !strcasecmp(argv[2], "ON") || !strcasecmp(argv[2], "YES");
207 settings_set_bool("attr_allow", allowed);
208 } else if (!strcasecmp(argv[1], "vcard")) {
209 settings_set_str("attr_vcard", argv[2]);
210 } else if (!strcasecmp(argv[1], "services")) {
211 settings_set_str("attr_services", argv[2]);
212 } else if (!strcasecmp(argv[1], "status_mood")) {
213 settings_set_str("attr_status_mood", argv[2]);
214 } else if (!strcasecmp(argv[1], "status_text")) {
215 settings_set_str("attr_status_text", argv[2]);
216 } else if (!strcasecmp(argv[1], "status_message")) {
217 settings_set_str("attr_status_message", argv[2]);
218 } else if (!strcasecmp(argv[1], "preferred_langauge")) {
219 settings_set_str("attr_preferred_language", argv[2]);
220 } else if (!strcasecmp(argv[1], "preferred_contact")) {
221 settings_set_str("attr_preferred_contact", argv[2]);
222 } else if (!strcasecmp(argv[1], "timezone")) {
223 allowed = !strcasecmp(argv[2], "ON") || !strcasecmp(argv[2], "YES");
224 settings_set_bool("attr_timezone", allowed);
225 } else if (!strcasecmp(argv[1], "geolocation")) {
226 settings_set_str("attr_geolocation", argv[2]);
227 } else if (!strcasecmp(argv[1], "device_info")) {
228 settings_set_str("attr_device_info", argv[2]);
229 } else if (!strcasecmp(argv[1], "public_keys")) {
230 settings_set_str("attr_public_keys", argv[2]);
232 cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS);
235 silc_query_attributes_default(silc_client, server->conn);
238 /* Put default attributes to client library */
240 void silc_query_attributes_default(SilcClient client,
241 SilcClientConnection conn)
243 char *tmp, **list, **entry;
245 SilcUInt32 tmp_len, mask;
246 SilcAttributeObjService service;
247 SilcAttributeObjMime mime;
248 SilcAttributeObjGeo geo;
249 SilcAttributeObjDevice dev;
250 SilcAttributeObjPk pk;
253 memset(&service, 0, sizeof(service));
254 memset(&mime, 0, sizeof(mime));
255 memset(&geo, 0, sizeof(geo));
256 memset(&dev, 0, sizeof(dev));
257 memset(&pk, 0, sizeof(pk));
259 sv = settings_get_str("attr_vcard");
262 silc_client_attribute_del(silc_client, conn,
263 SILC_ATTRIBUTE_USER_INFO, NULL);
264 tmp = silc_file_readfile(sv, &tmp_len);
266 silc_client_attribute_add(silc_client, conn,
267 SILC_ATTRIBUTE_USER_INFO, tmp, tmp_len);
271 sv = settings_get_str("attr_services");
274 silc_client_attribute_del(silc_client, conn,
275 SILC_ATTRIBUTE_SERVICE, NULL);
276 list = g_strsplit(sv, " ", -1);
277 for (entry = list; *entry != NULL; entry++) {
278 if (!strchr(*entry, ':'))
280 tmp = strchr(*entry, ':') + 1;
283 service.port = atoi(tmp);
284 *strchr(*entry, ':') = '\0';
285 silc_strncat(service.address, sizeof(service.address), *entry,
287 service.status = TRUE;
288 silc_client_attribute_add(silc_client, conn,
289 SILC_ATTRIBUTE_SERVICE, &service,
295 sv = settings_get_str("attr_status_mood");
297 /* Put STATUS_MOOD */
298 silc_client_attribute_del(silc_client, conn,
299 SILC_ATTRIBUTE_STATUS_MOOD, NULL);
301 list = g_strsplit(sv, " ", -1);
302 for (entry = list; *entry != NULL; entry++) {
303 if (!strcasecmp(*entry, "NORMAL"))
304 mask |= SILC_ATTRIBUTE_MOOD_NORMAL;
305 if (!strcasecmp(*entry, "HAPPY"))
306 mask |= SILC_ATTRIBUTE_MOOD_HAPPY;
307 if (!strcasecmp(*entry, "SAD"))
308 mask |= SILC_ATTRIBUTE_MOOD_SAD;
309 if (!strcasecmp(*entry, "ANGRY"))
310 mask |= SILC_ATTRIBUTE_MOOD_ANGRY;
311 if (!strcasecmp(*entry, "JEALOUS"))
312 mask |= SILC_ATTRIBUTE_MOOD_JEALOUS;
313 if (!strcasecmp(*entry, "ASHAMED"))
314 mask |= SILC_ATTRIBUTE_MOOD_ASHAMED;
315 if (!strcasecmp(*entry, "INVINCIBLE"))
316 mask |= SILC_ATTRIBUTE_MOOD_INVINCIBLE;
317 if (!strcasecmp(*entry, "INLOVE"))
318 mask |= SILC_ATTRIBUTE_MOOD_INLOVE;
319 if (!strcasecmp(*entry, "SLEEPY"))
320 mask |= SILC_ATTRIBUTE_MOOD_SLEEPY;
321 if (!strcasecmp(*entry, "BORED"))
322 mask |= SILC_ATTRIBUTE_MOOD_BORED;
323 if (!strcasecmp(*entry, "EXCITED"))
324 mask |= SILC_ATTRIBUTE_MOOD_EXCITED;
325 if (!strcasecmp(*entry, "ANXIOUS"))
326 mask |= SILC_ATTRIBUTE_MOOD_ANXIOUS;
327 silc_client_attribute_add(silc_client, conn,
328 SILC_ATTRIBUTE_STATUS_MOOD, (void *)mask,
334 sv = settings_get_str("attr_status_text");
336 /* Put STATUS_TEXT */
337 silc_client_attribute_del(silc_client, conn,
338 SILC_ATTRIBUTE_STATUS_FREETEXT, NULL);
339 silc_client_attribute_add(silc_client, conn,
340 SILC_ATTRIBUTE_STATUS_FREETEXT, (void *)sv,
344 sv = settings_get_str("attr_status_message");
346 /* Put STATUS_MESSAGE */
347 silc_client_attribute_del(silc_client, conn,
348 SILC_ATTRIBUTE_STATUS_MESSAGE, NULL);
349 tmp = silc_file_readfile(sv, &tmp_len);
351 mime.mime = (const unsigned char *)tmp;
352 mime.mime_len = tmp_len;
353 silc_client_attribute_add(silc_client, conn,
354 SILC_ATTRIBUTE_STATUS_MESSAGE, &mime,
360 sv = settings_get_str("attr_preferred_language");
362 /* Put PREFERRED_LANGUAGE */
363 silc_client_attribute_del(silc_client, conn,
364 SILC_ATTRIBUTE_PREFERRED_LANGUAGE, NULL);
365 list = g_strsplit(sv, " ", -1);
366 for (entry = list; *entry != NULL; entry++) {
367 silc_client_attribute_add(silc_client, conn,
368 SILC_ATTRIBUTE_PREFERRED_LANGUAGE, *entry,
374 sv = settings_get_str("attr_preferred_contact");
376 /* Put PREFERRED_CONTACT */
377 silc_client_attribute_del(silc_client, conn,
378 SILC_ATTRIBUTE_PREFERRED_CONTACT, NULL);
380 list = g_strsplit(sv, " ", -1);
381 for (entry = list; *entry != NULL; entry++) {
382 if (!strcasecmp(*entry, "NONE"))
384 if (!strcasecmp(*entry, "EMAIL"))
385 mask |= SILC_ATTRIBUTE_CONTACT_EMAIL;
386 if (!strcasecmp(*entry, "CALL"))
387 mask |= SILC_ATTRIBUTE_CONTACT_CALL;
388 if (!strcasecmp(*entry, "PAGE"))
389 mask |= SILC_ATTRIBUTE_CONTACT_PAGE;
390 if (!strcasecmp(*entry, "SMS"))
391 mask |= SILC_ATTRIBUTE_CONTACT_SMS;
392 if (!strcasecmp(*entry, "MMS"))
393 mask |= SILC_ATTRIBUTE_CONTACT_MMS;
394 if (!strcasecmp(*entry, "CHAT"))
395 mask |= SILC_ATTRIBUTE_CONTACT_CHAT;
396 silc_client_attribute_add(silc_client, conn,
397 SILC_ATTRIBUTE_PREFERRED_CONTACT, (void *)mask,
404 allowed = settings_get_bool("attr_timezone");
405 silc_client_attribute_del(silc_client, conn,
406 SILC_ATTRIBUTE_TIMEZONE, NULL);
408 silc_client_attribute_add(silc_client, conn,
409 SILC_ATTRIBUTE_TIMEZONE, "foo", 3);
411 sv = settings_get_str("attr_geolocation");
413 /* Put GEOLOCATION */
414 silc_client_attribute_del(silc_client, conn,
415 SILC_ATTRIBUTE_GEOLOCATION, NULL);
416 list = g_strsplit(sv, ":", -1);
417 for (entry = list; *entry != NULL; entry++) {
418 if (!geo.longitude) {
419 geo.longitude = *entry;
423 geo.latitude = *entry;
427 geo.altitude = *entry;
431 geo.accuracy = *entry;
435 silc_client_attribute_add(silc_client, conn,
436 SILC_ATTRIBUTE_GEOLOCATION, &geo,
441 sv = settings_get_str("attr_device_info");
443 /* Put DEVICE_INFO */
444 silc_client_attribute_del(silc_client, conn,
445 SILC_ATTRIBUTE_DEVICE_INFO, NULL);
447 list = g_strsplit(sv, ":", -1);
448 for (entry = list; *entry != NULL; entry++) {
451 if (!strcasecmp(*entry, "COMPUTER"))
452 dev.type = SILC_ATTRIBUTE_DEVICE_COMPUTER;
453 if (!strcasecmp(*entry, "MOBILE_PHONE"))
454 dev.type = SILC_ATTRIBUTE_DEVICE_MOBILE_PHONE;
455 if (!strcasecmp(sv, "PDA"))
456 dev.type = SILC_ATTRIBUTE_DEVICE_PDA;
457 if (!strcasecmp(sv, "TERMINAL"))
458 dev.type = SILC_ATTRIBUTE_DEVICE_TERMINAL;
461 if (!dev.manufacturer) {
462 dev.manufacturer = *entry;
466 dev.version = *entry;
474 dev.language = *entry;
478 silc_client_attribute_add(silc_client, conn,
479 SILC_ATTRIBUTE_DEVICE_INFO, &dev,
484 sv = settings_get_str("attr_public_keys");
486 /* Put USER_PUBLIC_KEY */
487 silc_client_attribute_del(silc_client, conn,
488 SILC_ATTRIBUTE_USER_PUBLIC_KEY, NULL);
489 list = g_strsplit(sv, " ", -1);
490 for (entry = list; *entry != NULL; entry++) {
491 /* XXX we support only SILC keys currently */
492 if (!strncasecmp(*entry, "silc-rsa:", 8)) {
493 tmp = silc_file_readfile((*entry) + 8, &tmp_len);
495 pk.type = "silc-rsa";
497 pk.data_len = tmp_len;
498 silc_client_attribute_add(silc_client, conn,
499 SILC_ATTRIBUTE_USER_PUBLIC_KEY, &pk,
509 void silc_query_attributes_print(SILC_SERVER_REC *server,
511 SilcClientConnection conn,
514 SilcAttributePayload attr;
515 SilcAttribute attribute;
517 SilcAttributeObjPk userpk, serverpk, usersign, serversign;
519 printformat_module("fe-common/silc", server, NULL,
520 MSGLEVEL_CRAP, SILCTXT_ATTR_HEADER);
522 memset(&userpk, 0, sizeof(userpk));
523 memset(&serverpk, 0, sizeof(serverpk));
524 memset(&usersign, 0, sizeof(usersign));
525 memset(&serversign, 0, sizeof(serversign));
527 silc_dlist_start(attrs);
528 while ((attr = silc_dlist_get(attrs)) != SILC_LIST_END) {
529 attribute = silc_attribute_get_attribute(attr);
530 memset(tmp, 0, sizeof(tmp));
534 case SILC_ATTRIBUTE_USER_INFO:
536 SilcVCardStruct vcard;
537 memset(&vcard, 0, sizeof(vcard));
538 if (!silc_attribute_get_object(attr, (void *)&vcard, sizeof(vcard)))
544 case SILC_ATTRIBUTE_SERVICE:
546 SilcAttributeObjService service;
547 if (!silc_attribute_get_object(attr, (void *)&service,
550 snprintf(tmp, sizeof(tmp) - 1, "%s:%d (logged %s)",
551 service.address, (unsigned int)service.port,
552 service.status ? "in" : "out");
553 printformat_module("fe-common/silc", server, NULL,
554 MSGLEVEL_CRAP, SILCTXT_ATTR_SERVICES, tmp);
558 case SILC_ATTRIBUTE_STATUS_MOOD:
561 if (!silc_attribute_get_object(attr, (void *)&mask, sizeof(mask)))
564 silc_strncat(tmp, sizeof(tmp), "NORMAL ", strlen(" NORMAL"));
565 if (mask & SILC_ATTRIBUTE_MOOD_HAPPY)
566 silc_strncat(tmp, sizeof(tmp), "HAPPY ", strlen(" HAPPY"));
567 if (mask & SILC_ATTRIBUTE_MOOD_SAD)
568 silc_strncat(tmp, sizeof(tmp), "SAD ", strlen(" SAD"));
569 if (mask & SILC_ATTRIBUTE_MOOD_ANGRY)
570 silc_strncat(tmp, sizeof(tmp), "ANGRY ", strlen(" ANGRY"));
571 if (mask & SILC_ATTRIBUTE_MOOD_JEALOUS)
572 silc_strncat(tmp, sizeof(tmp), "JEALOUS ", strlen(" JEALOUS"));
573 if (mask & SILC_ATTRIBUTE_MOOD_ASHAMED)
574 silc_strncat(tmp, sizeof(tmp), "ASHAMED ", strlen(" ASHAMED"));
575 if (mask & SILC_ATTRIBUTE_MOOD_INVINCIBLE)
576 silc_strncat(tmp, sizeof(tmp), "INVINCIBLE ", strlen(" INVINCIBLE"));
577 if (mask & SILC_ATTRIBUTE_MOOD_INLOVE)
578 silc_strncat(tmp, sizeof(tmp), "INLOVE ", strlen(" INLOVE"));
579 if (mask & SILC_ATTRIBUTE_MOOD_SLEEPY)
580 silc_strncat(tmp, sizeof(tmp), "SLEEPY ", strlen(" SLEEPY"));
581 if (mask & SILC_ATTRIBUTE_MOOD_BORED)
582 silc_strncat(tmp, sizeof(tmp), "BORED ", strlen(" BORED"));
583 if (mask & SILC_ATTRIBUTE_MOOD_EXCITED)
584 silc_strncat(tmp, sizeof(tmp), "EXCITED ", strlen(" EXCITED"));
585 if (mask & SILC_ATTRIBUTE_MOOD_ANXIOUS)
586 silc_strncat(tmp, sizeof(tmp), "ANXIOUS ", strlen(" ANXIOUS"));
587 printformat_module("fe-common/silc", server, NULL,
588 MSGLEVEL_CRAP, SILCTXT_ATTR_STATUS_MOOD, tmp);
592 case SILC_ATTRIBUTE_STATUS_FREETEXT:
594 if (!silc_attribute_get_object(attr, (void *)&tmp, sizeof(tmp) - 1))
596 printformat_module("fe-common/silc", server, NULL,
597 MSGLEVEL_CRAP, SILCTXT_ATTR_STATUS_TEXT, tmp);
601 case SILC_ATTRIBUTE_STATUS_MESSAGE:
603 SilcAttributeObjMime mime;
604 memset(&mime, 0, sizeof(mime));
605 if (!silc_attribute_get_object(attr, (void *)&mime, sizeof(mime)))
611 case SILC_ATTRIBUTE_PREFERRED_LANGUAGE:
613 if (!silc_attribute_get_object(attr, (void *)&tmp, sizeof(tmp) - 1))
615 printformat_module("fe-common/silc", server, NULL,
616 MSGLEVEL_CRAP, SILCTXT_ATTR_PREFERRED_LANGUAGE,
621 case SILC_ATTRIBUTE_PREFERRED_CONTACT:
624 if (!silc_attribute_get_object(attr, (void *)&mask, sizeof(mask)))
627 silc_strncat(tmp, sizeof(tmp), "NONE ", strlen(" NONE"));
628 if (mask & SILC_ATTRIBUTE_CONTACT_CHAT)
629 silc_strncat(tmp, sizeof(tmp), "CHAT ", strlen(" CHAT"));
630 if (mask & SILC_ATTRIBUTE_CONTACT_EMAIL)
631 silc_strncat(tmp, sizeof(tmp), "EMAIL ", strlen(" EMAIL"));
632 if (mask & SILC_ATTRIBUTE_CONTACT_CALL)
633 silc_strncat(tmp, sizeof(tmp), "CALL ", strlen(" CALL"));
634 if (mask & SILC_ATTRIBUTE_CONTACT_PAGE)
635 silc_strncat(tmp, sizeof(tmp), "PAGE ", strlen(" PAGE"));
636 if (mask & SILC_ATTRIBUTE_CONTACT_SMS)
637 silc_strncat(tmp, sizeof(tmp), "SMS ", strlen(" SMS"));
638 if (mask & SILC_ATTRIBUTE_CONTACT_MMS)
639 silc_strncat(tmp, sizeof(tmp), "MMS ", strlen(" MMS"));
640 printformat_module("fe-common/silc", server, NULL,
641 MSGLEVEL_CRAP, SILCTXT_ATTR_PREFERRED_CONTACT, tmp);
645 case SILC_ATTRIBUTE_TIMEZONE:
647 if (!silc_attribute_get_object(attr, (void *)&tmp, sizeof(tmp) - 1))
649 printformat_module("fe-common/silc", server, NULL,
650 MSGLEVEL_CRAP, SILCTXT_ATTR_TIMEZONE, tmp);
654 case SILC_ATTRIBUTE_EXTENSION:
657 case SILC_ATTRIBUTE_GEOLOCATION:
659 SilcAttributeObjGeo geo;
660 memset(&geo, 0, sizeof(geo));
661 if (!silc_attribute_get_object(attr, (void *)&geo, sizeof(geo)))
663 snprintf(tmp, sizeof(tmp) - 1, "%s:%s:%s:%s",
664 geo.longitude ? geo.longitude : "",
665 geo.latitude ? geo.latitude : "",
666 geo.altitude ? geo.altitude : "",
667 geo.accuracy ? geo.accuracy : "");
668 printformat_module("fe-common/silc", server, NULL,
669 MSGLEVEL_CRAP, SILCTXT_ATTR_GEOLOCATION, tmp);
673 case SILC_ATTRIBUTE_DEVICE_INFO:
675 SilcAttributeObjDevice dev;
676 memset(&dev, 0, sizeof(dev));
677 if (!silc_attribute_get_object(attr, (void *)&dev, sizeof(dev)))
679 snprintf(tmp, sizeof(tmp) - 1, "%s:%s:%s:%s:%s",
680 (dev.type == SILC_ATTRIBUTE_DEVICE_COMPUTER ? "COMPUTER" :
681 dev.type == SILC_ATTRIBUTE_DEVICE_PDA ? "PDA" :
682 dev.type == SILC_ATTRIBUTE_DEVICE_MOBILE_PHONE ?
684 dev.type == SILC_ATTRIBUTE_DEVICE_TERMINAL ? "TERMINAL" :
686 dev.manufacturer ? dev.manufacturer : "",
687 dev.version ? dev.version : "",
688 dev.model ? dev.model: "",
689 dev.language ? dev.language : "");
690 printformat_module("fe-common/silc", server, NULL,
691 MSGLEVEL_CRAP, SILCTXT_ATTR_DEVICE_INFO, tmp);
695 case SILC_ATTRIBUTE_USER_PUBLIC_KEY:
699 if (!silc_attribute_get_object(attr, (void *)&userpk, sizeof(userpk)))
702 case SILC_ATTRIBUTE_SERVER_PUBLIC_KEY:
706 if (!silc_attribute_get_object(attr, (void *)&serverpk,
712 case SILC_ATTRIBUTE_USER_DIGITAL_SIGNATURE:
716 if (!silc_attribute_get_object(attr, (void *)&usersign,
722 case SILC_ATTRIBUTE_SERVER_DIGITAL_SIGNATURE:
726 if (!silc_attribute_get_object(attr, (void *)&serversign,
738 printformat_module("fe-common/silc", server, NULL,
739 MSGLEVEL_CRAP, SILCTXT_ATTR_FOOTER);
741 /* Handle the signature verifications and public key verifying here */
743 if (usersign.data && !strcmp(userpk.type, "silc-rsa")) {
744 /* Verify the signature now */