From d5501a8bb2951f2142b9f888dbc0610e25e00b2d Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Mon, 10 Aug 2015 14:55:24 -0400
Subject: [PATCH] Enigma: Client-side keys generation (with OpenPGP.js) Fixed deletion of key pairs (error: Private key must be deleted before public key can be deleted)

---
 plugins/enigma/lib/enigma_driver_gnupg.php |   47 ++++++++++++++++++++++++++++++++---------------
 1 files changed, 32 insertions(+), 15 deletions(-)

diff --git a/plugins/enigma/lib/enigma_driver_gnupg.php b/plugins/enigma/lib/enigma_driver_gnupg.php
index d0b854c..b9376e1 100644
--- a/plugins/enigma/lib/enigma_driver_gnupg.php
+++ b/plugins/enigma/lib/enigma_driver_gnupg.php
@@ -180,8 +180,9 @@
     {
         $list = $this->list_keys($keyid);
 
-        if (is_array($list))
-            return array_shift($list);
+        if (is_array($list)) {
+            return $list[key($list)];
+        }
 
         // error
         return $list;
@@ -196,9 +197,25 @@
         // delete public key
         $result = $this->delete_pubkey($keyid);
 
-        // if not found, delete private key
-        if ($result !== true && $result->getCode() == enigma_error::E_KEYNOTFOUND) {
-            $result = $this->delete_privkey($keyid);
+        // error handling
+        if ($result !== true) {
+            $code = $result->getCode();
+
+            // if not found, delete private key
+            if ($code == enigma_error::E_KEYNOTFOUND) {
+                $result = $this->delete_privkey($keyid);
+            }
+            // need to delete private key first
+            else if ($code == enigma_error::E_DELKEY) {
+                $key = $this->get_key($keyid);
+                for ($i = count($key->subkeys) - 1; $i >= 0; $i--) {
+                    $type = $key->subkeys[$i]->can_encrypt ? 'priv' : 'pub';
+                    $result = $this->{'delete_' . $type . 'key'}($key->subkeys[$i]->id);
+                    if ($result !== true) {
+                        return $result;
+                    }
+                }
+            }
         }
 
         return $result;
@@ -307,17 +324,17 @@
         $ekey->name = trim($ekey->users[0]->name . ' <' . $ekey->users[0]->email . '>');
 
         foreach ($key->getSubKeys() as $idx => $subkey) {
-                $skey = new enigma_subkey();
-                $skey->id          = $subkey->getId();
-                $skey->revoked     = $subkey->isRevoked();
-                $skey->created     = $subkey->getCreationDate();
-                $skey->expires     = $subkey->getExpirationDate();
-                $skey->fingerprint = $subkey->getFingerprint();
-                $skey->has_private = $subkey->hasPrivate();
-                $skey->can_sign    = $subkey->canSign();
-                $skey->can_encrypt = $subkey->canEncrypt();
+            $skey = new enigma_subkey();
+            $skey->id          = $subkey->getId();
+            $skey->revoked     = $subkey->isRevoked();
+            $skey->created     = $subkey->getCreationDate();
+            $skey->expires     = $subkey->getExpirationDate();
+            $skey->fingerprint = $subkey->getFingerprint();
+            $skey->has_private = $subkey->hasPrivate();
+            $skey->can_sign    = $subkey->canSign();
+            $skey->can_encrypt = $subkey->canEncrypt();
 
-                $ekey->subkeys[$idx] = $skey;
+            $ekey->subkeys[$idx] = $skey;
         };
 
         $ekey->id = $ekey->subkeys[0]->id;

--
Gitblit v1.9.1