passkeys.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package controller
  2. import (
  3. "net/http"
  4. "github.com/ente-io/museum/ente"
  5. "github.com/ente-io/museum/pkg/repo"
  6. "github.com/ente-io/museum/pkg/repo/passkey"
  7. "github.com/go-webauthn/webauthn/protocol"
  8. "github.com/go-webauthn/webauthn/webauthn"
  9. "github.com/google/uuid"
  10. )
  11. type PasskeyController struct {
  12. Repo *passkey.Repository
  13. UserRepo *repo.UserRepository
  14. }
  15. func (c *PasskeyController) GetPasskeys(userID int64) (passkeys []ente.Passkey, err error) {
  16. user, err := c.UserRepo.Get(userID)
  17. if err != nil {
  18. return
  19. }
  20. return c.Repo.GetUserPasskeys(user.ID)
  21. }
  22. func (c *PasskeyController) DeletePasskey(userID int64, passkeyID uuid.UUID) (err error) {
  23. user, err := c.UserRepo.Get(userID)
  24. if err != nil {
  25. return
  26. }
  27. return c.Repo.DeletePasskey(&user, passkeyID)
  28. }
  29. // RemovePasskey2FA removes all the user's passkeys to disable passkey 2FA and fall back to TOTP based 2FA if enabled.
  30. func (c *PasskeyController) RemovePasskey2FA(userID int64) (err error) {
  31. passkeys, err := c.GetPasskeys(userID)
  32. if err != nil {
  33. return
  34. }
  35. for _, passkey := range passkeys {
  36. err = c.DeletePasskey(userID, passkey.ID)
  37. if err != nil {
  38. return
  39. }
  40. }
  41. return
  42. }
  43. func (c *PasskeyController) RenamePasskey(userID int64, passkeyID uuid.UUID, newName string) (err error) {
  44. if len(newName) < 1 || len(newName) > 32 {
  45. err = ente.ErrInvalidName
  46. return
  47. }
  48. user, err := c.UserRepo.Get(userID)
  49. if err != nil {
  50. return
  51. }
  52. return c.Repo.RenamePasskey(&user, passkeyID, newName)
  53. }
  54. func (c *PasskeyController) BeginRegistration(userID int64) (options *protocol.CredentialCreation, session *webauthn.SessionData, sessionID uuid.UUID, err error) {
  55. user, err := c.UserRepo.Get(userID)
  56. if err != nil {
  57. return
  58. }
  59. return c.Repo.CreateBeginRegistrationData(&user)
  60. }
  61. func (c *PasskeyController) FinishRegistration(userID int64, friendlyName string, req *http.Request, sessionID uuid.UUID) (err error) {
  62. user, err := c.UserRepo.Get(userID)
  63. if err != nil {
  64. return
  65. }
  66. return c.Repo.FinishRegistration(&user, friendlyName, req, sessionID)
  67. }