Skip to content
This repository was archived by the owner on Jul 12, 2023. It is now read-only.

Don't allow longexpires in user report #2370

Merged
merged 2 commits into from
Aug 17, 2022
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
14 changes: 11 additions & 3 deletions assets/server/realmadmin/_form_sms.html
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ <h5 class="mb-3">SMS templates</h5>
</div>
<div class="form-floating mb-3">
<textarea name="sms_text_template_{{$i}}" class="form-control font-monospace {{if $realm.ErrorsFor $v.Label}}is-invalid{{end}} sms-text-template"
placeholder="SMS text template" style="height:150px;">{{$v.Value}}</textarea>
placeholder="SMS text template" style="height:150px;" label="{{$v.Label}}">{{$v.Value}}</textarea>
<label for="sms-text-template">SMS text template</label>
</div>
{{if $realm.ErrorsFor $v.Label}}
Expand Down Expand Up @@ -416,7 +416,7 @@ <h5 class="mb-3">SMS templates</h5>
if (val.length > {{$realm.SMSTemplateMaxLength}}) {
errors.push('SMS Templates must be <= {{$realm.SMSTemplateMaxLength}} characters, currently ' + val.length + ' characters.');
}

// Provide live feedback on errors in the SMS Template construction.
if (enxEnabled) {
if (!val.includes("[enslink]")) {
Expand All @@ -438,11 +438,19 @@ <h5 class="mb-3">SMS templates</h5>
hasLC = val.includes("[longcode]");
if (!(hasSC || hasLC) || (hasSC && hasLC)) {
errors.push('must contain exactly one of `[code]` or `[longcode]`');
}
}

val = val.replace(/\[region\]/g, region);
val = val.replace(/\[longcode\]/g, longCode);
}

isUserReport = $(target).attr('label') === "User Report";
if (isUserReport) {
if (val.includes(("[longexpires]"))) {
errors.push("'User Report' template cannot contain `[longexpires]` since user report always uses the short expiration time `[expires]`, which is always in minutes.");
}
}

val = val.replace(/\[code\]/g, shortCode);
val = val.replace(/\[expires\]/g, shortExpires);
val = val.replace(/\[longexpires\]/g, longExpires);
Expand Down
7 changes: 7 additions & 0 deletions pkg/database/realm.go
Original file line number Diff line number Diff line change
Expand Up @@ -718,6 +718,13 @@ func (r *Realm) validateSMSTemplate(label, t string) string {
}
}

if label == UserReportTemplateLabel {
if strings.Contains(t, SMSLongExpires) {
r.AddError("smsTextTemplate", fmt.Sprintf("cannot contain %q - for %q the 'short expiration' time is used an is represented in minutes", SMSLongExpires, UserReportTemplateLabel))
r.AddError(label, fmt.Sprintf("cannot contain %q", SMSLongExpires))
}
}

// Check template length.
if l := len(t); l > SMSTemplateMaxLength {
r.AddError("smsTextTemplate", fmt.Sprintf("must be %d characters or less, current message is %v characters long", SMSTemplateMaxLength, l))
Expand Down
28 changes: 28 additions & 0 deletions pkg/database/realm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -458,6 +458,34 @@ func TestRealm_BeforeSave(t *testing.T) {
}
}

func TestRealm_ValidateSMSTemplateUserReport(t *testing.T) {
t.Parallel()

realm := NewRealmWithDefaults("test")
realm.RegionCode = "US-WA"
realm.AllowedTestTypes = TestTypeConfirmed | TestTypeUserReport
realm.EnableENExpress = true
realm.SMSTextTemplate = DefaultENXSMSTextTemplate

db, _ := testDatabaseInstance.NewDatabase(t, nil)
if err := db.SaveRealm(realm, SystemTest); err != nil {
t.Fatalf("save error: %v issues: %+v", err, realm.ErrorMessages())
}

_ = realm.validateSMSTemplate(UserReportTemplateLabel, *realm.SMSTextAlternateTemplates[UserReportTemplateLabel])
if len(realm.Errors()) > 0 {
t.Fatalf("unexpected errors when saving realm in ")
}

badTemplate := "Click here [enslink] expires in [longexpires] time"
realm.SMSTextAlternateTemplates[UserReportTemplateLabel] = &badTemplate

_ = realm.validateSMSTemplate(UserReportTemplateLabel, *realm.SMSTextAlternateTemplates[UserReportTemplateLabel])
if _, ok := realm.Errors()["smsTextTemplate"]; !ok {
t.Fatalf("missing expected error for `smsTextTemplate`")
}
}

func TestRealm_validateSMSTemplate(t *testing.T) {
t.Parallel()

Expand Down