1/* 2 * Copyright 2008, Ingo Weinhold, ingo_weinhold@gmx.de. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef _LIBROOT_USER_GROUP_COMMON_H 6#define _LIBROOT_USER_GROUP_COMMON_H 7 8#include <grp.h> 9#include <pwd.h> 10#include <shadow.h> 11 12#include <OS.h> 13 14 15#define MAX_PASSWD_NAME_LEN (32) 16#define MAX_PASSWD_PASSWORD_LEN (32) 17#define MAX_PASSWD_REAL_NAME_LEN (128) 18#define MAX_PASSWD_HOME_DIR_LEN (B_PATH_NAME_LENGTH) 19#define MAX_PASSWD_SHELL_LEN (B_PATH_NAME_LENGTH) 20 21#define MAX_PASSWD_BUFFER_SIZE ( \ 22 MAX_PASSWD_NAME_LEN \ 23 + MAX_PASSWD_PASSWORD_LEN \ 24 + MAX_PASSWD_REAL_NAME_LEN \ 25 + MAX_PASSWD_HOME_DIR_LEN \ 26 + MAX_PASSWD_SHELL_LEN) 27 28#define MAX_GROUP_NAME_LEN (32) 29#define MAX_GROUP_PASSWORD_LEN (32) 30#define MAX_GROUP_MEMBER_COUNT (32) 31 32#define MAX_GROUP_BUFFER_SIZE ( \ 33 MAX_GROUP_NAME_LEN \ 34 + MAX_GROUP_PASSWORD_LEN \ 35 + ((MAX_GROUP_MEMBER_COUNT + 1) * sizeof(char*))) 36 // MAX_GROUP_NAME_LEN and MAX_GROUP_PASSWORD_LEN are char* aligned 37 38 39#define MAX_SHADOW_PWD_NAME_LEN (32) 40#define MAX_SHADOW_PWD_PASSWORD_LEN (128) 41 42#define MAX_SHADOW_PWD_BUFFER_SIZE ( \ 43 MAX_SHADOW_PWD_NAME_LEN \ 44 + MAX_SHADOW_PWD_PASSWORD_LEN) 45 46 47#ifdef __cplusplus 48 49#include <AutoLocker.h> 50 51 52namespace BPrivate { 53 54class KMessage; 55class Tokenizer; 56 57extern const char* kPasswdFile; 58extern const char* kGroupFile; 59extern const char* kShadowPwdFile; 60 61 62// locking 63 64status_t user_group_lock(); 65status_t user_group_unlock(); 66 67 68class UserGroupLocking { 69public: 70 inline bool Lock(int*) 71 { 72 return user_group_lock() == B_OK; 73 } 74 75 inline void Unlock(int*) 76 { 77 user_group_unlock(); 78 } 79}; 80 81 82class UserGroupLocker : public AutoLocker<int, UserGroupLocking> { 83public: 84 UserGroupLocker() 85 : AutoLocker<int, UserGroupLocking>((int*)1) 86 { 87 } 88}; 89 90 91port_id get_registrar_authentication_port(); 92status_t send_authentication_request_to_registrar(KMessage& request, 93 KMessage& reply); 94 95 96template<typename Type> 97static inline Type* 98relocate_pointer(addr_t baseAddress, Type*& address) 99{ 100 return address = (Type*)(baseAddress + (addr_t)address); 101} 102 103 104// passwd 105 106status_t copy_passwd_to_buffer(const char* name, const char* password, uid_t uid, 107 gid_t gid, const char* home, const char* shell, const char* realName, 108 passwd* entry, char* buffer, size_t bufferSize); 109status_t copy_passwd_to_buffer(const passwd* from, passwd* entry, char* buffer, 110 size_t bufferSize); 111 112status_t parse_passwd_line(char* line, char*& name, char*& password, uid_t& uid, 113 gid_t& gid, char*& home, char*& shell, char*& realName); 114 115 116// group 117 118status_t copy_group_to_buffer(const char* name, const char* password, gid_t gid, 119 const char* const* members, int memberCount, group* entry, char* buffer, 120 size_t bufferSize); 121status_t copy_group_to_buffer(const group* from, group* entry, char* buffer, 122 size_t bufferSize); 123 124status_t parse_group_line(char* line, char*& name, char*& password, gid_t& gid, 125 char** members, int& memberCount); 126 127 128// shadow password 129 130status_t copy_shadow_pwd_to_buffer(const char* name, const char* password, 131 int lastChanged, int min, int max, int warn, int inactive, int expiration, 132 int flags, spwd* entry, char* buffer, size_t bufferSize); 133status_t copy_shadow_pwd_to_buffer(const spwd* from, spwd* entry, 134 char* buffer, size_t bufferSize); 135 136status_t parse_shadow_pwd_line(char* line, char*& name, char*& password, 137 int& lastChanged, int& min, int& max, int& warn, int& inactive, 138 int& expiration, int& flags); 139 140 141} // namespace BPrivate 142 143 144#endif // __cplusplus 145 146#endif // _LIBROOT_USER_GROUP_COMMON_H 147