From fb960db6afa5fa84e60556f0c7d240b4af165a8d Mon Sep 17 00:00:00 2001
From: Unknown <joe2010xtmf@163.com>
Date: Sun, 16 Mar 2014 06:25:16 -0400
Subject: [PATCH] Add check if public key name has been used

---
 models/publickey.go     | 12 ++++++++++++
 routers/user/setting.go |  4 ++++
 2 files changed, 16 insertions(+)

diff --git a/models/publickey.go b/models/publickey.go
index bd0b7ee937..ee6bd53101 100644
--- a/models/publickey.go
+++ b/models/publickey.go
@@ -67,11 +67,23 @@ type PublicKey struct {
 	Updated     time.Time `xorm:"updated"`
 }
 
+var (
+	ErrKeyAlreadyExist = errors.New("Public key already exist")
+)
+
 func GenAuthorizedKey(keyId int64, key string) string {
 	return fmt.Sprintf(tmplPublicKey, appPath, keyId, key)
 }
 
 func AddPublicKey(key *PublicKey) (err error) {
+	// Check if public key name has been used.
+	has, err := orm.Get(key)
+	if err != nil {
+		return err
+	} else if has {
+		return ErrKeyAlreadyExist
+	}
+
 	// Calculate fingerprint.
 	tmpPath := filepath.Join(os.TempDir(), fmt.Sprintf("%d", time.Now().Nanosecond()),
 		"id_rsa.pub")
diff --git a/routers/user/setting.go b/routers/user/setting.go
index cd12bb6296..91e992b18e 100644
--- a/routers/user/setting.go
+++ b/routers/user/setting.go
@@ -128,6 +128,10 @@ func SettingSSHKeys(ctx *middleware.Context, form auth.AddSSHKeyForm) {
 		}
 
 		if err := models.AddPublicKey(k); err != nil {
+			if err.Error() == models.ErrKeyAlreadyExist.Error() {
+				ctx.RenderWithErr("Public key name has been used", "user/publickey", &form)
+				return
+			}
 			ctx.Handle(200, "ssh.AddPublicKey", err)
 			return
 		} else {