Fix panic of ssh public key page after deletion of auth source (#31829)
Fix #31730 This PR rewrote the function `PublicKeysAreExternallyManaged` with a simple test. The new function removed the loop to make it more readable. (cherry picked from commit b491b2104f83ee8fc4956c099c427b339291b3be)
This commit is contained in:
parent
ebfdc659d8
commit
d5500422c9
2 changed files with 17 additions and 16 deletions
|
@ -229,35 +229,26 @@ func UpdatePublicKeyUpdated(ctx context.Context, id int64) error {
|
||||||
|
|
||||||
// PublicKeysAreExternallyManaged returns whether the provided KeyID represents an externally managed Key
|
// PublicKeysAreExternallyManaged returns whether the provided KeyID represents an externally managed Key
|
||||||
func PublicKeysAreExternallyManaged(ctx context.Context, keys []*PublicKey) ([]bool, error) {
|
func PublicKeysAreExternallyManaged(ctx context.Context, keys []*PublicKey) ([]bool, error) {
|
||||||
sources := make([]*auth.Source, 0, 5)
|
sourceCache := make(map[int64]*auth.Source, len(keys))
|
||||||
externals := make([]bool, len(keys))
|
externals := make([]bool, len(keys))
|
||||||
keyloop:
|
|
||||||
for i, key := range keys {
|
for i, key := range keys {
|
||||||
if key.LoginSourceID == 0 {
|
if key.LoginSourceID == 0 {
|
||||||
externals[i] = false
|
externals[i] = false
|
||||||
continue keyloop
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
var source *auth.Source
|
source, ok := sourceCache[key.LoginSourceID]
|
||||||
|
if !ok {
|
||||||
sourceloop:
|
|
||||||
for _, s := range sources {
|
|
||||||
if s.ID == key.LoginSourceID {
|
|
||||||
source = s
|
|
||||||
break sourceloop
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if source == nil {
|
|
||||||
var err error
|
var err error
|
||||||
source, err = auth.GetSourceByID(ctx, key.LoginSourceID)
|
source, err = auth.GetSourceByID(ctx, key.LoginSourceID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if auth.IsErrSourceNotExist(err) {
|
if auth.IsErrSourceNotExist(err) {
|
||||||
externals[i] = false
|
externals[i] = false
|
||||||
sources[i] = &auth.Source{
|
sourceCache[key.LoginSourceID] = &auth.Source{
|
||||||
ID: key.LoginSourceID,
|
ID: key.LoginSourceID,
|
||||||
}
|
}
|
||||||
continue keyloop
|
continue
|
||||||
}
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,8 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/models/db"
|
||||||
|
"code.gitea.io/gitea/models/unittest"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
"code.gitea.io/gitea/modules/setting"
|
||||||
|
|
||||||
"github.com/42wim/sshsig"
|
"github.com/42wim/sshsig"
|
||||||
|
@ -501,3 +503,11 @@ func runErr(t *testing.T, stdin []byte, args ...string) {
|
||||||
t.Fatal("expected error")
|
t.Fatal("expected error")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Test_PublicKeysAreExternallyManaged(t *testing.T) {
|
||||||
|
key1 := unittest.AssertExistsAndLoadBean(t, &PublicKey{ID: 1})
|
||||||
|
externals, err := PublicKeysAreExternallyManaged(db.DefaultContext, []*PublicKey{key1})
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Len(t, externals, 1)
|
||||||
|
assert.False(t, externals[0])
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue