| skipped 8 lines |
9 | 9 | | from table import LogEntry, UpdateTableEDT |
10 | 10 | | from helpers.http import IHttpRequestResponseImplementation |
11 | 11 | | |
12 | | - | import csv, base64, sys |
| 12 | + | import csv, base64, json, re, sys |
13 | 13 | | |
14 | 14 | | # This code is necessary to maximize the csv field limit for the save and |
15 | 15 | | # restore functionality |
| skipped 10 lines |
26 | 26 | | class SaveRestore(): |
27 | 27 | | def __init__(self, extender): |
28 | 28 | | self._extender = extender |
| 29 | + | self._checkBoxes = [ |
| 30 | + | "autoScroll", |
| 31 | + | "ignore304", |
| 32 | + | "prevent304", |
| 33 | + | "interceptRequestsfromRepeater", |
| 34 | + | "doUnauthorizedRequest", |
| 35 | + | "replaceQueryParam", |
| 36 | + | "showAuthBypassModified", |
| 37 | + | "showAuthPotentiallyEnforcedModified", |
| 38 | + | "showAuthEnforcedModified", |
| 39 | + | "showAuthBypassUnauthenticated", |
| 40 | + | "showAuthPotentiallyEnforcedUnauthenticated", |
| 41 | + | "showAuthEnforcedUnauthenticated", |
| 42 | + | "showDisabledUnauthenticated" |
| 43 | + | ] |
29 | 44 | | |
30 | 45 | | def saveState(self): |
31 | 46 | | parentFrame = JFrame() |
| skipped 5 lines |
37 | 52 | | exportFile = fileChooser.getSelectedFile() |
38 | 53 | | with open(exportFile.getAbsolutePath(), 'wb') as csvfile: |
39 | 54 | | csvwriter = csv.writer(csvfile, delimiter='\t', quotechar='|', quoting=csv.QUOTE_MINIMAL) |
| 55 | + | |
| 56 | + | # Configuration |
| 57 | + | tempRow = ["ReplaceString", base64.b64encode(self._extender.replaceString.getText())] |
| 58 | + | csvwriter.writerow(tempRow) |
| 59 | + | |
| 60 | + | for EDFilter in self._extender.EDModel.toArray(): |
| 61 | + | tempRow = ["EDFilter", base64.b64encode(EDFilter)] |
| 62 | + | csvwriter.writerow(tempRow) |
| 63 | + | |
| 64 | + | for EDFilterUnauth in self._extender.EDModelUnauth.toArray(): |
| 65 | + | tempRow = ["EDFilterUnauth", base64.b64encode(EDFilterUnauth)] |
| 66 | + | csvwriter.writerow(tempRow) |
| 67 | + | |
| 68 | + | for IFFilter in self._extender.IFModel.toArray(): |
| 69 | + | tempRow = ["IFFilter", base64.b64encode(IFFilter)] |
| 70 | + | csvwriter.writerow(tempRow) |
| 71 | + | |
| 72 | + | for t in ["AndOrType", "AndOrTypeUnauth"]: |
| 73 | + | tempRow = [t, getattr(self._extender, t).getSelectedItem()] |
| 74 | + | csvwriter.writerow(tempRow) |
| 75 | + | |
| 76 | + | for key in self._extender.badProgrammerMRModel: |
| 77 | + | d = dict(self._extender.badProgrammerMRModel[key]) |
| 78 | + | d["regexMatch"] = d["regexMatch"] is not None |
| 79 | + | tempRow = ["MatchReplace", base64.b64encode(json.dumps(d))] |
| 80 | + | csvwriter.writerow(tempRow) |
| 81 | + | |
| 82 | + | d = dict((c, getattr(self._extender, c).isSelected()) for c in self._checkBoxes) |
| 83 | + | tempRow = ["CheckBoxes", json.dumps(d)] |
| 84 | + | csvwriter.writerow(tempRow) |
| 85 | + | |
| 86 | + | isSelected = self._extender.exportPnl.getComponents()[-1].isSelected() |
| 87 | + | tempRow = ["RemoveDuplicates", json.dumps(isSelected)] |
| 88 | + | csvwriter.writerow(tempRow) |
| 89 | + | |
| 90 | + | # Request/response list |
40 | 91 | | for i in range(0,self._extender._log.size()): |
41 | 92 | | tempRequestResponseHost = self._extender._log.get(i)._requestResponse.getHttpService().getHost() |
42 | 93 | | tempRequestResponsePort = self._extender._log.get(i)._requestResponse.getHttpService().getPort() |
| skipped 5 lines |
48 | 99 | | tempOriginalRequestResponsePort = self._extender._log.get(i)._originalrequestResponse.getHttpService().getPort() |
49 | 100 | | tempOriginalRequestResponseProtocol = self._extender._log.get(i)._originalrequestResponse.getHttpService().getProtocol() |
50 | 101 | | tempOriginalRequestResponseRequest = base64.b64encode(self._extender._log.get(i)._originalrequestResponse.getRequest()) |
51 | | - | tempOriginalRequestResponseResponse = base64.b64encode(self._extender._log.get(i)._originalrequestResponse.getResponse()) |
| 102 | + | tempOriginalRequestResponseResponse = base64.b64encode(self._extender._log.get(i)._originalrequestResponse.getResponse()) |
52 | 103 | | |
53 | 104 | | if self._extender._log.get(i)._unauthorizedRequestResponse is not None: |
54 | 105 | | tempUnauthorizedRequestResponseHost = self._extender._log.get(i)._unauthorizedRequestResponse.getHttpService().getHost() |
| skipped 9 lines |
64 | 115 | | tempUnauthorizedRequestResponseResponse = None |
65 | 116 | | |
66 | 117 | | tempEnforcementStatus = self._extender._log.get(i)._enfocementStatus |
67 | | - | tempEnforcementStatusUnauthorized = self._extender._log.get(i)._enfocementStatusUnauthorized |
| 118 | + | tempEnforcementStatusUnauthorized = self._extender._log.get(i)._enfocementStatusUnauthorized |
68 | 119 | | |
69 | 120 | | tempRow = [tempRequestResponseHost,tempRequestResponsePort,tempRequestResponseProtocol,tempRequestResponseRequest,tempRequestResponseResponse] |
70 | 121 | | tempRow.extend([tempOriginalRequestResponseHost,tempOriginalRequestResponsePort,tempOriginalRequestResponseProtocol,tempOriginalRequestResponseRequest,tempOriginalRequestResponseResponse]) |
| skipped 6 lines |
77 | 128 | | parentFrame = JFrame() |
78 | 129 | | fileChooser = JFileChooser() |
79 | 130 | | fileChooser.setDialogTitle("State import file") |
80 | | - | userSelection = fileChooser.showDialog(parentFrame,"Restore") |
| 131 | + | userSelection = fileChooser.showDialog(parentFrame, "Restore") |
| 132 | + | modelMap = { |
| 133 | + | "IFFilter": self._extender.IFModel, |
| 134 | + | "EDFilter": self._extender.EDModel, |
| 135 | + | "EDFilterUnauth": self._extender.EDModelUnauth |
| 136 | + | } |
81 | 137 | | |
82 | 138 | | if userSelection == JFileChooser.APPROVE_OPTION: |
83 | 139 | | importFile = fileChooser.getSelectedFile() |
| skipped 3 lines |
87 | 143 | | csvreader = csv.reader(csvfile, delimiter='\t', quotechar='|') |
88 | 144 | | |
89 | 145 | | for row in csvreader: |
| 146 | + | # Configuration |
| 147 | + | if row[0] == "ReplaceString": |
| 148 | + | self._extender.replaceString.setText(base64.b64decode(row[1])) |
| 149 | + | continue |
90 | 150 | | |
| 151 | + | if row[0] in modelMap: |
| 152 | + | f = base64.b64decode(row[1]) |
| 153 | + | if f not in modelMap[row[0]].toArray(): |
| 154 | + | modelMap[row[0]].addElement(f) |
| 155 | + | continue |
| 156 | + | |
| 157 | + | if row[0] in {"AndOrType", "AndOrTypeUnauth"}: |
| 158 | + | getattr(self._extender, row[0]).setSelectedItem(row[1]) |
| 159 | + | continue |
| 160 | + | |
| 161 | + | if row[0] == "MatchReplace": |
| 162 | + | d = json.loads(base64.b64decode(row[1])) |
| 163 | + | key = d["type"] + " " + d["match"] + "->" + d["replace"] |
| 164 | + | if key in self._extender.badProgrammerMRModel: |
| 165 | + | continue |
| 166 | + | regexMatch = None |
| 167 | + | if d["regexMatch"]: |
| 168 | + | try: |
| 169 | + | d["regexMatch"] = re.compile(d["match"]) |
| 170 | + | except re.error: |
| 171 | + | print("ERROR: Regex to restore is invalid:", d["match"]) |
| 172 | + | continue |
| 173 | + | self._extender.badProgrammerMRModel[key] = d |
| 174 | + | self._extender.MRModel.addElement(key) |
| 175 | + | continue |
| 176 | + | |
| 177 | + | if row[0] == "CheckBoxes": |
| 178 | + | d = json.loads(row[1]) |
| 179 | + | for k in d: |
| 180 | + | getattr(self._extender, k).setSelected(d[k]) |
| 181 | + | continue |
| 182 | + | |
| 183 | + | if row[0] == "RemoveDuplicates": |
| 184 | + | isSelected = json.loads(row[1]) |
| 185 | + | try: |
| 186 | + | self._extender.exportPnl.getComponents()[-1].setSelected(isSelected) |
| 187 | + | except TypeError: # suppress TypeError: None required for void return |
| 188 | + | pass |
| 189 | + | continue |
| 190 | + | |
| 191 | + | # Request/response list |
91 | 192 | | tempRequestResponseHost = row[0] |
92 | 193 | | tempRequestResponsePort = row[1] |
93 | 194 | | tempRequestResponseProtocol = row[2] |
| skipped 7 lines |
101 | 202 | | tempOriginalRequestResponsePort = row[6] |
102 | 203 | | tempOriginalRequestResponseProtocol = row[7] |
103 | 204 | | tempOriginalRequestResponseRequest = base64.b64decode(row[8]) |
104 | | - | tempOriginalRequestResponseResponse = base64.b64decode(row[9]) |
| 205 | + | tempOriginalRequestResponseResponse = base64.b64decode(row[9]) |
105 | 206 | | |
106 | 207 | | tempOriginalRequestResponseHttpService = self._extender._helpers.buildHttpService(tempOriginalRequestResponseHost,int(tempOriginalRequestResponsePort),tempOriginalRequestResponseProtocol) |
107 | 208 | | tempOriginalRequestResponse = IHttpRequestResponseImplementation(tempOriginalRequestResponseHttpService,tempOriginalRequestResponseRequest,tempOriginalRequestResponseResponse) |
| skipped 12 lines |
120 | 221 | | tempUnauthorizedRequestResponse = None |
121 | 222 | | |
122 | 223 | | tempEnforcementStatus = row[15] |
123 | | - | tempEnforcementStatusUnauthorized = row[16] |
| 224 | + | tempEnforcementStatusUnauthorized = row[16] |
124 | 225 | | |
125 | 226 | | self._extender._lock.acquire() |
126 | 227 | | |
| skipped 33 lines |
160 | 261 | | self._extender.lastAuthorizationHeader = authorizationHeader |
161 | 262 | | self._extender.fetchAuthorizationHeaderButton.setEnabled(True) |
162 | 263 | | |
163 | | - | |