549 srand(now); |
550 srand(now); |
550 msg_idn += 1U + (unsigned int) (9.0 * (rand() / (RAND_MAX + 1.0))); |
551 msg_idn += 1U + (unsigned int) (9.0 * (rand() / (RAND_MAX + 1.0))); |
551 return g_strdup_printf("%u%d", msg_idn, (int)(now%10L)); |
552 return g_strdup_printf("%u%d", msg_idn, (int)(now%10L)); |
552 } |
553 } |
553 |
554 |
554 // jb_send_msg(jid, test, type, subject, msgid, *encrypted) |
555 // jb_send_msg(jid, text, type, subject, msgid, *encrypted) |
555 // When encrypted is not NULL, the function set *encrypted to 1 if the |
556 // When encrypted is not NULL, the function set *encrypted to 1 if the |
556 // message has been PGP-encrypted. If encryption enforcement is set and |
557 // message has been PGP-encrypted. If encryption enforcement is set and |
557 // encryption fails, *encrypted is set to -1. |
558 // encryption fails, *encrypted is set to -1. |
558 void jb_send_msg(const char *fjid, const char *text, int type, |
559 void jb_send_msg(const char *fjid, const char *text, int type, |
559 const char *subject, const char *msgid, gint *encrypted) |
560 const char *subject, const char *msgid, gint *encrypted) |
560 { |
561 { |
561 xmlnode x; |
562 xmlnode x; |
562 gchar *strtype; |
563 gchar *strtype; |
|
564 int otr_msg = 0; |
563 #if defined HAVE_GPGME || defined JEP0022 || defined JEP0085 |
565 #if defined HAVE_GPGME || defined JEP0022 || defined JEP0085 |
564 char *rname, *barejid; |
566 char *rname, *barejid; |
565 GSList *sl_buddy; |
567 GSList *sl_buddy; |
566 #endif |
568 #endif |
567 #if defined JEP0022 || defined JEP0085 |
569 #if defined JEP0022 || defined JEP0085 |
582 if (type == ROSTER_TYPE_ROOM) |
584 if (type == ROSTER_TYPE_ROOM) |
583 strtype = TMSG_GROUPCHAT; |
585 strtype = TMSG_GROUPCHAT; |
584 else |
586 else |
585 strtype = TMSG_CHAT; |
587 strtype = TMSG_CHAT; |
586 |
588 |
587 #if defined HAVE_GPGME || defined JEP0022 || defined JEP0085 |
589 #if defined HAVE_GPGME || defined HAVE_LIBOTR || defined JEP0022 || defined JEP0085 |
588 rname = strchr(fjid, JID_RESOURCE_SEPARATOR); |
590 rname = strchr(fjid, JID_RESOURCE_SEPARATOR); |
589 barejid = jidtodisp(fjid); |
591 barejid = jidtodisp(fjid); |
590 sl_buddy = roster_find(barejid, jidsearch, ROSTER_TYPE_USER); |
592 sl_buddy = roster_find(barejid, jidsearch, ROSTER_TYPE_USER); |
591 |
593 |
592 // If we can get a resource name, we use it. Else we use NULL, |
594 // If we can get a resource name, we use it. Else we use NULL, |
593 // which hopefully will give us the most likely resource. |
595 // which hopefully will give us the most likely resource. |
594 if (rname) |
596 if (rname) |
595 rname++; |
597 rname++; |
|
598 |
|
599 #ifdef HAVE_LIBOTR |
|
600 if (msgid && strcmp(msgid, "otrinject") == 0) |
|
601 msgid = NULL; |
|
602 else { |
|
603 otr_msg = otr_send((char **)&text, barejid); |
|
604 if (!text) { |
|
605 g_free(barejid); |
|
606 if (encrypted) |
|
607 *encrypted = -1; |
|
608 return; |
|
609 } |
|
610 } |
|
611 if (otr_msg && encrypted) { |
|
612 *encrypted = 1; |
|
613 } |
|
614 #endif |
596 |
615 |
597 #ifdef HAVE_GPGME |
616 #ifdef HAVE_GPGME |
598 if (type == ROSTER_TYPE_USER && sl_buddy && gpg_enabled()) { |
617 if (type == ROSTER_TYPE_USER && sl_buddy && gpg_enabled()) { |
599 if (!settings_pgp_getdisabled(barejid)) { // not disabled for this contact? |
618 if (!settings_pgp_getdisabled(barejid)) { // not disabled for this contact? |
600 guint force; |
619 guint force; |
1667 xmlnode xmldata_signed) |
1686 xmlnode xmldata_signed) |
1668 { |
1687 { |
1669 char *bjid; |
1688 char *bjid; |
1670 const char *rname, *s; |
1689 const char *rname, *s; |
1671 char *decrypted = NULL; |
1690 char *decrypted = NULL; |
|
1691 int otr_msg = 0, free_msg = 0; |
1672 |
1692 |
1673 bjid = jidtodisp(from); |
1693 bjid = jidtodisp(from); |
1674 |
1694 |
1675 rname = strchr(from, JID_RESOURCE_SEPARATOR); |
1695 rname = strchr(from, JID_RESOURCE_SEPARATOR); |
1676 if (rname) rname++; |
1696 if (rname) rname++; |
1683 } |
1703 } |
1684 } |
1704 } |
1685 // Check signature of an unencrypted message |
1705 // Check signature of an unencrypted message |
1686 if (xmldata_signed && gpg_enabled()) |
1706 if (xmldata_signed && gpg_enabled()) |
1687 check_signature(bjid, rname, xmldata_signed, decrypted); |
1707 check_signature(bjid, rname, xmldata_signed, decrypted); |
|
1708 #endif |
|
1709 |
|
1710 #ifdef HAVE_LIBOTR |
|
1711 otr_msg = otr_receive((char **)&body, bjid, &free_msg); |
|
1712 if(!body){ |
|
1713 g_free(bjid); |
|
1714 return; |
|
1715 } |
1688 #endif |
1716 #endif |
1689 |
1717 |
1690 // Check for unexpected groupchat messages |
1718 // Check for unexpected groupchat messages |
1691 // If we receive a groupchat message from a room we're not a member of, |
1719 // If we receive a groupchat message from a room we're not a member of, |
1692 // this is probably a server issue and the best we can do is to send |
1720 // this is probably a server issue and the best we can do is to send |
1727 if (!settings_opt_get_int("block_unsubscribed") || |
1757 if (!settings_opt_get_int("block_unsubscribed") || |
1728 (roster_getsubscription(bjid) & sub_from) || |
1758 (roster_getsubscription(bjid) & sub_from) || |
1729 (type && strcmp(type, "chat")) || |
1759 (type && strcmp(type, "chat")) || |
1730 ((s = settings_opt_get("server")) != NULL && !strcasecmp(bjid, s))) { |
1760 ((s = settings_opt_get("server")) != NULL && !strcasecmp(bjid, s))) { |
1731 hk_message_in(bjid, rname, timestamp, body, type, |
1761 hk_message_in(bjid, rname, timestamp, body, type, |
1732 (decrypted ? TRUE : FALSE)); |
1762 ((decrypted || otr_msg) ? TRUE : FALSE)); |
1733 } else { |
1763 } else { |
1734 scr_LogPrint(LPRINT_LOGNORM, "Blocked a message from <%s>", bjid); |
1764 scr_LogPrint(LPRINT_LOGNORM, "Blocked a message from <%s>", bjid); |
1735 } |
1765 } |
1736 g_free(bjid); |
1766 g_free(bjid); |
1737 g_free(decrypted); |
1767 g_free(decrypted); |
|
1768 if(free_msg) |
|
1769 g_free((char *)body); |
1738 } |
1770 } |
1739 |
1771 |
1740 static const char *defaulterrormsg(int code) |
1772 static const char *defaulterrormsg(int code) |
1741 { |
1773 { |
1742 const char *desc; |
1774 const char *desc; |