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