aboutsummaryrefslogtreecommitdiff
path: root/include/odhtdb/Permission.hpp
blob: 0978c5eb3fc1265589e601f3364028883419a17d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#pragma once

#include "types.hpp"
#include <initializer_list>
#include <stdexcept>

namespace odhtdb
{
    class PermissionDeniedException : public std::runtime_error
    {
    public:
        PermissionDeniedException(const std::string &errMsg) : std::runtime_error(errMsg) {}
    };
    
    enum class PermissionType : u32
    {
        ADD_DATA = (1 << 0),
        ADD_USER_SAME_LEVEL = (1 << 1),
        ADD_USER_HIGHER_LEVEL = (1 << 2),
        ADD_GROUP = (1 << 3),
        REMOVE_GROUP = (1 << 4)
    };
    
    const PermissionType ALL_PERMISSION_TYPES = (PermissionType)0xFFFFFFFF;
    
    const u8 PERMISSION_LEVEL_ADMIN = 0;
    const u8 PERMISSION_LEVEL_MODERATOR = 1;
    const u8 PERMISSION_LEVEL_REGULAR_USER = 2;
    
    class Permission
    {
    public:
        // @permissionLevel is hierarchical access right. A group can only modify a group that has higher @permissionLevel value
        Permission(u8 permissionLevel, u32 permissionFlags);
        
        // @permissionLevel is hierarchical access right. A group can only modify a group that has higher @permissionLevel value
        Permission(u8 permissionLevel, std::initializer_list<PermissionType> permissions);
        
        u8 getPermissionLevel() const { return permissionLevel; }
        u32 getPermissionFlags() const { return permissionFlags; }
        bool getFlag(PermissionType permissionType) const;
    private:
        u8 permissionLevel;
        u32 permissionFlags;
    };
    
    static const Permission ADMIN_PERMISSION(PERMISSION_LEVEL_ADMIN, { ALL_PERMISSION_TYPES });
    static const Permission REGULAR_USER_PERMISSION(PERMISSION_LEVEL_REGULAR_USER, { PermissionType::ADD_DATA });
}