def execute(pagename, request): _ = request.getText def wr(fmt, *args): request.write(form_writer(fmt, *args)) # This action generates data using the user language request.setContentLanguage(request.lang) form = values_to_form(request.values) if form.has_key('cancel'): request.reset() backto = form.get('backto', [None])[0] request.theme.add_msg(_('Edit was cancelled.'), "error") if backto: page = Page(request, backto) request.http_redirect(page.url(request)) request.page = page request.page.send_page() elif form.has_key('save') or form.has_key('saveform'): if request.environ['REQUEST_METHOD'] != 'POST': request.page.send_page() return template = form.get('template', [None])[0] # MetaFormEdit is much closer to set_meta in function if form.has_key('saveform'): added, cleared = {pagename: dict()}, {pagename: list()} # Pre-create page if it does not exist, using the template specified if template: added[pagename]['gwikitemplate'] = template # Ignore form clutter ignore = set() files = dict() for key in request.files: ignore.add(key) _file = request.files.get(key) filename = _file.filename fileobj = _file.stream # if type(fileobj) != file: # continue banana = key.split(SEPARATOR) keys = files.setdefault(banana[0], dict()) values = keys.setdefault(banana[1], list()) values.append((filename, fileobj)) keys = list() for key in form: if key not in ignore and SEPARATOR in key: keys.append(key.split(SEPARATOR)[1]) # keys = [x.split(SEPARATOR)[1] for x in form if SEPARATOR in x] for key in keys: cleared[pagename].append(key) vals = [x.strip() for x in form[pagename + SEPARATOR + key] if x.strip()] if vals: added[pagename].setdefault(key, list()).extend(vals) msgs = list() # Add attachments for pname in files: for key in files[pname]: for value in files[pname][key]: name = value[0] try: t, s = add_attachment(request, pname, name, value[1]) added.setdefault(pname, dict()).setdefault( key, list()).append("[[attachment:%s]]" % name) except AttachmentAlreadyExists: msgs = ["Attachment '%s' already exists." % name] _, msgss = set_metas(request, cleared, dict(), added) msgs.extend(msgss) else: # MetaEdit pages, msgs, files = parse_editform(request, form) if pages: saved_templates = False for page, _ in pages.iteritems(): # Save the template if needed if not Page(request, page).exists() and template: msgs.append(save_template(request, page, template)) saved_templates = True # If new pages were changed we need to redo parsing # the form to know what we really need to edit if saved_templates: pages, newmsgs, files = parse_editform(request, form) for page, (oldMeta, newMeta) in pages.iteritems(): msgs.append('%s: ' % page + edit_meta(request, page, oldMeta, newMeta)) for page in files: for key in files[page]: name, content = files[page][key] t, s = add_attachment(request, page, name, content) else: msgs.append(request.getText('No pages changed')) msg = '' for line in msgs: msg += line + request.formatter.linebreak(0) request.reset() backto = form.get('backto', [None])[0] if backto: page = Page(request, backto) request.http_redirect(page.url(request)) else: page = Page(request, pagename) request.theme.add_msg(msg) request.page = page page.send_page() elif form.has_key('args'): enter_page(request, pagename, 'Metatable editor') formatter = request.page.formatter request.write(formatter.heading(1, 2)) request.write(formatter.text(_("Edit metatable"))) request.write(formatter.heading(0, 2)) args = ', '.join(form['args']) show_editform(wr, request, pagename, args) exit_page(request, pagename) else: enter_page(request, pagename, 'Metatable editor') formatter = request.page.formatter request.write(formatter.heading(1, 2)) request.write(formatter.text(_("Edit current page"))) request.write(formatter.heading(0, 2)) show_editform(wr, request, pagename, pagename) request.write(formatter.heading(1, 2)) request.write(formatter.text(_("Edit metatable"))) request.write(formatter.heading(0, 2)) show_queryform(wr, request, pagename) exit_page(request, pagename) return
def execute(pagename, request): _ = request.getText def wr(fmt, *args): request.write(form_writer(fmt, *args)) # This action generates data using the user language request.setContentLanguage(request.lang) form = values_to_form(request.values) if form.has_key('cancel'): request.reset() backto = form.get('backto', [None])[0] request.theme.add_msg(_('Edit was cancelled.'), "error") if backto: page = Page(request, backto) request.http_redirect(page.url(request)) request.page = page request.page.send_page() elif form.has_key('save') or form.has_key('saveform'): if request.environ['REQUEST_METHOD'] != 'POST': request.page.send_page() return template = form.get('template', [None])[0] # MetaFormEdit is much closer to set_meta in function if form.has_key('saveform'): added, cleared = {pagename: dict()}, {pagename: list()} # Pre-create page if it does not exist, using the template specified if template: added[pagename]['gwikitemplate'] = template # Ignore form clutter ignore = set() files = dict() for key in request.files: ignore.add(key) _file = request.files.get(key) filename = _file.filename fileobj = _file.stream # if type(fileobj) != file: # continue banana = key.split(SEPARATOR) keys = files.setdefault(banana[0], dict()) values = keys.setdefault(banana[1], list()) values.append((filename, fileobj)) keys = list() for key in form: if key not in ignore and SEPARATOR in key: keys.append(key.split(SEPARATOR)[1]) # keys = [x.split(SEPARATOR)[1] for x in form if SEPARATOR in x] for key in keys: cleared[pagename].append(key) vals = [ x.strip() for x in form[pagename + SEPARATOR + key] if x.strip() ] if vals: added[pagename].setdefault(key, list()).extend(vals) msgs = list() # Add attachments for pname in files: for key in files[pname]: for value in files[pname][key]: name = value[0] try: t, s = add_attachment(request, pname, name, value[1]) added.setdefault(pname, dict()).setdefault( key, list()).append("[[attachment:%s]]" % name) except AttachmentAlreadyExists: msgs = ["Attachment '%s' already exists." % name] _, msgss = set_metas(request, cleared, dict(), added) msgs.extend(msgss) else: # MetaEdit pages, msgs, files = parse_editform(request, form) if pages: saved_templates = False for page, _ in pages.iteritems(): # Save the template if needed if not Page(request, page).exists() and template: msgs.append(save_template(request, page, template)) saved_templates = True # If new pages were changed we need to redo parsing # the form to know what we really need to edit if saved_templates: pages, newmsgs, files = parse_editform(request, form) for page, (oldMeta, newMeta) in pages.iteritems(): msgs.append('%s: ' % page + edit_meta(request, page, oldMeta, newMeta)) for page in files: for key in files[page]: name, content = files[page][key] t, s = add_attachment(request, page, name, content) else: msgs.append(request.getText('No pages changed')) msg = '' for line in msgs: msg += line + request.formatter.linebreak(0) request.reset() backto = form.get('backto', [None])[0] if backto: page = Page(request, backto) request.http_redirect(page.url(request)) else: page = Page(request, pagename) request.theme.add_msg(msg) request.page = page page.send_page() elif form.has_key('args'): enter_page(request, pagename, 'Metatable editor') formatter = request.page.formatter request.write(formatter.heading(1, 2)) request.write(formatter.text(_("Edit metatable"))) request.write(formatter.heading(0, 2)) args = ', '.join(form['args']) show_editform(wr, request, pagename, args) exit_page(request, pagename) else: enter_page(request, pagename, 'Metatable editor') formatter = request.page.formatter request.write(formatter.heading(1, 2)) request.write(formatter.text(_("Edit current page"))) request.write(formatter.heading(0, 2)) show_editform(wr, request, pagename, pagename) request.write(formatter.heading(1, 2)) request.write(formatter.text(_("Edit metatable"))) request.write(formatter.heading(0, 2)) show_queryform(wr, request, pagename) exit_page(request, pagename) return
def execute(pagename, request): _ = request.getText form = values_to_form(request.values) msgs = list() newpage = form['name'][0] if not newpage: request.theme.add_msg(_("IOCList page name not set!"), 'error') request.page.send_page() return template = form['template'][0] if not template: template = "IOCListTemplate" allow_overlap = form['allow_overlap'][0] if not allow_overlap: allow_overlap = "no" ips = IPV4_RE.findall(form['data'][0]) ips = filter(is_ipv4, ips) ips = set(ips) ipv6 = IPV6_RE.findall(form['data'][0]) ipv6 = filter(is_ipv6, ipv6) ips.update(set(ipv6)) ips = list(ips) domains = set(DOMAIN_RE.findall(form['data'][0])) urls = set(URL_RE.findall(form['data'][0])) emails = set(EMAIL_RE.findall(form['data'][0])) hashes = set(HASH_RE.findall(form['data'][0])) data = { 'ip': list(ips), 'domain name': list(domains), 'url': list(urls), 'email address': list(emails), 'artifact hash': list(hashes) } dataset = set() for key in data: dataset.update(data[key]) graphdata = request.graphdata vals_on_keys = graphdata.get_vals_on_keys() new_data = dict((key, list()) for (key, value) in data.iteritems()) for ip in ips: if ip not in vals_on_keys.get('ip', list()): new_data['ip'].append(ip) for domain in domains: if domain not in vals_on_keys.get('domain name', list()): new_data['domain name'].append(domain) for url in urls: if url not in vals_on_keys.get('url', list()): new_data['url'].append(url) for email in emails: if email not in vals_on_keys.get('email address', list()): new_data['email address'].append(email) for h in hashes: if h not in vals_on_keys.get('artifact hash', list()): new_data['artifact hash'].append(h) newdataset = list() for key in new_data: newdataset.extend(new_data[key]) old_data = dataset.difference(newdataset) if old_data: vals_on_pages = graphdata.get_vals_on_pages() if allow_overlap == 'no': for ioc in old_data: msgs.append( _("The following IOC already listed: %s (%s).") % (ioc, ', '.join(vals_on_pages[ioc]))) else: for ioc in old_data: if newpage in vals_on_pages[ioc]: for key in data.keys(): if ioc in data[key]: data[key].remove(ioc) else: msgs.append( _("The following IOC already listed: %s (%s).") % (ioc, ', '.join(vals_on_pages[ioc])) + " " + _("Adding anyway.")) if allow_overlap != 'no': new_data = data if not new_data: request.theme.add_msg(_("No new IOC!"), 'error') request.page.send_page() return if not Page(request, newpage).exists(): msgs.append( _("Creating page %s with template %s") % (newpage, template)) msgs.append(save_template(request, newpage, template)) ioccount = 0 for key in new_data: ioccount += len(new_data[key]) msgs.append(_("Added %s IOC to list %s") % (ioccount, newpage)) edit_meta(request, newpage, {}, new_data) msg = '' for line in msgs: msg += line + request.formatter.linebreak(0) request.theme.add_msg(msg) do_show(pagename, request)
def execute(pagename, request): _ = request.getText form = values_to_form(request.values) msgs = list() newpage = form['name'][0] if not newpage: request.theme.add_msg(_("IOCList page name not set!"), 'error') request.page.send_page() return template = form['template'][0] if not template: template = "IOCListTemplate" allow_overlap = form['allow_overlap'][0] if not allow_overlap: allow_overlap = "no" ips = IPV4_RE.findall(form['data'][0]) ips = filter(is_ipv4, ips) ips = set(ips) ipv6 = IPV6_RE.findall(form['data'][0]) ipv6 = filter(is_ipv6, ipv6) ips.update(set(ipv6)) ips = list(ips) domains = set(DOMAIN_RE.findall(form['data'][0])) urls = set(URL_RE.findall(form['data'][0])) emails = set(EMAIL_RE.findall(form['data'][0])) hashes = set(HASH_RE.findall(form['data'][0])) data = {'ip': list(ips), 'domain name': list(domains), 'url': list(urls), 'email address': list(emails), 'artifact hash': list(hashes)} dataset = set() for key in data: dataset.update(data[key]) graphdata = request.graphdata vals_on_keys = graphdata.get_vals_on_keys() new_data = dict((key, list()) for (key, value) in data.iteritems()) for ip in ips: if ip not in vals_on_keys.get('ip', list()): new_data['ip'].append(ip) for domain in domains: if domain not in vals_on_keys.get('domain name', list()): new_data['domain name'].append(domain) for url in urls: if url not in vals_on_keys.get('url', list()): new_data['url'].append(url) for email in emails: if email not in vals_on_keys.get('email address', list()): new_data['email address'].append(email) for h in hashes: if h not in vals_on_keys.get('artifact hash', list()): new_data['artifact hash'].append(h) newdataset = list() for key in new_data: newdataset.extend(new_data[key]) old_data = dataset.difference(newdataset) if old_data: vals_on_pages = graphdata.get_vals_on_pages() if allow_overlap == 'no': for ioc in old_data: msgs.append(_("The following IOC already listed: %s (%s).") % (ioc, ', '.join(vals_on_pages[ioc]))) else: for ioc in old_data: if newpage in vals_on_pages[ioc]: for key in data.keys(): if ioc in data[key]: data[key].remove(ioc) else: msgs.append( _("The following IOC already listed: %s (%s).") % (ioc, ', '.join(vals_on_pages[ioc])) + " " + _("Adding anyway.")) if allow_overlap != 'no': new_data = data if not new_data: request.theme.add_msg(_("No new IOC!"), 'error') request.page.send_page() return if not Page(request, newpage).exists(): msgs.append(_("Creating page %s with template %s") % (newpage, template)) msgs.append(save_template(request, newpage, template)) ioccount = 0 for key in new_data: ioccount += len(new_data[key]) msgs.append(_("Added %s IOC to list %s") % (ioccount, newpage)) edit_meta(request, newpage, {}, new_data) msg = '' for line in msgs: msg += line + request.formatter.linebreak(0) request.theme.add_msg(msg) do_show(pagename, request)