Ejemplo n.º 1
0
 def add(self, group_id=None):
     group_ids = []
     if group_id:
         group_ids = [group_id]
         
     form = ResourceAddForm(group_ids=group_ids)
     form.group_ids.choices = [(g.id, g.label) for g in groups.list()]
     return render('resource/add.html', {'form': form })
Ejemplo n.º 2
0
 def test_list(self):
     
     gs = groups.list()
     
     # Postgres is sorting case-insensitive here.  This 
     # probably is db-specific, so we may need a better assertion.
     
     gnames = [g.name for g in gs]
     print gnames
     print sorted(gnames, key=unicode.lower)
     self.assertEquals(sorted(gnames, key=unicode.lower), gnames)
     
     
Ejemplo n.º 3
0
 def process_merge(self, **kwargs):
     form = MergeForm(request_params())
     group_tuples = [(g.id, g.name) for g in groups.list()]
     form.from_group_id.choices = [(0, '[From Group]')] + group_tuples
     form.to_group_id.choices = [(0, '[To Group]')] + group_tuples
     if form.validate():
         log.info("Passed validation, somehow.")
         (moved_resources, from_group, to_group) = groups.merge(form.from_group_id.data, form.to_group_id.data)
         for r in moved_resources:
             auditlog.log(auditlog.CODE_CONTENT_MOD, target=r, attributes_modified=['group_id'])
         auditlog.log(auditlog.CODE_CONTENT_DEL, target=from_group)
         raise cherrypy.HTTPRedirect('/group/view/{0}'.format(to_group.id))
     else:
         return render("group/merge.html", {'form': form})
Ejemplo n.º 4
0
 def process_add(self, **kwargs):
     form = ResourceAddForm(request_params())
     form.group_ids.choices = [(g.id, g.label) for g in groups.list()]
     if form.validate():
         resource = resources.create(name=form.name.data,
                                     group_ids=form.group_ids.data,
                                     addr=form.addr.data,
                                     description=form.description.data, 
                                     notes=form.notes_decrypted.data,
                                     tags=form.tags.data) # XXX: process
         auditlog.log(auditlog.CODE_CONTENT_ADD, target=resource)
         notify_entity_activity(resource, 'created')
         raise cherrypy.HTTPRedirect('/resource/view/{0}'.format(resource.id))
     else:
         return render('resource/add.html', {'form': form })
Ejemplo n.º 5
0
 def export(self, group_id=None, **kwargs):
     form = ExportForm(request_params(), group_id=group_id)
     form.group_id.choices = [(g.id, g.name) for g in groups.list()]
     
     exporter_choices = [('yaml', 'YAML (GPG/PGP-encrypted)')]
     if config['export.keepass.enabled']:
         if not os.path.exists(config['export.keepass.exe_path']):
             log.error("KeePass export enabled, but specified converter script does not exist: {0}".format(config.get('export.keepass.exe_path')))
         else:
             exporter_choices.append(('kdb', 'KeePass 1.x'))
     form.format.choices = exporter_choices
     
     if cherrypy.request.method == 'POST':
         if form.validate():
             group = groups.get(form.group_id.data)
             
             if form.format.data == 'yaml':
                 exporter = GpgYamlExporter(use_tags=False,
                                            passphrase=form.passphrase.data,
                                            resource_filters=[model.GroupResource.group_id==group.id]) # @UndefinedVariable
                 encrypted_stream = BytesIO()
                 exporter.export(stream=encrypted_stream)
                 encrypted_stream.seek(0) # Just to ensure it's rewound
                 
                 return serve_fileobj(encrypted_stream, content_type='application/pgp-encrypted', disposition='attachment',
                                      name='group-{0}-export.pgp'.format(re.sub('[^\w\-\.]', '_', group.name)))
                 
             elif form.format.data == 'kdb':
                 exporter = KeepassExporter(passphrase=form.passphrase.data,
                                            resource_filters=[model.GroupResource.group_id==group.id]) # @UndefinedVariable
                 encrypted_stream = BytesIO()
                 exporter.export(stream=encrypted_stream)
                 encrypted_stream.seek(0) # Just to ensure it's rewound
                 
                 return serve_fileobj(encrypted_stream, content_type='application/x-keepass-database', disposition='attachment',
                                      name='group-{0}-export.kdb'.format(re.sub('[^\w\-\.]', '_', group.name)))
                     
             else:
                 # I don't think we can get here in normal business.
                 raise RuntimeError("Unhandled format specified: {0}".format(form.format.data))
                 
         else: # does not validate
             return render("group/export.html", {'form': form})
     else: # request method is GET
         return render("group/export.html", {'form': form})
Ejemplo n.º 6
0
 def process_edit(self, **kwargs):
     form = ResourceEditForm(request_params())
     form.group_ids.choices = [(g.id, g.label) for g in groups.list()]
     if form.validate():
         (resource, modified) = resources.modify(form.resource_id.data,
                                                 name=form.name.data,
                                                 addr=form.addr.data,
                                                 group_ids=form.group_ids.data,
                                                 notes=form.notes_decrypted.data,
                                                 description=form.description.data,
                                                 tags=form.tags.data) # XXX: process
         auditlog.log(auditlog.CODE_CONTENT_MOD, target=resource, attributes_modified=modified)
         notify_entity_activity(resource, 'updated')
         raise cherrypy.HTTPRedirect('/resource/view/{0}'.format(resource.id))
     else:
         log.warning("Form validation failed.")
         log.warning(form.errors)
         return render('resource/edit.html', {'form': form})
Ejemplo n.º 7
0
def render(filename, data=None):
    """
    Convenience method to render a template.
    """
    from ensconce import acl
    
    if data is None:
        data = {}
    
    data['title_prefix'] = config.get('ui.title_prefix')
    data['operator_info'] = operator_info()
    
    env = Environment(loader=PackageLoader('ensconce', 'templates'),
                      autoescape=True,
                      finalize=lambda x: '' if x is None else x)
    env.globals['pop_notifications'] = pop_notifications
    
    # Expose the ACL module so that there can be some checking in the templates 
    # (to avoid showing buttons that won't be clickable)
    env.globals['acl'] = acl
    
    try:
        env.globals['app_version'] = pkg_resources.get_distribution("ensconce").version
    except:
        log.exception("Error determining software version.")
        env.globals['app_version'] = '?.?'
    
    # Add an escape filter for when we need to embed values in JS code. 
    env.filters['escapejs'] = escapejs
    
    if operator_info().user_id: # They are logged in, so add the quick-group-nav form.
        form = QuickGroupForm() # Do not initialize we/ request params, since that could be confusing.
        form.group_id.choices = [(0, '[Jump to Group]')] + [(g.id, g.name) for g in groups.list()]
        env.globals['quickgroupform'] = form
    
    return env.get_template(filename).render(data)
Ejemplo n.º 8
0
 def list(self):
     return render('group/list.html', {'groups': groups.list()})
Ejemplo n.º 9
0
 def merge(self, group_id=None):
     form = MergeForm(from_group_id=group_id)
     group_tuples = [(g.id, g.name) for g in groups.list()]
     form.from_group_id.choices = [(0, '[From Group]')] + group_tuples
     form.to_group_id.choices = [(0, '[To Group]')] + group_tuples
     return render("group/merge.html", {'form': form})
Ejemplo n.º 10
0
 def listGroups(self):
     return [g.to_dict() for g in groups.list()]
Ejemplo n.º 11
0
 def edit(self, resource_id):
     resource = resources.get(resource_id)
     log.debug("Resource matched: {0!r}".format(resource))
     form = ResourceEditForm(request_params(), obj=resource, resource_id=resource_id, group_ids=[g.id for g in resource.groups])
     form.group_ids.choices = [(g.id, g.label) for g in groups.list()]
     return render('resource/edit.html', {'form': form})