Mercurial > ~mikael > mcabber > hg
comparison mcabber/src/jabglue.c @ 1044:52cfe9bf9840
Encryption support for outgoing messages
author | Mikael Berthe <mikael@lilotux.net> |
---|---|
date | Sun, 26 Nov 2006 17:12:34 +0100 |
parents | ebbde723614b |
children | 96be69d3a5fd |
comparison
equal
deleted
inserted
replaced
1043:ebbde723614b | 1044:52cfe9bf9840 |
---|---|
507 void jb_send_msg(const char *jid, const char *text, int type, | 507 void jb_send_msg(const char *jid, const char *text, int type, |
508 const char *subject, const char *msgid) | 508 const char *subject, const char *msgid) |
509 { | 509 { |
510 xmlnode x; | 510 xmlnode x; |
511 gchar *strtype; | 511 gchar *strtype; |
512 #if defined HAVE_GPGME || defined JEP0022 || defined JEP0085 | |
513 char *rname, *barejid; | |
514 GSList *sl_buddy; | |
515 #endif | |
512 #if defined JEP0022 || defined JEP0085 | 516 #if defined JEP0022 || defined JEP0085 |
513 xmlnode event; | 517 xmlnode event; |
514 char *rname, *barejid; | |
515 GSList *sl_buddy; | |
516 guint use_jep85 = 0; | 518 guint use_jep85 = 0; |
517 struct jep0085 *jep85 = NULL; | 519 struct jep0085 *jep85 = NULL; |
518 #endif | 520 #endif |
521 gchar *enc = NULL; | |
519 | 522 |
520 if (!online) return; | 523 if (!online) return; |
521 | 524 |
522 if (type == ROSTER_TYPE_ROOM) | 525 if (type == ROSTER_TYPE_ROOM) |
523 strtype = TMSG_GROUPCHAT; | 526 strtype = TMSG_GROUPCHAT; |
524 else | 527 else |
525 strtype = TMSG_CHAT; | 528 strtype = TMSG_CHAT; |
526 | 529 |
527 x = jutil_msgnew(strtype, (char*)jid, NULL, (char*)text); | 530 #if defined HAVE_GPGME || defined JEP0022 || defined JEP0085 |
531 rname = strchr(jid, JID_RESOURCE_SEPARATOR); | |
532 barejid = jidtodisp(jid); | |
533 sl_buddy = roster_find(barejid, jidsearch, ROSTER_TYPE_USER); | |
534 g_free(barejid); | |
535 | |
536 // If we can get a resource name, we use it. Else we use NULL, | |
537 // which hopefully will give us the most likely resource. | |
538 if (rname) | |
539 rname++; | |
540 #endif | |
541 | |
542 #ifdef HAVE_GPGME | |
543 if (type == ROSTER_TYPE_USER && sl_buddy && gpg_enabled()) { | |
544 struct pgp_data *res_pgpdata; | |
545 res_pgpdata = buddy_resource_pgp(sl_buddy->data, rname); | |
546 if (res_pgpdata && res_pgpdata->sign_keyid) | |
547 enc = gpg_encrypt(text, res_pgpdata->sign_keyid); | |
548 } | |
549 #endif | |
550 | |
551 x = jutil_msgnew(strtype, (char*)jid, NULL, | |
552 (enc ? "This message is PGP-encrypted." : (char*)text)); | |
528 if (subject) { | 553 if (subject) { |
529 xmlnode y; | 554 xmlnode y; |
530 y = xmlnode_insert_tag(x, "subject"); | 555 y = xmlnode_insert_tag(x, "subject"); |
531 xmlnode_insert_cdata(y, subject, (unsigned) -1); | 556 xmlnode_insert_cdata(y, subject, (unsigned) -1); |
532 } | 557 } |
558 if (enc) { | |
559 xmlnode y; | |
560 y = xmlnode_insert_tag(x, "x"); | |
561 xmlnode_put_attrib(y, "xmlns", NS_ENCRYPTED); | |
562 xmlnode_insert_cdata(y, enc, (unsigned) -1); | |
563 g_free(enc); | |
564 } | |
533 | 565 |
534 #if defined JEP0022 || defined JEP0085 | 566 #if defined JEP0022 || defined JEP0085 |
535 // If typing notifications are disabled, we can skip all this stuff... | 567 // If typing notifications are disabled, we can skip all this stuff... |
536 if (chatstates_disabled || type == ROSTER_TYPE_ROOM) | 568 if (chatstates_disabled || type == ROSTER_TYPE_ROOM) |
537 goto jb_send_msg_no_chatstates; | 569 goto jb_send_msg_no_chatstates; |
538 | 570 |
539 rname = strchr(jid, JID_RESOURCE_SEPARATOR); | |
540 barejid = jidtodisp(jid); | |
541 sl_buddy = roster_find(barejid, jidsearch, ROSTER_TYPE_USER); | |
542 g_free(barejid); | |
543 | |
544 // If we can get a resource name, we use it. Else we use NULL, | |
545 // which hopefully will give us the most likely resource. | |
546 if (rname) | |
547 rname++; | |
548 if (sl_buddy) | 571 if (sl_buddy) |
549 jep85 = buddy_resource_jep85(sl_buddy->data, rname); | 572 jep85 = buddy_resource_jep85(sl_buddy->data, rname); |
550 #endif | 573 #endif |
551 | 574 |
552 #ifdef JEP0085 | 575 #ifdef JEP0085 |