diff options
Diffstat (limited to 'src/authentication_request.zig')
-rw-r--r-- | src/authentication_request.zig | 75 |
1 files changed, 0 insertions, 75 deletions
diff --git a/src/authentication_request.zig b/src/authentication_request.zig deleted file mode 100644 index 549a26b..0000000 --- a/src/authentication_request.zig +++ /dev/null @@ -1,75 +0,0 @@ -const std = @import("std"); -const log = std.log.scoped(.pgz); -const ByteArrayList = std.ArrayList(u8); -const ProtocolError = @import("main.zig").ProtocolError; -const ClientError = @import("main.zig").ClientError; -const enum_from_int = @import("main.zig").enum_from_int; - -pub const Tag: u8 = 'R'; - -const AuthenticationRequest = @This(); - -pub const InnerAuthRequestType = enum(u32) { - AuthRequestTypeOk = 0, - AuthRequestTypeCleartextPassword = 3, -}; -pub const InnerAuthRequest = union{ - ok: AuthRequestOk, - cleartext_password: AuthRequestCleartextPassword, -}; -pub const AuthRequestOk = struct {}; -pub const AuthRequestCleartextPassword = struct {}; - -// Authentication requests have multiple subtypes. -// It's not possible to have a tagged union with a custom backing integer, so do it the long way -inner_type: InnerAuthRequestType, -inner: InnerAuthRequest, - -pub fn read(_: std.mem.Allocator, b: []const u8) !AuthenticationRequest { - if (b.len != 4) { - log.err("invalid message length, expected 4 got {}",.{b.len}); - return ProtocolError.InvalidMessageLength; - } - const inner_type = enum_from_int(InnerAuthRequestType, std.mem.readIntBig(u32, b[0..4])) orelse return ClientError.UnsupportedAuthType; - var inner: InnerAuthRequest = switch (inner_type) { - .AuthRequestTypeOk => .{.ok = AuthRequestOk{}}, - .AuthRequestTypeCleartextPassword => .{.cleartext_password = AuthRequestCleartextPassword{}}, - }; - return .{ - .inner_type = inner_type, - .inner = inner, - }; -} - -pub fn write(self: AuthenticationRequest, _: std.mem.Allocator, stream_writer: anytype) !void { - try stream_writer.writeByte(Tag); - try stream_writer.writeIntBig(u32, 8); - try stream_writer.writeIntBig(u32, @intFromEnum(self.inner_type)); -} - -pub fn deinit(_: *AuthenticationRequest, _: std.mem.Allocator) void {} - -test "round trip" { - const allocator = std.testing.allocator; - var sm = AuthenticationRequest{ - .inner_type = .AuthRequestTypeOk, - .inner = .{.ok = AuthRequestOk{}}, - }; - defer sm.deinit(allocator); - - var bal = ByteArrayList.init(allocator); - defer bal.deinit(); - try sm.write(allocator, bal.writer()); - - var fbs = std.io.fixedBufferStream(bal.items); - var reader = fbs.reader(); - const tag = try reader.readByte(); - try std.testing.expectEqual(Tag, tag); - const len = try reader.readIntBig(u32); - const buf = try allocator.alloc(u8, len - 4); - defer allocator.free(buf); - try reader.readNoEof(buf); - var sm2 = try AuthenticationRequest.read(allocator, buf); - defer sm2.deinit(allocator); - try std.testing.expectEqual(InnerAuthRequestType.AuthRequestTypeOk, sm2.inner_type); -} |