added user creation from ap
This commit is contained in:
parent
a702da69cc
commit
e180467760
4 changed files with 107 additions and 16 deletions
|
@ -289,7 +289,6 @@ classDiagram
|
||||||
}
|
}
|
||||||
class Actor {
|
class Actor {
|
||||||
ID
|
ID
|
||||||
URL Item
|
|
||||||
Type ActivityVocabularyType // Person
|
Type ActivityVocabularyType // Person
|
||||||
Name NaturalLanguageValues
|
Name NaturalLanguageValues
|
||||||
PreferredUsername NaturalLanguageValues
|
PreferredUsername NaturalLanguageValues
|
||||||
|
@ -346,7 +345,6 @@ classDiagram
|
||||||
class FederatedUser {
|
class FederatedUser {
|
||||||
ID int64
|
ID int64
|
||||||
UserID int64
|
UserID int64
|
||||||
RawData map[string]any
|
|
||||||
ExternalID string
|
ExternalID string
|
||||||
FederationHost int64
|
FederationHost int64
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,28 +4,21 @@
|
||||||
package user
|
package user
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"code.gitea.io/gitea/models/db"
|
|
||||||
"code.gitea.io/gitea/modules/validation"
|
"code.gitea.io/gitea/modules/validation"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
|
||||||
db.RegisterModel(new(FederatedUser))
|
|
||||||
}
|
|
||||||
|
|
||||||
type FederatedUser struct {
|
type FederatedUser struct {
|
||||||
ID int64 `xorm:"pk NOT NULL"`
|
ID int64 `xorm:"pk NOT NULL"`
|
||||||
UserID int64 `xorm:"NOT NULL"`
|
UserID int64 `xorm:"NOT NULL"`
|
||||||
ExternalID string `xorm:"TEXT UNIQUE(federation_mapping) NOT NULL"`
|
ExternalID string `xorm:"TEXT UNIQUE(federation_mapping) NOT NULL"`
|
||||||
FederationHostID int64 `xorm:"UNIQUE(federation_mapping) NOT NULL"`
|
FederationHostID int64 `xorm:"UNIQUE(federation_mapping) NOT NULL"`
|
||||||
RawData map[string]any `xorm:"TEXT JSON"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewFederatedUser(userID int64, externalID string, federationHostID int64, rawData map[string]any) (FederatedUser, error) {
|
func NewFederatedUser(userID int64, externalID string, federationHostID int64) (FederatedUser, error) {
|
||||||
result := FederatedUser{
|
result := FederatedUser{
|
||||||
UserID: userID,
|
UserID: userID,
|
||||||
ExternalID: externalID,
|
ExternalID: externalID,
|
||||||
FederationHostID: federationHostID,
|
FederationHostID: federationHostID,
|
||||||
RawData: rawData,
|
|
||||||
}
|
}
|
||||||
if valid, err := validation.IsValid(result); !valid {
|
if valid, err := validation.IsValid(result); !valid {
|
||||||
return FederatedUser{}, err
|
return FederatedUser{}, err
|
||||||
|
|
|
@ -1,2 +1,24 @@
|
||||||
// Copyright 2024 The Forgejo Authors. All rights reserved.
|
// Copyright 2024 The Forgejo Authors. All rights reserved.
|
||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package user
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/models/db"
|
||||||
|
"code.gitea.io/gitea/modules/validation"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
db.RegisterModel(new(FederatedUser))
|
||||||
|
}
|
||||||
|
|
||||||
|
func CreateFederationUser(ctx context.Context, user FederatedUser) error {
|
||||||
|
if res, err := validation.IsValid(user); !res {
|
||||||
|
return fmt.Errorf("FederatedUser is not valid: %v", err)
|
||||||
|
}
|
||||||
|
_, err := db.GetEngine(ctx).Insert(user)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
|
@ -1,2 +1,80 @@
|
||||||
// Copyright 2024 The Forgejo Authors. All rights reserved.
|
// Copyright 2024 The Forgejo Authors. All rights reserved.
|
||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package user
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/models/forgefed"
|
||||||
|
"code.gitea.io/gitea/modules/context"
|
||||||
|
"code.gitea.io/gitea/modules/log"
|
||||||
|
"code.gitea.io/gitea/modules/setting"
|
||||||
|
"code.gitea.io/gitea/modules/util"
|
||||||
|
"code.gitea.io/gitea/modules/validation"
|
||||||
|
"github.com/google/uuid"
|
||||||
|
pwd_gen "github.com/sethvargo/go-password/password"
|
||||||
|
)
|
||||||
|
|
||||||
|
func CreateFederatedUserFromAP(ctx *context.APIContext, person forgefed.ForgePerson, personID forgefed.PersonID,
|
||||||
|
federationHostID int64) (*User, error) {
|
||||||
|
if res, err := validation.IsValid(person); !res {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
log.Info("RepositoryInbox: validated person: %q", person)
|
||||||
|
|
||||||
|
localFqdn, err := url.ParseRequestURI(setting.AppURL)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
email := fmt.Sprintf("f%v@%v", uuid.New().String(), localFqdn.Hostname())
|
||||||
|
loginName := personID.AsLoginName()
|
||||||
|
name := fmt.Sprintf("%v%v", person.PreferredUsername.String(), personID.HostSuffix())
|
||||||
|
log.Info("RepositoryInbox: person.Name: %v", person.Name)
|
||||||
|
fullName := person.Name.String()
|
||||||
|
if len(person.Name) == 0 {
|
||||||
|
fullName = name
|
||||||
|
}
|
||||||
|
|
||||||
|
password, err := pwd_gen.Generate(32, 10, 10, false, true)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
user := &User{
|
||||||
|
LowerName: strings.ToLower(person.PreferredUsername.String()),
|
||||||
|
Name: name,
|
||||||
|
FullName: fullName,
|
||||||
|
Email: email,
|
||||||
|
EmailNotificationsPreference: "disabled",
|
||||||
|
Passwd: password,
|
||||||
|
MustChangePassword: false,
|
||||||
|
LoginName: loginName,
|
||||||
|
Type: UserTypeRemoteUser,
|
||||||
|
IsAdmin: false,
|
||||||
|
}
|
||||||
|
|
||||||
|
overwrite := &CreateUserOverwriteOptions{
|
||||||
|
IsActive: util.OptionalBoolFalse,
|
||||||
|
IsRestricted: util.OptionalBoolFalse,
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := CreateUser(ctx, user, overwrite); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
federatedUser, err := NewFederatedUser(user.ID, personID.ID, federationHostID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = CreateFederationUser(ctx, federatedUser)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return user, nil
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue