Guest User

ACL.cpp

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