Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions api/handlers/network_user_handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,7 @@ func GetNetworkUser(w http.ResponseWriter, r *http.Request) {
func UpgradeGuest(w http.ResponseWriter, r *http.Request) {
router.WrapWithInputRequireAuth(controller.UpgradeFromGuest, w, r)
}

func UpgradeGuestExisting(w http.ResponseWriter, r *http.Request) {
router.WrapWithInputRequireAuth(controller.UpgradeFromGuestExisting, w, r)
}
1 change: 1 addition & 0 deletions api/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ Options:
router.NewRoute("POST", "/auth/code-create", handlers.AuthCodeCreate),
router.NewRoute("POST", "/auth/code-login", handlers.AuthCodeLogin),
router.NewRoute("POST", "/auth/upgrade-guest", handlers.UpgradeGuest),
router.NewRoute("POST", "/auth/upgrade-guest-existing", handlers.UpgradeGuestExisting),
router.NewRoute("POST", "/network/auth-client", handlers.AuthNetworkClient),
router.NewRoute("POST", "/network/remove-client", handlers.RemoveNetworkClient),
router.NewRoute("GET", "/network/clients", handlers.NetworkClients),
Expand Down
29 changes: 29 additions & 0 deletions controller/network_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,9 @@ func UpdateNetworkName(
return &UpdateNetworkNameResult{}, nil
}

/**
* Upgrades a guest to a new account
*/
func UpgradeFromGuest(
upgradeGuest model.UpgradeGuestArgs,
session *session.ClientSession,
Expand Down Expand Up @@ -127,6 +130,32 @@ func UpgradeFromGuest(

}

/**
* Upgrades a guest to an existing account
*/
func UpgradeFromGuestExisting(
upgradeGuest model.UpgradeGuestExistingArgs,
session *session.ClientSession,
) (*model.UpgradeGuestExistingResult, error) {

result, err := model.UpgradeFromGuestExisting(
upgradeGuest,
session,
)

// if verification required, send it
if result.VerificationRequired != nil {
verifySend := AuthVerifySendArgs{
UserAuth: result.VerificationRequired.UserAuth,
UseNumeric: true,
}
AuthVerifySend(verifySend, session)
}

return result, err

}

type NetworkRemoveResult struct{}

func NetworkRemove(session *session.ClientSession) (*NetworkRemoveResult, error) {
Expand Down
4 changes: 4 additions & 0 deletions db_migrations.go
Original file line number Diff line number Diff line change
Expand Up @@ -1606,4 +1606,8 @@ var migrations = []any{
newSqlMigration(`
ALTER TABLE network_client_location ADD COLUMN network_id uuid NULL
`),

newSqlMigration(`
ALTER TABLE network ADD COLUMN guest_upgrade_network_id uuid NULL
`),
}
206 changes: 200 additions & 6 deletions model/network_model.go
Original file line number Diff line number Diff line change
Expand Up @@ -779,10 +779,196 @@ func UpgradeGuest(
return result, nil
}

type UpgradeGuestExistingArgs struct {
UserAuth *string `json:"user_auth,omitempty"`
Password *string `json:"password,omitempty"`
AuthJwt *string `json:"auth_jwt,omitempty"`
AuthJwtType *string `json:"auth_jwt_type,omitempty"`
}

type UpgradeGuestExistingError struct {
Message string `json:"message"`
}

type UpgradeGuestExistingResult struct {
Error *UpgradeGuestExistingError `json:"error,omitempty"`
VerificationRequired *UpgradeGuestExistingVerificationRequired `json:"verification_required,omitempty"`
Network *UpgradeGuestExistingResultNetwork `json:"network,omitempty"`
// Error *AuthLoginWithPasswordResultError `json:"error,omitempty"`
}

type UpgradeGuestExistingVerificationRequired struct {
UserAuth string `json:"user_auth"`
}

type UpgradeGuestExistingResultNetwork struct {
ByJwt *string `json:"by_jwt,omitempty"`
// NetworkName *string `json:"name,omitempty"`
}

func UpgradeFromGuestExisting(
upgradeGuestExisting UpgradeGuestExistingArgs,
session *session.ClientSession,
) (*UpgradeGuestExistingResult, error) {

if upgradeGuestExisting.UserAuth != nil && upgradeGuestExisting.Password != nil {
/**
* Upgrade from guest from email + password
*/

args := AuthLoginWithPasswordArgs{
UserAuth: *upgradeGuestExisting.UserAuth,
Password: *upgradeGuestExisting.Password,
}

loginResult, err := AuthLoginWithPassword(args, session)
if err != nil {
return &UpgradeGuestExistingResult{
Error: &UpgradeGuestExistingError{
Message: "Invalid login",
},
}, nil
}

if loginResult.Error != nil {
return &UpgradeGuestExistingResult{
Error: &UpgradeGuestExistingError{
Message: loginResult.Error.Message,
},
}, nil
}

if loginResult.Network.ByJwt == nil {

return &UpgradeGuestExistingResult{
Error: &UpgradeGuestExistingError{
Message: "Invalid network token",
},
}, nil
}

network, err := jwt.ParseByJwt(*loginResult.Network.ByJwt)
if err != nil {
return &UpgradeGuestExistingResult{
Error: &UpgradeGuestExistingError{
Message: "Error parsing network token",
},
}, nil
}

err = markUpgradedNetworkId(network.NetworkId, session)
if err != nil {
return &UpgradeGuestExistingResult{
Error: &UpgradeGuestExistingError{
Message: "Error marking upgraded network id",
},
}, nil
}

result := &UpgradeGuestExistingResult{
Network: &UpgradeGuestExistingResultNetwork{
ByJwt: loginResult.Network.ByJwt,
},
}

if loginResult.VerificationRequired != nil {
result.VerificationRequired = &UpgradeGuestExistingVerificationRequired{
UserAuth: loginResult.VerificationRequired.UserAuth,
}
}

return result, nil

}

if upgradeGuestExisting.AuthJwt != nil && upgradeGuestExisting.AuthJwtType != nil {
/**
* Upgrade from guest from social login
*/

args := AuthLoginArgs{
UserAuth: upgradeGuestExisting.UserAuth,
}

loginResult, err := AuthLogin(args, session)
if err != nil {
return &UpgradeGuestExistingResult{
Error: &UpgradeGuestExistingError{
Message: "Invalid login",
},
}, nil
}

if loginResult.Error != nil {
return &UpgradeGuestExistingResult{
Error: &UpgradeGuestExistingError{
Message: loginResult.Error.Message,
},
}, nil
}

network, err := jwt.ParseByJwt(loginResult.Network.ByJwt)
if err != nil {
return &UpgradeGuestExistingResult{
Error: &UpgradeGuestExistingError{
Message: "Error parsing network token",
},
}, nil
}

err = markUpgradedNetworkId(network.NetworkId, session)
if err != nil {
return &UpgradeGuestExistingResult{
Error: &UpgradeGuestExistingError{
Message: "Error marking upgraded network id",
},
}, nil
}

return &UpgradeGuestExistingResult{
Network: &UpgradeGuestExistingResultNetwork{
ByJwt: &loginResult.Network.ByJwt,
},
}, nil

}

return &UpgradeGuestExistingResult{
Error: &UpgradeGuestExistingError{
Message: "Invalid args",
},
}, nil

}

func markUpgradedNetworkId(
upgradedNetworkId server.Id,
session *session.ClientSession,
) error {

server.Tx(session.Ctx, func(tx server.PgTx) {
server.RaisePgResult(tx.Exec(
session.Ctx,
`
UPDATE network
SET
guest_upgrade_network_id = $1
WHERE
network_id = $2
`,
upgradedNetworkId,
session.ByJwt.NetworkId,
))
})

return nil
}

type Network struct {
NetworkId *server.Id `json:"network_id"`
NetworkName string `json:"network_name"`
AdminUserId *server.Id `json:"admin_user_id"`
NetworkId *server.Id `json:"network_id"`
NetworkName string `json:"network_name"`
AdminUserId *server.Id `json:"admin_user_id"`
GuestUpgradeNetworkId *server.Id `json:"guest_upgrade_network_id"`
}

func GetNetwork(
Expand All @@ -798,7 +984,8 @@ func GetNetwork(
SELECT
network_id,
network_name,
admin_user_id
admin_user_id,
guest_upgrade_network_id
FROM network
WHERE network_id = $1
`,
Expand All @@ -813,6 +1000,7 @@ func GetNetwork(
&network.NetworkId,
&network.NetworkName,
&network.AdminUserId,
&network.GuestUpgradeNetworkId,
))
}
})
Expand All @@ -829,6 +1017,10 @@ func Testing_CreateNetwork(
adminUserId server.Id,
) (userAuth string) {
userAuth = fmt.Sprintf("%s@bringyour.com", networkId)
password := "password"

passwordSalt := createPasswordSalt()
passwordHash := computePasswordHashV1([]byte(password), passwordSalt)

server.Tx(ctx, func(tx server.PgTx) {
server.RaisePgResult(tx.Exec(
Expand All @@ -845,14 +1037,16 @@ func Testing_CreateNetwork(
server.RaisePgResult(tx.Exec(
ctx,
`
INSERT INTO network_user (user_id, user_name, auth_type, user_auth, verified)
VALUES ($1, $2, $3, $4, $5)
INSERT INTO network_user (user_id, user_name, auth_type, user_auth, verified, password_hash, password_salt)
VALUES ($1, $2, $3, $4, $5, $6, $7)
`,
adminUserId,
"test",
AuthTypePassword,
userAuth,
true,
passwordHash,
passwordSalt,
))
})

Expand Down
Loading