mcabber/src/jabglue.c
changeset 1197 6f602d3270a4
parent 1194 03d8fafe8104
child 1205 2de8f8ba1f34
--- a/mcabber/src/jabglue.c	Sun Apr 22 15:01:20 2007 +0200
+++ b/mcabber/src/jabglue.c	Fri Apr 27 00:37:57 2007 +0200
@@ -510,10 +510,11 @@
 }
 
 //  jb_send_msg(jid, test, type, subject, msgid, *encrypted)
-// When encrypted is not NULL, the function set *encrypted to TRUE if the
-// message has been PGP-encrypted.
+// When encrypted is not NULL, the function set *encrypted to 1 if the
+// message has been PGP-encrypted.  If encryption enforcement is set and
+// encryption fails, *encrypted is set to -1.
 void jb_send_msg(const char *fjid, const char *text, int type,
-                 const char *subject, const char *msgid, guint *encrypted)
+                 const char *subject, const char *msgid, gint *encrypted)
 {
   xmlnode x;
   gchar *strtype;
@@ -532,7 +533,7 @@
   gchar *enc = NULL;
 
   if (encrypted)
-    *encrypted = FALSE;
+    *encrypted = 0;
 
   if (!online) return;
 
@@ -553,19 +554,29 @@
 
 #ifdef HAVE_GPGME
   if (type == ROSTER_TYPE_USER && sl_buddy && gpg_enabled()) {
-    if (!settings_pgp_getdisabled(barejid)) { // disabled for this contact?
+    if (!settings_pgp_getdisabled(barejid)) { // not disabled for this contact?
+      guint force;
       struct pgp_data *res_pgpdata;
+      force = settings_pgp_getforce(barejid);
       res_pgpdata = buddy_resource_pgp(sl_buddy->data, rname);
-      if (res_pgpdata && res_pgpdata->sign_keyid) {
-        /* Remote client has PGP support (we have a signature).
+      if (force || (res_pgpdata && res_pgpdata->sign_keyid)) {
+        /* Remote client has PGP support (we have a signature)
+         * OR encryption is enforced (force = TRUE).
          * If the contact has a specific KeyId, we'll use it;
          * if not, we'll use the key used for the signature.
          * Both keys should match, in theory (cf. XEP-0027). */
         const char *key;
         key = settings_pgp_getkeyid(barejid);
-        if (!key)
+        if (!key && res_pgpdata)
           key = res_pgpdata->sign_keyid;
-        enc = gpg_encrypt(text, key);
+        if (key)
+          enc = gpg_encrypt(text, key);
+        if (!enc && force) {
+          if (encrypted)
+            *encrypted = -1;
+          g_free(barejid);
+          return;
+        }
       }
     }
   }
@@ -587,7 +598,7 @@
     xmlnode_put_attrib(y, "xmlns", NS_ENCRYPTED);
     xmlnode_insert_cdata(y, enc, (unsigned) -1);
     if (encrypted)
-      *encrypted = TRUE;
+      *encrypted = 1;
     g_free(enc);
   }