Stefan Schuermans commited on 2020-08-23 09:21:48
Showing 9 changed files, with 196 additions and 15 deletions.
... | ... |
@@ -2,13 +2,17 @@ add_library( |
2 | 2 |
permissioner |
3 | 3 |
STATIC |
4 | 4 |
include/permissioner/Config.h |
5 |
+ include/permissioner/Group.h |
|
5 | 6 |
include/permissioner/Permissions.h |
6 | 7 |
include/permissioner/StringUtils.h |
7 | 8 |
include/permissioner/Tree.h |
9 |
+ include/permissioner/User.h |
|
8 | 10 |
src/Config.cpp |
11 |
+ src/Group.cpp |
|
9 | 12 |
src/Permissions.cpp |
10 | 13 |
src/StringUtils.cpp |
11 | 14 |
src/Tree.cpp |
15 |
+ src/User.cpp |
|
12 | 16 |
) |
13 | 17 |
|
14 | 18 |
target_include_directories( |
... | ... |
@@ -0,0 +1,28 @@ |
1 |
+#ifndef GROUP_H |
|
2 |
+#define GROUP_H |
|
3 |
+ |
|
4 |
+#include <boost/optional.hpp> |
|
5 |
+#include <string> |
|
6 |
+ |
|
7 |
+/// group name and ID configuration |
|
8 |
+class Group { |
|
9 |
+public: |
|
10 |
+ /** |
|
11 |
+ * @brief parse group name |
|
12 |
+ * @param[in] groupNameStr group name |
|
13 |
+ * @throws std::exception if something goes wrong |
|
14 |
+ */ |
|
15 |
+ void parseGroupName(std::string const &groupNameStr); |
|
16 |
+ |
|
17 |
+ /// return group name |
|
18 |
+ boost::optional<std::string> const & getGroupName() const; |
|
19 |
+ |
|
20 |
+ /// return group ID (or -1 if none) |
|
21 |
+ int getGid() const; |
|
22 |
+ |
|
23 |
+protected: |
|
24 |
+ boost::optional<std::string> groupName; |
|
25 |
+ int gid = -1; |
|
26 |
+}; |
|
27 |
+ |
|
28 |
+#endif // #ifndef GROUP_H |
... | ... |
@@ -1,10 +1,11 @@ |
1 | 1 |
#ifndef TREE_H |
2 | 2 |
#define TREE_H |
3 | 3 |
|
4 |
+#include <permissioner/Group.h> |
|
4 | 5 |
#include <permissioner/Permissions.h> |
6 |
+#include <permissioner/User.h> |
|
5 | 7 |
|
6 | 8 |
#include <boost/filesystem.hpp> |
7 |
-#include <boost/optional.hpp> |
|
8 | 9 |
#include <string> |
9 | 10 |
|
10 | 11 |
/// directory tree configuration |
... | ... |
@@ -18,8 +19,8 @@ public: |
18 | 19 |
void parseParams(std::string const ¶mStr); |
19 | 20 |
|
20 | 21 |
protected: |
21 |
- boost::optional<std::string> user; |
|
22 |
- boost::optional<std::string> group; |
|
22 |
+ User user; |
|
23 |
+ Group group; |
|
23 | 24 |
Permissions permissions; |
24 | 25 |
boost::filesystem::path root; |
25 | 26 |
}; |
... | ... |
@@ -0,0 +1,28 @@ |
1 |
+#ifndef USER_H |
|
2 |
+#define USER_H |
|
3 |
+ |
|
4 |
+#include <boost/optional.hpp> |
|
5 |
+#include <string> |
|
6 |
+ |
|
7 |
+/// user name and ID configuration |
|
8 |
+class User { |
|
9 |
+public: |
|
10 |
+ /** |
|
11 |
+ * @brief parse user name |
|
12 |
+ * @param[in] userNameStr user name |
|
13 |
+ * @throws std::exception if something goes wrong |
|
14 |
+ */ |
|
15 |
+ void parseUserName(std::string const &userNameStr); |
|
16 |
+ |
|
17 |
+ /// return user name |
|
18 |
+ boost::optional<std::string> const & getUserName() const; |
|
19 |
+ |
|
20 |
+ /// return user ID (or -1 if none) |
|
21 |
+ int getUid() const; |
|
22 |
+ |
|
23 |
+protected: |
|
24 |
+ boost::optional<std::string> userName; |
|
25 |
+ int uid = -1; |
|
26 |
+}; |
|
27 |
+ |
|
28 |
+#endif // #ifndef USER_H |
... | ... |
@@ -0,0 +1,50 @@ |
1 |
+#include <permissioner/Group.h> |
|
2 |
+ |
|
3 |
+#include <boost/optional.hpp> |
|
4 |
+#include <cerrno> |
|
5 |
+#include <cstring> |
|
6 |
+#include <grp.h> |
|
7 |
+#include <sstream> |
|
8 |
+#include <stdexcept> |
|
9 |
+#include <string> |
|
10 |
+#include <sys/types.h> |
|
11 |
+#include <unistd.h> |
|
12 |
+ |
|
13 |
+void Group::parseGroupName(std::string const &groupNameStr) { |
|
14 |
+ if (groupNameStr == "-") { |
|
15 |
+ groupName = boost::none; |
|
16 |
+ gid = -1; |
|
17 |
+ return; |
|
18 |
+ } |
|
19 |
+ |
|
20 |
+ long size_max = sysconf(_SC_GETGR_R_SIZE_MAX); |
|
21 |
+ if (size_max <= 0) { |
|
22 |
+ std::stringstream msg; |
|
23 |
+ msg << "invalid maximum size of group entry structure " << size_max; |
|
24 |
+ throw std::runtime_error(msg.str()); |
|
25 |
+ } |
|
26 |
+ |
|
27 |
+ struct group gr_buf, *gr; |
|
28 |
+ char buf[size_max]; |
|
29 |
+ if (getgrnam_r(groupNameStr.c_str(), &gr_buf, buf, sizeof(buf), &gr) != 0) { |
|
30 |
+ std::string err(strerror(errno)); |
|
31 |
+ std::stringstream msg; |
|
32 |
+ msg << "looking up group name \"" << groupNameStr << "\" failed: " << err; |
|
33 |
+ throw std::runtime_error(msg.str()); |
|
34 |
+ } |
|
35 |
+ if (! gr) { |
|
36 |
+ std::stringstream msg; |
|
37 |
+ msg << "group name \"" << groupNameStr << "\" not found"; |
|
38 |
+ throw std::runtime_error(msg.str()); |
|
39 |
+ } |
|
40 |
+ |
|
41 |
+ gid = gr->gr_gid; |
|
42 |
+} |
|
43 |
+ |
|
44 |
+boost::optional<std::string> const & Group::getGroupName() const { |
|
45 |
+ return groupName; |
|
46 |
+} |
|
47 |
+ |
|
48 |
+int Group::getGid() const { |
|
49 |
+ return gid; |
|
50 |
+} |
... | ... |
@@ -1,5 +1,7 @@ |
1 | 1 |
#include <permissioner/Permissions.h> |
2 | 2 |
|
3 |
+#include <sstream> |
|
4 |
+#include <stdexcept> |
|
3 | 5 |
#include <string> |
4 | 6 |
|
5 | 7 |
void Permissions::parseParams(std::string const ¶mStr) { |
... | ... |
@@ -65,6 +67,13 @@ void Permissions::parseParams(std::string const ¶mStr) { |
65 | 67 |
case 'X': |
66 | 68 |
whatCond |= flagExecute; |
67 | 69 |
break; |
70 |
+ default: |
|
71 |
+ { |
|
72 |
+ std::stringstream msg; |
|
73 |
+ msg << "invalid character \"" << c << "\" in permission string \"" |
|
74 |
+ << paramStr << "\""; |
|
75 |
+ throw std::runtime_error(msg.str()); |
|
76 |
+ } |
|
68 | 77 |
} |
69 | 78 |
} |
70 | 79 |
} |
... | ... |
@@ -1,10 +1,11 @@ |
1 | 1 |
#include <permissioner/Tree.h> |
2 | 2 |
|
3 |
+#include <permissioner/Group.h> |
|
3 | 4 |
#include <permissioner/Permissions.h> |
5 |
+#include <permissioner/User.h> |
|
4 | 6 |
#include <permissioner/StringUtils.h> |
5 | 7 |
|
6 | 8 |
#include <boost/filesystem.hpp> |
7 |
-#include <boost/optional.hpp> |
|
8 | 9 |
#include <sstream> |
9 | 10 |
#include <stdexcept> |
10 | 11 |
#include <string> |
... | ... |
@@ -25,23 +26,32 @@ void Tree::parseParams(std::string const ¶mStr) { |
25 | 26 |
throw std::runtime_error(msg.str()); |
26 | 27 |
} |
27 | 28 |
|
28 |
- if (userStr == "-") { |
|
29 |
- user = boost::none; |
|
30 |
- } else { |
|
31 |
- user = userStr; |
|
29 |
+ try { |
|
30 |
+ user.parseUserName(userStr); |
|
31 |
+ } catch (std::exception const & e) { |
|
32 |
+ std::stringstream msg; |
|
33 |
+ msg << "invalid <user> field \"" << userStr << "\" in \"" |
|
34 |
+ << paramStr << "\": " << e.what(); |
|
35 |
+ throw std::runtime_error(msg.str()); |
|
32 | 36 |
} |
33 |
- if (groupStr == "-") { |
|
34 |
- group = boost::none; |
|
35 |
- } else { |
|
36 |
- group = groupStr; |
|
37 |
+ |
|
38 |
+ try { |
|
39 |
+ group.parseGroupName(groupStr); |
|
40 |
+ } catch (std::exception const & e) { |
|
41 |
+ std::stringstream msg; |
|
42 |
+ msg << "invalid <group> field \"" << groupStr << "\" in \"" |
|
43 |
+ << paramStr << "\": " << e.what(); |
|
44 |
+ throw std::runtime_error(msg.str()); |
|
37 | 45 |
} |
46 |
+ |
|
38 | 47 |
try { |
39 | 48 |
permissions.parseParams(permissionsStr); |
40 | 49 |
} catch (std::exception const & e) { |
41 | 50 |
std::stringstream msg; |
42 |
- msg << "invalid <permissions> field in \"" << paramStr << "\": " |
|
43 |
- << e.what(); |
|
51 |
+ msg << "invalid <permissions> field \"" << permissionsStr << "\" in \"" |
|
52 |
+ << paramStr << "\": " << e.what(); |
|
44 | 53 |
throw std::runtime_error(msg.str()); |
45 | 54 |
} |
55 |
+ |
|
46 | 56 |
root = rootStr; |
47 | 57 |
} |
... | ... |
@@ -0,0 +1,50 @@ |
1 |
+#include <permissioner/User.h> |
|
2 |
+ |
|
3 |
+#include <boost/optional.hpp> |
|
4 |
+#include <cerrno> |
|
5 |
+#include <cstring> |
|
6 |
+#include <pwd.h> |
|
7 |
+#include <sstream> |
|
8 |
+#include <stdexcept> |
|
9 |
+#include <string> |
|
10 |
+#include <sys/types.h> |
|
11 |
+#include <unistd.h> |
|
12 |
+ |
|
13 |
+void User::parseUserName(std::string const &userNameStr) { |
|
14 |
+ if (userNameStr == "-") { |
|
15 |
+ userName = boost::none; |
|
16 |
+ uid = -1; |
|
17 |
+ return; |
|
18 |
+ } |
|
19 |
+ |
|
20 |
+ long size_max = sysconf(_SC_GETPW_R_SIZE_MAX); |
|
21 |
+ if (size_max <= 0) { |
|
22 |
+ std::stringstream msg; |
|
23 |
+ msg << "invalid maximum size of passwd entry structure " << size_max; |
|
24 |
+ throw std::runtime_error(msg.str()); |
|
25 |
+ } |
|
26 |
+ |
|
27 |
+ struct passwd pw_buf, *pw; |
|
28 |
+ char buf[size_max]; |
|
29 |
+ if (getpwnam_r(userNameStr.c_str(), &pw_buf, buf, sizeof(buf), &pw) != 0) { |
|
30 |
+ std::string err(strerror(errno)); |
|
31 |
+ std::stringstream msg; |
|
32 |
+ msg << "looking up user name \"" << userNameStr << "\" failed: " << err; |
|
33 |
+ throw std::runtime_error(msg.str()); |
|
34 |
+ } |
|
35 |
+ if (! pw) { |
|
36 |
+ std::stringstream msg; |
|
37 |
+ msg << "user name \"" << userNameStr << "\" not found"; |
|
38 |
+ throw std::runtime_error(msg.str()); |
|
39 |
+ } |
|
40 |
+ |
|
41 |
+ uid = pw->pw_uid; |
|
42 |
+} |
|
43 |
+ |
|
44 |
+boost::optional<std::string> const & User::getUserName() const { |
|
45 |
+ return userName; |
|
46 |
+} |
|
47 |
+ |
|
48 |
+int User::getUid() const { |
|
49 |
+ return uid; |
|
50 |
+} |