mirror of
https://github.com/volatiletech/authboss.git
synced 2025-01-26 05:27:33 +02:00
Add maximum amount of OTPs
This commit is contained in:
parent
6164dd8da4
commit
9aed0c512d
11
otp/otp.go
11
otp/otp.go
@ -20,6 +20,7 @@ import (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
otpSize = 16
|
otpSize = 16
|
||||||
|
maxOTPs = 5
|
||||||
|
|
||||||
// PageLogin is for identifying the login page for parsing & validation
|
// PageLogin is for identifying the login page for parsing & validation
|
||||||
PageLogin = "otplogin"
|
PageLogin = "otplogin"
|
||||||
@ -196,14 +197,20 @@ func (o *OTP) AddPost(w http.ResponseWriter, r *http.Request) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
otpUser := MustBeOTPable(user)
|
||||||
|
currentOTPs := splitOTPs(otpUser.GetOTPs())
|
||||||
|
|
||||||
|
if len(currentOTPs) >= maxOTPs {
|
||||||
|
data := authboss.HTMLData{authboss.DataValidation: fmt.Sprintf("you cannot have more than %d one time passwords", maxOTPs)}
|
||||||
|
return o.Core.Responder.Respond(w, r, http.StatusOK, PageAdd, data)
|
||||||
|
}
|
||||||
|
|
||||||
logger.Infof("generating otp for %s", user.GetPID())
|
logger.Infof("generating otp for %s", user.GetPID())
|
||||||
otp, hash, err := generateOTP()
|
otp, hash, err := generateOTP()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
otpUser := MustBeOTPable(user)
|
|
||||||
currentOTPs := splitOTPs(otpUser.GetOTPs())
|
|
||||||
currentOTPs = append(currentOTPs, hash)
|
currentOTPs = append(currentOTPs, hash)
|
||||||
otpUser.PutOTPs(joinOTPs(currentOTPs))
|
otpUser.PutOTPs(joinOTPs(currentOTPs))
|
||||||
|
|
||||||
|
@ -459,6 +459,46 @@ func TestAddPost(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAddPostTooMany(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
h := testSetup()
|
||||||
|
uname := "test@test.com"
|
||||||
|
h.storer.Users[uname] = &mocks.User{
|
||||||
|
Email: uname,
|
||||||
|
OTPs: "2aID,2aID,2aID,2aID,2aID",
|
||||||
|
}
|
||||||
|
h.session.ClientValues[authboss.SessionKey] = uname
|
||||||
|
|
||||||
|
r := mocks.Request("POST")
|
||||||
|
w := h.ab.NewResponse(httptest.NewRecorder())
|
||||||
|
|
||||||
|
var err error
|
||||||
|
r, err = h.ab.LoadClientState(w, r)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := h.otp.AddPost(w, r); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if h.responder.Page != PageAdd {
|
||||||
|
t.Error("wanted add page, got:", h.responder.Page)
|
||||||
|
}
|
||||||
|
if h.responder.Status != http.StatusOK {
|
||||||
|
t.Error("wanted ok status, got:", h.responder.Status)
|
||||||
|
}
|
||||||
|
if len(h.responder.Data[authboss.DataValidation].(string)) == 0 {
|
||||||
|
t.Error("there should have been a validation error")
|
||||||
|
}
|
||||||
|
|
||||||
|
otps := splitOTPs(h.storer.Users[uname].OTPs)
|
||||||
|
if len(otps) != maxOTPs {
|
||||||
|
t.Error("expected the number of OTPs to be equal to the maximum")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestAddGetUserNotFound(t *testing.T) {
|
func TestAddGetUserNotFound(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user