file_permission.html 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>File Permissions</title>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0 user-scalable=no">
  7. <link rel="stylesheet" href="../../script/semantic/semantic.css">
  8. <script type="text/javascript" src="../../script/jquery.min.js"></script>
  9. <script type="text/javascript" src="../../script/semantic/semantic.min.js"></script>
  10. <script type="text/javascript" src="../../script/ao_module.js"></script>
  11. <style>
  12. body{
  13. }
  14. .fitted.checkbox{
  15. height: 20px;
  16. }
  17. </style>
  18. </head>
  19. <body id="filePropertiesWindow">
  20. <br>
  21. <div class="ui container">
  22. <h3 class="ui header">
  23. File Permissions
  24. <div class="sub header">Update file permissions for other gateways</div>
  25. </h3>
  26. <div class="ui divider"></div>
  27. <p id="filename"></p>
  28. <div class="ui grid">
  29. <div class="five wide column">
  30. <br>
  31. <div class="ui divider"></div>
  32. User
  33. <div class="ui divider"></div>
  34. Group
  35. <div class="ui divider"></div>
  36. Other
  37. </div>
  38. <div class="three wide column" style="text-align: center;">
  39. Read
  40. <div class="ui divider"></div>
  41. <div class="ui fitted disabled checkbox">
  42. <input id="1" type="checkbox" autocomplete="false">
  43. <label></label>
  44. </div>
  45. <div class="ui divider"></div>
  46. <div class="ui fitted disabled checkbox">
  47. <input id="4" type="checkbox" autocomplete="false">
  48. <label></label>
  49. </div>
  50. <div class="ui divider"></div>
  51. <div class="ui fitted checkbox">
  52. <input id="7" type="checkbox" autocomplete="false">
  53. <label></label>
  54. </div>
  55. </div>
  56. <div class="three wide column" style="text-align: center;">
  57. Write
  58. <div class="ui divider"></div>
  59. <div class="ui fitted disabled checkbox">
  60. <input id="2" type="checkbox" autocomplete="false">
  61. <label></label>
  62. </div>
  63. <div class="ui divider"></div>
  64. <div class="ui fitted disabled checkbox">
  65. <input id="5" type="checkbox" autocomplete="false">
  66. <label></label>
  67. </div>
  68. <div class="ui divider"></div>
  69. <div class="ui fitted checkbox">
  70. <input id="8" type="checkbox" autocomplete="false">
  71. <label></label>
  72. </div>
  73. </div>
  74. <div class="three wide column" style="text-align: center;">
  75. Execute
  76. <div class="ui divider"></div>
  77. <div class="ui fitted disabled checkbox">
  78. <input id="3" type="checkbox" autocomplete="false">
  79. <label></label>
  80. </div>
  81. <div class="ui divider"></div>
  82. <div class="ui fitted disabled checkbox">
  83. <input id="6" type="checkbox" autocomplete="false">
  84. <label></label>
  85. </div>
  86. <div class="ui divider"></div>
  87. <div class="ui fitted checkbox">
  88. <input id="9" type="checkbox" autocomplete="false">
  89. <label></label>
  90. </div>
  91. </div>
  92. </div>
  93. <br>
  94. <div class="ui accordion">
  95. <div class="title">
  96. <i class="dropdown icon"></i>
  97. Advance Settings
  98. </div>
  99. <div class="content">
  100. <div class="ui toggle checkbox">
  101. <input type="checkbox" name="removeProtection" onchange="toggleProtection(this);" autocomplete="false" checked="false">
  102. <label>Allow Edit User / Group Permission</label>
  103. </div>
  104. <br>
  105. <small>Removing User / Group permission to critical files might lead to system failure. Please make sure you know what you are doing.</small>
  106. </div>
  107. </div>
  108. <div class="ui divider"></div>
  109. <button class="ui right floated button" onclick="ao_module_close();">Cancel</button>
  110. <button class="ui green right floated button" onclick="update();">Update</button>
  111. <br> <br>
  112. </div>
  113. <div id="filesizeLoader" class="ui active dimmer">
  114. <div class="ui indeterminate text loader">Requesting File System</div>
  115. </div>
  116. <div id="success" class="ui basic modal">
  117. <div class="ui icon header">
  118. <i class="green checkmark icon"></i>
  119. Pernmission Updated
  120. </div>
  121. <div class="actions">
  122. <div class="ui ok inverted button">
  123. OK
  124. </div>
  125. </div>
  126. </div>
  127. <div id="failed" class="ui basic modal">
  128. <div class="ui icon header">
  129. <i class="red remove icon"></i>
  130. Pernmission Update Failed
  131. </div>
  132. <div class="content">
  133. <p id="errmsg"></p>
  134. </div>
  135. <div class="actions">
  136. <div class="ui ok inverted button">
  137. OK
  138. </div>
  139. </div>
  140. </div>
  141. <script>
  142. $(".ui.checkbox").checkbox();
  143. $('.ui.accordion').accordion();
  144. $(".ui.modal").modal();
  145. //Initiate the view model
  146. var files = ao_module_loadInputFiles();
  147. var fileProperties = [];
  148. var groupID = 0;
  149. for (var i =0; i < files.length; i++){
  150. getPermission(files[i]);
  151. }
  152. if (files.length == 1){
  153. var filename = files[0].split("/").pop();
  154. $("#filename").append(filename);
  155. }else{
  156. $("#filename").append(`<i class="file icon"></i>` + files.length + " files selected");
  157. }
  158. function getPermission(filepath){
  159. $.ajax({
  160. url: "../../system/file_system/handleFilePermission",
  161. data: {file: filepath},
  162. success: function(data){
  163. var permissionBites = [];
  164. var perChar = data.split("");
  165. //Shift out the group ID, currently useless
  166. groupID = perChar.shift();
  167. for (var i = 0; i < perChar.length; i++){
  168. //i: 0 - 2 => (7)55
  169. var permissionSettingBit = parseInt(perChar[i]).toString(2).padStart(3, "0").split("")
  170. for (var j = 0; j < permissionSettingBit.length; j++){
  171. //j: 0 - 2 => 111
  172. permissionBites.push(permissionSettingBit[j]);
  173. }
  174. }
  175. //Render the file permission
  176. console.log(data);
  177. //Assign the permission checkbox
  178. for (var i = 0; i < permissionBites.length; i++){
  179. if (permissionBites[i] == "1"){
  180. $("#" + (i + 1))[0].checked = true;
  181. }
  182. }
  183. $("#filesizeLoader").hide();
  184. }
  185. });
  186. }
  187. function toggleProtection(button){
  188. if (button.checked == true){
  189. $(".disabled.checkbox").removeClass("disabled");
  190. }else{
  191. for (var i = 1; i < 7; i++){
  192. $("#" + i).parent().addClass("disabled");
  193. }
  194. }
  195. }
  196. function resetCheckboxes(){
  197. for (var i = 1; i < 10; i++){
  198. $("#" + i)[0].checked = false;
  199. }
  200. }
  201. function update(){
  202. var newPermission = generatePermissionString();
  203. files.forEach(filepath => {
  204. $.ajax({
  205. url: "../../system/file_system/handleFilePermission",
  206. data: {file: filepath, mode: newPermission},
  207. success: function(data){
  208. if (data.error !== undefined){
  209. $("#failed").modal("show");
  210. $("#errmsg").text(data.error);
  211. }else{
  212. $("#success").modal("show");
  213. }
  214. console.log(data);
  215. }
  216. });
  217. })
  218. }
  219. function generatePermissionString(){
  220. var binary = [];
  221. for (var i = 1; i < 10; i++){
  222. if ($("#" + i)[0].checked == true){
  223. binary.push(1);
  224. }else{
  225. binary.push(0);
  226. }
  227. }
  228. //Convert the binary into hex
  229. var octalRepresentation = parseInt(binary.join(""), 2).toString(8);
  230. return groupID + octalRepresentation;
  231. }
  232. </script>
  233. </body>
  234. </html>