Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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)