From e84e0ab904e076e248d7b84c0a840b5473c6739b Mon Sep 17 00:00:00 2001
From: Eryx <evorui@gmail.com>
Date: Tue, 28 Oct 2014 10:36:47 +0800
Subject: [PATCH] Fix #266

---
 models/publickey.go | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/models/publickey.go b/models/publickey.go
index 762d7333f..c29003ce6 100644
--- a/models/publickey.go
+++ b/models/publickey.go
@@ -79,9 +79,9 @@ func init() {
 // PublicKey represents a SSH key.
 type PublicKey struct {
 	Id                int64
-	OwnerId           int64  `xorm:"UNIQUE(s) INDEX NOT NULL"`
-	Name              string `xorm:"UNIQUE(s) NOT NULL"`
-	Fingerprint       string
+	OwnerId           int64     `xorm:"UNIQUE(s) INDEX NOT NULL"`
+	Name              string    `xorm:"UNIQUE(s) NOT NULL"`
+	Fingerprint       string    `xorm:"INDEX NOT NULL"`
 	Content           string    `xorm:"TEXT NOT NULL"`
 	Created           time.Time `xorm:"CREATED"`
 	Updated           time.Time
@@ -209,6 +209,9 @@ func AddPublicKey(key *PublicKey) (err error) {
 		return errors.New("not enough output for calculating fingerprint: " + stdout)
 	}
 	key.Fingerprint = strings.Split(stdout, " ")[1]
+	if has, err := x.Get(&PublicKey{Fingerprint: key.Fingerprint}); err == nil && has {
+		return ErrKeyAlreadyExist
+	}
 
 	// Save SSH key.
 	if _, err = x.Insert(key); err != nil {