From 03ac0f18ae8bcc9c2f843841b8fe322717616a21 Mon Sep 17 00:00:00 2001
From: Taylor Gerring <taylor.gerring@gmail.com>
Date: Mon, 16 Mar 2015 14:46:46 -0400
Subject: [PATCH] Initial support to remove Whisper identities per #491

---
 rpc/api.go         | 13 ++++++++++++-
 whisper/whisper.go |  9 +++++++++
 xeth/whisper.go    |  6 +++++-
 3 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/rpc/api.go b/rpc/api.go
index 1846e7db5a..b2d04cee64 100644
--- a/rpc/api.go
+++ b/rpc/api.go
@@ -9,11 +9,11 @@ import (
 	"sync"
 	"time"
 
+	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/core"
 	"github.com/ethereum/go-ethereum/core/types"
 	"github.com/ethereum/go-ethereum/crypto"
 	"github.com/ethereum/go-ethereum/ethdb"
-	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/event"
 	"github.com/ethereum/go-ethereum/event/filter"
 	"github.com/ethereum/go-ethereum/state"
@@ -371,6 +371,11 @@ func (p *EthereumApi) NewWhisperIdentity(reply *interface{}) error {
 	return nil
 }
 
+func (p *EthereumApi) RemoveWhisperIdentity(args *WhisperIdentityArgs, reply *interface{}) error {
+	*reply = p.xeth().Whisper().RemoveIdentity(args.Identity)
+	return nil
+}
+
 func (p *EthereumApi) NewWhisperFilter(args *WhisperFilterArgs, reply *interface{}) error {
 	var id int
 	opts := new(xeth.Options)
@@ -751,6 +756,12 @@ func (p *EthereumApi) GetRequestReply(req *RpcRequest, reply *interface{}) error
 		return p.WhisperPost(args, reply)
 	case "shh_newIdentity":
 		return p.NewWhisperIdentity(reply)
+	case "shh_removeIdentity":
+		args := new(WhisperIdentityArgs)
+		if err := json.Unmarshal(req.Params, &args); err != nil {
+			return err
+		}
+		return p.RemoveWhisperIdentity(args, reply)
 	case "shh_hasIdentity":
 		args := new(WhisperIdentityArgs)
 		if err := json.Unmarshal(req.Params, &args); err != nil {
diff --git a/whisper/whisper.go b/whisper/whisper.go
index 13209f9a6e..c80ba3c8ec 100644
--- a/whisper/whisper.go
+++ b/whisper/whisper.go
@@ -116,6 +116,15 @@ func (self *Whisper) GetIdentity(key *ecdsa.PublicKey) *ecdsa.PrivateKey {
 	return self.keys[string(crypto.FromECDSAPub(key))]
 }
 
+func (self *Whisper) RemoveIdentity(key *ecdsa.PublicKey) bool {
+	k := string(crypto.FromECDSAPub(key))
+	if _, ok := self.keys[k]; ok {
+		delete(self.keys, k)
+		return true
+	}
+	return false
+}
+
 func (self *Whisper) Watch(opts Filter) int {
 	return self.filters.Install(filter.Generic{
 		Str1: string(crypto.FromECDSAPub(opts.To)),
diff --git a/xeth/whisper.go b/xeth/whisper.go
index 76bf8012af..eb5fc789ca 100644
--- a/xeth/whisper.go
+++ b/xeth/whisper.go
@@ -4,8 +4,8 @@ import (
 	"errors"
 	"time"
 
-	"github.com/ethereum/go-ethereum/crypto"
 	"github.com/ethereum/go-ethereum/common"
+	"github.com/ethereum/go-ethereum/crypto"
 	"github.com/ethereum/go-ethereum/logger"
 	"github.com/ethereum/go-ethereum/whisper"
 )
@@ -63,6 +63,10 @@ func (self *Whisper) HasIdentity(key string) bool {
 	return self.Whisper.HasIdentity(crypto.ToECDSAPub(common.FromHex(key)))
 }
 
+func (self *Whisper) RemoveIdentity(key string) bool {
+	return self.Whisper.RemoveIdentity(crypto.ToECDSAPub(common.FromHex(key)))
+}
+
 func (self *Whisper) Watch(opts *Options) int {
 	filter := whisper.Filter{
 		To:     crypto.ToECDSAPub(common.FromHex(opts.To)),