comparison mcabber/src/jabglue.c @ 1197:6f602d3270a4

Add /pgp [-]force With this command it becomes possible to enforce PGP encryption without checking if the remote client has PGP support. It can be used to send encrypted offline messages too.
author Mikael Berthe <mikael@lilotux.net>
date Fri, 27 Apr 2007 00:37:57 +0200
parents 03d8fafe8104
children 2de8f8ba1f34
comparison
equal deleted inserted replaced
1196:d657a13fd71a 1197:6f602d3270a4
508 msg_idn += 1U + (unsigned int) (9.0 * (rand() / (RAND_MAX + 1.0))); 508 msg_idn += 1U + (unsigned int) (9.0 * (rand() / (RAND_MAX + 1.0)));
509 return g_strdup_printf("%u%d", msg_idn, (int)(now%10L)); 509 return g_strdup_printf("%u%d", msg_idn, (int)(now%10L));
510 } 510 }
511 511
512 // jb_send_msg(jid, test, type, subject, msgid, *encrypted) 512 // jb_send_msg(jid, test, type, subject, msgid, *encrypted)
513 // When encrypted is not NULL, the function set *encrypted to TRUE if the 513 // When encrypted is not NULL, the function set *encrypted to 1 if the
514 // message has been PGP-encrypted. 514 // message has been PGP-encrypted. If encryption enforcement is set and
515 // encryption fails, *encrypted is set to -1.
515 void jb_send_msg(const char *fjid, const char *text, int type, 516 void jb_send_msg(const char *fjid, const char *text, int type,
516 const char *subject, const char *msgid, guint *encrypted) 517 const char *subject, const char *msgid, gint *encrypted)
517 { 518 {
518 xmlnode x; 519 xmlnode x;
519 gchar *strtype; 520 gchar *strtype;
520 #if defined HAVE_GPGME || defined JEP0022 || defined JEP0085 521 #if defined HAVE_GPGME || defined JEP0022 || defined JEP0085
521 char *rname, *barejid; 522 char *rname, *barejid;
530 gchar *nmsgid = NULL; 531 gchar *nmsgid = NULL;
531 #endif 532 #endif
532 gchar *enc = NULL; 533 gchar *enc = NULL;
533 534
534 if (encrypted) 535 if (encrypted)
535 *encrypted = FALSE; 536 *encrypted = 0;
536 537
537 if (!online) return; 538 if (!online) return;
538 539
539 if (type == ROSTER_TYPE_ROOM) 540 if (type == ROSTER_TYPE_ROOM)
540 strtype = TMSG_GROUPCHAT; 541 strtype = TMSG_GROUPCHAT;
551 if (rname) 552 if (rname)
552 rname++; 553 rname++;
553 554
554 #ifdef HAVE_GPGME 555 #ifdef HAVE_GPGME
555 if (type == ROSTER_TYPE_USER && sl_buddy && gpg_enabled()) { 556 if (type == ROSTER_TYPE_USER && sl_buddy && gpg_enabled()) {
556 if (!settings_pgp_getdisabled(barejid)) { // disabled for this contact? 557 if (!settings_pgp_getdisabled(barejid)) { // not disabled for this contact?
558 guint force;
557 struct pgp_data *res_pgpdata; 559 struct pgp_data *res_pgpdata;
560 force = settings_pgp_getforce(barejid);
558 res_pgpdata = buddy_resource_pgp(sl_buddy->data, rname); 561 res_pgpdata = buddy_resource_pgp(sl_buddy->data, rname);
559 if (res_pgpdata && res_pgpdata->sign_keyid) { 562 if (force || (res_pgpdata && res_pgpdata->sign_keyid)) {
560 /* Remote client has PGP support (we have a signature). 563 /* Remote client has PGP support (we have a signature)
564 * OR encryption is enforced (force = TRUE).
561 * If the contact has a specific KeyId, we'll use it; 565 * If the contact has a specific KeyId, we'll use it;
562 * if not, we'll use the key used for the signature. 566 * if not, we'll use the key used for the signature.
563 * Both keys should match, in theory (cf. XEP-0027). */ 567 * Both keys should match, in theory (cf. XEP-0027). */
564 const char *key; 568 const char *key;
565 key = settings_pgp_getkeyid(barejid); 569 key = settings_pgp_getkeyid(barejid);
566 if (!key) 570 if (!key && res_pgpdata)
567 key = res_pgpdata->sign_keyid; 571 key = res_pgpdata->sign_keyid;
568 enc = gpg_encrypt(text, key); 572 if (key)
573 enc = gpg_encrypt(text, key);
574 if (!enc && force) {
575 if (encrypted)
576 *encrypted = -1;
577 g_free(barejid);
578 return;
579 }
569 } 580 }
570 } 581 }
571 } 582 }
572 #endif // HAVE_GPGME 583 #endif // HAVE_GPGME
573 584
585 xmlnode y; 596 xmlnode y;
586 y = xmlnode_insert_tag(x, "x"); 597 y = xmlnode_insert_tag(x, "x");
587 xmlnode_put_attrib(y, "xmlns", NS_ENCRYPTED); 598 xmlnode_put_attrib(y, "xmlns", NS_ENCRYPTED);
588 xmlnode_insert_cdata(y, enc, (unsigned) -1); 599 xmlnode_insert_cdata(y, enc, (unsigned) -1);
589 if (encrypted) 600 if (encrypted)
590 *encrypted = TRUE; 601 *encrypted = 1;
591 g_free(enc); 602 g_free(enc);
592 } 603 }
593 604
594 #if defined JEP0022 || defined JEP0085 605 #if defined JEP0022 || defined JEP0085
595 // If typing notifications are disabled, we can skip all this stuff... 606 // If typing notifications are disabled, we can skip all this stuff...