Changeset 4279

Show
Ignore:
Timestamp:
09/14/08 10:50:41 (2 months ago)
Author:
bobbysmith007
Message:

Got query screen exports correctly enforcing field permissions (had to monkey patch the query module)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • timingandestimationplugin/branches/trac0.11-Permissions/timingandestimationplugin/tande_filters.py

    r4270 r4279  
    77from genshi.filters.transform import Transformer 
    88from blackmagic import * 
     9from trac.ticket.query import QueryModule 
     10 
     11from StringIO import StringIO 
     12import csv 
     13from trac.mimeview.api import Context 
     14from trac.resource import Resource 
     15 
     16## MONKEY PATCH THE QUERY MODULE CSV EXPORT FN TO ENFORCE PERMISSIONS 
     17def new_csv_export(self, req, query, sep=',', mimetype='text/plain'): 
     18    self.log.debug("T&E plugin has overridden QueryModule.csv_export so to enforce field permissions") 
     19 
     20    ## find the columns that should be hidden 
     21    hidden_fields = [] 
     22    fields = self.config.getlist(csection, 'fields', []) 
     23    self.log.debug('QueryModule.csv_export: found : %s' % fields) 
     24    for field in fields: 
     25        perms = self.config.getlist(csection, '%s.permission' % field, []) 
     26        #self.log.debug('QueryModule.csv_export: read permission config: %s has %s' % (field, perms)) 
     27        for (perm, denial) in [s.split(":") for s in perms] : 
     28            perm = perm.upper() 
     29            #self.log.debug('QueryModule.csv_export: testing permission: %s:%s should act= %s' % 
     30            #               (field, perm, (not req.perm.has_permission(perm) or perm == "ALWAYS"))) 
     31            if (not req.perm.has_permission(perm) or perm == "ALWAYS") and denial.lower() in ["remove","hide"]: 
     32                hidden_fields.append(field) 
     33    ## END find the columns that should be hidden 
     34     
     35    content = StringIO() 
     36    cols = query.get_columns() 
     37    writer = csv.writer(content, delimiter=sep) 
     38    writer = csv.writer(content, delimiter=sep, quoting=csv.QUOTE_MINIMAL) 
     39    writer.writerow([unicode(c).encode('utf-8') for c in cols if c not in hidden_fields]) 
     40     
     41    context = Context.from_request(req) 
     42    results = query.execute(req, self.env.get_db_cnx()) 
     43    self.log.debug('QueryModule.csv_export: hidding columns %s' %  hidden_fields) 
     44    for result in results: 
     45        ticket = Resource('ticket', result['id']) 
     46        if 'TICKET_VIEW' in req.perm(ticket): 
     47            values = [] 
     48            for col in cols: 
     49                if col not in hidden_fields: 
     50                    self.log.debug("not hiding %s" % col) 
     51                    value = result[col] 
     52                    if col in ('cc', 'reporter'): 
     53                        value = Chrome(self.env).format_emails(context(ticket), 
     54                                                               value) 
     55                    values.append(unicode(value).encode('utf-8')) 
     56            writer.writerow(values) 
     57    return (content.getvalue(), '%s;charset=utf-8' % mimetype) 
     58 
     59QueryModule.export_csv = new_csv_export 
    960 
    1061class TicketFormatFilter(Component): 
     
    54105                self.log.debug('testing permission: %s:%s should act= %s' % 
    55106                               (field, perm, (not req.perm.has_permission(perm) or perm == "ALWAYS"))) 
    56                 if (not req.perm.has_permission(perm) or perm == "ALWAYS")
     107                if (not req.perm.has_permission(perm) or perm == "ALWAYS") and denial.lower() in ["remove","hide"]
    57108                    # remove from the list of addable  
    58109                    stream = stream | Transformer(