mirror of https://github.com/meshcore-dev/MeshCore
3 changed files with 85 additions and 12 deletions
@ -0,0 +1,31 @@ |
|||||
|
#pragma once |
||||
|
|
||||
|
#include <stdint.h> |
||||
|
#include <string.h> |
||||
|
|
||||
|
namespace room_server { |
||||
|
|
||||
|
enum class LoginPermission : uint8_t { |
||||
|
Guest = 0, |
||||
|
ReadWrite = 2, |
||||
|
Admin = 3, |
||||
|
Rejected = 0xFF, |
||||
|
}; |
||||
|
|
||||
|
inline LoginPermission resolveLoginPermission(const char *supplied_password, const char *admin_password, |
||||
|
const char *guest_password, bool allow_read_only) { |
||||
|
if (strcmp(supplied_password, admin_password) == 0) { |
||||
|
return LoginPermission::Admin; |
||||
|
} |
||||
|
// An empty guest password disables authenticated read/write access. Without
|
||||
|
// this guard, a blank login is promoted before open read-only access applies.
|
||||
|
if (guest_password[0] != 0 && strcmp(supplied_password, guest_password) == 0) { |
||||
|
return LoginPermission::ReadWrite; |
||||
|
} |
||||
|
if (allow_read_only) { |
||||
|
return LoginPermission::Guest; |
||||
|
} |
||||
|
return LoginPermission::Rejected; |
||||
|
} |
||||
|
|
||||
|
} // namespace room_server
|
||||
@ -0,0 +1,39 @@ |
|||||
|
#include <gtest/gtest.h> |
||||
|
|
||||
|
#include "../../examples/simple_room_server/RoomAuth.h" |
||||
|
|
||||
|
using room_server::LoginPermission; |
||||
|
using room_server::resolveLoginPermission; |
||||
|
|
||||
|
TEST(RoomAuth, MatchingAdminPasswordGrantsAdmin) { |
||||
|
EXPECT_EQ(LoginPermission::Admin, resolveLoginPermission("admin", "admin", "guest", true)); |
||||
|
} |
||||
|
|
||||
|
TEST(RoomAuth, AdminPasswordTakesPriorityWhenPasswordsMatch) { |
||||
|
EXPECT_EQ(LoginPermission::Admin, resolveLoginPermission("shared", "shared", "shared", true)); |
||||
|
} |
||||
|
|
||||
|
TEST(RoomAuth, MatchingNonEmptyGuestPasswordTakesPriorityOverOpenReadOnly) { |
||||
|
EXPECT_EQ(LoginPermission::ReadWrite, resolveLoginPermission("guest", "admin", "guest", true)); |
||||
|
} |
||||
|
|
||||
|
TEST(RoomAuth, BlankGuestPasswordDoesNotGrantReadWrite) { |
||||
|
EXPECT_EQ(LoginPermission::Guest, resolveLoginPermission("", "admin", "", true)); |
||||
|
} |
||||
|
|
||||
|
TEST(RoomAuth, OpenReadOnlyAccessAcceptsAnyNonAdminAsGuest) { |
||||
|
EXPECT_EQ(LoginPermission::Guest, resolveLoginPermission("wrong", "admin", "guest", true)); |
||||
|
} |
||||
|
|
||||
|
TEST(RoomAuth, ClosedServerRejectsBlankPasswordWithBlankGuestPassword) { |
||||
|
EXPECT_EQ(LoginPermission::Rejected, resolveLoginPermission("", "admin", "", false)); |
||||
|
} |
||||
|
|
||||
|
TEST(RoomAuth, ClosedServerRejectsIncorrectPassword) { |
||||
|
EXPECT_EQ(LoginPermission::Rejected, resolveLoginPermission("wrong", "admin", "guest", false)); |
||||
|
} |
||||
|
|
||||
|
int main(int argc, char **argv) { |
||||
|
::testing::InitGoogleTest(&argc, argv); |
||||
|
return RUN_ALL_TESTS(); |
||||
|
} |
||||
Loading…
Reference in new issue