+12
build.maple
+12
build.maple
···
43
43
run = 'docker rm beep-database && docker volume rm beep-data'
44
44
}
45
45
46
+
task:ngrok = {
47
+
description = 'Open an ngrok tunnel for testing.'
48
+
category = 'misc'
49
+
run = 'ngrok http http://localhost:8008'
50
+
}
51
+
52
+
task:ngrok.url = {
53
+
description = 'Open an ngrok tunnel for testing. Requires you to pass the ngrok URL as an argument.'
54
+
category = 'misc'
55
+
run = 'ngrok http --url=${args} http://localhost:8008'
56
+
}
57
+
46
58
task:run.watch = {
47
59
description = 'Watch/run beep'
48
60
category = 'run'
+11
-7
src/main.v
+11
-7
src/main.v
···
43
43
44
44
@[inline]
45
45
fn load_validators(mut app App) {
46
-
app.validators.username = StringValidator.new(app.config.user.username_min_len,app.config.user.username_max_len,app.config.user.username_pattern)
47
-
app.validators.password = StringValidator.new(app.config.user.password_min_len,app.config.user.password_max_len,app.config.user.password_pattern)
48
-
app.validators.nickname = StringValidator.new(app.config.user.nickname_min_len,app.config.user.nickname_max_len,app.config.user.nickname_pattern)
49
-
app.validators.user_bio = StringValidator.new(app.config.user.bio_min_len,app.config.user.bio_max_len,app.config.user.bio_pattern)
50
-
app.validators.pronouns = StringValidator.new(app.config.user.pronouns_min_len,app.config.user.pronouns_max_len,app.config.user.pronouns_pattern)
51
-
app.validators.post_title = StringValidator.new(app.config.post.title_min_len,app.config.post.title_max_len,app.config.post.title_pattern)
52
-
app.validators.post_body = StringValidator.new(app.config.post.body_min_len,app.config.post.body_max_len,app.config.post.body_pattern)
46
+
// vfmt off
47
+
user := app.config.user
48
+
app.validators.username = StringValidator.new(user.username_min_len, user.username_max_len, user.username_pattern)
49
+
app.validators.password = StringValidator.new(user.password_min_len, user.password_max_len, user.password_pattern)
50
+
app.validators.nickname = StringValidator.new(user.nickname_min_len, user.nickname_max_len, user.nickname_pattern)
51
+
app.validators.user_bio = StringValidator.new(user.bio_min_len, user.bio_max_len, user.bio_pattern)
52
+
app.validators.pronouns = StringValidator.new(user.pronouns_min_len, user.pronouns_max_len, user.pronouns_pattern)
53
+
post := app.config.post
54
+
app.validators.post_title = StringValidator.new(post.title_min_len, post.title_max_len, post.title_pattern)
55
+
app.validators.post_body = StringValidator.new(post.body_min_len, post.body_max_len, post.body_pattern)
56
+
// vfmt on
53
57
}
54
58
55
59
fn main() {
-3
src/templates/settings.html
-3
src/templates/settings.html
···
15
15
rows="10"
16
16
minlength="@app.config.user.bio_min_len"
17
17
maxlength="@app.config.user.bio_max_len"
18
-
required aria-required
19
18
>@user.bio</textarea>
20
19
<br>
21
20
<input type="submit" value="save">
···
33
32
maxlength="@app.config.user.pronouns_max_len"
34
33
pattern="@app.config.user.pronouns_pattern"
35
34
value="@user.pronouns"
36
-
required aria-required
37
35
>
38
36
<input type="submit" value="save">
39
37
</form>
···
50
48
minlength="@app.config.user.nickname_min_len"
51
49
maxlength="@app.config.user.nickname_max_len"
52
50
value="@{user.nickname or { '' }}"
53
-
required aria-required
54
51
>
55
52
<input type="submit" value="save">
56
53
</form>
+14
-2
src/webapp/validation.v
+14
-2
src/webapp/validation.v
···
13
13
// validate validates a given string and returns true if it succeeded and false
14
14
// otherwise.
15
15
@[inline]
16
-
pub fn (validator StringValidator) validate(str string) bool {
17
-
return str.len > validator.min_len && str.len < validator.max_len
16
+
pub fn (validator StringValidator) validate(str_ string) bool {
17
+
// for whatever reason form inputs can end up with \r\n. i have
18
+
// absolutely no clue why this is a thing. anyway, this is here as a fix
19
+
str := str_.replace('\r\n', '\n')
20
+
21
+
// used for debugging validators. don't uncomment this in prod, please.
22
+
// a) it will log a crap ton of unneeded info, and b) basically all user
23
+
// inputs are validated. including passwords.
24
+
// println('validator on: ${str}')
25
+
// println(' >= min_len: ${str.len >= validator.min_len} (${str.len} >= ${validator.min_len})')
26
+
// println(' <= max_len: ${str.len <= validator.max_len} (${str.len} <= ${validator.max_len})')
27
+
// println(' regex: ${validator.pattern.matches_string(str)}')
28
+
29
+
return str.len >= validator.min_len && str.len <= validator.max_len
18
30
&& validator.pattern.matches_string(str)
19
31
}
20
32