Changes
3 changed files (+97/-65)
-
-
@@ -10,10 +10,9 @@ "log/slog""pocka.jp/x/yamori/backend/core/event" "pocka.jp/x/yamori/backend/core/projection" "pocka.jp/x/yamori/backend/crypto" workspaceEvent "pocka.jp/x/yamori/backend/events/workspace" "pocka.jp/x/yamori/backend/migrations" eventsV1 "pocka.jp/x/yamori/proto/go/backend/events/v1" workspaceEvent "pocka.jp/x/yamori/proto/go/backend/events/workspace/v1" ) type Core struct {
-
@@ -73,21 +72,9 @@core.Logger.Debug("Generating admin creation password...") password := rand.Text() hash, salt := crypto.SaltAndHashPassword([]byte(password)) err = event.AppendEvents(tx, []*eventsV1.Event{ { Event: &eventsV1.Event_WorkspaceEvent{ WorkspaceEvent: &workspaceEvent.Event{ Event: &workspaceEvent.Event_AdminCreationPasswordGenerated{ AdminCreationPasswordGenerated: &workspaceEvent.AdminCreationPasswordGenerated{ PasswordHash: hash, PasswordSalt: salt, }, }, }, }, }, workspaceEvent.GenerateAdminCreationPassword(password), }) if err != nil { return err
-
-
-
@@ -0,0 +1,90 @@// SPDX-FileCopyrightText: 2025 Shota FUJI <pockawoooh@gmail.com> // SPDX-License-Identifier: AGPL-3.0-only package workspace import ( "google.golang.org/protobuf/proto" "pocka.jp/x/yamori/backend/crypto" eventV1 "pocka.jp/x/yamori/proto/go/backend/events/v1" workspaceEvent "pocka.jp/x/yamori/proto/go/backend/events/workspace/v1" ) func GenerateAdminCreationPassword(password string) *eventV1.Event { hash, salt := crypto.SaltAndHashPassword([]byte(password)) return &eventV1.Event{ Event: &eventV1.Event_WorkspaceEvent{ WorkspaceEvent: &workspaceEvent.Event{ Event: &workspaceEvent.Event_AdminCreationPasswordGenerated{ AdminCreationPasswordGenerated: &workspaceEvent.AdminCreationPasswordGenerated{ PasswordHash: hash, PasswordSalt: salt, }, }, }, }, } } func ExpireAdminCreationPassword() *eventV1.Event { return &eventV1.Event{ Event: &eventV1.Event_WorkspaceEvent{ WorkspaceEvent: &workspaceEvent.Event{ Event: &workspaceEvent.Event_AdminCreationPasswordExpired{ AdminCreationPasswordExpired: &workspaceEvent.AdminCreationPasswordExpired{}, }, }, }, } } func CreateUser(id string, name string, displayName string, keyID []byte) *eventV1.Event { return &eventV1.Event{ Event: &eventV1.Event_WorkspaceEvent{ WorkspaceEvent: &workspaceEvent.Event{ Event: &workspaceEvent.Event_UserCreated{ UserCreated: &workspaceEvent.UserCreated{ Id: proto.String(id), Name: proto.String(name), DisplayName: proto.String(displayName), KeyId: keyID, }, }, }, }, } } func ConfigurePasswordLogin(userID string, password string) *eventV1.Event { hash, salt := crypto.SaltAndHashPassword([]byte(password)) return &eventV1.Event{ Event: &eventV1.Event_WorkspaceEvent{ WorkspaceEvent: &workspaceEvent.Event{ Event: &workspaceEvent.Event_PasswordLoginConfigured{ PasswordLoginConfigured: &workspaceEvent.PasswordLoginConfigured{ UserId: proto.String(userID), PasswordHash: hash, PasswordSalt: salt, }, }, }, }, } } func GrantAdminAccess(userID string) *eventV1.Event { return &eventV1.Event{ Event: &eventV1.Event_WorkspaceEvent{ WorkspaceEvent: &workspaceEvent.Event{ Event: &workspaceEvent.Event_AdminAccessGranted{ AdminAccessGranted: &workspaceEvent.AdminAccessGranted{ UserId: proto.String(userID), }, }, }, }, } }
-
-
-
@@ -18,8 +18,8 @@ "pocka.jp/x/yamori/backend/core""pocka.jp/x/yamori/backend/core/event" "pocka.jp/x/yamori/backend/core/projection" "pocka.jp/x/yamori/backend/crypto" workspaceEvent "pocka.jp/x/yamori/backend/events/workspace" eventV1 "pocka.jp/x/yamori/proto/go/backend/events/v1" workspaceEvent "pocka.jp/x/yamori/proto/go/backend/events/workspace/v1" errorV1 "pocka.jp/x/yamori/proto/go/error/v1" workspaceV2 "pocka.jp/x/yamori/proto/go/workspace/v2" workspaceV2connect "pocka.jp/x/yamori/proto/go/workspace/v2/v2connect"
-
@@ -192,56 +192,11 @@keyID := make([]byte, 32) rand.Read(keyID) pwHash, pwSalt := crypto.SaltAndHashPassword([]byte(req.Msg.GetPassword())) err = event.AppendEvents(tx, []*eventV1.Event{ { Event: &eventV1.Event_WorkspaceEvent{ WorkspaceEvent: &workspaceEvent.Event{ Event: &workspaceEvent.Event_AdminCreationPasswordExpired{ AdminCreationPasswordExpired: &workspaceEvent.AdminCreationPasswordExpired{}, }, }, }, }, { Event: &eventV1.Event_WorkspaceEvent{ WorkspaceEvent: &workspaceEvent.Event{ Event: &workspaceEvent.Event_UserCreated{ UserCreated: &workspaceEvent.UserCreated{ Id: proto.String(id.String()), Name: proto.String(name), DisplayName: proto.String(displayName), KeyId: keyID, }, }, }, }, }, { Event: &eventV1.Event_WorkspaceEvent{ WorkspaceEvent: &workspaceEvent.Event{ Event: &workspaceEvent.Event_AdminAccessGranted{ AdminAccessGranted: &workspaceEvent.AdminAccessGranted{ UserId: proto.String(id.String()), }, }, }, }, }, { Event: &eventV1.Event_WorkspaceEvent{ WorkspaceEvent: &workspaceEvent.Event{ Event: &workspaceEvent.Event_PasswordLoginConfigured{ PasswordLoginConfigured: &workspaceEvent.PasswordLoginConfigured{ UserId: proto.String(id.String()), PasswordHash: pwHash, PasswordSalt: pwSalt, }, }, }, }, }, workspaceEvent.ExpireAdminCreationPassword(), workspaceEvent.CreateUser(id.String(), name, displayName, keyID), workspaceEvent.GrantAdminAccess(id.String()), workspaceEvent.ConfigurePasswordLogin(id.String(), password), }) if err != nil { return nil, err
-