Skip to content

Commit e5aeca3

Browse files
authored
Merge pull request #107 from PUFA-Computing/feat/2fa
fix: return 2fa column
2 parents dfdc65e + ce7a2fe commit e5aeca3

File tree

3 files changed

+34
-7
lines changed

3 files changed

+34
-7
lines changed

api/routes.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ func SetupRoutes() *gin.Engine {
5656
versionUpdater := services.NewVersionUpdater(VersionService)
5757
go versionUpdater.Run()
5858

59-
authHandlers := auth.NewAuthHandlers(authService, permissionService, MailgunService)
59+
authHandlers := auth.NewAuthHandlers(authService, permissionService, MailgunService, userService)
6060
userHandlers := user.NewUserHandlers(userService, permissionService, AWSService, R2Service)
6161
eventHandlers := event.NewEventHandlers(eventService, permissionService, AWSService, R2Service)
6262
newsHandlers := news.NewNewsHandler(newsService, permissionService, AWSService, R2Service)

internal/database/app/auth_database.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func AuthenticateUser(usernameOrEmail string) (*models.User, error) {
3535
var err error
3636

3737
query = `
38-
SELECT id, username, password, first_name, middle_name, last_name, email, student_id, major, year, role_id, email_verification_token, institution_name, gender
38+
SELECT id, username, password, first_name, middle_name, last_name, email, student_id, major, year, role_id, email_verification_token, institution_name, gender, email_verified, twofa_enabled, twofa_image, twofa_secret
3939
FROM users
4040
WHERE username = $1 OR email = $1`
4141

@@ -46,7 +46,7 @@ func AuthenticateUser(usernameOrEmail string) (*models.User, error) {
4646
).Scan(
4747
&userID, &user.Username, &user.Password, &user.FirstName, &user.MiddleName, &user.LastName, &user.Email,
4848
&user.StudentID, &user.Major, &user.Year, &user.RoleID, &user.EmailVerificationToken, &user.InstitutionName,
49-
&user.Gender,
49+
&user.Gender, &user.EmailVerified, &user.TwoFAEnabled, &user.TwoFAImage, &user.TwoFASecret,
5050
)
5151

5252
if errors.Is(err, sql.ErrNoRows) {

internal/handlers/auth/auth_handlers.go

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,15 @@ type Handlers struct {
2121
AuthService *services.AuthService
2222
PermissionService *services.PermissionService
2323
MailGunService *services.MailgunService
24+
UserService *services.UserService
2425
}
2526

26-
func NewAuthHandlers(authService *services.AuthService, permissionService *services.PermissionService, MailGunService *services.MailgunService) *Handlers {
27+
func NewAuthHandlers(authService *services.AuthService, permissionService *services.PermissionService, MailGunService *services.MailgunService, userService *services.UserService) *Handlers {
2728
return &Handlers{
2829
AuthService: authService,
2930
PermissionService: permissionService,
3031
MailGunService: MailGunService,
32+
UserService: userService,
3133
}
3234
}
3335

@@ -135,9 +137,11 @@ func validateEmail(email, suffix string) error {
135137
}
136138

137139
func (h *Handlers) Login(c *gin.Context) {
138-
var loginRequest models.User
139-
140-
log.Println("before bind json")
140+
var loginRequest struct {
141+
Username string `json:"username"`
142+
Password string `json:"password"`
143+
Passcode *string `json:"passcode"`
144+
}
141145

142146
if err := c.BindJSON(&loginRequest); err != nil {
143147
c.JSON(http.StatusBadRequest, gin.H{"success": false, "message": []string{err.Error()}})
@@ -153,6 +157,29 @@ func (h *Handlers) Login(c *gin.Context) {
153157
return
154158
}
155159

160+
// If there is no passcode, but 2FA is enabled, return otp required
161+
if loginRequest.Passcode == nil {
162+
163+
if user.TwoFAEnabled {
164+
c.JSON(http.StatusUnauthorized, gin.H{"success": false, "message": "Two Factor Authentication Required"})
165+
return
166+
}
167+
}
168+
169+
if loginRequest.Passcode != nil {
170+
if !user.TwoFAEnabled {
171+
c.JSON(http.StatusBadRequest, gin.H{"success": false, "message": "2FA is not enabled for this account"})
172+
return
173+
}
174+
175+
_, err := h.UserService.VerifyTwoFA(user.ID, *loginRequest.Passcode)
176+
if err != nil {
177+
c.JSON(http.StatusBadRequest, gin.H{"success": false, "message": "Invalid 2FA Code"})
178+
return
179+
}
180+
181+
}
182+
156183
// Check if the usernameOrEmail is an email
157184
if utils.IsEmail(loginRequest.Username) {
158185
if err := h.AuthService.ValidateEmail(loginRequest.Username); err != nil {

0 commit comments

Comments
 (0)