// Copyright 2024 The Forgejo Authors. All rights reserved. // SPDX-License-Identifier: MIT package user import ( "context" "fmt" "code.gitea.io/gitea/models/db" "code.gitea.io/gitea/modules/util" "code.gitea.io/gitea/modules/validation" ) func init() { db.RegisterModel(new(FederatedUser)) } func CreateFederatedUser(ctx context.Context, user *User, federatedUser *FederatedUser) error { if res, err := validation.IsValid(user); !res { return fmt.Errorf("User is not valid: %v", err) } overwrite := CreateUserOverwriteOptions{ IsActive: util.OptionalBoolFalse, IsRestricted: util.OptionalBoolFalse, } // Begin transaction ctx, committer, err := db.TxContext((ctx)) if err != nil { return err } defer committer.Close() if err := CreateUser(ctx, user, &overwrite); err != nil { return err } federatedUser.UserID = user.ID if res, err := validation.IsValid(federatedUser); !res { return fmt.Errorf("FederatedUser is not valid: %v", err) } _, err = db.GetEngine(ctx).Insert(federatedUser) if err != nil { return err } // Commit transaction return committer.Commit() } func FindFederatedUser(ctx context.Context, externalID string, federationHostID int64) (*User, *FederatedUser, error) { federatedUser := new(FederatedUser) user := new(User) has, err := db.GetEngine(ctx).Where("external_id=? and federation_host_id=?", externalID, federationHostID).Get(federatedUser) if err != nil { return nil, nil, err } else if !has { return nil, nil, nil } has, err = db.GetEngine(ctx).ID(federatedUser.UserID).Get(user) if err != nil { return nil, nil, err } else if !has { return nil, nil, fmt.Errorf("User %v for federated user is missing.", federatedUser.UserID) } if res, err := validation.IsValid(*user); !res { return nil, nil, fmt.Errorf("FederatedUser is not valid: %v", err) } if res, err := validation.IsValid(*federatedUser); !res { return nil, nil, fmt.Errorf("FederatedUser is not valid: %v", err) } return user, federatedUser, nil }