Advertisement
Guest User

ACL.cpp

a guest
Jan 3rd, 2018
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.21 KB | None | 0 0
  1. #include "ACL.h"
  2.  
  3. Permissions::Permissions() {
  4. User u;
  5. Group g1, g2;
  6. g1.name = "administrators";
  7. g2.name = "users";
  8. u.name = "administrator";
  9. u.password = "admin";
  10. u.group = g1.name;
  11. g1.users_in_group.push_back(u);
  12. all_groups.push_back(g1);
  13. all_groups.push_back(g2);
  14. all_users.push_back(u);
  15. log_in_user = u;
  16. }
  17.  
  18. Permissions::~Permissions() {}
  19.  
  20. User Permissions::return_log_in_user_name() {
  21. return log_in_user;
  22. }
  23.  
  24. bool Permissions::user_exists(std::string name) {
  25. for (auto e : all_users)
  26. if (e.name == name)
  27. return true;
  28. return false;
  29. }
  30.  
  31. bool Permissions::group_exists(std::string name) {
  32. for (auto e : all_groups)
  33. if (e.name == name)
  34. return true;
  35. return false;
  36. }
  37.  
  38. void Permissions::add_user(std::string name, std::string password) {
  39. User u;
  40. if (!user_exists(name)) {
  41. u.name = name;
  42. u.password = password;
  43. u.group = "users";
  44. all_users.push_back(u);
  45.  
  46. for (int i = 0; i < all_groups.size(); i++) {
  47. if (all_groups[i].name == "users")
  48. all_groups[i].users_in_group.push_back(u);
  49. }
  50. }
  51. else std::cout << "\nUser with this name already exists\n\n";
  52. }
  53.  
  54. void Permissions::add_group(std::string name) {
  55. Group g;
  56. if (!group_exists(name)) {
  57. g.name = name;
  58. all_groups.push_back(g);
  59. }
  60. }
  61.  
  62. void Permissions::delete_user(std::string name) {
  63. if (log_in_user.group == "administrators") {
  64. if (name != "administrator") {
  65. if (log_in_user.name != name) {
  66. std::string group_name;
  67. int counter = -1;
  68. for (int i = 0; i < all_users.size(); i++) {
  69. if (all_users[i].name == name) {
  70.  
  71. group_name = all_users[i].group;
  72. all_users.erase(all_users.begin() + i);
  73. }
  74. }
  75. for (int i = 0; i < all_groups.size(); i++) {
  76. if (all_groups[i].name == group_name) {
  77. for (int j = 0; j < all_groups[i].users_in_group.size(); j++) {
  78. if (all_groups[i].users_in_group[j].name == name)
  79. all_groups[i].users_in_group.erase(all_groups[i].users_in_group.begin() + j);
  80. }
  81. }
  82. }
  83. for (auto &z : ACL_container) {
  84. counter = -1;
  85. for (auto &x : z.second.users) {
  86. counter++;
  87. if (x.name == name) {
  88. z.second.users.erase(z.second.users.begin() + counter);
  89. }
  90. }
  91. }
  92. }
  93. else std::cout << "\nCannot delete the logged in user\n\n";
  94. }
  95. else std::cout << "\nCannot delete the built-in administrator account\n\n";
  96. }
  97. else std::cout << "\nTo delete a user, you must belong to the administrators group\n\n";
  98. }
  99.  
  100. void Permissions::delete_group(std::string name) {
  101. if (log_in_user.group == "administrators") {
  102. if (name != "administrators" && name != "users") {
  103. User u;
  104. std::vector<User> pom{};
  105. int counter = -1;
  106.  
  107. for (int i = 0; i < all_users.size(); i++) {
  108. if (all_users[i].group == name) {
  109. all_users[i].group = "users";
  110. }
  111. }
  112. for (int i = 0; i < all_groups.size(); i++) {
  113. if (all_groups[i].name == name) {
  114. for (int j = 0; j < all_groups[i].users_in_group.size(); j++) {
  115. u.name = all_groups[i].users_in_group[j].name;
  116. u.password = all_groups[i].users_in_group[j].password;
  117. u.group = "users";
  118. pom.push_back(u);
  119. }
  120. all_groups.erase(all_groups.begin() + i);
  121. }
  122. }
  123.  
  124. for (int i = 0; i < all_groups.size(); i++) {
  125. if (all_groups[i].name == "users") {
  126. for (int j = 0; j < pom.size(); j++) {
  127. u.name = pom[j].name;
  128. u.password = pom[j].password;
  129. u.group = "uzytkownicy";
  130. all_groups[i].users_in_group.push_back(u);
  131. }
  132. }
  133. }
  134.  
  135. for (auto &z : ACL_container) {
  136. counter = -1;
  137. for (auto &x : z.second.groups) {
  138. counter++;
  139. if (x.name == name) {
  140. z.second.groups.erase(z.second.groups.begin() + counter);
  141. }
  142. }
  143. }
  144. }
  145. else std::cout << "\nCannot delete built-in administrators and users accounts\n\n";
  146. }
  147. else std::cout << "\nTo delete a group, you must belong to the administrators group\n\n";
  148. }
  149.  
  150. void Permissions::display_users() {
  151. std::cout << "\n";
  152. for (auto e : all_users)
  153. std::cout << e.name << "\n";
  154. std::cout << "\n";
  155. }
  156.  
  157. void Permissions::display_groups() {
  158. std::cout << "\n";
  159. for (auto e : all_groups) {
  160. std::cout << e.name << ": ";
  161. for (auto z : e.users_in_group)
  162. std::cout << z.name << " ";
  163. std::cout << "\n";
  164. }
  165. std::cout << "\n";
  166. }
  167.  
  168. void Permissions::log_out_and_in(std::string name, std::string password) {
  169. bool flag = false;
  170. for (int i = 0; i < all_users.size(); i++) {
  171. if (all_users[i].name == name) {
  172. if (all_users[i].password == password)
  173. log_in_user = all_users[i];
  174. else
  175. std::cout << "\nIncorrect password\n\n";
  176.  
  177. flag = true;
  178. break;
  179. }
  180. }
  181. if (!flag)
  182. std::cout << "\nSpecified user " <<"'"<<name<<"'"<<" doesn't exist\n\n";
  183. }
  184.  
  185. void Permissions::add_to_group(std::string name, std::string group) {
  186. bool flag1 = false;
  187. bool flag2 = false;
  188. bool flag3 = false;
  189. bool flag4 = false;
  190. User u;
  191. for (auto e : all_users)
  192. if (e.name == name && e.name != "administrator") {
  193. flag3 = true;
  194. u = e;
  195. }
  196.  
  197. if (log_in_user.group == "administrators")
  198. flag1 = true;
  199.  
  200. if (u.group != group)
  201. flag4 = true;
  202.  
  203. for (int i = 0; i < all_groups.size(); i++)
  204. if (all_groups[i].name == group)
  205. flag2 = true;
  206.  
  207. if (flag1 == true && flag2 == true && flag3 == true && flag4 == true) {
  208. for (int j = 0; j < all_groups.size(); j++) {
  209. if (all_groups[j].name == u.group) {
  210. for (int k = 0; k < all_groups[j].users_in_group.size(); k++) {
  211. if (all_groups[j].users_in_group[k].name == u.name) {
  212. all_groups[j].users_in_group.erase(all_groups[j].users_in_group.begin() + k);
  213. }
  214. }
  215. }
  216. }
  217. }
  218. if (flag1 == true && flag2 == true && flag3 == true && flag4 == true) {
  219. u.group = group;
  220. for (int i = 0; i < all_groups.size(); i++) {
  221. if (all_groups[i].name == group)
  222. all_groups[i].users_in_group.push_back(u);
  223. }
  224. for (auto &x : all_users) {
  225. if (x.name == name)
  226. x.group = group;
  227. }
  228. }
  229. if (!flag4)
  230. std::cout << "\nSpecified user already belongs to this group\n\n";
  231. if (!flag3)
  232. std::cout << "\nThis user doesn't exist\n\n";
  233. if (!flag2)
  234. std::cout << "\nThis group doesn't exist\n\n";
  235. if (!flag1)
  236. std::cout << "\n You are not allowed to perform such operation. \nLog in to the administrator's account\n\n";
  237.  
  238. }
  239.  
  240. std::string Permissions::numbers_to_rwx(char right) {
  241. std::string permissions;
  242. switch (right) {
  243. case '0':
  244. permissions = "---";
  245. return permissions;
  246. case '1':
  247. permissions = "--x";
  248. return permissions;
  249. case '2':
  250. permissions = "-w-";
  251. return permissions;
  252. case '3':
  253. permissions = "-wx";
  254. return permissions;
  255. case '4':
  256. permissions = "r--";
  257. return permissions;
  258. case '5':
  259. permissions = "r-x";
  260. return permissions;
  261. case '6':
  262. permissions = "rw-";
  263. return permissions;
  264. case '7':
  265. permissions = "rwx";
  266. return permissions;
  267. }
  268. }
  269.  
  270. void Permissions::createACL(std::string file_name) {
  271. std::pair<std::string, ACL> pair;
  272. pair.first = file_name;
  273. pair.second.owner = log_in_user.name;
  274. pair.second.group = log_in_user.group;
  275. pair.second.user_owner_permissions = "rwx";
  276. pair.second.group_owner_permissions = "rwx";
  277. pair.second.mask = "rwx";
  278. pair.second.others = "r--";
  279. ACL_container.insert(pair);
  280. }
  281.  
  282. void Permissions::getfacl(std::string file_name) {
  283. std::cout << "\n";
  284. if (ACL_container.find(file_name) != ACL_container.end()) {
  285. if (ACL_container[file_name].mask == "rwx") {
  286. std::cout << "# file: " << file_name << "\n";
  287. std::cout << "# owner: " << ACL_container[file_name].owner << "\n";
  288. std::cout << "# group: " << ACL_container[file_name].group << "\n";
  289. std::cout << "user::" << ACL_container[file_name].user_owner_permissions << "\n";
  290. for (auto p : ACL_container[file_name].users)
  291. std::cout << "user:" << p.name << ":" << p.permissions << "\n";
  292. std::cout << "group::" << ACL_container[file_name].group_owner_permissions << "\n";
  293. for (auto p : ACL_container[file_name].groups)
  294. std::cout << "group:" << p.name << ":" << p.permissions << "\n";
  295. std::cout << "mask::" << ACL_container[file_name].mask << "\n";
  296. std::cout << "other::" << ACL_container[file_name].others << "\n\n";
  297. }
  298. else {
  299. std::cout << "# file: " << file_name << "\n";
  300. std::cout << "# owner: " << ACL_container[file_name].owner << "\n";
  301. std::cout << "# group: " << ACL_container[file_name].group << "\n";
  302. std::cout << "user::" << ACL_container[file_name].user_owner_permissions << "\n";
  303. for (auto p : ACL_container[file_name].users)
  304. std::cout << "user:" << p.name << ":" << p.permissions << "\t\t\t#effective:" << p.effective_permissions << "\n";
  305. std::cout << "group::" << ACL_container[file_name].group_owner_permissions << "\t\t\t#effective:" << ACL_container[file_name].group_owner_effective_permissions << "\n";
  306. for (auto p : ACL_container[file_name].groups)
  307. std::cout << "group:" << p.name << ":" << p.permissions << "\t\t\t#effective:" << p.effective_permissions << "\n";
  308. std::cout << "mask::" << ACL_container[file_name].mask << "\n";
  309. std::cout << "other::" << ACL_container[file_name].others << "\n\n";
  310. }
  311. }
  312. else std::cout << "This file doesn't exist\n\n";
  313. }
  314.  
  315. bool Permissions::user_exists_in_ACL(std::string name, std::string file_name) {
  316. for (auto z : ACL_container) {
  317. if (z.first == file_name) {
  318. for (auto x : z.second.users)
  319. if (x.name == name)
  320. return true;
  321. }
  322. }
  323. return false;
  324. }
  325.  
  326. bool Permissions::group_exists_in_ACL(std::string name, std::string file_name) {
  327. for (auto z : ACL_container) {
  328. if (z.first == file_name) {
  329. for (auto x : z.second.groups)
  330. if (x.name == name)
  331. return true;
  332. }
  333. }
  334. return false;
  335. }
  336.  
  337. void Permissions::delete_user_from_ACL(std::string name, std::string file_name) {
  338. for (int i = 0; i < ACL_container[file_name].users.size(); i++) {
  339. if (ACL_container[file_name].users[i].name == name)
  340. ACL_container[file_name].users.erase(ACL_container[file_name].users.begin() + i);
  341. }
  342. }
  343.  
  344. void Permissions::delete_group_from_ACL(std::string name, std::string file_name) {
  345. for (int i = 0; i <ACL_container[file_name].groups.size(); i++) {
  346. if (ACL_container[file_name].groups[i].name == name)
  347. ACL_container[file_name].groups.erase(ACL_container[file_name].groups.begin() + i);
  348. }
  349. }
  350.  
  351. std::string Permissions::from_normal_to_effective(std::string mask, std::string permissions) {
  352. std::string effective_permissions = "";
  353. for (int i = 0; i < 3; i++) {
  354. if (permissions[i] != mask[i])
  355. effective_permissions += '-';
  356. else
  357. effective_permissions += mask[i];
  358. }
  359. return effective_permissions;
  360. }
  361.  
  362. void Permissions::set_effective_permissions(std::string permissions, std::string file_name) {
  363. std::string new_permissions = "";
  364. std::string mask = permissions;
  365. for (auto &x : ACL_container[file_name].users) {
  366. new_permissions = from_normal_to_effective(mask, x.permissions);
  367. x.effective_permissions = new_permissions;
  368. }
  369. new_permissions = from_normal_to_effective(mask, ACL_container[file_name].group_owner_permissions);
  370. ACL_container[file_name].group_owner_effective_permissions = new_permissions;
  371.  
  372. for (auto &y : ACL_container[file_name].groups) {
  373. new_permissions = from_normal_to_effective(mask, y.permissions);
  374. y.effective_permissions = new_permissions;
  375. }
  376. }
  377.  
  378. void Permissions::setfacl(char parameter, std::string command, char right, std::string file_name) {
  379. char mark = command[0];
  380. User u; Group g;
  381. std::string name = "", permissions = "";
  382. if (parameter == 'm') {
  383. switch (mark) {
  384. case 'u':
  385. name = command.substr(2, command.size() - 2);
  386. if (user_exists(name)) {
  387. permissions = numbers_to_rwx(right);
  388. if (!mask_defined) {
  389. if (!user_exists_in_ACL(name, file_name)) {
  390. u.name = name;
  391. u.permissions = permissions;
  392. ACL_container[file_name].users.push_back(u);
  393. }
  394. else {
  395. for (int i = 0; i < ACL_container[file_name].users.size(); i++) {
  396. if (ACL_container[file_name].users[i].name == name) {
  397. ACL_container[file_name].users[i].permissions = permissions;
  398. }
  399. }
  400. }
  401. }
  402. else {
  403. if (!user_exists_in_ACL(name, file_name)) {
  404. u.name = name;
  405. u.permissions = permissions;
  406. u.effective_permissions = from_normal_to_effective(ACL_container[file_name].mask, permissions);
  407. ACL_container[file_name].users.push_back(u);
  408. }
  409. else {
  410. for (int i = 0; i <ACL_container[file_name].users.size(); i++) {
  411. if (ACL_container[file_name].users[i].name == name) {
  412. ACL_container[file_name].users[i].permissions = permissions;
  413. ACL_container[file_name].users[i].effective_permissions = from_normal_to_effective(ACL_container[file_name].mask, permissions);
  414. }
  415. }
  416. }
  417. }
  418. }
  419. else {
  420. std::cout << "\nThis user doesn't exist\n\n";
  421. }
  422. break;
  423. case 'g':
  424. name = command.substr(2, command.size() - 2);
  425. if (group_exists(name)) {
  426. permissions = numbers_to_rwx(right);
  427. if (!group_exists_in_ACL(name, file_name)) {
  428. g.name = name;
  429. g.permissions = permissions;
  430. ACL_container[file_name].groups.push_back(g);
  431. }
  432. else {
  433. for (int i = 0; i < ACL_container[file_name].groups.size(); i++) {
  434. if (ACL_container[file_name].groups[i].name == name)
  435. ACL_container[file_name].groups[i].permissions = permissions;
  436. }
  437. }
  438. }
  439. else {
  440. std::cout << "\nThis group doesn't exist\n\n";
  441. }
  442. break;
  443. case 'm':
  444. if (right < 55) {
  445. permissions = numbers_to_rwx(right);
  446. set_effective_permissions(permissions, file_name);
  447. ACL_container[file_name].mask = permissions;
  448. mask_defined = true;
  449. }
  450. else {
  451. permissions = numbers_to_rwx(right);
  452. ACL_container[file_name].mask = permissions;
  453. }
  454. break;
  455. case 'o':
  456. permissions = numbers_to_rwx(right);
  457. ACL_container[file_name].others = permissions;
  458. break;
  459. }
  460. }
  461. else if (parameter == 'x') {
  462. switch (mark) {
  463. case 'u':
  464. name = command.substr(2, command.size() - 2);
  465. if (user_exists(name))
  466. if (user_exists_in_ACL(name, file_name))
  467. delete_user_from_ACL(name, file_name);
  468. break;
  469. case 'g':
  470. name = command.substr(2, command.size() - 2);
  471. if (group_exists(name))
  472. if (group_exists_in_ACL(name, file_name))
  473. delete_group_from_ACL(name, file_name);
  474. break;
  475. }
  476. }
  477. }
  478.  
  479. void Permissions::deleteACL(std::string file_name) {
  480. if (ACL_container.find(file_name) != ACL_container.end()) {
  481. std::map<std::string, ACL>::iterator it;
  482. it = ACL_container.find(file_name);
  483. ACL_container.erase(it);
  484. }
  485. else std::cout << "This file doesn't exist\n\n";
  486.  
  487. }
  488.  
  489. bool Permissions::read_permission(std::string file_name) {
  490. bool others1 = false, others2 = false, others3 = false;
  491. if (ACL_container.find(file_name) != ACL_container.end()) {
  492. if (log_in_user.name == ACL_container[file_name].owner)
  493. return true;
  494.  
  495. if (mask_defined) {
  496. for (auto x : ACL_container[file_name].users) {
  497. if (x.name == log_in_user.name) {
  498. if (x.effective_permissions[0] == 'r') {
  499. return true;
  500. }
  501. }
  502. else
  503. others1 = true;
  504. }
  505. if (log_in_user.group == ACL_container[file_name].group) {
  506. if (ACL_container[file_name].group_owner_effective_permissions[0] == 'r')
  507. return true;
  508. else
  509. return false;
  510. }
  511. else others2 = true;
  512.  
  513. for (auto x : ACL_container[file_name].groups) {
  514. if (x.name == log_in_user.group) {
  515. if (x.effective_permissions[0] == 'r')
  516. return true;
  517. else
  518. return false;
  519. }
  520. else others3 = true;
  521. }
  522.  
  523. if (others1 == true && others2 == true && others3 == true) {
  524. if (ACL_container[file_name].others[0] == 'r')
  525. return true;
  526. else
  527. return false;
  528. }
  529. }
  530. else {
  531. for (auto x : ACL_container[file_name].users) {
  532. if (x.name == log_in_user.name) {
  533. if (x.permissions[0] == 'r') {
  534. return true;
  535. }
  536. }
  537. else
  538. others1 = true;
  539. }
  540. if (log_in_user.group == ACL_container[file_name].group) {
  541. if (ACL_container[file_name].group_owner_permissions[0] == 'r')
  542. return true;
  543. else
  544. return false;
  545. }
  546. else others2 = true;
  547.  
  548. for (auto x : ACL_container[file_name].groups) {
  549. if (x.name == log_in_user.group) {
  550. if (x.permissions[0] == 'r')
  551. return true;
  552. else
  553. return false;
  554. }
  555. else others3 = true;
  556. }
  557.  
  558. if (others1 == true && others2 == true && others3 == true) {
  559. if (ACL_container[file_name].others[0] == 'r')
  560. return true;
  561. else
  562. return false;
  563. }
  564. }
  565. }
  566. }
  567.  
  568. bool Permissions::write_permission(std::string file_name) {
  569. bool others1 = false, others2 = false, others3 = false;
  570. if (ACL_container.find(file_name) != ACL_container.end()) {
  571. if (log_in_user.name == ACL_container[file_name].owner)
  572. return true;
  573.  
  574. if (mask_defined) {
  575. for (auto x : ACL_container[file_name].users) {
  576. if (x.name == log_in_user.name) {
  577. if (x.effective_permissions[1] == 'w') {
  578. return true;
  579. }
  580. }
  581. else
  582. others1 = true;
  583. }
  584. if (log_in_user.group == ACL_container[file_name].group) {
  585. if (ACL_container[file_name].group_owner_effective_permissions[1] == 'w')
  586. return true;
  587. else
  588. return false;
  589. }
  590. else others2 = true;
  591.  
  592. for (auto x : ACL_container[file_name].groups) {
  593. if (x.name == log_in_user.group) {
  594. if (x.effective_permissions[1] == 'w')
  595. return true;
  596. else
  597. return false;
  598. }
  599. else others3 = true;
  600. }
  601.  
  602. if (others1 == true && others2 == true && others3 == true) {
  603. if (ACL_container[file_name].others[1] == 'w')
  604. return true;
  605. else
  606. return false;
  607. }
  608. }
  609. else {
  610. for (auto x : ACL_container[file_name].users) {
  611. if (x.name == log_in_user.name) {
  612. if (x.permissions[1] == 'w') {
  613. return true;
  614. }
  615. }
  616. else
  617. others1 = true;
  618. }
  619. if (log_in_user.group == ACL_container[file_name].group) {
  620. if (ACL_container[file_name].group_owner_permissions[1] == 'w')
  621. return true;
  622. else
  623. return false;
  624. }
  625. else others2 = true;
  626.  
  627. for (auto x : ACL_container[file_name].groups) {
  628. if (x.name == log_in_user.group) {
  629. if (x.permissions[1] == 'w')
  630. return true;
  631. else
  632. return false;
  633. }
  634. else others3 = true;
  635. }
  636.  
  637. if (others1 == true && others2 == true && others3 == true) {
  638. if (ACL_container[file_name].others[1] == 'w')
  639. return true;
  640. else
  641. return false;
  642. }
  643. }
  644. }
  645. }
  646.  
  647. bool Permissions::exec_permission(std::string file_name) {
  648. bool others1 = false, others2 = false, others3 = false;
  649. if (ACL_container.find(file_name) != ACL_container.end()) {
  650. if (log_in_user.name == ACL_container[file_name].owner)
  651. return true;
  652.  
  653. if (mask_defined) {
  654. for (auto x : ACL_container[file_name].users) {
  655. if (x.name == log_in_user.name) {
  656. if (x.effective_permissions[2] == 'x') {
  657. return true;
  658. }
  659. }
  660. else
  661. others1 = true;
  662. }
  663. if (log_in_user.group == ACL_container[file_name].group) {
  664. if (ACL_container[file_name].group_owner_effective_permissions[2] == 'x')
  665. return true;
  666. else
  667. return false;
  668. }
  669. else others2 = true;
  670.  
  671. for (auto x : ACL_container[file_name].groups) {
  672. if (x.name == log_in_user.group) {
  673. if (x.effective_permissions[2] == 'x')
  674. return true;
  675. else
  676. return false;
  677. }
  678. else others3 = true;
  679. }
  680.  
  681. if (others1 == true && others2 == true && others3 == true) {
  682. if (ACL_container[file_name].others[2] == 'x')
  683. return true;
  684. else
  685. return false;
  686. }
  687. }
  688. else {
  689. for (auto x : ACL_container[file_name].users) {
  690. if (x.name == log_in_user.name) {
  691. if (x.permissions[2] == 'x') {
  692. return true;
  693. }
  694. }
  695. else
  696. others1 = true;
  697. }
  698. if (log_in_user.group == ACL_container[file_name].group) {
  699. if (ACL_container[file_name].group_owner_permissions[2] == 'x')
  700. return true;
  701. else
  702. return false;
  703. }
  704. else others2 = true;
  705.  
  706. for (auto x : ACL_container[file_name].groups) {
  707. if (x.name == log_in_user.group) {
  708. if (x.permissions[2] == 'x')
  709. return true;
  710. else
  711. return false;
  712. }
  713. else others3 = true;
  714. }
  715.  
  716. if (others1 == true && others2 == true && others3 == true) {
  717. if (ACL_container[file_name].others[2] == 'x')
  718. return true;
  719. else
  720. return false;
  721. }
  722. }
  723. }
  724. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement