X-Git-Url: https://gitweb.ps.run/chirp/blobdiff_plain/4cf4bee6f41428be1e4138b329b3f9d0a7ccf4f4..d8f54dd8ac187349c1194871a55d4675f28e5a43:/src/main.zig
diff --git a/src/main.zig b/src/main.zig
index cc33216..164606f 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -111,28 +111,19 @@ fn reencode(comptime T: type, text: []const u8) !T {
const c = text[idx];
if (c == '+') {
try result.append(' ');
- } else if (c == '%') {
- // special case of ...
- // assume only , no
- if (idx + 6 < text.len and std.mem.eql(u8, text[idx .. idx + 6], "%26%23")) {
- const num_start = idx + 6;
- var num_end = num_start;
- while (num_end < text.len and std.ascii.isDigit(text[num_end])) {
- num_end += 1;
- }
+ } else if (c == '%' and idx + 2 < text.len) {
+ const allow = &[_]u8{ 0x26, 0x23, 0x3b, 0x0a };
- if (num_end + 2 < text.len and
- text[num_end] == '%' and
- text[num_end + 1] == '3' and
- std.ascii.toLower(text[num_end + 2]) == 'b')
- {
- try std.fmt.format(result.writer(), "{s};", .{text[num_start..num_end]});
- idx = num_end + 2;
- continue;
- }
+ const escaped_value = std.fmt.parseUnsigned(u8, text[idx + 1 .. idx + 3], 16) catch continue;
+
+ if (escaped_value == 0x0d) {
+ try std.fmt.format(result.writer(), "
", .{});
+ } else if (std.mem.indexOfScalar(u8, allow, escaped_value) != null) {
+ try std.fmt.format(result.writer(), "{c}", .{escaped_value});
+ } else {
+ try std.fmt.format(result.writer(), "{x};", .{escaped_value});
}
- try std.fmt.format(result.writer(), "{s};", .{text[idx + 1 .. idx + 3]});
idx += 2;
} else {
try result.append(c);
@@ -518,10 +509,16 @@ fn html_form(res: *http.Response, action: []const u8, inputs: anytype) !void {
inline for (inputs) |input| {
switch (@typeInfo(@TypeOf(input))) {
- .Struct => {
- try res.write("", .{});
+ .Struct => |s| {
+ if (s.fields.len == 3) {
+ try res.write("<{s} ", .{input[0]});
+ try res.write(input[1], input[2]);
+ try res.write(">{s}>", .{input[0]});
+ } else {
+ try res.write("", .{});
+ }
},
else => {
try res.write("{s}{s}", .{ id, name.constSlice(), if (list_view.has(post_id) catch false) " *" else "" });
}
try res.write("", .{});
- try res.write("", .{@intFromEnum(post_id)});
- try res.write("", .{});
+ try res.write("", .{@intFromEnum(post_id)});
+ try res.write("", .{});
try res.write("", .{});
}
@@ -789,8 +786,8 @@ fn write_profile(res: *http.Response, txn: lmdb.Txn, logged_in: ?Login, user: Us
try res.write("", .{ id, name.constSlice(), if (list_view.has(user.id) catch false) " *" else "" });
}
try res.write("", .{});
- try res.write("", .{@intFromEnum(user.id)});
- try res.write("", .{});
+ try res.write("", .{@intFromEnum(user.id)});
+ try res.write("", .{});
try res.write("", .{});
}
try res.write(
@@ -1274,7 +1271,7 @@ const GET = struct {
});
try self.res.write("
Description: ", .{});
try html_form(self.res, "/set_description", .{
- .{ "type=\"text\" name=\"description\" placeholder=\"{s}\"", .{login.user.description.constSlice()} },
+ .{ "textarea", "type=\"text\" name=\"description\" placeholder=\"{s}\"", .{login.user.description.constSlice()} },
"type=\"submit\" value=\"Change\"",
});
try self.res.write("
Password: ", .{});