commit 80c67256578daf24956af8559802a25f00879c3c
parent 75c1fa861f8d18dc9fe739b0b99d340eee7394a6
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Thu, 8 Feb 2024 20:20:42 -0800
display gpg key expired time on user profile
Diffstat:
4 files changed, 46 insertions(+), 4 deletions(-)
diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go
@@ -448,6 +448,21 @@ func getGCMKeyBytes(keyBytes []byte) (cipher.AEAD, int, error) {
return gcm, nonceSize, nil
}
+func GetKeyExpiredTime(pkey string) (*time.Time, bool) {
+ e := GetEntityFromPKey(pkey)
+ if e == nil {
+ return nil, false
+ }
+ i := e.PrimaryIdentity()
+ sig := i.SelfSignature
+ if sig.KeyLifetimeSecs == nil || *sig.KeyLifetimeSecs == 0 {
+ return nil, false
+ }
+ expiredTime := e.PrimaryKey.CreationTime.Add(time.Duration(*sig.KeyLifetimeSecs) * time.Second)
+ expired := e.PrimaryKey.KeyExpired(sig, time.Now())
+ return &expiredTime, expired
+}
+
func GetKeyFingerprint(pkey string) string {
if e := GetEntityFromPKey(pkey); e != nil {
return FormatPgPFingerprint(e.PrimaryKey.Fingerprint)
@@ -539,6 +554,15 @@ func GeneratePgpEncryptedMessage(pkey, msg string) (string, error) {
armoredWriter, _ := armor.Encode(buffer, "PGP MESSAGE", nil)
w, err := openpgp.Encrypt(armoredWriter, []*openpgp.Entity{e}, nil, nil, nil)
if err != nil {
+
+ //i := e.PrimaryIdentity()
+ //sig := i.SelfSignature
+ //if sig.KeyLifetimeSecs != nil && *sig.KeyLifetimeSecs != 0 {
+ // expiry := e.PrimaryKey.CreationTime.Add(time.Duration(*sig.KeyLifetimeSecs) * time.Second)
+ //}
+ //if e.PrimaryKey.KeyExpired(sig, time.Now()) {
+ //}
+
// openpgp: invalid argument: cannot encrypt a message to key id xxx because it has no encryption keys
// Likely your key is expired or had expired subkeys. (https://github.com/keybase/keybase-issues/issues/2072#issuecomment-183702559)
logrus.Error(err)
diff --git a/pkg/web/handlers/data.go b/pkg/web/handlers/data.go
@@ -929,9 +929,12 @@ type adminSpamFiltersData struct {
}
type publicProfileData struct {
- User database.User
- PublicNotes database.UserPublicNote
- UserStyle string
+ User database.User
+ PublicNotes database.UserPublicNote
+ UserStyle string
+ GpgKeyExpiredTime *time.Time
+ GpgKeyExpired bool
+ GpgKeyExpiredSoon bool
}
type fileDropData struct {
diff --git a/pkg/web/handlers/handlers.go b/pkg/web/handlers/handlers.go
@@ -698,6 +698,10 @@ func PublicUserProfileHandler(c echo.Context) error {
data.User = user
data.UserStyle = user.GenerateChatStyle()
data.PublicNotes, _ = db.GetUserPublicNotes(user.ID)
+ data.GpgKeyExpiredTime, data.GpgKeyExpired = utils.GetKeyExpiredTime(user.GPGPublicKey)
+ if data.GpgKeyExpiredTime != nil {
+ data.GpgKeyExpiredSoon = data.GpgKeyExpiredTime.AddDate(0, -1, 0).Before(time.Now())
+ }
return c.Render(http.StatusOK, "public-profile", data)
}
diff --git a/pkg/web/public/views/pages/public-profile.gohtml b/pkg/web/public/views/pages/public-profile.gohtml
@@ -66,7 +66,18 @@
<span style="color: #c0ebff;">{{ if .Data.User.AgePublicKey }}{{ .Data.User.AgePublicKey }}{{ else }}none{{ end }}</span>
</div>
<div class="mt-3">
- <label for="pgpPublicKey">PGP key: <span style="color: #82e17f;">{{ .Data.User.GPGPublicKey | getKeyFingerprint }}</span></label><br />
+ <label for="pgpPublicKey">
+ PGP key:
+ <span style="color: #82e17f;">{{ .Data.User.GPGPublicKey | getKeyFingerprint }}</span>
+ {{ if .Data.GpgKeyExpiredTime }}
+ <span class="ml-3">
+ ( Expires on:
+ <span style="color: {{ if .Data.GpgKeyExpired }}red;{{ else if .Data.GpgKeyExpiredSoon }}orange{{ else }}#82e17f{{ end }};">
+ {{ .Data.GpgKeyExpiredTime.Format "Jan 02, 2006 15:04:05" }}
+ </span>)
+ </span>
+ {{ end }}
+ </label><br />
<textarea id="pgpPublicKey" rows="10" class="form-control mono" readonly>{{ .Data.User.GPGPublicKey }}</textarea>
</div>
<div class="mt-3">