def actionPerformed(self, event): option = event.getActionCommand() if option == 'Close': self.dispose() elif option == 'SCI': chooser = JFileChooser() returnVal = chooser.showSaveDialog(self) if returnVal == JFileChooser.APPROVE_OPTION: fileName = chooser.getSelectedFile().getPath() f = open(fileName, 'w') f.write("\t".join([ "Het", "Fst", "0.5(1-pval)quantile", "median", "0.5(1+pval)quantile" ]) + "\n") for line in self.confLines: f.write('\t'.join(map(lambda x: str(x), line)) + "\n") f.close() elif option == 'SLL': chooser = JFileChooser() returnVal = chooser.showSaveDialog(self) if returnVal == JFileChooser.APPROVE_OPTION: fileName = chooser.getSelectedFile().getPath() f = open(fileName, 'w') f.write("\t".join( ["Locus", "Het", "Fst", "P(Simul Fst<sample Fst)"]) + "\n") for i in range(self.data.size()): line = self.data.elementAt(i) lineList = [str(line.elementAt(0))] lineList.append(str(line.elementAt(1))) lineList.append(str(line.elementAt(2))) lineList.append(str(line.elementAt(3))) f.write("\t".join(lineList) + "\n") f.close()
def actionPerformed(self, event): option = event.getActionCommand() if option == 'Close': self.dispose() elif option == 'SCI': chooser = JFileChooser() returnVal = chooser.showSaveDialog(self) if returnVal == JFileChooser.APPROVE_OPTION: fileName = chooser.getSelectedFile().getPath() f = open(fileName, 'w') f.write("\t".join(["Het", "Fst", "0.5(1-pval)quantile", "median", "0.5(1+pval)quantile"]) + "\n") for line in self.confLines: f.write('\t'.join(map(lambda x: str(x), line)) + "\n") f.close() elif option == 'SLL': chooser = JFileChooser() returnVal = chooser.showSaveDialog(self) if returnVal == JFileChooser.APPROVE_OPTION: fileName = chooser.getSelectedFile().getPath() f = open(fileName, 'w') f.write("\t".join(["Locus", "Het", "Fst", "P(Simul Fst<sample Fst)"]) + "\n") for i in range(self.data.size()): line = self.data.elementAt(i) lineList = [str(line.elementAt(0))] lineList.append(str(line.elementAt(1))) lineList.append(str(line.elementAt(2))) lineList.append(str(line.elementAt(3))) f.write("\t".join(lineList) + "\n") f.close()
def exportToCSV(self): parentFrame = JFrame() fileChooser = JFileChooser() fileChooser.setSelectedFile(File("AutorizeReport.csv")) fileChooser.setDialogTitle("Save Autorize Report") userSelection = fileChooser.showSaveDialog(parentFrame) if userSelection == JFileChooser.APPROVE_OPTION: fileToSave = fileChooser.getSelectedFile() enforcementStatusFilter = self.exportES.getSelectedItem() csvContent = "id\tMethod\tURL\tOriginal length\tModified length\tUnauthorized length\tAuthorization Enforcement Status\tAuthorization Unauthenticated Status\n" for i in range(0,self._log.size()): if enforcementStatusFilter == "All Statuses": csvContent += "%d\t%s\t%s\t%d\t%d\t%d\t%s\t%s\n" % (self._log.get(i)._id, self._log.get(i)._method, self._log.get(i)._url, len(self._log.get(i)._originalrequestResponse.getResponse()) if self._log.get(i)._originalrequestResponse is not None else 0, len(self._log.get(i)._requestResponse.getResponse()) if self._log.get(i)._requestResponse is not None else 0, len(self._log.get(i)._unauthorizedRequestResponse.getResponse()) if self._log.get(i)._unauthorizedRequestResponse is not None else 0, self._log.get(i)._enfocementStatus, self._log.get(i)._enfocementStatusUnauthorized) elif enforcementStatusFilter == "As table filter": if ((self._extender.showAuthBypassModified.isSelected() and self.BYPASSSED_STR == self._log.get(i)._enfocementStatus) or (self._extender.showAuthPotentiallyEnforcedModified.isSelected() and "Is enforced???" == self._log.get(i)._enfocementStatus) or (self._extender.showAuthEnforcedModified.isSelected() and self.ENFORCED_STR == self._log.get(i)._enfocementStatus) or (self._extender.showAuthBypassUnauthenticated.isSelected() and self.BYPASSSED_STR == self._log.get(i)._enfocementStatusUnauthorized) or (self._extender.showAuthPotentiallyEnforcedUnauthenticated.isSelected() and "Is enforced???" == self._log.get(i)._enfocementStatusUnauthorized) or (self._extender.showAuthEnforcedUnauthenticated.isSelected() and self.ENFORCED_STR == self._log.get(i)._enfocementStatusUnauthorized) or (self._extender.showDisabledUnauthenticated.isSelected() and "Disabled" == self._log.get(i)._enfocementStatusUnauthorized)): csvContent += "%d\t%s\t%s\t%d\t%d\t%d\t%s\t%s\n" % (self._log.get(i)._id, self._log.get(i)._method, self._log.get(i)._url, len(self._log.get(i)._originalrequestResponse.getResponse()) if self._log.get(i)._originalrequestResponse is not None else 0, len(self._log.get(i)._requestResponse.getResponse()) if self._log.get(i)._requestResponse is not None else 0, len(self._log.get(i)._unauthorizedRequestResponse.getResponse()) if self._log.get(i)._unauthorizedRequestResponse is not None else 0, self._log.get(i)._enfocementStatus, self._log.get(i)._enfocementStatusUnauthorized) else: if (enforcementStatusFilter == self._log.get(i)._enfocementStatus) or (enforcementStatusFilter == self._log.get(i)._enfocementStatusUnauthorized): csvContent += "%d\t%s\t%s\t%d\t%d\t%d\t%s\t%s\n" % (self._log.get(i)._id, self._log.get(i)._method, self._log.get(i)._url, len(self._log.get(i)._originalrequestResponse.getResponse()) if self._log.get(i)._originalrequestResponse is not None else 0, len(self._log.get(i)._requestResponse.getResponse()) if self._log.get(i)._requestResponse is not None else 0, len(self._log.get(i)._unauthorizedRequestResponse.getResponse()) if self._log.get(i)._unauthorizedRequestResponse is not None else 0, self._log.get(i)._enfocementStatus, self._log.get(i)._enfocementStatusUnauthorized) f = open(fileToSave.getAbsolutePath(), 'w') f.writelines(csvContent) f.close()
def _show_directory_dialog(): filechooser = JFileChooser("") filechooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY) selected = filechooser.showSaveDialog(None) if selected == JFileChooser.APPROVE_OPTION: file = filechooser.getSelectedFile() return file.getAbsolutePath()
def gcodeBottom(event): fc = JFileChooser() fc.setCurrentDirectory( File(boardcad.gui.jdk.BoardCAD.getInstance().defaultDirectory)) returnVal = fc.showSaveDialog( boardcad.gui.jdk.BoardCAD.getInstance().getFrame()) if (returnVal != JFileChooser.APPROVE_OPTION): return mfile = fc.getSelectedFile() filename = mfile.getPath() if (filename == None): return boardcad.gui.jdk.BoardCAD.getInstance().defaultDirectory = mfile.getPath() boardcam.BoardMachine.bottomFileName = filename boardcam.BoardMachine.read_machine_data() filename = boardcam.BoardMachine.bottomScript myconsole.insertText("execfile('" + filename + "')") myconsole.enter() board_draw = boardcad.gui.jdk.BoardCAD.getInstance().getBoardHandler( ).board_draw board_draw.bottom_cut = boardcam.BoardMachine.bottom_cut board_draw.nr_of_cuts_bottom = boardcam.BoardMachine.nr_of_cuts_bottom board_draw.bottom_collision = boardcam.BoardMachine.bottom_collision
def promptSaveDocumentAs(world, component, handleSaveDocumentAsFn, existingFilename=None): filename = None bFinished = False while not bFinished: saveDialog = JFileChooser() saveDialog.setFileFilter( FileNameExtensionFilter( 'Larch project (*.larch)', [ 'larch' ] ) ) response = saveDialog.showSaveDialog( component ) if response == JFileChooser.APPROVE_OPTION: sf = saveDialog.getSelectedFile() if sf is not None: if sf.exists(): response = JOptionPane.showOptionDialog( component, 'File already exists. Overwrite?', 'File already exists', JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, None, [ 'Overwrite', 'Cancel' ], 'Cancel' ) if response == JFileChooser.APPROVE_OPTION: filename = sf.getPath() bFinished = True else: bFinished = False else: filename = sf.getPath() bFinished = True else: bFinished = True else: bFinished = True if filename is not None: handleSaveDocumentAsFn( filename ) return True else: return False
def actionPerformed(self, e): file_chooser = JFileChooser() is_load_file = str(e.getActionCommand()) == "load" is_save_file = str(e.getActionCommand()) == "save" if is_load_file: file_chooser.setDialogTitle("Load JSON File") file_chooser.setDialogType(JFileChooser.OPEN_DIALOG) open_dialog = file_chooser.showOpenDialog(self.file_button) is_approve = open_dialog == JFileChooser.APPROVE_OPTION if is_approve: load_file = file_chooser.getSelectedFile() file_name = str(load_file) self.load_data(file_name) else: print("JSON file load cancelled") if is_save_file: file_chooser.setDialogTitle("Save JSON File") file_chooser.setDialogType(JFileChooser.SAVE_DIALOG) save_dialog = file_chooser.showSaveDialog(self.file_button) is_approve = save_dialog == JFileChooser.APPROVE_OPTION if is_approve: save_file = str(file_chooser.getSelectedFile()) self.save_data(save_file) else: print("JSON file save cancelled")
def saveFile(self, event=None): ''' If file being edited has a path, then overwrite with latest changes. If file was created from scratch and has no path, prompt JFileChooser to save in desired location. Also checks for project name, and if found, makes it default. ''' atfText = self.atfAreaController.getAtfAreaText() if not self.currentFilename: fileChooser = JFileChooser(os.getcwd()) status = fileChooser.showSaveDialog(self.view) if status == JFileChooser.APPROVE_OPTION: atfFile = fileChooser.getSelectedFile() filename = atfFile.getCanonicalPath() basename = atfFile.getName() self.currentFilename = filename self.view.setTitle(basename) else: return try: self.writeTextFile(self.currentFilename, atfText) except: self.logger.error("There was an error trying to save %s.", self.currentFilename) else: self.logger.info("File %s successfully saved.", self.currentFilename) # Find project and add to setting.yaml as default project = self.get_project() if project: if self.config['projects']['default'] != project: self.config['projects']['default'] = [project] save_yaml_config(self.config)
def save_pdf(self, event): from com.itextpdf.text.pdf import PdfWriter from com.itextpdf.text import Document fileChooser = JFileChooser() fileChooser.setSelectedFile(java.io.File('%s.pdf' % self.view.network.name)) if fileChooser.showSaveDialog(self) == JFileChooser.APPROVE_OPTION: f = fileChooser.getSelectedFile() doc = Document() writer = PdfWriter.getInstance(doc, java.io.FileOutputStream(f)) doc.open() cb = writer.getDirectContent() w = self.view.area.size.width h = self.view.area.size.height pw = 550 ph = 800 tp = cb.createTemplate(pw, ph) g2 = tp.createGraphicsShapes(pw, ph) at = java.awt.geom.AffineTransform() s = min(float(pw) / w, float(ph) / h) at.scale(s, s) g2.transform(at) self.view.area.pdftemplate = tp, s self.view.area.paint(g2) self.view.area.pdftemplate = None g2.dispose() cb.addTemplate(tp, 20, 0) doc.close()
def writeConfigDialog(self, e): """Open a file dialog to save configuration""" fileChooser = JFileChooser(os.getcwd()) retval = fileChooser.showSaveDialog(None) if retval == JFileChooser.APPROVE_OPTION: f = fileChooser.getSelectedFile() self.writeConfig(f.getPath())
def exportToHTML(self, event): parentFrame = JFrame() fileChooser = JFileChooser() fileChooser.setSelectedFile(File("AutorizeReprort.html")); fileChooser.setDialogTitle("Save Autorize Report") userSelection = fileChooser.showSaveDialog(parentFrame) if userSelection == JFileChooser.APPROVE_OPTION: fileToSave = fileChooser.getSelectedFile() enforcementStatusFilter = self.exportES.getSelectedItem() htmlContent = """<html><title>Autorize Report by Barak Tawily</title> <style> .datagrid table { border-collapse: collapse; text-align: left; width: 100%; } .datagrid {font: normal 12px/150% Arial, Helvetica, sans-serif; background: #fff; overflow: hidden; border: 1px solid #006699; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } .datagrid table td, .datagrid table th { padding: 3px 10px; } .datagrid table thead th {background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #006699), color-stop(1, #00557F) );background:-moz-linear-gradient( center top, #006699 5%, #00557F 100% );filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#006699', endColorstr='#00557F');background-color:#006699; color:#FFFFFF; font-size: 15px; font-weight: bold; border-left: 1px solid #0070A8; } .datagrid table thead th:first-child { border: none; }.datagrid table tbody td { color: #00496B; border-left: 1px solid #E1EEF4;font-size: 12px;font-weight: normal; }.datagrid table tbody .alt td { background: #E1EEF4; color: #00496B; }.datagrid table tbody td:first-child { border-left: none; }.datagrid table tbody tr:last-child td { border-bottom: none; }.datagrid table tfoot td div { border-top: 1px solid #006699;background: #E1EEF4;} .datagrid table tfoot td { padding: 0; font-size: 12px } .datagrid table tfoot td div{ padding: 2px; }.datagrid table tfoot td ul { margin: 0; padding:0; list-style: none; text-align: right; }.datagrid table tfoot li { display: inline; }.datagrid table tfoot li a { text-decoration: none; display: inline-block; padding: 2px 8px; margin: 1px;color: #FFFFFF;border: 1px solid #006699;-webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #006699), color-stop(1, #00557F) );background:-moz-linear-gradient( center top, #006699 5%, #00557F 100% );filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#006699', endColorstr='#00557F');background-color:#006699; }.datagrid table tfoot ul.active, .datagrid table tfoot ul a:hover { text-decoration: none;border-color: #006699; color: #FFFFFF; background: none; background-color:#00557F;}div.dhtmlx_window_active, div.dhx_modal_cover_dv { position: fixed !important; } table { width: 100%; table-layout: fixed; } td { border: 1px solid #35f; overflow: hidden; text-overflow: ellipsis; } td.a { width: 13%; white-space: nowrap; } td.b { width: 9%; word-wrap: break-word; } </style> <body> <h1>Autorize Report<h1> <div class="datagrid"><table> <thead><tr><th>URL</th><th>Authorization Enforcement Status</th></tr></thead> <tbody>""" for i in range(0,self._log.size()): color = "" if self._log.get(i)._enfocementStatus == self._enfocementStatuses[0]: color = "red" if self._log.get(i)._enfocementStatus == self._enfocementStatuses[1]: color = "yellow" if self._log.get(i)._enfocementStatus == self._enfocementStatuses[2]: color = "LawnGreen" if enforcementStatusFilter == "All Statuses": htmlContent += "<tr bgcolor=\"%s\"><td><a href=\"%s\">%s</a></td><td>%s</td></tr>" % (color,self._log.get(i)._url,self._log.get(i)._url, self._log.get(i)._enfocementStatus) else: if enforcementStatusFilter == self._log.get(i)._enfocementStatus: htmlContent += "<tr bgcolor=\"%s\"><td><a href=\"%s\">%s</a></td><td>%s</td></tr>" % (color,self._log.get(i)._url,self._log.get(i)._url, self._log.get(i)._enfocementStatus) htmlContent += "</tbody></table></div></body></html>" f = open(fileToSave.getAbsolutePath(), 'w') f.writelines(htmlContent) f.close()
class FileManager(object): def __init__(self, pywin): self.fc = JFileChooser() self.fc.fileFilter = FileNameExtensionFilter("Python Files", ["py"]) self.pywin = pywin self.load_path = None self.script_path = None @property def script_area(self): return self.pywin.script_pane.script_area def show_open_dialog(self, title): self.fc.dialogTitle = title res = self.fc.showOpenDialog(self.pywin.frame) if res == JFileChooser.APPROVE_OPTION: return self.fc.selectedFile def show_save_dialog(self, title): self.fc.dialogTitle = title res = self.fc.showSaveDialog(self.pywin.frame) if res == JFileChooser.APPROVE_OPTION: return self.fc.selectedFile def save_script(self): if self.script_path is None: return with codecs.open(self.script_path, "wb", "utf-8") as stream: stream.write(self.script_area.input) def open_script(self): f = self.show_open_dialog("Select script file to open") if f is None: return self.script_path = f.absolutePath with codecs.open(self.script_path, "rb", "utf-8") as stream: self.script_area.input = stream.read() def save_script_as(self): f = self.show_save_dialog("Select file to write script to") if f is None: return self.script_path = f.absolutePath self.save_script() def load_script(self): f = self.show_open_dialog("Select script file to load") if f is None: return self.load_path = f.absolutePath self.reload_script() def reload_script(self): print "*** Loading", self.load_path, "***" try: self.pywin.execfile(self.load_path) except Exception, e: self.pywin.outputpane.addtext(str(e) + '\n', 'error')
def _buildProjectJar(element, document): component = element.getRootElement().getComponent() larchJarURL = app_in_jar.getLarchJarURL() chosenJarURL = None if larchJarURL is None: openDialog = JFileChooser() openDialog.setFileFilter( FileNameExtensionFilter('Larch executable JAR (*.jar)', ['jar'])) response = openDialog.showDialog(component, 'Choose Larch JAR') if response == JFileChooser.APPROVE_OPTION: sf = openDialog.getSelectedFile() if sf is not None: chosenJarURL = sf.toURI().toURL() else: return jarFile = None bFinished = False while not bFinished: saveDialog = JFileChooser() saveDialog.setFileFilter( FileNameExtensionFilter('JAR file (*.jar)', ['jar'])) response = saveDialog.showSaveDialog(component) if response == JFileChooser.APPROVE_OPTION: sf = saveDialog.getSelectedFile() if sf is not None: if sf.exists(): response = JOptionPane.showOptionDialog( component, 'File already exists. Overwrite?', 'File already exists', JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, None, ['Overwrite', 'Cancel'], 'Cancel') if response == JFileChooser.APPROVE_OPTION: jarFile = sf bFinished = True else: bFinished = False else: jarFile = sf bFinished = True else: bFinished = True else: bFinished = True if jarFile is not None: outStream = FileOutputStream(jarFile) documentBytes = document.writeAsBytes() nameBytesPairs = [('app.larch', documentBytes)] app_in_jar.buildLarchJar(outStream, nameBytesPairs, larchJarURL=chosenJarURL) outStream.close()
def set_output_file(self, event=None): file_chooser = JFileChooser() choice = file_chooser.showSaveDialog(None) if choice == JFileChooser.APPROVE_OPTION: self.outputFileTextField.text = file_chooser.selectedFile.path self.output_file = open(file_chooser.selectedFile.path, 'a') self.script.stdout = self.output_file return True return False
def selectFile(self, event): ''' Action handler to select a file to save to ''' chooser = JFileChooser() retVal = chooser.showSaveDialog(None) #if reVal == JFileChooser.APPROVE_OPTION: self.saveFile = chooser.selectedFile.path
def actionPerformed(self, e): fc = JFileChooser() returnValue = fc.showSaveDialog(self.pi.mainWindow.frame) if returnValue == JFileChooser.APPROVE_OPTION: fileName = fc.selectedFile.absolutePath createIdcFile(fileName, self.module) MessageBox.showInformation(self.pi.mainWindow.frame, "Module information was successfully written to the selected IDC file. Please run the IDC file in IDA Pro now.")
def exportToCSV(self): parentFrame = JFrame() fileChooser = JFileChooser() fileChooser.setSelectedFile(File("AutorizeReprort.csv")) fileChooser.setDialogTitle("Save Autorize Report") userSelection = fileChooser.showSaveDialog(parentFrame) if userSelection == JFileChooser.APPROVE_OPTION: fileToSave = fileChooser.getSelectedFile() enforcementStatusFilter = self.exportES.getSelectedItem() csvContent = "id\tURL\tOriginal length\tModified length\tUnauthorized length\tAuthorization Enforcement Status\tAuthorization Unauthenticated Status\n" for i in range(0, self._log.size()): if enforcementStatusFilter == "All Statuses": csvContent += "%d\t%s\t%d\t%d\t%d\t%s\t%s\n" % ( self._log.get(i)._id, self._log.get(i)._url, len( self._log.get( i)._originalrequestResponse.getResponse()) if self._log.get(i)._originalrequestResponse != None else 0, len(self._log.get(i)._requestResponse.getResponse()) if self._log.get(i)._requestResponse != None else 0, len( self._log.get( i)._unauthorizedRequestResponse.getResponse()) if self._log.get(i)._unauthorizedRequestResponse != None else 0, self._log.get(i)._enfocementStatus, self._log.get(i)._enfocementStatusUnauthorized) else: if (enforcementStatusFilter == self._log.get(i)._enfocementStatus) or ( enforcementStatusFilter == self._log.get(i)._enfocementStatusUnauthorized): csvContent += "%d\t%s\t%d\t%d\t%d\t%s\t%s\n" % ( self._log.get(i)._id, self._log.get(i)._url, len( self._log.get( i)._originalrequestResponse.getResponse()) if self._log.get(i)._originalrequestResponse != None else 0, len(self._log.get(i)._requestResponse.getResponse()) if self._log.get(i)._requestResponse != None else 0, len( self._log.get(i)._unauthorizedRequestResponse. getResponse()) if self._log.get(i)._unauthorizedRequestResponse != None else 0, self._log.get(i)._enfocementStatus, self._log.get(i)._enfocementStatusUnauthorized) f = open(fileToSave.getAbsolutePath(), 'w') f.writelines(csvContent) f.close()
def saveResults(self, e): self._stdout.println("Saving results") fileChooser = JFileChooser() fileChooser.setDialogTitle("Specify the file name") userSelection = fileChooser.showSaveDialog(self.getUiComponent()) if userSelection == JFileChooser.APPROVE_OPTION: f = fileChooser.getSelectedFile() fileout = open(f, 'w') for domain in self.domain_list: self._stdout.println("writing ") fileout.write("I AM FILE") fileout.close()
def toFileButtonAction(self, event): fileChooser = JFileChooser() fileChooser.dialogTitle = 'Save Payloads' fileChooser.fileSelectionMode = JFileChooser.FILES_ONLY if (fileChooser.showSaveDialog( self.mainPanel) == JFileChooser.APPROVE_OPTION): file = fileChooser.getSelectedFile() self.extender.generatePayloads() result = '\n'.join(self.extender.tamperedPayloads) with open(file.getAbsolutePath(), 'w') as writer: writer.writelines(result.encode('utf-8')) self.showMessage('{} url encoded payload written to file'.format( len(self.extender.tamperedPayloads)))
def saveToFile(self, event): fileChooser = JFileChooser() if not (self.targetURL is None): fileChooser.setSelectedFile(File("Burp_SSL_Scanner_Result_%s.html" \ % (self.targetURL.getHost()))) else: fileChooser.setSelectedFile(File("Burp_SSL_Scanner_Result.html")) if (fileChooser.showSaveDialog(self.getUiComponent()) == JFileChooser.APPROVE_OPTION): fw = FileWriter(fileChooser.getSelectedFile()) fw.write(self.textPane.getText()) fw.flush() fw.close() print "Saved results to disk"
def initUI(self): self.panel = JPanel() self.panel.setLayout(BorderLayout()) chooseFile = JFileChooser() chooseFile.setDialogTitle("Select Access Database") fnfilter = FileNameExtensionFilter("Access Databases", ["mdb", "accdb"]) chooseFile.setFileFilter(fnfilter) ret = chooseFile.showSaveDialog(self.panel) if ret == JFileChooser.APPROVE_OPTION: self.file_name = str(chooseFile.getSelectedFile())
def initUI(self): self.panel = JPanel() self.panel.setLayout(BorderLayout()) chooseFile = JFileChooser() chooseFile.setDialogTitle("Select Export Location") chooseFile.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY) ret = chooseFile.showSaveDialog(self.panel) if ret == JFileChooser.APPROVE_OPTION: self.file_name = str(chooseFile.getSelectedFile()) if not chooseFile.getSelectedFile().isDirectory(): mkdirp(self.file_name)
def menuItemClicked(self, menuItemCaption, messageInfo): if menuItemCaption == 'Save PoC': if self.dir: fc = JFileChooser(self.dir) else: fc = JFileChooser() returnVal = fc.showSaveDialog(None) if returnVal == JFileChooser.APPROVE_OPTION: file = fc.getSelectedFile() try: mode = 'w' if file.exists(): res = JOptionPane.showConfirmDialog( None, "File exists. Append?") mode = { JOptionPane.YES_OPTION: 'a', JOptionPane.NO_OPTION: 'w', JOptionPane.CANCEL_OPTION: None, }[res] if not mode: return fp = open(str(file.getAbsolutePath()), mode) for req_resp in messageInfo: req = req_resp.getRequest() resp = req_resp.getResponse() fp.write(req.tostring()) fp.write('\r\n\r\n') fp.write(resp.tostring()) fp.write('\r\n\r\n') fp.close() except Exception, e: JOptionPane.showMessageDialog( None, "Error during save: " + str(e), "Error", JOptionPane.ERROR_MESSAGE) raise JOptionPane.showMessageDialog(None, "File was successfully saved", "Ok", JOptionPane.INFORMATION_MESSAGE) self.dir = fc.getCurrentDirectory()
def menuItemClicked(self, menuItemCaption, messageInfo): if menuItemCaption == 'Save PoC': if self.dir: fc = JFileChooser(self.dir) else: fc = JFileChooser() returnVal = fc.showSaveDialog(None) if returnVal == JFileChooser.APPROVE_OPTION: file = fc.getSelectedFile() try: mode = 'w' if file.exists(): res = JOptionPane.showConfirmDialog(None, "File exists. Append?") mode = { JOptionPane.YES_OPTION : 'a', JOptionPane.NO_OPTION : 'w', JOptionPane.CANCEL_OPTION : None, }[res] if not mode: return fp = open(str(file.getAbsolutePath()), mode) for req_resp in messageInfo: req = req_resp.getRequest() resp = req_resp.getResponse() fp.write(req.tostring()) fp.write('\r\n\r\n') fp.write(resp.tostring()) fp.write('\r\n\r\n') fp.close() except Exception, e: JOptionPane.showMessageDialog(None, "Error during save: " + str(e), "Error", JOptionPane.ERROR_MESSAGE) raise JOptionPane.showMessageDialog(None, "File was successfully saved", "Ok", JOptionPane.INFORMATION_MESSAGE) self.dir = fc.getCurrentDirectory()
def save(self, parent, format): chooser = JFileChooser() # filter = FileNameExtensionFilter( # format + " files", # array([format, format.lower()], String)) # chooser.setFileFilter(filter); returnVal = chooser.showSaveDialog(parent) if returnVal == JFileChooser.APPROVE_OPTION: fileName = chooser.getSelectedFile().getPath() if not fileName.upper().endswith('.' + format): fileName += '.' + format.lower() file = File(fileName) else: return if format == 'PNG': ChartUtils.saveChartAsPNG(file, self.chart, self.exportX, self.exportY) elif format == 'SVG': domImpl = GenericDOMImplementation.getDOMImplementation() doc = domImpl.createDocument(None, "svg", None) svgGen = SVGGraphics2D(doc) svgGen.getGeneratorContext().setPrecision(6) self.chart.draw( svgGen, Rectangle2D.Double(0, 0, self.exportX, self.exportY), None) out = OutputStreamWriter(FileOutputStream(file), "UTF-8") svgGen.stream(out, True) #True is for useCSS out.close() elif format == 'PDF': mapper = DefaultFontMapper() pageSize = Rectangle(self.exportX, self.exportY) doc = TextDocument(pageSize, 50, 50, 50, 50) out = BufferedOutputStream(FileOutputStream(file)) writer = PdfWriter.getInstance(doc, out) doc.open() cb = writer.getDirectContent() tp = cb.createTemplate(self.exportX, self.exportY) g2 = tp.createGraphics(self.exportX, self.exportY, mapper) r2D = Rectangle2D.Double(0, 0, self.exportX, self.exportY) self.chart.draw(g2, r2D) g2.dispose() cb.addTemplate(tp, 0, 0) doc.close()
def saveFile(self, event): ''' 1. Check if current file has a filename 2. Save current file in destination given by user ''' self.consoleController.addText("NammuController: Saving file...") fileChooser = JFileChooser() status = fileChooser.showSaveDialog(self.view) if status == JFileChooser.APPROVE_OPTION: atfFile = fileChooser.getSelectedFile() filename = atfFile.getCanonicalPath() atfText = self.atfAreaController.getAtfAreaText() self.writeTextFile(filename, atfText) #TODO check returned status? self.consoleController.addText(" OK\n")
def saveFile(self, event=None): ''' If file being edited has a path, then overwrite with latest changes. If file was created from scratch and has no path, prompt JFileChooser to save in desired location. Also checks for project name, and if found, makes it default. ''' atfText = self.atfAreaController.getAtfAreaText() if not self.currentFilename: fileChooser = JFileChooser(self.get_working_dir()) file_filter = FileNameExtensionFilter("ATF files", ["atf"]) fileChooser.setFileFilter(file_filter) status = fileChooser.showSaveDialog(self.view) if status == JFileChooser.APPROVE_OPTION: atfFile = fileChooser.getSelectedFile() filename = atfFile.getCanonicalPath() # Make sure users check before lightly overwriting a file # No need to ask if they choose to save on the file they are # currently and knowingly editing. if os.path.isfile(filename) and \ filename != self.currentFilename: reply = JOptionPane.showConfirmDialog( None, "Are you sure you want to overwrite that file?", "Confirm replace file", JOptionPane.YES_NO_OPTION) if reply == JOptionPane.NO_OPTION: return filename = self.force_atf_extension(filename) self.currentFilename = filename self.view.setTitle(os.path.basename(filename)) else: return try: self.writeTextFile(self.currentFilename, atfText) except: self.logger.error("There was an error trying to save %s.", self.currentFilename) else: self.logger.info("File %s successfully saved.", self.currentFilename) # Find project and language and add to settings.yaml as default self.update_config()
def saveFileDialog(parent, startingDir=None, title=None, extension=None): # type: (java.awt.Component, str, str, str) -> (java.io.File, str) """Creates a fileChooser.showSaveDialog and returns the selected file. Args: * parent (java.awt.Component): Parent component. * startingDir (str): Starting directory. * title (str): Title of the dialog. * fileFilter (str): Extension (without the dot) of the file to look for. E.g., "json" Returns java.io.File and a string containing the last used directory.""" fileChooser = JFileChooser() if startingDir is not None: startingPath = File(startingDir) fileChooser.setCurrentDirectory(startingPath) if title is not None: fileChooser.dialogTitle = title # FileNameExtensionFilter # https://docs.oracle.com/javase/8/docs/api/javax/swing/filechooser/FileNameExtensionFilter.html if extension is not None: extensionFilterString = "%s Files (*.%s)" % (extension.upper(), extension) extensionFilterList = [extension] fil = FileNameExtensionFilter(extensionFilterString, extensionFilterList) fileChooser.fileFilter = fil fileChooser.addChoosableFileFilter(fil) fileChooser.fileSelectionMode = JFileChooser.FILES_ONLY returnVal = fileChooser.showSaveDialog(parent) if returnVal != JFileChooser.APPROVE_OPTION: # export cancelled or there was an error return None, "" # store the used directory lastDir = fileChooser.getCurrentDirectory().toString() # get file path selectedFile = fileChooser.getSelectedFile() return selectedFile, lastDir
def save(self, parent, format): chooser = JFileChooser() #filter = FileNameExtensionFilter( # format + " files", # array([format, format.lower()], String)) #chooser.setFileFilter(filter); returnVal = chooser.showSaveDialog(parent) if returnVal == JFileChooser.APPROVE_OPTION: fileName = chooser.getSelectedFile().getPath() if not fileName.upper().endswith('.' + format): fileName += '.' + format.lower() file = File(fileName) else: return if format == 'PNG': ChartUtilities.saveChartAsPNG(file, self.chart, self.exportX, self.exportY) elif format == 'SVG': domImpl = GenericDOMImplementation.getDOMImplementation() doc = domImpl.createDocument(None, "svg", None) svgGen = SVGGraphics2D(doc) svgGen.getGeneratorContext().setPrecision(6) self.chart.draw(svgGen, Rectangle2D.Double(0, 0, self.exportX, self.exportY), None) out = OutputStreamWriter(FileOutputStream(file), "UTF-8") svgGen.stream(out, True) #True is for useCSS out.close() elif format == 'PDF': mapper = DefaultFontMapper() pageSize = Rectangle(self.exportX, self.exportY) doc = TextDocument(pageSize, 50, 50, 50, 50) out = BufferedOutputStream(FileOutputStream(file)) writer = PdfWriter.getInstance(doc, out) doc.open() cb = writer.getDirectContent() tp = cb.createTemplate(self.exportX, self.exportY) g2 = tp.createGraphics(self.exportX, self.exportY, mapper) r2D = Rectangle2D.Double(0, 0, self.exportX, self.exportY) self.chart.draw(g2, r2D) g2.dispose() cb.addTemplate(tp, 0, 0) doc.close()
def promptuser(self, wlist): fileChooser = JFileChooser() filter = FileNameExtensionFilter("Text Files", ["txt"]) #shows only text files in the save menu prompt fileChooser.setFileFilter(filter) ret = fileChooser.showSaveDialog(self.panel) #if they have selected the save option if ret == JFileChooser.APPROVE_OPTION: file = fileChooser.getSelectedFile() #get the path that the user selected filepath = str(file.getCanonicalPath()) with open(filepath, 'a+') as f: for word in sorted(wlist): if word == '': pass else: f.write(word + '\n') print 'Wordlist created at ' + filepath print '##########################################################################################################\n'
def savePopNames(): global frame global popNames, remPops fc = JFileChooser(dataPath) retVal = fc.showSaveDialog(frame) if retVal == JFileChooser.APPROVE_OPTION: file = fc.getSelectedFile().getAbsolutePath() try: f = open(file) except IOError: exists = False else: exists = True f.close() if exists: if not yesNo(frame, "File exists, overwrite?"): return f = open(file, 'w') for popName in popNames: f.write(popName + '\n') f.close()
def go(self, fileTypes=None, default=None, directoryAllowed=False): fileChooser = JFileChooser() if self.title: fileChooser.setDialogTitle(self.title) if default: fileChooser.setSelectedFile(java.io.File(default)) fileChooser.setCurrentDirectory(java.io.File(".")) if fileTypes: for extension, description in fileTypes: fileChooser.addChoosableFileFilter(FileFilterForExtension(extension, description)) if self.loadOrSave == "load": result = fileChooser.showOpenDialog(self.parent) else: result = fileChooser.showSaveDialog(self.parent) if (result == JFileChooser.APPROVE_OPTION): fileResult = None fileAndMaybeDir = fileChooser.getSelectedFile().getAbsoluteFile() if directoryAllowed or not fileAndMaybeDir.isDirectory(): fileResult = str(fileAndMaybeDir) return fileResult else: return None
def saveAsFile(self, event=None): ''' Forces saving as dialog to be prompted. Also checks for project name, and if found, makes it default. ''' atfText = self.atfAreaController.getAtfAreaText() fileChooser = JFileChooser(self.get_working_dir()) status = fileChooser.showSaveDialog(self.view) if status == JFileChooser.APPROVE_OPTION: atfFile = fileChooser.getSelectedFile() filename = atfFile.getCanonicalPath() basename = atfFile.getName() # Make sure users check before lightly overwriting a file # No need to ask if they choose to save on the file they are # currently and knowingly editing. if os.path.isfile(filename) and filename != self.currentFilename: reply = JOptionPane.showConfirmDialog( None, "Are you sure you want to overwrite that file?", "Confirm replace file", JOptionPane.YES_NO_OPTION) if reply == JOptionPane.NO_OPTION: return self.currentFilename = filename self.view.setTitle(basename) try: self.writeTextFile(self.currentFilename, atfText) except: self.logger.error("There was an error trying to save %s.", self.currentFilename) else: self.logger.info("File %s successfully saved.", self.currentFilename) # Find project and language and add to settings.yaml as default self.update_config()
def exportToCSV(self): parentFrame = JFrame() fileChooser = JFileChooser() fileChooser.setSelectedFile(File("AutorizeReprort.csv")); fileChooser.setDialogTitle("Save Autorize Report") userSelection = fileChooser.showSaveDialog(parentFrame) if userSelection == JFileChooser.APPROVE_OPTION: fileToSave = fileChooser.getSelectedFile() enforcementStatusFilter = self.exportES.getSelectedItem() csvContent = "id\tURL\tOriginal length\tModified length\tUnauthorized length\tAuthorization Enforcement Status\tAuthorization Unauthenticated Status\n" for i in range(0,self._log.size()): if enforcementStatusFilter == "All Statuses": csvContent += "%d\t%s\t%d\t%d\t%d\t%s\t%s\n" % (self._log.get(i)._id,self._log.get(i)._url, len(self._log.get(i)._originalrequestResponse.getResponse()) if self._log.get(i)._originalrequestResponse != None else 0, len(self._log.get(i)._requestResponse.getResponse()) if self._log.get(i)._requestResponse != None else 0, len(self._log.get(i)._unauthorizedRequestResponse.getResponse()) if self._log.get(i)._unauthorizedRequestResponse != None else 0, self._log.get(i)._enfocementStatus, self._log.get(i)._enfocementStatusUnauthorized) else: if (enforcementStatusFilter == self._log.get(i)._enfocementStatus) or (enforcementStatusFilter == self._log.get(i)._enfocementStatusUnauthorized): csvContent += "%d\t%s\t%d\t%d\t%d\t%s\t%s\n" % (self._log.get(i)._id,self._log.get(i)._url, len(self._log.get(i)._originalrequestResponse.getResponse()) if self._log.get(i)._originalrequestResponse != None else 0, len(self._log.get(i)._requestResponse.getResponse()) if self._log.get(i)._requestResponse != None else 0, len(self._log.get(i)._unauthorizedRequestResponse.getResponse()) if self._log.get(i)._unauthorizedRequestResponse != None else 0, self._log.get(i)._enfocementStatus, self._log.get(i)._enfocementStatusUnauthorized) f = open(fileToSave.getAbsolutePath(), 'w') f.writelines(csvContent) f.close()
def actionPerformed(self, event): """Delete the last row""" # Generate a save dialog dialog = JFileChooser(Prefs.get("roiGroup.exportDir", "")) dialog.setSelectedFile(File("roiGroups.txt")) dialog.setFileFilter(FileNameExtensionFilter("Text file", ["txt"])) output = dialog.showSaveDialog( self.groupTable) # could be argument None too if output in [JFileChooser.CANCEL_OPTION, JFileChooser.ERROR_OPTION]: return selectedFile = dialog.getSelectedFile() directory = selectedFile.getParent() Prefs.set("roiGroup.exportDir", directory) filePath = selectedFile.getPath() if not ("." in filePath): filePath += ".txt" # Add extension if missing # Write the groupString to the file groupString = self.groupTable.tableModel.getGroupString() with open(filePath, "w") as textFile: textFile.write(groupString)
def saveState(self): parentFrame = JFrame() fileChooser = JFileChooser() fileChooser.setDialogTitle("State output file") userSelection = fileChooser.showSaveDialog(parentFrame) if userSelection == JFileChooser.APPROVE_OPTION: exportFile = fileChooser.getSelectedFile() with open(exportFile.getAbsolutePath(), 'wb') as csvfile: csvwriter = csv.writer(csvfile, delimiter='\t', quotechar='|', quoting=csv.QUOTE_MINIMAL) for i in range(0, self._extender._log.size()): tempRequestResponseHost = self._extender._log.get( i)._requestResponse.getHttpService().getHost() tempRequestResponsePort = self._extender._log.get( i)._requestResponse.getHttpService().getPort() tempRequestResponseProtocol = self._extender._log.get( i)._requestResponse.getHttpService().getProtocol() tempRequestResponseRequest = base64.b64encode( self._extender._log.get( i)._requestResponse.getRequest()) tempRequestResponseResponse = base64.b64encode( self._extender._log.get( i)._requestResponse.getResponse()) tempOriginalRequestResponseHost = self._extender._log.get( i)._originalrequestResponse.getHttpService().getHost() tempOriginalRequestResponsePort = self._extender._log.get( i)._originalrequestResponse.getHttpService().getPort() tempOriginalRequestResponseProtocol = self._extender._log.get( i)._originalrequestResponse.getHttpService( ).getProtocol() tempOriginalRequestResponseRequest = base64.b64encode( self._extender._log.get( i)._originalrequestResponse.getRequest()) tempOriginalRequestResponseResponse = base64.b64encode( self._extender._log.get( i)._originalrequestResponse.getResponse()) if self._extender._log.get( i)._unauthorizedRequestResponse is not None: tempUnauthorizedRequestResponseHost = self._extender._log.get( i)._unauthorizedRequestResponse.getHttpService( ).getHost() tempUnauthorizedRequestResponsePort = self._extender._log.get( i)._unauthorizedRequestResponse.getHttpService( ).getPort() tempUnauthorizedRequestResponseProtocol = self._extender._log.get( i)._unauthorizedRequestResponse.getHttpService( ).getProtocol() tempUnauthorizedRequestResponseRequest = base64.b64encode( self._extender._log.get( i)._unauthorizedRequestResponse.getRequest()) tempUnauthorizedRequestResponseResponse = base64.b64encode( self._extender._log.get( i)._unauthorizedRequestResponse.getResponse()) else: tempUnauthorizedRequestResponseHost = None tempUnauthorizedRequestResponsePort = None tempUnauthorizedRequestResponseProtocol = None tempUnauthorizedRequestResponseRequest = None tempUnauthorizedRequestResponseResponse = None tempEnforcementStatus = self._extender._log.get( i)._enfocementStatus tempEnforcementStatusUnauthorized = self._extender._log.get( i)._enfocementStatusUnauthorized tempRow = [ tempRequestResponseHost, tempRequestResponsePort, tempRequestResponseProtocol, tempRequestResponseRequest, tempRequestResponseResponse ] tempRow.extend([ tempOriginalRequestResponseHost, tempOriginalRequestResponsePort, tempOriginalRequestResponseProtocol, tempOriginalRequestResponseRequest, tempOriginalRequestResponseResponse ]) tempRow.extend([ tempUnauthorizedRequestResponseHost, tempUnauthorizedRequestResponsePort, tempUnauthorizedRequestResponseProtocol, tempUnauthorizedRequestResponseRequest, tempUnauthorizedRequestResponseResponse ]) tempRow.extend([ tempEnforcementStatus, tempEnforcementStatusUnauthorized ]) csvwriter.writerow(tempRow)
def exportToHTML(self, event): parentFrame = JFrame() fileChooser = JFileChooser() fileChooser.setSelectedFile(File("AutorizeReprort.html")) fileChooser.setDialogTitle("Save Autorize Report") userSelection = fileChooser.showSaveDialog(parentFrame) if userSelection == JFileChooser.APPROVE_OPTION: fileToSave = fileChooser.getSelectedFile() enforcementStatusFilter = self.exportES.getSelectedItem() htmlContent = """<html><title>Autorize Report by Barak Tawily</title> <style> .datagrid table { border-collapse: collapse; text-align: left; width: 100%; } .datagrid {font: normal 12px/150% Arial, Helvetica, sans-serif; background: #fff; overflow: hidden; border: 1px solid #006699; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } .datagrid table td, .datagrid table th { padding: 3px 10px; } .datagrid table thead th {background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #006699), color-stop(1, #00557F) );background:-moz-linear-gradient( center top, #006699 5%, #00557F 100% );filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#006699', endColorstr='#00557F');background-color:#006699; color:#FFFFFF; font-size: 15px; font-weight: bold; border-left: 1px solid #0070A8; } .datagrid table thead th:first-child { border: none; }.datagrid table tbody td { color: #00496B; border-left: 1px solid #E1EEF4;font-size: 12px;font-weight: normal; }.datagrid table tbody .alt td { background: #E1EEF4; color: #00496B; }.datagrid table tbody td:first-child { border-left: none; }.datagrid table tbody tr:last-child td { border-bottom: none; }.datagrid table tfoot td div { border-top: 1px solid #006699;background: #E1EEF4;} .datagrid table tfoot td { padding: 0; font-size: 12px } .datagrid table tfoot td div{ padding: 2px; }.datagrid table tfoot td ul { margin: 0; padding:0; list-style: none; text-align: right; }.datagrid table tfoot li { display: inline; }.datagrid table tfoot li a { text-decoration: none; display: inline-block; padding: 2px 8px; margin: 1px;color: #FFFFFF;border: 1px solid #006699;-webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #006699), color-stop(1, #00557F) );background:-moz-linear-gradient( center top, #006699 5%, #00557F 100% );filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#006699', endColorstr='#00557F');background-color:#006699; }.datagrid table tfoot ul.active, .datagrid table tfoot ul a:hover { text-decoration: none;border-color: #006699; color: #FFFFFF; background: none; background-color:#00557F;}div.dhtmlx_window_active, div.dhx_modal_cover_dv { position: fixed !important; } table { width: 100%; table-layout: fixed; } td { border: 1px solid #35f; overflow: hidden; text-overflow: ellipsis; } td.a { width: 13%; white-space: nowrap; } td.b { width: 9%; word-wrap: break-word; } </style> <body> <h1>Autorize Report<h1> <div class="datagrid"><table> <thead><tr><th>URL</th><th>Authorization Enforcement Status</th></tr></thead> <tbody>""" for i in range(0, self._log.size()): color = "" if self._log.get( i )._enfocementStatus == "Authorization enforced??? (please configure enforcement detector)": color = "yellow" if self._log.get(i)._enfocementStatus == "Authorization bypass!": color = "red" if self._log.get(i)._enfocementStatus == "Authorization enforced!": color = "LawnGreen" if enforcementStatusFilter == "All Statuses": htmlContent += "<tr bgcolor=\"%s\"><td><a href=\"%s\">%s</a></td><td>%s</td></tr>" % ( color, self._log.get(i)._url, self._log.get(i)._url, self._log.get(i)._enfocementStatus) else: if enforcementStatusFilter == self._log.get( i)._enfocementStatus: htmlContent += "<tr bgcolor=\"%s\"><td><a href=\"%s\">%s</a></td><td>%s</td></tr>" % ( color, self._log.get(i)._url, self._log.get(i)._url, self._log.get(i)._enfocementStatus) htmlContent += "</tbody></table></div></body></html>" f = open(fileToSave.getAbsolutePath(), 'w') f.writelines(htmlContent) f.close()
# Notify the writer of the end of this detail record csvFile.endRecord() csvFile.flush() print "Entry", entry.getId(), "written" # Now do the actual work here # Create output file. # Unless modified here, this will create the output file in the same # location as the roster itself. # Default behaviour is for this to be in the user preferences directory fc = JFileChooser() fc.setSelectedFile(java.io.File(outFile)) ret = fc.showSaveDialog(None) if ret == JFileChooser.APPROVE_OPTION: # We've got a valid filename outFile = fc.getSelectedFile().toString() print "Output file:", outFile csvFile = com.csvreader.CsvWriter( java.io.BufferedOutputStream(java.io.FileOutputStream(outFile)), ',', java.nio.charset.Charset.defaultCharset()) # Output the header if required if outputHeader == True: writeHeader(csvFile) # Output details writeDetails(csvFile)
def selectFile(self, event): chooser = JFileChooser() retVal = chooser.showSaveDialog(None) self.saveFile = chooser.selectedFile.path
class BurpExtender(IBurpExtender, ITab, IMessageEditorController, IContextMenuFactory): # # implement IBurpExtender # def registerExtenderCallbacks(self, callbacks): # keep a reference to our Burp callbacks object self._callbacks = callbacks # obtain an Burp extension helpers object self._helpers = callbacks.getHelpers() # set our extension name callbacks.setExtensionName("AuthMatrix - v0.5.2") # DB that holds everything users, roles, and messages self._db = MatrixDB() # For saving/loading config self._fc = JFileChooser() # Used by ActionListeners selfExtender = self self._selectedColumn = -1 self._selectedRow = -1 # Table of User entries self._userTable = UserTable(self, model = UserTableModel(self._db)) roleScrollPane = JScrollPane(self._userTable) self._userTable.redrawTable() # Table of Request (AKA Message) entries self._messageTable = MessageTable(self, model = MessageTableModel(self._db)) messageScrollPane = JScrollPane(self._messageTable) self._messageTable.redrawTable() # Semi-Generic Popup stuff def addPopup(component, popup): class genericMouseListener(MouseAdapter): def mousePressed(self, e): if e.isPopupTrigger(): self.showMenu(e) def mouseReleased(self, e): if e.isPopupTrigger(): self.showMenu(e) def showMenu(self, e): if type(component) is JTableHeader: table = component.getTable() column = component.columnAtPoint(e.getPoint()) if type(table) is MessageTable and column >= selfExtender._db.STATIC_MESSAGE_TABLE_COLUMN_COUNT or type(table) is UserTable and column >= selfExtender._db.STATIC_USER_TABLE_COLUMN_COUNT: selfExtender._selectedColumn = column else: return else: selfExtender._selectedRow = component.rowAtPoint(e.getPoint()) popup.show(e.getComponent(), e.getX(), e.getY()) component.addMouseListener(genericMouseListener()) class actionRunMessage(ActionListener): def actionPerformed(self,e): if selfExtender._selectedRow >= 0: if selfExtender._selectedRow not in selfExtender._messageTable.getSelectedRows(): indexes = [selfExtender._db.getMessageByRow(selfExtender._selectedRow)._index] else: indexes = [selfExtender._db.getMessageByRow(rowNum)._index for rowNum in selfExtender._messageTable.getSelectedRows()] t = Thread(target=selfExtender.runMessagesThread, args = [indexes]) t.start() selfExtender._selectedColumn = -1 # Redrawing the table happens in colorcode within the thread class actionRemoveMessage(ActionListener): def actionPerformed(self,e): if selfExtender._selectedRow >= 0: if selfExtender._selectedRow not in selfExtender._messageTable.getSelectedRows(): indexes = [selfExtender._db.getMessageByRow(selfExtender._selectedRow)._index] else: indexes = [selfExtender._db.getMessageByRow(rowNum)._index for rowNum in selfExtender._messageTable.getSelectedRows()] for i in indexes: selfExtender._db.deleteMessage(i) selfExtender._selectedColumn = -1 selfExtender._messageTable.redrawTable() class actionRemoveUser(ActionListener): def actionPerformed(self,e): if selfExtender._selectedRow >= 0: if selfExtender._selectedRow not in selfExtender._userTable.getSelectedRows(): indexes = [selfExtender._db.getUserByRow(selfExtender._selectedRow)._index] else: indexes = [selfExtender._db.getUserByRow(rowNum)._index for rowNum in selfExtender._userTable.getSelectedRows()] for i in indexes: selfExtender._db.deleteUser(i) selfExtender._selectedColumn = -1 selfExtender._userTable.redrawTable() # TODO combine these next two classes class actionRemoveRoleHeaderFromMessageTable(ActionListener): def actionPerformed(self,e): if selfExtender._selectedColumn >= 0: selfExtender._db.deleteRole(selfExtender._db.getRoleByMessageTableColumn(selfExtender._selectedColumn)._index) selfExtender._selectedColumn = -1 selfExtender._userTable.redrawTable() selfExtender._messageTable.redrawTable() class actionRemoveRoleHeaderFromUserTable(ActionListener): def actionPerformed(self,e): if selfExtender._selectedColumn >= 0: selfExtender._db.deleteRole(selfExtender._db.getRoleByUserTableColumn(selfExtender._selectedColumn)._index) selfExtender._selectedColumn = -1 selfExtender._userTable.redrawTable() selfExtender._messageTable.redrawTable() # Message Table popups messagePopup = JPopupMenu() addPopup(self._messageTable,messagePopup) messageRun = JMenuItem("Run Request(s)") messageRun.addActionListener(actionRunMessage()) messagePopup.add(messageRun) messageRemove = JMenuItem("Remove Request(s)") messageRemove.addActionListener(actionRemoveMessage()) messagePopup.add(messageRemove) messageHeaderPopup = JPopupMenu() addPopup(self._messageTable.getTableHeader(),messageHeaderPopup) roleRemoveFromMessageTable = JMenuItem("Remove Role") roleRemoveFromMessageTable.addActionListener(actionRemoveRoleHeaderFromMessageTable()) messageHeaderPopup.add(roleRemoveFromMessageTable) # User Table popup userPopup = JPopupMenu() addPopup(self._userTable,userPopup) userRemove = JMenuItem("Remove Users(s)") userRemove.addActionListener(actionRemoveUser()) userPopup.add(userRemove) userHeaderPopup = JPopupMenu() addPopup(self._userTable.getTableHeader(),userHeaderPopup) roleRemoveFromUserTable = JMenuItem("Remove Role") roleRemoveFromUserTable.addActionListener(actionRemoveRoleHeaderFromUserTable()) userHeaderPopup.add(roleRemoveFromUserTable) # Top pane topPane = JSplitPane(JSplitPane.VERTICAL_SPLIT,roleScrollPane,messageScrollPane) # request tabs added to this tab on click in message table self._tabs = JTabbedPane() # Button pannel buttons = JPanel() runButton = JButton("Run", actionPerformed=self.runClick) newUserButton = JButton("New User", actionPerformed=self.getInputUserClick) newRoleButton = JButton("New Role", actionPerformed=self.getInputRoleClick) #debugButton = JButton("Debug", actionPerformed=self.printDB) saveButton = JButton("Save", actionPerformed=self.saveClick) loadButton = JButton("Load", actionPerformed=self.loadClick) clearButton = JButton("Clear", actionPerformed=self.clearClick) buttons.add(runButton) buttons.add(newUserButton) buttons.add(newRoleButton) #buttons.add(debugButton) buttons.add(saveButton) buttons.add(loadButton) buttons.add(clearButton) bottomPane = JSplitPane(JSplitPane.VERTICAL_SPLIT, self._tabs, buttons) # Main Pane self._splitpane = JSplitPane(JSplitPane.VERTICAL_SPLIT, topPane, bottomPane) # customize our UI components callbacks.customizeUiComponent(self._splitpane) callbacks.customizeUiComponent(topPane) callbacks.customizeUiComponent(bottomPane) callbacks.customizeUiComponent(messageScrollPane) callbacks.customizeUiComponent(roleScrollPane) callbacks.customizeUiComponent(self._messageTable) callbacks.customizeUiComponent(self._userTable) callbacks.customizeUiComponent(self._tabs) callbacks.customizeUiComponent(buttons) self._splitpane.setResizeWeight(0.5) topPane.setResizeWeight(0.3) bottomPane.setResizeWeight(0.95) # Handles checkbox color coding # Must be bellow the customizeUiComponent calls self._messageTable.setDefaultRenderer(Boolean, SuccessBooleanRenderer(self._db)) # add the custom tab to Burp's UI callbacks.addSuiteTab(self) # register SendTo option callbacks.registerContextMenuFactory(self) return ## ## implement ITab ## def getTabCaption(self): return "AuthMatrix" def getUiComponent(self): return self._splitpane ## ## Creates the sendto tab in other areas of Burp ## def createMenuItems(self, invocation): def addRequestsToTab(e): for messageInfo in messages: # saveBuffers is required since modifying the original from its source changes the saved objects, its not a copy messageIndex = self._db.createNewMessage(self._callbacks.saveBuffersToTempFiles(messageInfo), self._helpers.analyzeRequest(messageInfo).getUrl()) #self._messageTable.getModel().addRow(row) self._messageTable.redrawTable() ret = [] messages = invocation.getSelectedMessages() # Check if the messages in the target tree have a response valid = True if invocation.getInvocationContext() == invocation.CONTEXT_TARGET_SITE_MAP_TREE: for selected in messages: if not selected.getResponse(): valid = False if valid: menuItem = JMenuItem("Send request(s) to AuthMatrix"); menuItem.addActionListener(addRequestsToTab) ret.append(menuItem) return ret ## ## implement IMessageEditorController ## this allows our request/response viewers to obtain details about the messages being displayed ## def getHttpService(self): return self._currentlyDisplayedItem.getHttpService() def getRequest(self): return self._currentlyDisplayedItem.getRequest() def getResponse(self): return self._currentlyDisplayedItem.getResponse() ## ## Actions on Bottom Row Button Clicks ## def printDB(self, e): out = "" for a in self._db.arrayOfUsers: out += str(a._index)+" "+a._name+" : "+str(a._roles)+"\n" for b in self._db.arrayOfMessages: out += str(b._index)+" "+str(b._roles)+"\n" JOptionPane.showMessageDialog(self._splitpane,out) def getInputUserClick(self, e): newUser = JOptionPane.showInputDialog(self._splitpane,"Enter New User:"******"Enter New Role:") if not newRole is None: self._db.getOrCreateRole(newRole) self._userTable.redrawTable() self._messageTable.redrawTable() def saveClick(self, e): returnVal = self._fc.showSaveDialog(self._splitpane) if returnVal == JFileChooser.APPROVE_OPTION: f = self._fc.getSelectedFile() if f.exists(): result = JOptionPane.showConfirmDialog(self._splitpane, "The file exists, overwrite?", "Existing File", JOptionPane.YES_NO_OPTION) if result != JOptionPane.YES_OPTION: return fileName = f.getPath() outs = ObjectOutputStream(FileOutputStream(fileName)) outs.writeObject(self._db.getSaveableObject()) outs.close() def loadClick(self,e): returnVal = self._fc.showOpenDialog(self._splitpane) if returnVal == JFileChooser.APPROVE_OPTION: warning = """ CAUTION: Loading a saved configuration deserializes data. This action may pose a security threat to the application. Only proceed when the source and contents of this file is trusted. Load Selected File? """ result = JOptionPane.showOptionDialog(self._splitpane, warning, "Caution", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, None, ["OK", "Cancel"],"OK") if result != JOptionPane.YES_OPTION: return f = self._fc.getSelectedFile() fileName = f.getPath() ins = ObjectInputStream(FileInputStream(fileName)) dbData=ins.readObject() ins.close() self._db.load(dbData,self) self._userTable.redrawTable() self._messageTable.redrawTable() def clearClick(self,e): result = JOptionPane.showConfirmDialog(self._splitpane, "Clear AuthMatrix Configuration?", "Clear Config", JOptionPane.YES_NO_OPTION) if result == JOptionPane.YES_OPTION: self._db.clear() self._tabs.removeAll() self._userTable.redrawTable() self._messageTable.redrawTable() def runClick(self,e): t = Thread(target=self.runMessagesThread) self._tabs.removeAll() t.start() def changeDomainPopup(self, oldDomain, index): hostField = JTextField(25) checkbox = JCheckBox() domainPanel = JPanel(GridLayout(0,1)) domainPanel.add(JLabel("Request %s: Domain %s inaccessible. Enter new domain." % (str(index),oldDomain))) firstline = JPanel() firstline.add(JLabel("Host:")) firstline.add(hostField) domainPanel.add(firstline) secondline = JPanel() secondline.add(JLabel("Replace domain for all requests?")) secondline.add(checkbox) domainPanel.add(secondline) result = JOptionPane.showConfirmDialog( self._splitpane,domainPanel, "Domain Inaccessible", JOptionPane.OK_CANCEL_OPTION) cancelled = (result == JOptionPane.CANCEL_OPTION) if cancelled: return (False, None, False) return (True, hostField.getText(), checkbox.isSelected()) ## ## Methods for running messages and analyzing results ## def runMessagesThread(self, messageIndexes=None): self._db.lock.acquire() try: indexes = messageIndexes if not indexes: indexes = self._db.getActiveMessageIndexes() self.clearColorResults(indexes) for index in indexes: self.runMessage(index) #self.colorCodeResults() except: traceback.print_exc(file=self._callbacks.getStderr()) finally: self._db.lock.release() self.colorCodeResults() # Replaces headers/cookies with user's token def getNewHeader(self, requestInfo, userEntry): headers = requestInfo.getHeaders() if userEntry.isCookie(): cookieHeader = "Cookie:" newheader = cookieHeader previousCookies = [] # note: getHeaders has to be called again here cuz of java references for header in requestInfo.getHeaders(): # Find and remove existing cookie header if str(header).startswith(cookieHeader): previousCookies = str(header)[len(cookieHeader):].replace(" ","").split(";") headers.remove(header) newCookies = userEntry._token.replace(" ","").split(";") newCookieVariableNames = [] for newCookie in newCookies: # If its a valid cookie equalsToken = newCookie.find("=") if equalsToken >= 0: newCookieVariableNames.append(newCookie[0:equalsToken+1]) # Add all the old unchanged cookies for previousCookie in previousCookies: # If its a valid cookie equalsToken = previousCookie.find("=") if equalsToken >= 0: if previousCookie[0:equalsToken+1] not in newCookieVariableNames: newCookies.append(previousCookie) # Remove whitespace newCookies = [x for x in newCookies if x] newheader = cookieHeader+" "+";".join(newCookies) else: # TODO: Support multiple headers with a newline somehow newheader = userEntry._token # Remove previous HTTP Header colon = newheader.find(":") if colon >= 0: # getHeaders has to be called again here cuz of java references for header in requestInfo.getHeaders(): # If the header already exists, remove it if str(header).startswith(newheader[0:colon+1]): headers.remove(header) headers.add(newheader) return headers def runMessage(self, messageIndex): messageEntry = self._db.arrayOfMessages[messageIndex] # Clear Previous Results: messageEntry._roleResults = {} messageEntry._userRuns = {} messageInfo = messageEntry._requestResponse requestInfo = self._helpers.analyzeRequest(messageInfo) reqBody = messageInfo.getRequest()[requestInfo.getBodyOffset():] for userIndex in self._db.getActiveUserIndexes(): userEntry = self._db.arrayOfUsers[userIndex] headers = self.getNewHeader(requestInfo, userEntry) # Add static CSRF token if available # TODO: Kinda hacky, but for now it will add the token as long as there is some content in the post body # Even if its a GET request. This screws up when original requests have no body though... oh well... newBody = reqBody if userEntry._staticcsrf and len(reqBody): delimeter = userEntry._staticcsrf.find("=") if delimeter >= 0: csrfname = userEntry._staticcsrf[0:delimeter] csrfvalue = userEntry._staticcsrf[delimeter+1:] params = requestInfo.getParameters() for param in params: if str(param.getName())==csrfname: # Handle CSRF Tokens in Body if param.getType() == 1: newBody = reqBody[0:param.getValueStart()-requestInfo.getBodyOffset()] + StringUtil.toBytes(csrfvalue) + reqBody[param.getValueEnd()-requestInfo.getBodyOffset():] # Handle CSRF Tokens in Cookies (for Cookie==Body mitigation technique): if param.getType() == 2: # TODO: required moving above portion to a function # TODO: also need to think about when cookie name != postarg name print "Cookie CSRF Tokens are not currently supported" if newBody == reqBody: newBody = reqBody+StringUtil.toBytes("&"+userEntry._staticcsrf) # Construct and send a message with the new headers message = self._helpers.buildHttpMessage(headers, newBody) requestResponse = self._callbacks.makeHttpRequest(messageInfo.getHttpService(),message) messageEntry.addRunByUserIndex(userIndex, self._callbacks.saveBuffersToTempFiles(requestResponse)) # Grab all active roleIndexes that should succeed activeSuccessRoles = [index for index in messageEntry._roles.keys() if messageEntry._roles[index] and not self._db.arrayOfRoles[index].isDeleted()] # Check Role Results of message for roleIndex in self._db.getActiveRoleIndexes(): success = self.checkResult(messageEntry, roleIndex, activeSuccessRoles) messageEntry.setRoleResultByRoleIndex(roleIndex, success) def colorCodeResults(self): self._messageTable.redrawTable() def clearColorResults(self, messageIndexArray = None): if not messageIndexArray: messageIndexes = self._db.getActiveMessageIndexes() else: messageIndexes = messageIndexArray for messageIndex in messageIndexes: messageEntry = self._db.arrayOfMessages[messageIndex] messageEntry._roleResults = {} messageEntry._userRuns = {} self._messageTable.redrawTable() def checkResult(self, messageEntry, roleIndex, activeSuccessRoles): for userIndex in self._db.getActiveUserIndexes(): userEntry = self._db.arrayOfUsers[userIndex] ignoreUser = False # if user is not in this role, ignore it if not userEntry._roles[roleIndex]: ignoreUser = True # If user is in any other role that should succeed, then ignore it for index in userEntry._roles.keys(): if not index == roleIndex and userEntry._roles[index] and index in activeSuccessRoles: ignoreUser = True if not ignoreUser: shouldSucceed = roleIndex in activeSuccessRoles requestResponse = messageEntry._userRuns[userEntry._index] resp = StringUtil.fromBytes(requestResponse.getResponse()) found = re.search(messageEntry._successRegex, resp, re.DOTALL) succeeds = found if shouldSucceed else not found if not succeeds: return False return True
class JythonGui(object): def __init__(self, instructionsURI=""): self.instructionsURI = instructionsURI self.logger = logging.getLogger("sasi_gridder_gui") self.logger.addHandler(logging.StreamHandler()) def log_fn(msg): self.log_msg(msg) self.logger.addHandler(FnLogHandler(log_fn)) self.logger.setLevel(logging.DEBUG) self.selected_input_file = None self.selected_output_file = None self.frame = JFrame("SASI Gridder", defaultCloseOperation=WindowConstants.EXIT_ON_CLOSE) self.frame.size = (650, 600) self.main_panel = JPanel() self.main_panel.layout = BoxLayout(self.main_panel, BoxLayout.Y_AXIS) self.frame.add(self.main_panel) self.top_panel = JPanel(SpringLayout()) self.top_panel.alignmentX = Component.CENTER_ALIGNMENT self.main_panel.add(self.top_panel) self.stageCounter = 1 def getStageLabel(txt): label = JLabel("%s. %s" % (self.stageCounter, txt)) self.stageCounter += 1 return label # Instructions link. self.top_panel.add(getStageLabel("Read the instructions:")) instructionsButton = JButton( ('<HTML><FONT color="#000099">' "<U>open instructions</U></FONT><HTML>"), actionPerformed=self.browseInstructions, ) instructionsButton.setHorizontalAlignment(SwingConstants.LEFT) instructionsButton.setBorderPainted(False) instructionsButton.setOpaque(False) instructionsButton.setBackground(Color.WHITE) instructionsButton.setToolTipText(self.instructionsURI) self.top_panel.add(instructionsButton) # Select input elements. self.top_panel.add(getStageLabel("Select an input data folder:")) self.top_panel.add(JButton("Select input...", actionPerformed=self.openInputChooser)) # Select output elements. self.top_panel.add(getStageLabel("Specify an output file:")) self.top_panel.add(JButton("Specify output...", actionPerformed=self.openOutputChooser)) # Run elements. self.top_panel.add(getStageLabel("Run SASI Gridder: (this might take a hwile")) self.run_button = JButton("Run...", actionPerformed=self.runSASIGridder) self.top_panel.add(self.run_button) SpringUtilities.makeCompactGrid(self.top_panel, self.stageCounter - 1, 2, 6, 6, 6, 6) # Progress bar. self.progressBar = JProgressBar(0, 100) self.main_panel.add(self.progressBar) # Log panel. self.log_panel = JPanel() self.log_panel.alignmentX = Component.CENTER_ALIGNMENT self.log_panel.setBorder(EmptyBorder(10, 10, 10, 10)) self.main_panel.add(self.log_panel) self.log_panel.setLayout(BorderLayout()) self.log = JTextArea() self.log.editable = False self.logScrollPane = JScrollPane(self.log) self.logScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS) self.log_panel.add(self.logScrollPane, BorderLayout.CENTER) # File selectors self.inputChooser = JFileChooser() self.inputChooser.fileSelectionMode = JFileChooser.FILES_AND_DIRECTORIES self.outputChooser = JFileChooser() self.outputChooser.fileSelectionMode = JFileChooser.FILES_ONLY defaultOutputFile = os.path.join(System.getProperty("user.home"), "gridded_efforts.csv") self.outputChooser.setSelectedFile(File(defaultOutputFile)) self.frame.setLocationRelativeTo(None) self.frame.visible = True def browseInstructions(self, event): """ Open a browser to the instructions page. """ browseURI(self.instructionsURI) return def log_msg(self, msg): self.log.append(msg + "\n") self.log.setCaretPosition(self.log.getDocument().getLength()) def openInputChooser(self, event): ret = self.inputChooser.showOpenDialog(self.frame) if ret == JFileChooser.APPROVE_OPTION: self.selected_input_file = self.inputChooser.selectedFile self.log_msg("Selected '%s' as input." % self.selected_input_file.path) def openOutputChooser(self, event): ret = self.outputChooser.showSaveDialog(self.frame) if ret == JFileChooser.APPROVE_OPTION: self.selected_output_file = self.outputChooser.selectedFile self.log_msg("Selected '%s' as output." % self.selected_output_file.path) def runSASIGridder(self, event): try: self.validateParameters() except Exception as e: self.log_msg("ERROR: '%s'" % e) # Run task in a separate thread, so that log # messages will be shown as task progresses. def run_task(): self.progressBar.setValue(0) self.progressBar.setIndeterminate(True) try: input_dir = self.selected_input_file.path output_path = self.selected_output_file.path grid_path = os.path.join(input_dir, "grid", "grid.shp") stat_areas_path = os.path.join(input_dir, "stat_areas", "stat_areas.shp") raw_efforts_path = os.path.join(input_dir, "raw_efforts.csv") gear_mappings_path = os.path.join(input_dir, "gear_mappings.csv") gear_mappings = {} with open(gear_mappings_path, "rb") as f: r = csv.DictReader(f) for mapping in r: gear_mappings[mapping["trip_type"]] = mapping["gear_code"] task = SASIGridderTask( grid_path=grid_path, raw_efforts_path=raw_efforts_path, stat_areas_path=stat_areas_path, output_path=output_path, logger=self.logger, gear_mappings=gear_mappings, effort_limit=None, ) task.call() except Exception as e: self.logger.exception("Could not complete task") self.progressBar.setIndeterminate(False) self.progressBar.setValue(100) Thread(target=run_task).start() def validateParameters(self): return True
csvFile.write("") csvFile.write("") csvFile.write("") csvFile.write(keyRow[0]) else: csvFile.write('{}'.format(keyRow[0])) csvFile.write(keyRow[1]) csvFile.write(keyRow[2]) csvFile.write(keyRow[3]) csvFile.write(keyRow[4]) csvFile.endRecord() # Provide the option to export the full class key list to an external file. saveResp = JOptionPane.showConfirmDialog(None, "Do you want to export the full class key list to a CSV file?", dialogTitle, JOptionPane.YES_NO_OPTION) if saveResp == 0: fo = JFileChooser(FileUtil.getUserFilesPath()) fo.setDialogTitle(dialogTitle) fo.setFileFilter(FileNameExtensionFilter("CSV", ["csv"])); ret = fo.showSaveDialog(None) if ret == JFileChooser.APPROVE_OPTION: keyFile = fo.getSelectedFile().toString() csvFile = com.csvreader.CsvWriter(java.io.BufferedOutputStream(java.io.FileOutputStream(keyFile)),',',java.nio.charset.Charset.defaultCharset()) writeHeader(csvFile) writeDetails(csvFile) csvFile.flush() csvFile.close() JOptionPane.showMessageDialog(None,"Class keys export completed",dialogTitle,JOptionPane.INFORMATION_MESSAGE) print '\n {} Done'.format(dialogTitle)
class JythonGui(ItemListener): def __init__(self, instructionsURI=''): self.instructionsURI = instructionsURI self.logger = logging.getLogger('sasi_runner_gui') self.logger.addHandler(logging.StreamHandler()) def log_fn(msg): self.log_msg(msg) self.logger.addHandler(FnLogHandler(log_fn)) self.logger.setLevel(logging.DEBUG) self.selected_input_file = None self.selected_output_file = None self.frame = JFrame( "SASI Runner", defaultCloseOperation = WindowConstants.EXIT_ON_CLOSE, ) self.frame.size = (650, 600,) self.main_panel = JPanel() self.main_panel.layout = BoxLayout(self.main_panel, BoxLayout.Y_AXIS) self.frame.add(self.main_panel) self.top_panel = JPanel(SpringLayout()) self.top_panel.alignmentX = Component.CENTER_ALIGNMENT self.main_panel.add(self.top_panel) self.stageCounter = 1 def getStageLabel(txt): label = JLabel("%s. %s" % (self.stageCounter, txt)) self.stageCounter += 1 return label # Instructions link. self.top_panel.add(getStageLabel("Read the instructions:")) instructionsButton = JButton( ('<HTML><FONT color="#000099">' '<U>open instructions</U></FONT><HTML>'), actionPerformed=self.browseInstructions) instructionsButton.setHorizontalAlignment(SwingConstants.LEFT); instructionsButton.setBorderPainted(False); instructionsButton.setOpaque(False); instructionsButton.setBackground(Color.WHITE); instructionsButton.setToolTipText(self.instructionsURI); self.top_panel.add(instructionsButton) # 'Select input' elements. self.top_panel.add(getStageLabel( "Select a SASI .zip file or data folder:")) self.top_panel.add( JButton("Select input...", actionPerformed=self.openInputChooser)) # 'Select output' elements. self.top_panel.add(getStageLabel("Specify an output file:")) self.top_panel.add( JButton("Specify output...", actionPerformed=self.openOutputChooser)) # 'Set result fields' elements. result_fields = [ {'id': 'gear_id', 'label': 'Gear', 'selected': True, 'enabled': False}, {'id': 'substrate_id', 'label': 'Substrate', 'selected': True}, {'id': 'energy_id', 'label': 'Energy', 'selected': False}, {'id': 'feature_id', 'label': 'Feature', 'selected': False}, {'id': 'feature_category_id', 'label': 'Feature Category', 'selected': False} ] self.selected_result_fields = {} resolutionLabelPanel = JPanel(GridLayout(0,1)) resolutionLabelPanel.add(getStageLabel("Set result resolution:")) resolutionLabelPanel.add( JLabel(("<html><i>This sets the specificity with which<br>" "results will be grouped. Note that enabling<br>" "more fields can *greatly* increase resulting<br>" "output sizes and run times.</i>"))) #self.top_panel.add(getStageLabel("Set result resolution:")) self.top_panel.add(resolutionLabelPanel) checkPanel = JPanel(GridLayout(0, 1)) self.top_panel.add(checkPanel) self.resultFieldCheckBoxes = {} for result_field in result_fields: self.selected_result_fields.setdefault( result_field['id'], result_field['selected']) checkBox = JCheckBox( result_field['label'], result_field['selected']) checkBox.setEnabled(result_field.get('enabled', True)) checkBox.addItemListener(self) checkPanel.add(checkBox) self.resultFieldCheckBoxes[checkBox] = result_field # 'Run' elements. self.top_panel.add(getStageLabel("Run SASI: (this might take a while)")) self.run_button = JButton("Run...", actionPerformed=self.runSASI) self.top_panel.add(self.run_button) SpringUtilities.makeCompactGrid( self.top_panel, self.stageCounter - 1, 2, 6, 6, 6, 6) # Progress bar. self.progressBar = JProgressBar(0, 100) self.main_panel.add(self.progressBar) # Log panel. self.log_panel = JPanel() self.log_panel.alignmentX = Component.CENTER_ALIGNMENT self.log_panel.setBorder(EmptyBorder(10,10,10,10)) self.main_panel.add(self.log_panel) self.log_panel.setLayout(BorderLayout()) self.log = JTextArea() self.log.editable = False self.logScrollPane = JScrollPane(self.log) self.logScrollPane.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS) self.logScrollBar = self.logScrollPane.getVerticalScrollBar() self.log_panel.add(self.logScrollPane, BorderLayout.CENTER) # File selectors self.inputChooser = JFileChooser() self.inputChooser.fileSelectionMode = JFileChooser.FILES_AND_DIRECTORIES self.outputChooser = JFileChooser() defaultOutputFile = os.path.join(System.getProperty("user.home"), "sasi_project.zip") self.outputChooser.setSelectedFile(File(defaultOutputFile)); self.outputChooser.fileSelectionMode = JFileChooser.FILES_ONLY self.frame.setLocationRelativeTo(None) self.frame.visible = True def browseInstructions(self, event): """ Open a browser to the instructions page. """ browseURI(self.instructionsURI) def itemStateChanged(self, event): """ Listen for checkbox changes. """ checkBox = event.getItemSelectable() is_selected = (event.getStateChange() == ItemEvent.SELECTED) result_field = self.resultFieldCheckBoxes[checkBox] self.selected_result_fields[result_field['id']] = is_selected def log_msg(self, msg): """ Print message to log and scroll to bottom. """ self.log.append(msg + "\n") self.log.setCaretPosition(self.log.getDocument().getLength()) def openInputChooser(self, event): ret = self.inputChooser.showOpenDialog(self.frame) if ret == JFileChooser.APPROVE_OPTION: self.selected_input_file = self.inputChooser.selectedFile self.log_msg("Selected '%s' as input." % self.selected_input_file.path) def openOutputChooser(self, event): ret = self.outputChooser.showSaveDialog(self.frame) if ret == JFileChooser.APPROVE_OPTION: selectedPath = self.outputChooser.selectedFile.path if not selectedPath.endswith('.zip'): zipPath = selectedPath + '.zip' self.outputChooser.setSelectedFile(File(zipPath)) self.selected_output_file = self.outputChooser.selectedFile self.log_msg( "Selected '%s' as output." % self.selected_output_file.path) def runSASI(self, event): try: self.validateParameters() except Exception as e: self.log_msg("ERROR: '%s'" % e) # Run task in a separate thread, so that log # messages will be shown as task progresses. def run_task(): self.tmp_dir = tempfile.mkdtemp(prefix="sasi_runner.") self.db_file = os.path.join(self.tmp_dir, "sasi_runner.db") self.progressBar.setValue(0) self.progressBar.setIndeterminate(True) def get_connection(): engine = create_engine('h2+zxjdbc:////%s' % self.db_file) con = engine.connect() return con try: # Set result fields. result_fields = [] for field_id, is_selected in self.selected_result_fields.items(): if is_selected: result_fields.append(field_id) task = RunSasiTask( input_path=self.selected_input_file.path, output_file=self.selected_output_file.path, logger=self.logger, get_connection=get_connection, config={ 'result_fields': result_fields, 'run_model': { 'run': { 'batch_size': 'auto', } }, 'output': { 'batch_size': 'auto', }, } ) task.call() except Exception as e: self.logger.exception("Could not complete task") self.progressBar.setIndeterminate(False) self.progressBar.setValue(100) try: shutil.rmtree(self.tmp_dir) except: pass Thread(target=run_task).start() def validateParameters(self): return True
csvFile.write("Off") # Notify the writer of the end of this detail record csvFile.endRecord() csvFile.flush() print "Entry", entry.getId(), "written" # Now do the actual work here # Create output file. # Unless modified here, this will create the output file in the same # location as the roster itself. # Default behaviour is for this to be in the user preferences directory fc = JFileChooser() fc.setSelectedFile(java.io.File(outFile)) ret = fc.showSaveDialog(None) if ret == JFileChooser.APPROVE_OPTION: # We've got a valid filename outFile = fc.getSelectedFile().toString() print "Output file:", outFile csvFile = com.csvreader.CsvWriter(java.io.BufferedOutputStream(java.io.FileOutputStream(outFile)),',',java.nio.charset.Charset.defaultCharset()) # Output the header if required if outputHeader==True: writeHeader(csvFile) # Output details writeDetails(csvFile) # Flush the write buffer and close the file csvFile.flush()
class BurpExtender(IBurpExtender, ITab, IMessageEditorController, AbstractTableModel, IContextMenuFactory): def registerExtenderCallbacks(self, callbacks): # keep a reference to our callbacks object self._callbacks = callbacks # obtain an extension helpers object self._helpers = callbacks.getHelpers() # set our extension name callbacks.setExtensionName("PT Vulnerabilities Manager") self.config = SafeConfigParser() self.createSection('projects') self.createSection('general') self.config.read('config.ini') self.chooser = JFileChooser() # create the log and a lock on which to synchronize when adding log entries self._log = ArrayList() self._lock = Lock() self.logTable = Table(self) self.logTable.getColumnModel().getColumn(0).setMaxWidth(35) self.logTable.getColumnModel().getColumn(1).setMinWidth(100) self._requestViewer = self._callbacks.createMessageEditor(self, False) self._responseViewer = self._callbacks.createMessageEditor(self, False) self.initVulnerabilityTab() self.initProjSettingsTab() self.initTabs() self.initCallbacks() if self.projPath.getText() != None: self.loadVulnerabilities(self.projPath.getText()) print "Thank you for installing PT Vulnerabilities Manager v1.0 extension" print "by Barak Tawily\n\n\n" print "Disclaimer:\nThis extension might create folders and files in your hardisk which might be declared as sensitive information, make sure you are creating projects under encrypted partition" return def initVulnerabilityTab(self): # ## init vulnerability tab # nameLabel = JLabel("Vulnerability Name:") nameLabel.setBounds(10, 10, 140, 30) self.addButton = JButton("Add",actionPerformed=self.addVuln) self.addButton.setBounds(10, 500, 100, 30) rmVulnButton = JButton("Remove",actionPerformed=self.rmVuln) rmVulnButton.setBounds(465, 500, 100, 30) mitigationLabel = JLabel("Mitigation:") mitigationLabel.setBounds(10, 290, 150, 30) addSSBtn = JButton("Add SS",actionPerformed=self.addSS) addSSBtn.setBounds(750, 40, 110, 30) deleteSSBtn = JButton("Remove SS",actionPerformed=self.removeSS) deleteSSBtn.setBounds(750, 75, 110, 30) piclistLabel = JLabel("Images list:") piclistLabel.setBounds(580, 10, 140, 30) self.screenshotsList = DefaultListModel() self.ssList = JList(self.screenshotsList) self.ssList.setBounds(580, 40, 150, 250) self.ssList.addListSelectionListener(ssChangedHandler(self)) self.ssList.setBorder(BorderFactory.createLineBorder(Color.GRAY)) previewPicLabel = JLabel("Selected image preview: (click to open in image viewer)") previewPicLabel.setBounds(580, 290, 500, 30) copyImgMenu = JMenuItem("Copy") copyImgMenu.addActionListener(copyImg(self)) self.imgMenu = JPopupMenu("Popup") self.imgMenu.add(copyImgMenu) self.firstPic = JLabel() self.firstPic.setBorder(BorderFactory.createLineBorder(Color.GRAY)) self.firstPic.setBounds(580, 320, 550, 400) self.firstPic.addMouseListener(imageClicked(self)) self.vulnName = JTextField("") self.vulnName.getDocument().addDocumentListener(vulnTextChanged(self)) self.vulnName.setBounds(140, 10, 422, 30) sevirities = ["Unclassified", "Critical","High","Medium","Low"] self.threatLevel = JComboBox(sevirities); self.threatLevel.setBounds(140, 45, 140, 30) colors = ["Color:", "Green", "Red"] self.colorCombo = JComboBox(colors); self.colorCombo.setBounds(465, 45, 100, 30) self.colorCombo severityLabel = JLabel("Threat Level:") severityLabel.setBounds(10, 45, 100, 30) descriptionLabel = JLabel("Description:") descriptionLabel.setBounds(10, 80, 100, 30) self.descriptionString = JTextArea("", 5, 30) self.descriptionString.setWrapStyleWord(True); self.descriptionString.setLineWrap(True) self.descriptionString.setBounds(10, 110, 555, 175) descriptionStringScroll = JScrollPane(self.descriptionString) descriptionStringScroll.setBounds(10, 110, 555, 175) descriptionStringScroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED) self.mitigationStr = JTextArea("", 5, 30) self.mitigationStr.setWrapStyleWord(True); self.mitigationStr.setLineWrap(True) self.mitigationStr.setBounds(10, 320, 555, 175) mitigationStrScroll = JScrollPane(self.mitigationStr) mitigationStrScroll.setBounds(10, 320, 555, 175) mitigationStrScroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED) self.pnl = JPanel() self.pnl.setBounds(0, 0, 1000, 1000); self.pnl.setLayout(None); self.pnl.add(addSSBtn) self.pnl.add(piclistLabel) self.pnl.add(nameLabel) self.pnl.add(deleteSSBtn) self.pnl.add(rmVulnButton) self.pnl.add(severityLabel) self.pnl.add(mitigationLabel) self.pnl.add(descriptionLabel) self.pnl.add(previewPicLabel) self.pnl.add(mitigationStrScroll) self.pnl.add(descriptionStringScroll) self.pnl.add(self.ssList) self.pnl.add(self.firstPic) self.pnl.add(self.addButton) self.pnl.add(self.vulnName) self.pnl.add(self.threatLevel) self.pnl.add(self.colorCombo) def initProjSettingsTab(self): # init project settings projNameLabel = JLabel("Name:") projNameLabel.setBounds(10, 50, 140, 30) self.projName = JTextField("") self.projName.setBounds(140, 50, 320, 30) self.projName.getDocument().addDocumentListener(projTextChanged(self)) detailsLabel = JLabel("Details:") detailsLabel.setBounds(10, 120, 140, 30) reportLabel = JLabel("Generate Report:") reportLabel.setBounds(10, 375, 140, 30) types = ["DOCX","HTML","XLSX"] self.reportType = JComboBox(types) self.reportType.setBounds(10, 400, 140, 30) generateReportButton = JButton("Generate", actionPerformed=self.generateReport) generateReportButton.setBounds(160, 400, 90, 30) self.projDetails = JTextArea("", 5, 30) self.projDetails.setWrapStyleWord(True); self.projDetails.setLineWrap(True) projDetailsScroll = JScrollPane(self.projDetails) projDetailsScroll.setBounds(10, 150, 450, 175) projDetailsScroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED) projPathLabel = JLabel("Path:") projPathLabel.setBounds(10, 90, 140, 30) self.projPath = JTextField("") self.projPath.setBounds(140, 90, 320, 30) chooseProjPathButton = JButton("Browse...",actionPerformed=self.chooseProjPath) chooseProjPathButton.setBounds(470, 90, 100, 30) importProjButton = JButton("Import",actionPerformed=self.importProj) importProjButton.setBounds(470, 10, 100, 30) exportProjButton = JButton("Export",actionPerformed=self.exportProj) exportProjButton.setBounds(575, 10, 100, 30) openProjButton = JButton("Open Directory",actionPerformed=self.openProj) openProjButton.setBounds(680, 10, 130, 30) currentProjectLabel = JLabel("Current:") currentProjectLabel.setBounds(10, 10, 140, 30) projects = self.config.options('projects') self.currentProject = JComboBox(projects) self.currentProject.addActionListener(projectChangeHandler(self)) self.currentProject.setBounds(140, 10, 140, 30) self.autoSave = JCheckBox("Auto Save Mode") self.autoSave.setEnabled(False) # implement this feature self.autoSave.setBounds(300, 10, 140, 30) self.autoSave.setToolTipText("Will save any changed value while focus is out") addProjButton = JButton("Add / Update",actionPerformed=self.addProj) addProjButton.setBounds(10, 330, 150, 30) removeProjButton = JButton("Remove Current",actionPerformed=self.rmProj) removeProjButton.setBounds(315, 330, 146, 30) generalOptions = self.config.options('general') if 'default project' in generalOptions: defaultProj = self.config.get('general','default project') self.currentProject.getModel().setSelectedItem(defaultProj) self.projPath.setText(self.config.get('projects',self.currentProject.getSelectedItem())) self.clearProjTab = True self.projectSettings = JPanel() self.projectSettings.setBounds(0, 0, 1000, 1000) self.projectSettings.setLayout(None) self.projectSettings.add(reportLabel) self.projectSettings.add(detailsLabel) self.projectSettings.add(projPathLabel) self.projectSettings.add(addProjButton) self.projectSettings.add(openProjButton) self.projectSettings.add(projNameLabel) self.projectSettings.add(projDetailsScroll) self.projectSettings.add(importProjButton) self.projectSettings.add(exportProjButton) self.projectSettings.add(removeProjButton) self.projectSettings.add(generateReportButton) self.projectSettings.add(chooseProjPathButton) self.projectSettings.add(currentProjectLabel) self.projectSettings.add(self.projPath) self.projectSettings.add(self.autoSave) self.projectSettings.add(self.projName) self.projectSettings.add(self.reportType) self.projectSettings.add(self.currentProject) def initTabs(self): # ## init autorize tabs # self._splitpane = JSplitPane(JSplitPane.HORIZONTAL_SPLIT) self.scrollPane = JScrollPane(self.logTable) self._splitpane.setLeftComponent(self.scrollPane) colorsMenu = JMenu("Paint") redMenu = JMenuItem("Red") noneMenu = JMenuItem("None") greenMenu = JMenuItem("Green") redMenu.addActionListener(paintChange(self, "Red")) noneMenu.addActionListener(paintChange(self, None)) greenMenu.addActionListener(paintChange(self, "Green")) colorsMenu.add(redMenu) colorsMenu.add(noneMenu) colorsMenu.add(greenMenu) self.menu = JPopupMenu("Popup") self.menu.add(colorsMenu) self.tabs = JTabbedPane() self.tabs.addTab("Request", self._requestViewer.getComponent()) self.tabs.addTab("Response", self._responseViewer.getComponent()) self.tabs.addTab("Vulnerability", self.pnl) self.tabs.addTab("Project Settings", self.projectSettings) self.tabs.setSelectedIndex(2) self._splitpane.setRightComponent(self.tabs) def initCallbacks(self): # ## init callbacks # # customize our UI components self._callbacks.customizeUiComponent(self._splitpane) self._callbacks.customizeUiComponent(self.logTable) self._callbacks.customizeUiComponent(self.scrollPane) self._callbacks.customizeUiComponent(self.tabs) self._callbacks.registerContextMenuFactory(self) # add the custom tab to Burp's UI self._callbacks.addSuiteTab(self) def loadVulnerabilities(self, projPath): self.clearList(None) selected = False for root, dirs, files in os.walk(projPath): # make it go only for dirs for dirName in dirs: xmlPath = projPath+"/"+dirName+"/vulnerability.xml" # xmlPath = xmlPath.replace("/","//") document = self.getXMLDoc(xmlPath) nodeList = document.getDocumentElement().getChildNodes() vulnName = nodeList.item(0).getTextContent() severity = nodeList.item(1).getTextContent() description = nodeList.item(2).getTextContent() mitigation = nodeList.item(3).getTextContent() color = nodeList.item(4).getTextContent() test = vulnerability(vulnName,severity,description,mitigation,color) self._lock.acquire() row = self._log.size() self._log.add(test) self.fireTableRowsInserted(row, row) self._lock.release() if vulnName == self.vulnName.getText(): self.logTable.setRowSelectionInterval(row,row) selected = True if selected == False and self._log.size() > 0: self.logTable.setRowSelectionInterval(0, 0) self.loadVulnerability(self._log.get(0)) def createSection(self, sectioName): self.config.read('config.ini') if not (sectioName in self.config.sections()): self.config.add_section(sectioName) cfgfile = open("config.ini",'w') self.config.write(cfgfile) cfgfile.close() def saveCfg(self): f = open('config.ini', 'w') self.config.write(f) f.close() def getXMLDoc(self, xmlPath): try: document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(xmlPath) return document except: self._extender.popup("XML file not found") return def saveXMLDoc(self, doc, xmlPath): transformerFactory = TransformerFactory.newInstance() transformer = transformerFactory.newTransformer() source = DOMSource(doc) result = StreamResult(File(xmlPath)) transformer.transform(source, result) def generateReport(self,event): if self.reportType.getSelectedItem() == "HTML": path = self.reportToHTML() if self.reportType.getSelectedItem() == "XLSX": path = self.reportToXLS() if self.reportType.getSelectedItem() == "DOCX": path = self.generateReportFromDocxTemplate('template.docx',"newfile.docx", 'word/document.xml') n = JOptionPane.showConfirmDialog(None, "Report generated successfuly:\n%s\nWould you like to open it?" % (path), "PT Manager", JOptionPane.YES_NO_OPTION) if n == JOptionPane.YES_OPTION: os.system('"' + path + '"') # Bug! stucking burp until the file get closed def exportProj(self,event): self.chooser.setDialogTitle("Save project") Ffilter = FileNameExtensionFilter("Zip files", ["zip"]) self.chooser.setFileFilter(Ffilter) returnVal = self.chooser.showSaveDialog(None) if returnVal == JFileChooser.APPROVE_OPTION: dst = str(self.chooser.getSelectedFile()) shutil.make_archive(dst,"zip",self.getCurrentProjPath()) self.popup("Project export successfuly") def importProj(self,event): self.chooser.setDialogTitle("Select project zip to directory") Ffilter = FileNameExtensionFilter("Zip files", ["zip"]) self.chooser.setFileFilter(Ffilter) returnVal = self.chooser.showOpenDialog(None) if returnVal == JFileChooser.APPROVE_OPTION: zipPath = str(self.chooser.getSelectedFile()) self.chooser.setDialogTitle("Select project directory") self.chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY) returnVal = self.chooser.showOpenDialog(None) if returnVal == JFileChooser.APPROVE_OPTION: projPath = str(self.chooser.getSelectedFile()) + "/PTManager" with zipfile.ZipFile(zipPath, "r") as z: z.extractall(projPath) xmlPath = projPath + "/project.xml" document = self.getXMLDoc(xmlPath) nodeList = document.getDocumentElement().getChildNodes() projName = nodeList.item(0).getTextContent() nodeList.item(1).setTextContent(projPath) self.saveXMLDoc(document, xmlPath) self.config.set('projects', projName, projPath) self.saveCfg() self.reloadProjects() self.currentProject.getModel().setSelectedItem(projName) self.clearVulnerabilityTab() def reportToXLS(self): if not xlsxwriterImported: self.popup("xlsxwriter library is not imported") return workbook = xlsxwriter.Workbook(self.getCurrentProjPath() + '/PT Manager Report.xlsx') worksheet = workbook.add_worksheet() bold = workbook.add_format({'bold': True}) worksheet.write(0, 0, "Vulnerability Name", bold) worksheet.write(0, 1, "Threat Level", bold) worksheet.write(0, 2, "Description", bold) worksheet.write(0, 3, "Mitigation", bold) row = 1 for i in range(0,self._log.size()): worksheet.write(row, 0, self._log.get(i).getName()) worksheet.write(row, 1, self._log.get(i).getSeverity()) worksheet.write(row, 2, self._log.get(i).getDescription()) worksheet.write(row, 3, self._log.get(i).getMitigation()) row = row + 1 # add requests and images as well workbook.close() return self.getCurrentProjPath() + '/PT Manager Report.xlsx' def reportToHTML(self): htmlContent = """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="he" dir="ltr"> <head> <title>PT Manager Report</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <style> body { background-repeat: no-repeat; background-attachment: fixed; font-family: Arial,Tahoma,sens-serif; font-size: 13px; margin: auto; } #warpcenter { width: 900px; margin: 0px auto; } table { border: 2px dashed #000000; } td { border-top: 2px dashed #000000; padding: 10px; } img { border: 0px; } </style> <script language="javascript"> function divHideShow(divToHideOrShow) { var div = document.getElementById(divToHideOrShow); if (div.style.display == "block") { div.style.display = "none"; } else { div.style.display = "block"; } } </script> </head> <body> <div id="warpcenter"> <h1> PT Manager Report </h1> <h2> Project: %s</h1> """ % (self.projName.getText()) for i in range(0,self._log.size()): name = self._log.get(i).getName() request = "None" response = "None" path = self.getVulnReqResPath("request",name) if os.path.exists(path): request = self.newlineToBR(self.getFileContent(path)) path = self.getVulnReqResPath("response",name) if os.path.exists(path): response = self.newlineToBR(self.getFileContent(path)) images = "" for fileName in os.listdir(self.projPath.getText()+"/"+self.clearStr(name)): if fileName.endswith(".jpg"): images += "%s<br><img src=\"%s\"><br><br>" % (fileName, self.projPath.getText()+"/"+self.clearStr(name) + "/" + fileName) description = self.newlineToBR(self._log.get(i).getDescription()) mitigation = self.newlineToBR(self._log.get(i).getMitigation()) htmlContent += self.convertVulntoTable(i,name,self._log.get(i).getSeverity(), description,mitigation, request, response, images) htmlContent += "</div></body></html>" f = open(self.getCurrentProjPath() + '/PT Manager Report.html', 'w') f.writelines(htmlContent) f.close() return self.getCurrentProjPath() + '/PT Manager Report.html' def newlineToBR(self,string): return "<br />".join(string.split("\n")) def getFileContent(self,path): f = open(path, "rb") content = f.read() f.close() return content def convertVulntoTable(self, number, name, severity, description, mitigation, request = "None", response = "None", images = "None"): return """<div style="width: 100%%;height: 30px;text-align: center;background-color:#E0E0E0;font-size: 17px;font-weight: bold;color: #000;padding-top: 10px;">%s <a href="javascript:divHideShow('Table_%s');" style="color:#191970">(OPEN / CLOSE)</a></div> <div id="Table_%s" style="display: none;"> <table width="100%%" cellspacing="0" cellpadding="0" style="margin: 0px auto;text-align: left;border-top: 0px;"> <tr> <td> <div style="font-size: 16px;font-weight: bold;"> <span style="color:#000000">Threat Level: </span> <span style="color:#8b8989">%s</span> </td> </tr> <tr> <td> <div style="font-size: 16px;font-weight: bold;"> <span style="color:#000000">Description</span> <a href="javascript:divHideShow('Table_%s_Command_03');" style="color:#191970">OPEN / CLOSE >>></a> </div> <div id="Table_%s_Command_03" style="display: none;margin-top: 25px;"> %s </div> </td> </tr> <tr> <td> <div style="font-size: 16px;font-weight: bold;"> <span style="color:#000000">Mitigration</span> <a href="javascript:divHideShow('Table_%s_Command_04');" style="color:#191970">OPEN / CLOSE >>></a> </div> <div id="Table_%s_Command_04" style="display: none;margin-top: 25px;"> %s <b> </td> </tr> <tr> <td> <div style="font-size: 16px;font-weight: bold;"> <span style="color:#000000">Request</span> <a href="javascript:divHideShow('Table_%s_Command_05');" style="color:#191970">OPEN / CLOSE >>></a> </div> <div id="Table_%s_Command_05" style="display: none;margin-top: 25px;"> %s <b> </td> </tr> <tr> <td> <div style="font-size: 16px;font-weight: bold;"> <span style="color:#000000">Response</span> <a href="javascript:divHideShow('Table_%s_Command_06');" style="color:#191970">OPEN / CLOSE >>></a> </div> <div id="Table_%s_Command_06" style="display: none;margin-top: 25px;"> %s <b> </td> </tr> <tr> <td> <div style="font-size: 16px;font-weight: bold;"> <span style="color:#000000">Images</span> <a href="javascript:divHideShow('Table_%s_Command_07');" style="color:#191970">OPEN / CLOSE >>></a> </div> <div id="Table_%s_Command_07" style="display: none;margin-top: 25px;"> %s <b> </td> </tr> </table> </div><br><br>""" % (name,number,number,severity,number,number,description,number,number,mitigation,number,number,request,number,number,response,number,number,images) def clearVulnerabilityTab(self, rmVuln=True): if rmVuln: self.vulnName.setText("") self.descriptionString.setText("") self.mitigationStr.setText("") self.colorCombo.setSelectedIndex(0) self.threatLevel.setSelectedIndex(0) self.screenshotsList.clear() self.addButton.setText("Add") self.firstPic.setIcon(None) def saveRequestResponse(self, type, requestResponse, vulnName): path = self.getVulnReqResPath(type,vulnName) f = open(path, 'wb') f.write(requestResponse) f.close() def openProj(self, event): os.system('explorer ' + self.projPath.getText()) def getVulnReqResPath(self, requestOrResponse, vulnName): return self.getCurrentProjPath() + "/" + self.clearStr(vulnName) + "/"+requestOrResponse+"_" + self.clearStr(vulnName) def htmlEscape(self,data): return data.replace('&', '&').replace('<', '<').replace('>', '>').replace('"', '"').replace("'", ''') def generateReportFromDocxTemplate(self, zipname, newZipName, filename): newZipName = self.getCurrentProjPath() + "/" + newZipName with zipfile.ZipFile(zipname, 'r') as zin: with zipfile.ZipFile(newZipName, 'w') as zout: zout.comment = zin.comment for item in zin.infolist(): if item.filename != filename: zout.writestr(item, zin.read(item.filename)) else: xml_content = zin.read(item.filename) result = re.findall("(.*)<w:body>(?:.*)<\/w:body>(.*)",xml_content)[0] newXML = result[0] templateBody = re.findall("<w:body>(.*)<\/w:body>", xml_content)[0] newBody = "" for i in range(0,self._log.size()): tmp = templateBody tmp = tmp.replace("$vulnerability", self.htmlEscape(self._log.get(i).getName())) tmp = tmp.replace("$severity", self.htmlEscape(self._log.get(i).getSeverity())) tmp = tmp.replace("$description", self.htmlEscape(self._log.get(i).getDescription())) tmp = tmp.replace("$mitigation", self.htmlEscape(self._log.get(i).getMitigation())) newBody = newBody + tmp newXML = newXML + newBody newXML = newXML + result[1] with zipfile.ZipFile(newZipName, mode='a', compression=zipfile.ZIP_DEFLATED) as zf: zf.writestr(filename, newXML) return newZipName def chooseProjPath(self, event): self.chooser.setDialogTitle("Select target directory") self.chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY) returnVal = self.chooser.showOpenDialog(None) if returnVal == JFileChooser.APPROVE_OPTION: projPath = str(self.chooser.getSelectedFile()) + "/PTManager" os.makedirs(projPath) self.projPath.setText(projPath) def reloadProjects(self): self.currentProject.setModel(DefaultComboBoxModel(self.config.options('projects'))) def rmProj(self, event): if self.popUpAreYouSure() == JOptionPane.YES_OPTION: self._requestViewer.setMessage("None", False) self._responseViewer.setMessage("None", False) shutil.rmtree(self.projPath.getText()) self.config.remove_option('projects',self.currentProject.getSelectedItem()) self.reloadProjects() self.currentProject.setSelectedIndex(0) self.loadVulnerabilities(self.projPath.getText()) def popup(self,msg): JOptionPane.showMessageDialog(None,msg) def addProj(self, event): projPath = self.projPath.getText() if projPath == None or projPath == "": self.popup("Please select path") return self.config.set('projects', self.projName.getText(), projPath) self.saveCfg() xml = ET.Element('project') name = ET.SubElement(xml, "name") path = ET.SubElement(xml, "path") details = ET.SubElement(xml, "details") autoSaveMode = ET.SubElement(xml, "autoSaveMode") name.text = self.projName.getText() path.text = projPath details.text = self.projDetails.getText() autoSaveMode.text = str(self.autoSave.isSelected()) tree = ET.ElementTree(xml) try: tree.write(self.getCurrentProjPath()+'/project.xml') except: self.popup("Invalid path") return self.reloadProjects() self.clearVulnerabilityTab() self.clearList(None) self.currentProject.getModel().setSelectedItem(self.projName.getText()) def resize(self, image, width, height): bi = BufferedImage(width, height, BufferedImage.TRANSLUCENT) g2d = bi.createGraphics() g2d.addRenderingHints(RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY)) g2d.drawImage(image, 0, 0, width, height, None) g2d.dispose() return bi; def clearStr(self, var): return var.replace(" " , "_").replace("\\" , "").replace("/" , "").replace(":" , "").replace("*" , "").replace("?" , "").replace("\"" , "").replace("<" , "").replace(">" , "").replace("|" , "").replace("(" , "").replace(")" , "") def popUpAreYouSure(self): dialogResult = JOptionPane.showConfirmDialog(None,"Are you sure?","Warning",JOptionPane.YES_NO_OPTION) if dialogResult == 0: return 0 return 1 def removeSS(self,event): if self.popUpAreYouSure() == JOptionPane.YES_OPTION: os.remove(self.getCurrentVulnPath() + "/" + self.ssList.getSelectedValue()) self.ssList.getModel().remove(self.ssList.getSelectedIndex()) self.firstPic.setIcon(ImageIcon(None)) # check if there is images and select the first one # bug in linux def addSS(self,event): clipboard = Toolkit.getDefaultToolkit().getSystemClipboard() try: image = clipboard.getData(DataFlavor.imageFlavor) except: self.popup("Clipboard not contains image") return vulnPath = self.projPath.getText() + "/" + self.clearStr(self.vulnName.getText()) if not os.path.exists(vulnPath): os.makedirs(vulnPath) name = self.clearStr(self.vulnName.getText()) + str(random.randint(1, 99999))+".jpg" fileName = self.projPath.getText()+"/"+ self.clearStr(self.vulnName.getText()) + "/" + name file = File(fileName) bufferedImage = BufferedImage(image.getWidth(None), image.getHeight(None), BufferedImage.TYPE_INT_RGB); g = bufferedImage.createGraphics(); g.drawImage(image, 0, 0, bufferedImage.getWidth(), bufferedImage.getHeight(), Color.WHITE, None); ImageIO.write(bufferedImage, "jpg", file) self.addVuln(self) self.ssList.setSelectedValue(name,True) def rmVuln(self, event): if self.popUpAreYouSure() == JOptionPane.YES_OPTION: self._requestViewer.setMessage("None", False) self._responseViewer.setMessage("None", False) shutil.rmtree(self.getCurrentVulnPath()) self.clearVulnerabilityTab() self.loadVulnerabilities(self.getCurrentProjPath()) def addVuln(self, event): if self.colorCombo.getSelectedItem() == "Color:": colorTxt = None else: colorTxt = self.colorCombo.getSelectedItem() self._lock.acquire() row = self._log.size() vulnObject = vulnerability(self.vulnName.getText(),self.threatLevel.getSelectedItem(),self.descriptionString.getText(),self.mitigationStr.getText() ,colorTxt) self._log.add(vulnObject) self.fireTableRowsInserted(row, row) self._lock.release() vulnPath = self.projPath.getText() + "/" + self.clearStr(self.vulnName.getText()) if not os.path.exists(vulnPath): os.makedirs(vulnPath) xml = ET.Element('vulnerability') name = ET.SubElement(xml, "name") severity = ET.SubElement(xml, "severity") description = ET.SubElement(xml, "description") mitigation = ET.SubElement(xml, "mitigation") color = ET.SubElement(xml, "color") name.text = self.vulnName.getText() severity.text = self.threatLevel.getSelectedItem() description.text = self.descriptionString.getText() mitigation.text = self.mitigationStr.getText() color.text = colorTxt tree = ET.ElementTree(xml) tree.write(vulnPath+'/vulnerability.xml') self.loadVulnerabilities(self.getCurrentProjPath()) self.loadVulnerability(vulnObject) def vulnNameChanged(self): if os.path.exists(self.getCurrentVulnPath()) and self.vulnName.getText() != "": self.addButton.setText("Update") elif self.addButton.getText() != "Add": options = ["Create a new vulnerability", "Change current vulnerability name"] n = JOptionPane.showOptionDialog(None, "Would you like to?", "Vulnerability Name", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, None, options, options[0]); if n == 0: self.clearVulnerabilityTab(False) self.addButton.setText("Add") else: newName = JOptionPane.showInputDialog( None, "Enter new name:", "Vulnerability Name", JOptionPane.PLAIN_MESSAGE, None, None, self.vulnName.getText()) row = self.logTable.getSelectedRow() old = self.logTable.getValueAt(row,1) self.changeVulnName(newName,old) def changeVulnName(self,new,old): newpath = self.getCurrentProjPath() + "/" + new oldpath = self.getCurrentProjPath() + "/" + old os.rename(oldpath,newpath) self.changeCurrentVuln(new,0, newpath + "/vulnerability.xml") def getCurrentVulnPath(self): return self.projPath.getText() + "/" + self.clearStr(self.vulnName.getText()) def getCurrentProjPath(self): return self.projPath.getText() def loadSS(self, imgPath): image = ImageIO.read(File(imgPath)) if image.getWidth() <= 550 and image.getHeight() <= 400: self.firstPic.setIcon(ImageIcon(image)) self.firstPic.setSize(image.getWidth(),image.getHeight()) else: self.firstPic.setIcon(ImageIcon(self.resize(image,550, 400))) self.firstPic.setSize(550,400) def clearProjectTab(self): self.projPath.setText("") self.projDetails.setText("") def clearList(self, event): self._lock.acquire() self._log = ArrayList() row = self._log.size() self.fireTableRowsInserted(row, row) self._lock.release() # # implement IContextMenuFactory # def createMenuItems(self, invocation): responses = invocation.getSelectedMessages(); if responses > 0: ret = LinkedList() requestMenuItem = JMenuItem("Send to PT Manager"); requestMenuItem.addActionListener(handleMenuItems(self,responses[0], "request")) ret.add(requestMenuItem); return(ret); return null; # # implement ITab # def getTabCaption(self): return "PT Manager" def getUiComponent(self): return self._splitpane # # extend AbstractTableModel # def getRowCount(self): try: return self._log.size() except: return 0 def getColumnCount(self): return 3 def getColumnName(self, columnIndex): if columnIndex == 0: return "#" if columnIndex == 1: return "Vulnerability Name" if columnIndex == 2: return "Threat Level" return "" def getValueAt(self, rowIndex, columnIndex): vulnObject = self._log.get(rowIndex) if columnIndex == 0: return rowIndex+1 if columnIndex == 1: return vulnObject.getName() if columnIndex == 2: return vulnObject.getSeverity() if columnIndex == 3: return vulnObject.getMitigation() if columnIndex == 4: return vulnObject.getColor() return "" def changeCurrentVuln(self,value,fieldNumber, xmlPath = "def"): if xmlPath == "def": xmlPath = self.getCurrentVulnPath() + "/vulnerability.xml" document = self.getXMLDoc(xmlPath) nodeList = document.getDocumentElement().getChildNodes() nodeList.item(fieldNumber).setTextContent(value) self.saveXMLDoc(document, xmlPath) self.loadVulnerabilities(self.getCurrentProjPath()) def loadVulnerability(self, vulnObject): self.addButton.setText("Update") self.vulnName.setText(vulnObject.getName()) self.threatLevel.setSelectedItem(vulnObject.getSeverity()) self.descriptionString.setText(vulnObject.getDescription()) self.mitigationStr.setText(vulnObject.getMitigation()) if vulnObject.getColor() == "" or vulnObject.getColor() == None: self.colorCombo.setSelectedItem("Color:") else: self.colorCombo.setSelectedItem(vulnObject.getColor()) self.screenshotsList.clear() for fileName in os.listdir(self.projPath.getText()+"/"+self.clearStr(vulnObject.getName())): if fileName.endswith(".jpg"): self.screenshotsList.addElement(fileName) imgPath = self.projPath.getText()+"/"+self.clearStr(vulnObject.getName())+'/'+fileName # imgPath = imgPath.replace("/","//") self.loadSS(imgPath) if (self.screenshotsList.getSize() == 0): self.firstPic.setIcon(None) else: self.ssList.setSelectedIndex(0) path = self.getVulnReqResPath("request",vulnObject.getName()) if os.path.exists(path): f = self.getFileContent(path) self._requestViewer.setMessage(f, False) else: self._requestViewer.setMessage("None", False) path = self.getVulnReqResPath("response",vulnObject.getName()) if os.path.exists(path): f = self.getFileContent(path) self._responseViewer.setMessage(f, False) else: self._responseViewer.setMessage("None", False)
class SettingsTableFrame(JFrame): def __init__(self, *args, **kwargs): # do not create any class members before calling JFrame.__init__ ! s, size, title, savemode = None, None, None, False self.OKstatus = True if 'settings_config' in kwargs: s = kwargs.pop('settings_config') else: s = None if 'size' in kwargs: size = kwargs.pop('size') else: size = (300, 300) if 'widget' in kwargs: widget = kwargs.pop('widget') else: widget = None if 'savemode' in kwargs: savemode = kwargs.pop('savemode') defaultdir = None if 'defaultdir' in kwargs: defaultdir = kwargs.pop('defaultdir') if len(args) > 0: title = args[0] else: title = 'Save Settings' JFrame.__init__(self, title, size=size, **kwargs) self.widget = widget if self.widget == None: print "Need to pass keyword argument widget=widget when creating SettingsTableFrame" self.s = s self.savemode = savemode self.defaultdir = defaultdir # create FileChooser, make its window bigger and choose smaller font if self.defaultdir != None: self.fc = JFileChooser(self.defaultdir) else: self.fc = JFileChooser() self.fc.setPreferredSize(Dimension(800, 600)) smallfont = Font("Lucida Sans", Font.PLAIN, 12) SetFontRecursively(self.fc.getComponents(), smallfont) filefilter = FileNameExtensionFilter("Settings Files", (DEFAULT_EXTENSION, )) self.fc.setFileFilter(filefilter) # fill the table, in save mode only with the current values, in load mode with current and setting values self.prepare_tabledata() # if not savemode, we first pop up a filechooser to select a loadable setting if self.savemode == False: self.OKstatus = self.load_setting() if not self.OKstatus: return # listener for data edited by user, good for providing PV write access within the table to the user self.dataListener = MyTableModelListener(savemode=self.savemode) self.dataModel.addTableModelListener(self.dataListener) self.table = JTable(self.dataModel) # create Buttons self.bu_do_label = "Save" if self.savemode == True else "Load" self.bu_do_handler = self.bu_save_handler if self.savemode == True else self.bu_load_handler self.bu_do = JButton(self.bu_do_label, actionPerformed=self.bu_do_handler) self.bu_cancel = JButton("Cancel", actionPerformed=self.bu_cancel_handler) # BEGIN visual adaptations of JTable self.table.setRowHeight(24) self.table.getColumnModel().getColumn(0).setMinWidth(200) if self.savemode: self.table.getColumnModel().getColumn(3).setMaxWidth(60) else: self.table.getColumnModel().getColumn(4).setMaxWidth(60) smallfontr = MyTableCellRenderer(font=FONT_FAMILY, style=Font.PLAIN, fontsize=10) smallfontr.setHorizontalAlignment(JLabel.CENTER) bigfontplainr = MyTableCellRenderer(font=FONT_FAMILY, style=Font.PLAIN, fontsize=18) bigfontplainr.setHorizontalAlignment(JLabel.CENTER) bigfontr = MyTableCellRenderer(font=FONT_FAMILY, style=Font.BOLD, fontsize=18) bigfontr.setHorizontalAlignment(JLabel.CENTER) self.table.getColumnModel().getColumn(0).setCellRenderer(smallfontr) self.table.getColumnModel().getColumn(1).setCellRenderer(bigfontplainr) self.table.getColumnModel().getColumn(2).setCellRenderer(bigfontr) if not self.savemode: self.table.getColumnModel().getColumn(3).setCellRenderer(bigfontr) # END visual adaptations of JTable ## BEGIN layout of window (JFrame) self.getContentPane().setLayout(BorderLayout()) self.add(JScrollPane(self.table)) self.bottompanel = JPanel() self.bottompanel.setLayout( BoxLayout(self.bottompanel, BoxLayout.LINE_AXIS)) self.bottompanel.add(Box.createHorizontalGlue()) self.bottompanel.add(self.bu_do) self.bottompanel.add(Box.createRigidArea(Dimension(20, 0))) self.bottompanel.add(self.bu_cancel) self.bottompanel.add(Box.createHorizontalGlue()) self.add(self.bottompanel, BorderLayout.SOUTH) # END layout of window (JFrame) def bu_cancel_handler(self, event): self.dispose() def bu_save_handler(self, event): dlg_answer = self.fc.showSaveDialog(self) if dlg_answer == self.fc.CANCEL_OPTION: return if dlg_answer == self.fc.APPROVE_OPTION: # user clicked SAVE f = self.fc.getSelectedFile().getAbsolutePath() if not str(f).endswith("." + DEFAULT_EXTENSION): f = f + "." + DEFAULT_EXTENSION if os.path.exists( f): # file already exists, let user confirm overwriting choice = JOptionPane.showConfirmDialog( self, "The file exists, overwrite?", "Existing file", JOptionPane.YES_NO_CANCEL_OPTION) if choice in (JOptionPane.NO_OPTION, JOptionPane.CANCEL_OPTION): return if choice == JOptionPane.YES_OPTION: self.do_save(f) self.dispose() else: # file does not exist, yet -> don't need to ask self.do_save(f) self.dispose() def bu_load_handler(self, event): for i in range(self.dataModel.getRowCount()): if self.dataModel.getValueAt(i, RESTORE_COL_LOADMODE) == False: continue curval = self.dataModel.getValueAt(i, VALUE_COLUMN) setval = self.dataModel.getValueAt(i, SETTING_COLUMN) if curval == '---' or setval == '---': # either PV does not exist or value missing in the settings file continue pvname = self.dataModel.getValueAt(i, PV_COLUMN) writejob = BackgroundPVWriter(pvname, setval) writejob.schedule() self.dispose() def load_setting(self): dlg_answer = self.fc.showOpenDialog(self) if dlg_answer == self.fc.CANCEL_OPTION: return False if dlg_answer == self.fc.APPROVE_OPTION: f = self.fc.getSelectedFile().getAbsolutePath() self.parse_setting(f) return True def parse_setting(self, fpath): # compatible to old set files with open(fpath, "r") as f: idxset = set(range(self.dataModel.getRowCount())) #lbuf = [l for l in f] # need to create a file buffer to traverse twice through the file for l in f: if len(l) == 0 or l.startswith('#'): continue els = l.split() idstr = els[0] checkcolumn = ID_COLUMN for i in idxset: if self.dataModel.getValueAt(i, checkcolumn) == idstr: self.dataModel.setValueAt(els[1], i, SETTING_COLUMN) idxset.remove(i) # remove restore flag for PVs that were missing in the settings file for i in idxset: self.dataModel.setValueAt(False, i, RESTORE_COL_LOADMODE) def parse_setting_pvtable_format(self, fpath): with open(fpath, "r") as f: idxset = set(range(self.dataModel.getRowCount())) lbuf = [ l for l in f ] # need to create a file buffer to traverse twice through the file # parse ID PVNAME mappings if present mapping_header_found = False pv_to_id = dict() for l in lbuf: if not mapping_header_found: if l.startswith("### Mapping ID to PV"): mapping_header_found = True continue if not l.startswith("# "): continue els = l.split() idstr = els[1] pvstr = " ".join( els[2:] ) # tango PVs may contain blanks if additional parameters were included pv_to_id[pvstr] = idstr # second run through file: fill our table with values read from the file for l in lbuf: if len(l) == 0 or l.startswith('#'): continue els = l.split() # default to PVNAME comparison if no PVNAME->ID mapping exists idstr = els[0] checkcolumn = PV_COLUMN # check if mapping exists, and override if so if idstr in pv_to_id: idstr = pv_to_id[idstr] # (set idstr to the mapped ID) checkcolumn = ID_COLUMN # (tell the following code that ID_COLUMN has to be compared) for i in idxset: if self.dataModel.getValueAt(i, checkcolumn) == idstr: self.dataModel.setValueAt(els[1], i, SETTING_COLUMN) idxset.remove(i) # remove restore flag for PVs that were missing in the settings file for i in idxset: self.dataModel.setValueAt(False, i, RESTORE_COL_LOADMODE) def do_save(self, filepath): # creates something compatible to older set files now = datetime.datetime.now() with open(filepath, "w") as f: f.write("### ------------------------------------\n") f.write("### SETTING saved from CSS\n") f.write("### " + now.strftime("Date: %Y-%m-%d Time: %H:%M") + "\n") f.write("### ------------------------------------\n") for row_index in range(self.dataModel.getRowCount()): IDstr = str(self.dataModel.getValueAt(row_index, ID_COLUMN)) valstr = str(self.dataModel.getValueAt(row_index, VALUE_COLUMN)) f.write("%s %s\n" % (IDstr, valstr)) f.write("### Mapping ID to PV\n") for row_index in range(self.dataModel.getRowCount()): IDstr = str(self.dataModel.getValueAt(row_index, ID_COLUMN)) PVstr = str(self.dataModel.getValueAt(row_index, PV_COLUMN)) f.write("# %s %s\n" % (IDstr, PVstr)) def do_save_pvtableformat(self, filepath): now = datetime.datetime.now() with open(filepath, "w") as f: f.write("# save/restore file generated by CSS PVTable, " + now.strftime("%Y-%m-%d %H:%M:0.0") + "\n") for row_index in range(self.dataModel.getRowCount()): PVstr = str(self.dataModel.getValueAt(row_index, PV_COLUMN)) valstr = str(self.dataModel.getValueAt(row_index, VALUE_COLUMN)) f.write("%s %s\n" % (PVstr, valstr)) f.write("<END>\n") f.write("### ------------------------------------\n") f.write("### SETTING saved from CSS\n") f.write("### " + now.strftime("Date: %Y-%m-%d Time: %H:%M") + "\n") f.write("### ------------------------------------\n") f.write("### Mapping ID to PV\n") for row_index in range(self.dataModel.getRowCount()): IDstr = str(self.dataModel.getValueAt(row_index, ID_COLUMN)) PVstr = str(self.dataModel.getValueAt(row_index, PV_COLUMN)) f.write("# %s %s\n" % (IDstr, PVstr)) def prepare_tabledata(self): if self.s == None: self.tableData = [['', '', '', '', False]] else: self.tableData = [] for l in self.s: idstr = l[0] pvname = l[1] # read PV value curval = "---" restore_flag = l[2] try: ipv = PVUtil.createPV(pvname, self.widget) curval = PVUtil.getString(ipv) except: restore_flag = False if self.savemode: self.tableData.append( [pvname, idstr, curval, restore_flag]) else: self.tableData.append( [pvname, idstr, curval, '---', restore_flag]) if self.savemode: self.colNames = TABLE_HEADER_SAVEMODE else: self.colNames = TABLE_HEADER_LOADMODE self.dataModel = MyTableModel(self.tableData, self.colNames, savemode=self.savemode)
class DataPanel(JPanel,MouseListener): def __init__(self,view): JPanel.__init__(self) self.view=view self.background=Color.white self.layout=BorderLayout() self.popup=JPopupMenu() self.popup_items={} self.add(self.make_controls(),BorderLayout.SOUTH) data,title=self.extract_data() self.table=JTable(DefaultTableModel(data,title)) scroll=JScrollPane(self.table) self.add(scroll) scroll.addMouseListener(self) self.table.tableHeader.addMouseListener(self) self.table.addMouseListener(self) self.fileChooser=JFileChooser() self.fileChooser.setFileFilter(CSVFilter()) self.fileChooser.setSelectedFile(File('%s.csv'%self.view.network.name)) def make_controls(self): from timeview.components.timecontrol import Icon, ShadedIcon panel=JPanel(background=self.background) panel.add(JButton(Icon.refresh,actionPerformed=self.refresh,rolloverIcon=ShadedIcon.refresh,toolTipText='refresh',borderPainted=False,focusPainted=False,contentAreaFilled=False)) filter=JPanel(layout=BorderLayout(),opaque=False) self.filter = JSpinner(SpinnerNumberModel(self.view.tau_filter,0,0.5,0.01),stateChanged=self.refresh) filter.add(self.filter) filter.add(JLabel('filter'),BorderLayout.NORTH) filter.maximumSize=filter.preferredSize panel.add(filter) decimals=JPanel(layout=BorderLayout(),opaque=False) self.decimals = JSpinner(SpinnerNumberModel(3,0,10,1),stateChanged=self.refresh) decimals.add(self.decimals) decimals.add(JLabel('decimal places'),BorderLayout.NORTH) decimals.maximumSize=decimals.preferredSize panel.add(decimals) panel.add(JButton(Icon.save,actionPerformed=self.save,rolloverIcon=ShadedIcon.save,toolTipText='save',borderPainted=False,focusPainted=False,contentAreaFilled=False)) return panel def extract_data(self): pause_state=self.view.paused self.view.paused=True while self.view.simulating: java.lang.Thread.sleep(10) tau=float(self.filter.value) dt=self.view.dt if tau<dt: dt_tau=None else: dt_tau=dt/tau decimals=int(self.decimals.value) format='%%1.%df'%decimals start_index=max(0,self.view.timelog.tick_count-self.view.timelog.tick_limit+1) count=min(self.view.timelog.tick_limit,self.view.timelog.tick_count) start_time=start_index*self.view.dt data=None title=['t'] keys = self.view.watcher.active.keys() keys.sort() for key in keys: watch = self.view.watcher.active[key] name,func,args=key code='%s.%s%s'%(name,func.__name__,args) if code not in self.popup_items: state=True if 'spike' in func.__name__: state=False if 'voltage' in func.__name__: state=False self.popup_items[code]=JCheckBoxMenuItem(code,state,stateChanged=self.refresh) self.popup.add(self.popup_items[code]) if self.popup_items[code].state is False: continue d=watch.get(dt_tau=dt_tau,start=start_index,count=count) n=len(watch.get_first()) if data is None: data=[] while len(data)<len(d): data.append(['%0.4f'%(start_time+(len(data)+0)*self.view.dt)]) for i in range(n): title.append('%s[%d]'%(code,i)) for j in range(len(data)): dd=d[j] if dd is None: data[j].append('') else: data[j].append(format%dd[i]) self.view.paused=pause_state return data,title def save(self,event=None): if self.fileChooser.showSaveDialog(self)==JFileChooser.APPROVE_OPTION: f=self.fileChooser.getSelectedFile() writer=BufferedWriter(FileWriter(f)) data,title=self.extract_data() title=[t.replace(',',' ') for t in title] writer.write(','.join(title)+'\n') for row in data: writer.write(','.join(row)+'\n') writer.close() def refresh(self,event=None): data,title=self.extract_data() self.table.model.setDataVector(data,title) def mouseClicked(self, event): if event.button==MouseEvent.BUTTON3 or (event.button==MouseEvent.BUTTON1 and event.isControlDown()): if self.popup is not None: self.popup.show(event.source,event.x-5,event.y-5) def mouseEntered(self, event): pass def mouseExited(self, event): pass def mousePressed(self, event): pass def mouseReleased(self, event): pass
print "\nTiming" print(" Phase 1: {}").format(midTime - startTime) print(" Phase 2: {}").format(endTime - midTime) print(" Total: {}").format(endTime - startTime) ## # Provide the option to export the unused key list to an external file. ## saveResp = JOptionPane.showConfirmDialog( None, "Do you want to save the unused key list?", dialogTitle, JOptionPane.YES_NO_OPTION) if saveResp == 0: fo = JFileChooser(FileUtil.getUserFilesPath()) fo.setDialogTitle(dialogTitle) ret = fo.showSaveDialog(None) if ret == JFileChooser.APPROVE_OPTION: keyFile = fo.getSelectedFile().toString() with io.open(keyFile, "w", encoding="utf-8") as outputFile: outputFile.write("\n".join(notUsedList)) ## # Provide the option to update the property files. # All of the files for the current bundle name will be updated. # A backup will be created for each file before it is updated. 4 copies of the backup will be retained. # The unused keys will be converted to comments with the NotUsed tag. # Note: If the Java tree is managed by Git, the backups will create new file entries. # These backup files should not be included in a commit. ## updateResp = JOptionPane.showConfirmDialog( None, "Do you want to update the property files?", dialogTitle,