summaryrefslogtreecommitdiffstats
path: root/routers
diff options
context:
space:
mode:
authorAntoine GIRARD <sapk@users.noreply.github.com>2019-04-14 18:43:56 +0200
committertechknowlogick <matti@mdranta.net>2019-04-14 12:43:56 -0400
commitd699de32f2f6fd2216c8d620c8f53011e511b56b (patch)
tree1588178184132c2ac6f84af763ba003c469dba4c /routers
parent38889f09cbe039217f159838961b631f8f8d3b46 (diff)
downloadgitea-d699de32f2f6fd2216c8d620c8f53011e511b56b.tar.gz
gitea-d699de32f2f6fd2216c8d620c8f53011e511b56b.zip
add .gpg url (match github behaviour) (#6610)
* add .gpg url (match github behaviour) * wildcard * test to export maximum data * working POC * add comment for old imported keys * cleaning * Update routers/user/profile.go Co-Authored-By: sapk <sapk@users.noreply.github.com> * add migration script * add integration tests
Diffstat (limited to 'routers')
-rw-r--r--routers/user/home.go41
-rw-r--r--routers/user/profile.go15
2 files changed, 55 insertions, 1 deletions
diff --git a/routers/user/home.go b/routers/user/home.go
index 740a9edc4e..8eedeb70bd 100644
--- a/routers/user/home.go
+++ b/routers/user/home.go
@@ -19,6 +19,8 @@ import (
"github.com/Unknwon/com"
"github.com/Unknwon/paginater"
+ "github.com/keybase/go-crypto/openpgp"
+ "github.com/keybase/go-crypto/openpgp/armor"
)
const (
@@ -384,6 +386,45 @@ func ShowSSHKeys(ctx *context.Context, uid int64) {
ctx.PlainText(200, buf.Bytes())
}
+// ShowGPGKeys output all the public GPG keys of user by uid
+func ShowGPGKeys(ctx *context.Context, uid int64) {
+ keys, err := models.ListGPGKeys(uid)
+ if err != nil {
+ ctx.ServerError("ListGPGKeys", err)
+ return
+ }
+ entities := make([]*openpgp.Entity, 0)
+ failedEntitiesID := make([]string, 0)
+ for _, k := range keys {
+ e, err := models.GPGKeyToEntity(k)
+ if err != nil {
+ if models.IsErrGPGKeyImportNotExist(err) {
+ failedEntitiesID = append(failedEntitiesID, k.KeyID)
+ continue //Skip previous import without backup of imported armored key
+ }
+ ctx.ServerError("ShowGPGKeys", err)
+ return
+ }
+ entities = append(entities, e)
+ }
+ var buf bytes.Buffer
+
+ headers := make(map[string]string)
+ if len(failedEntitiesID) > 0 { //If some key need re-import to be exported
+ headers["Note"] = fmt.Sprintf("The keys with the following IDs couldn't be exported and need to be reuploaded %s", strings.Join(failedEntitiesID, ", "))
+ }
+ writer, _ := armor.Encode(&buf, "PGP PUBLIC KEY BLOCK", headers)
+ for _, e := range entities {
+ err = e.Serialize(writer) //TODO find why key are exported with a different cipherTypeByte as original (should not be blocking but strange)
+ if err != nil {
+ ctx.ServerError("ShowGPGKeys", err)
+ return
+ }
+ }
+ writer.Close()
+ ctx.PlainText(200, buf.Bytes())
+}
+
func showOrgProfile(ctx *context.Context) {
ctx.SetParams(":org", ctx.Params(":username"))
context.HandleOrgAssignment(ctx)
diff --git a/routers/user/profile.go b/routers/user/profile.go
index 03f88e256a..675c1dc3f4 100644
--- a/routers/user/profile.go
+++ b/routers/user/profile.go
@@ -59,9 +59,16 @@ func Profile(ctx *context.Context) {
isShowKeys := false
if strings.HasSuffix(uname, ".keys") {
isShowKeys = true
+ uname = strings.TrimSuffix(uname, ".keys")
}
- ctxUser := GetUserByName(ctx, strings.TrimSuffix(uname, ".keys"))
+ isShowGPG := false
+ if strings.HasSuffix(uname, ".gpg") {
+ isShowGPG = true
+ uname = strings.TrimSuffix(uname, ".gpg")
+ }
+
+ ctxUser := GetUserByName(ctx, uname)
if ctx.Written() {
return
}
@@ -72,6 +79,12 @@ func Profile(ctx *context.Context) {
return
}
+ // Show GPG keys.
+ if isShowGPG {
+ ShowGPGKeys(ctx, ctxUser.ID)
+ return
+ }
+
if ctxUser.IsOrganization() {
showOrgProfile(ctx)
return