hostAccessEditor.html 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <!-- Notes: This should be open in its original path-->
  5. <meta charset="utf-8">
  6. <meta name="zoraxy.csrf.Token" content="{{.csrfToken}}">
  7. <link rel="stylesheet" href="../script/semantic/semantic.min.css">
  8. <script src="../script/jquery-3.6.0.min.js"></script>
  9. <script src="../script/semantic/semantic.min.js"></script>
  10. <script src="../script/utils.js"></script>
  11. <style>
  12. .accessRule{
  13. cursor: pointer;
  14. border-radius: 0.4em !important;
  15. border: 1px solid rgb(233, 233, 233) !important;
  16. }
  17. .accessRule:hover{
  18. background-color: rgb(241, 241, 241) !important;
  19. }
  20. .accessRule.active{
  21. background-color: rgb(241, 241, 241) !important;
  22. }
  23. .accessRule .selected{
  24. position: absolute;
  25. top: 1em;
  26. right: 0.6em;
  27. }
  28. .accessRule:not(.active) .selected{
  29. display:none;
  30. }
  31. #accessRuleList{
  32. padding: 0.6em;
  33. border: 1px solid rgb(228, 228, 228);
  34. border-radius: 0.4em !important;
  35. max-height: calc(100vh - 15em);
  36. min-height: 300px;
  37. overflow-y: auto;
  38. }
  39. body.darkTheme #accessRuleList{
  40. border: 1px solid rgb(50, 50, 50) !important;
  41. }
  42. body.darkTheme .ui.segment.accessRule {
  43. border: 1px solid var(--theme_bg_secondary) !important;
  44. }
  45. body.darkTheme .ui.segment.accessRule:hover {
  46. background-color: var(--theme_bg_secondary) !important;
  47. }
  48. body.darkTheme .ui.segment.accessRule.active {
  49. background-color: var(--theme_bg_secondary) !important;
  50. }
  51. </style>
  52. </head>
  53. <body>
  54. <link rel="stylesheet" href="../darktheme.css">
  55. <script src="../script/darktheme.js"></script>
  56. <br>
  57. <div class="ui container">
  58. <div class="ui header">
  59. <div class="content">
  60. Host Access Settings
  61. <div class="sub header" id="epname"></div>
  62. </div>
  63. </div>
  64. <div class="ui divider"></div>
  65. <p>Select an access rule to apply blacklist / whitelist filtering</p>
  66. <div id="accessRuleList">
  67. <div class="ui segment accessRule">
  68. <div class="ui header">
  69. <i class="filter icon"></i>
  70. <div class="content">
  71. Account Settings
  72. <div class="sub header">Manage your preferences</div>
  73. </div>
  74. </div>
  75. </div>
  76. </div>
  77. <br>
  78. <button class="ui basic button" onclick="applyChangeAndClose()"><i class="ui green check icon"></i> Apply Change</button>
  79. <button class="ui basic button" style="float: right;" onclick="parent.hideSideWrapper();"><i class="remove icon"></i> Close</button>
  80. <br><br><br>
  81. </div>
  82. <script>
  83. let editingEndpoint = {};
  84. if (window.location.hash.length > 1){
  85. let payloadHash = window.location.hash.substr(1);
  86. try{
  87. payloadHash = JSON.parse(decodeURIComponent(payloadHash));
  88. $("#epname").text(payloadHash.ep);
  89. editingEndpoint = payloadHash;
  90. }catch(ex){
  91. console.log("Unable to load endpoint data from hash")
  92. }
  93. }
  94. function initAccessRuleList(callback = undefined){
  95. $("#accessRuleList").html("<small>Loading</small>");
  96. $.get("/api/access/list", function(data){
  97. if (data.error == undefined){
  98. $("#accessRuleList").html("");
  99. data.forEach(function(rule){
  100. let icon = `<i class="ui grey filter icon"></i>`;
  101. if (rule.ID == "default"){
  102. icon = `<i class="ui yellow star icon"></i>`;
  103. }else if (rule.BlacklistEnabled && !rule.WhitelistEnabled){
  104. //This is a blacklist filter
  105. icon = `<i class="ui red filter icon"></i>`;
  106. }else if (rule.WhitelistEnabled && !rule.BlacklistEnabled){
  107. //This is a whitelist filter
  108. icon = `<i class="ui green filter icon"></i>`;
  109. }else if (rule.WhitelistEnabled && rule.BlacklistEnabled){
  110. //Whitelist and blacklist filter
  111. icon = `<i class="ui yellow filter icon"></i>`;
  112. }
  113. $("#accessRuleList").append(`<div class="ui basic segment accessRule" ruleid="${rule.ID}" onclick="selectThisRule(this);">
  114. <h5 class="ui header">
  115. ${icon}
  116. <div class="content">
  117. ${rule.Name}
  118. <div class="sub header">${rule.ID}</div>
  119. </div>
  120. </h5>
  121. <p>${rule.Desc}</p>
  122. ${rule.BlacklistEnabled?`<small><i class="ui red filter icon"></i> Blacklist Enabled</small>`:""}
  123. ${rule.WhitelistEnabled?`<small><i class="ui green filter icon"></i> Whitelist Enabled</small>`:""}
  124. <div class="selected"><i class="ui large green check icon"></i></div>
  125. </div>`);
  126. });
  127. accessRuleList = data;
  128. $(".dropdown").dropdown();
  129. if (callback != undefined){
  130. callback();
  131. }
  132. }
  133. });
  134. }
  135. initAccessRuleList(function(){
  136. $.cjax({
  137. url: "/api/proxy/detail",
  138. method: "POST",
  139. data: {"type":"host", "epname": editingEndpoint.ep },
  140. success: function(data){
  141. console.log(data);
  142. if (data.error != undefined){
  143. alert(data.error);
  144. }else{
  145. let currentAccessFilter = data.AccessFilterUUID;
  146. if (currentAccessFilter == ""){
  147. //Use default
  148. currentAccessFilter = "default";
  149. }
  150. $(`.accessRule[ruleid=${currentAccessFilter}]`).addClass("active");
  151. }
  152. }
  153. })
  154. });
  155. function selectThisRule(accessRuleObject){
  156. let accessRuleID = $(accessRuleObject).attr("ruleid");
  157. $(".accessRule").removeClass('active');
  158. $(accessRuleObject).addClass('active');
  159. }
  160. function applyChangeAndClose(){
  161. let newAccessRuleID = $(".accessRule.active").attr("ruleid");
  162. let targetEndpoint = editingEndpoint.ep;
  163. $.cjax({
  164. url: "/api/access/attach",
  165. method: "POST",
  166. data: {
  167. id: newAccessRuleID,
  168. host: targetEndpoint
  169. },
  170. success: function(data){
  171. if (data.error != undefined){
  172. parent.msgbox(data.error, false);
  173. }else{
  174. parent.msgbox("Access Rule Updated");
  175. //Modify the parent list if exists
  176. if (parent != undefined && parent.updateAccessRuleNameUnderHost){
  177. parent.updateAccessRuleNameUnderHost(targetEndpoint, newAccessRuleID);
  178. }
  179. parent.hideSideWrapper();
  180. }
  181. }
  182. })
  183. }
  184. </script>
  185. </body>
  186. </html>