def getNoAccessIds(attr, trans):
     lstNoAccess = []
     for sID in attr.value:
         oItem = db.getItem(sID, trans)
         if not(oItem):
             lstNoAccess.append(sID)
     return lstNoAccess
 def get_response(self, raw_request):
     response = HttpResponse()
     request = HttpRequest(raw_request)
             
     item = None
     registration = None
     
     try:
         try:
             self.context = HttpContext(request, response)
             sPath = request.serverVariables['PATH_INFO']
             try:
                 item = db.getItem(sPath)
             except exceptions.ObjectNotFound:
                 # dir request
                 lstPath = sPath.split('/')
                 dirName = lstPath[1]
                 # remove blank entry & app name to get the requested path
                 sDirPath = '/'.join(lstPath[2:])
                 webApp = pubdirs.dirs.setdefault(dirName, None)
                 if webApp:
                     registration = webApp.getRegistration(
                         sDirPath,
                         request.serverVariables['REQUEST_METHOD'],
                         request.serverVariables['HTTP_USER_AGENT'],
                         request.getLang())
                 if not registration:
                     raise exceptions.NotFound, \
                         'The resource "%s" does not exist' % sPath
                 
                 # apply pre-processing filters
                 [filter[0].apply(self.context, registration, **filter[1])
                  for filter in registration.filters
                  if filter[0].type == 'pre']
             
                 rtype = registration.type
                 if rtype == 1: # psp page
                     ServerPage.execute(self.context, registration.context)
                 elif rtype == 0: # static file
                     response.loadFromFile(registration.context)
                     if registration.encoding:
                         response.charset = registration.encoding
             else:
                 # db request
                 if (item == None):
                     raise exceptions.PermissionDenied
                 self.dispatch_method(item)
         
         except exceptions.ResponseEnd, e:
             pass
         
         if registration != None:
             # do we have caching directive?
             if registration.max_age:
                 response.setExpiration(registration.max_age)
             # apply post-processing filters
             [filter[0].apply(self.context, registration, **filter[1])
              for filter in registration.filters
              if filter[0].type == 'post']
 def getNoAccessIds(cls, attr, trans):
     lstNoAccess = []
     for sID in attr.value:
         oItem = db.getItem(sID, trans)
         # do not replay in case of txn abort
         del trans.actions[-1]
         if not(oItem):
             lstNoAccess.append(sID)
     return lstNoAccess
def login(self, username, password):
    "Remote method for authenticating users"
    http_context = HttpContext.current()
    users_container = db.getItem("users")
    user = users_container.getChildByName(username)
    if user and hasattr(user, "authenticate"):
        if user.authenticate(password):
            http_context.session.user = user
            return True
    return False
 def getParent(self, trans=None):
     """
     Returns the parent container.
             
     @param trans: A valid transaction handle
         
     @return: the parent container object
     @rtype: type
     """
     return(db.getItem(self._parentid, trans))
def getSecurity(self):
    "Returns information about the object's security descriptor"
    l = []
    for sID in self.security:
        oUser = db.getItem(sID)
        l.append({
                'id': sID,
                'displayName': oUser.displayName.value,
                'role': str(self.security[sID])
        })
    return l
 def getChildByName(self, name, trans=None):
     """
     This method returns the child with the specified name.
     
     @param name: The name of the child
     @type name: str
     
     @param trans: A valid transaction handle
         
     @return: The child object if a child with the given name exists
              else None.
     @rtype: type
     """
     if (self._items.has_key(name)):
         oChild = db.getItem(self._items[name], trans)
         return(oChild)
     elif (self._subfolders.has_key(name)):
         oChild = db.getItem(self._subfolders[name], trans)
         return(oChild)
     else:
         return(None)
 def __loadcache(self, istart):
     if self._resolved:
         self.__cache = [
             _db.getItem(id, self._txn)
             for id in self._list[istart:istart + self._cachesize]]
     else:
         if self._safe:
             self.__cache = filter(None,
                 [db.getItem(id, self._txn)
                  for id in self._list[istart:istart + self._cachesize]])
         else:
             self.__cache = filter(None,
                 [self.__getItemSafe(id)
                  for id in self._list[istart:istart + self._cachesize]])
def getSecurity(self):
    "Returns information about the object's security descriptor"
    l = []
    for sID in self.security:
        try:
            oUser = db.getItem(sID)
            dn = oUser.displayName.value
        except exceptions.ObjectNotFound:
            dn = sID
        l.append({
                'id': sID,
                'displayName': dn,
                'role': str(self.security[sID])
        })
    return l
def selectcontainer(self):
    "Displays a dialog for selecting the destination container"
    context = HttpContext.current()
    rootFolder = db.getItem('')
    params = {
        'ROOT_ID': '/',
        'ROOT_IMG': rootFolder.__image__,
        'ROOT_DN': rootFolder.displayName.value,
        'ID': self.id,
    }
    sAction = context.request.queryString['action'][0]
    params['TITLE'] = '@@%s@@' % sAction.upper()
    if sAction != 'select_folder':
        params['TITLE'] += ' "%s"' % self.displayName.value
    return params
 def getItem(self, trans=None):
     """
     This method returns the object that this data type
     instance references. If the current user has no read
     permission on the referenced item or it has been deleted
     then it returns None.
     
     @param trans: A valid transaction handle
     
     @rtype: type
     @return: The referenced object, otherwise None
     """
     oItem = None
     if self.value:
         try:
             oItem = db.getItem(self.value, trans)
         except exceptions.ObjectNotFound:
             pass
     return(oItem)
Ejemplo n.º 12
0
def select(deep, children, fields, condition, variables):
    results = []
    
    for child in [db.getItem(child_id) for child_id in children]:
        if child:
            if condition:
                res = evaluateStack(condition[:], variables, child)
            else:
                res = True
            
            if res:
                fieldlist = [evaluateStack(expr[1], variables, child) for expr in fields]
                results.append(tuple(fieldlist))
                
            if deep and child.isCollection:
                children_ids = child._subfolders.values() + child._items.values()
                results1 = select(deep, children_ids, fields, condition, variables)
                results.extend(results1)

    return (results)
Ejemplo n.º 13
0
def h_200(params, variables, forObject = None):
    select_fields = params[0]
    
    # get aliases
    aliases = []
    for expr, alias, aggr in select_fields:
        if expr != alias:
            variables[alias] = (expr, None, None)
            aliases.append(alias)

    field_names = [ x[1] for x in select_fields ]
    expressions = [ tuple(x[0::2]) for x in select_fields ]
    
    select_from = params[1]
    where_condition = params[2]
    
    if params[3]:
        sort_order, order_by = params[3]
        
        for ind, order_field in enumerate(order_by):
            expr, alias, aggr = order_field
            if alias in aliases:
                order_by[ind] = select_fields[ field_names.index(alias) ]
            elif expr != alias:
                if (expr, aggr) in expressions:
                    order_by[ind] = select_fields[ expressions.index((expr, aggr)) ]
                else:
                    variables[alias] = (expr, None, None)
                    aliases.append(alias)
    else:
        order_by = []

    group_by = params[4]
    if group_by:
        for ind, group_field in enumerate(group_by):
            expr, alias, aggr = group_field
            if alias in aliases:
                group_by[ind] = select_fields[ field_names.index(alias) ]
            elif expr != alias:
                if (expr, aggr) in expressions:
                    group_by[ind] = select_fields[ expressions.index((expr, aggr)) ]
                else:
                    variables[alias] = (expr, None, None)
                    aliases.append(alias)

    if select_fields:
        all_fields = select_fields + order_by + group_by
    else:
        all_fields = [['id','id', '']] + order_by + group_by
    
    aggregates = [x[2] for x in all_fields]
    results = []
    
    for deep, object_id in select_from:
        if deep==2:
            # this:attr
            if not forObject:
                raise TypeError, 'Inner scopes using "this:" are valid only in sub-queries'
            if hasattr(forObject, object_id):
                refObjects = getattr(forObject, object_id).value
                if type(refObjects) == str:
                    refObjects = [refObjects]
                r = select(False, refObjects, all_fields, where_condition, variables)
                results.extend(r)
        else:
            # swallow-deep
            obj = db.getItem(object_id)    
            if obj != None and obj.isCollection:
                children = obj._subfolders.values() + obj._items.values()
                r = select(deep, children, all_fields, 
                                where_condition, variables)
                results.extend(r)
#    print results
    if results:
        if group_by:
            if select_fields:
                #construct groups
                group_dict = {}
                igrpstart = len(select_fields) + len(order_by)
                igrpend = igrpstart + len(group_by)
                for rec in results:
                    group_value = tuple(rec[igrpstart:igrpend])
                    group_dict[group_value] = group_dict.setdefault(group_value, [])
                    group_dict[group_value].append(rec)
                groups = [tuple(g) for g in group_dict.values()]
            else:
                raise TypeError, 'GROUP BY clause is incompatible with SELECT *'
        else:
            groups = [results]
        
#        print len(groups)
        results = []

        if aggregates != [''] * len(aggregates) or group_by:
            for ind, group in enumerate(groups):
                group_sum = []
                for aggr_index, aggr_type in enumerate(aggregates):
                    # aggregates exclude None values
                    group_sum.append( computeAggregate(aggr_type, [x[aggr_index] for x in group if x[aggr_index] != None]) )
                groups[ind] = (tuple(group_sum),)

        for group in groups:
            results.extend(group)

        if order_by:
            # extract sort values
            istart = 1
            if select_fields:
                istart = len(select_fields)
            sortlist = tuple([x[istart:istart + len(order_by)] for x in results])
            results = sortList(sortlist, results)
            # if it is descending reverse the result list
            if not sort_order: results.reverse()
    
    # remove aliases
    for alias in aliases:
        del variables[alias]
    
    if select_fields:
        schema = field_names
        # truncate to keep only select fields
        iend = len(select_fields)
        results = tuple([x[:iend] for x in results])
    else:
        schema = None
        results = tuple([x[:1][0] for x in results])
        
#    print results

    return objectSet.ObjectSet(tuple(results), schema)
def __blank__(self):
    "Displays the desktop"
    context = HttpContext.current()
    context.response.setHeader("cache-control", "no-cache")

    oUser = context.session.user

    params = {
        "USER": oUser.displayName.value,
        "AUTO_RUN": "",
        "RUN_MAXIMIZED": 0,
        "SETTINGS_DISABLED": "",
        "LOGOFF_DISABLED": "",
    }
    if hasattr(oUser, "authenticate"):
        settings = oUser.settings
        params["AUTO_RUN"] = settings.value.setdefault("AUTO_RUN", "")
        params["RUN_MAXIMIZED"] = int(settings.value.setdefault("RUN_MAXIMIZED", False))
        taskbar_position = settings.value.setdefault("TASK_BAR_POS", "bottom")
    else:
        taskbar_position = "bottom"
        params["SETTINGS_DISABLED"] = "true"
        params["LOGOFF_DISABLED"] = "true"

    params["REPOSITORY_DISABLED"] = "true"
    params["PERSONAL_FOLDER"] = ""
    if hasattr(oUser, "personalFolder"):
        params["REPOSITORY_DISABLED"] = "false"
        params["PERSONAL_FOLDER"] = oUser.personalFolder.value

    # has the user access to recycle bin?
    rb_icon = ""
    rb = db.getItem("rb")
    if rb:
        rb_icon = (
            """
            <icon top="80" left="10" width="80" height="80"
                imgalign="top" ondblclick="generic.openContainer"
                img="desktop/images/trashcan_full.gif" color="white"
                caption="%s">
                    <prop name="folderID" value="rb"></prop>
            </icon>
        """
            % rb.displayName.value
        )

    desktop_pane = DESKSTOP_PANE % (self.displayName.value, rb_icon)

    if taskbar_position == "bottom":
        params["TOP"] = desktop_pane
        params["BOTTOM"] = ""
    else:
        params["TOP"] = ""
        params["BOTTOM"] = desktop_pane

    # get applications
    oCmd = OqlCommand()
    sOql = "select launchUrl,displayName,icon from 'apps' " + "order by displayName asc"
    apps = oCmd.execute(sOql)
    sApps = ""
    if len(apps) > 0:
        for app in apps:
            sApps += """<menuoption img="%s" caption="%s"
                onclick="generic.runApp">
                    <prop name="url" value="%s"></prop>
                </menuoption>""" % (
                app["icon"],
                app["displayName"],
                app["launchUrl"],
            )
        params["APPS"] = sApps
    else:
        params["APPS"] = '<menuoption caption="@@EMPTY@@"' + ' disabled="true"></menuoption>'

    return params
 def __getItemSafe(self, id):
     try:
         return db.getItem(id, self._txn)
     except exceptions.ObjectNotFound:
         return None
def __blank__(self):
    "Displays the desktop"
    context = HttpContext.current()
    context.response.setHeader('cache-control', 'no-cache')
    
    oUser = context.user
    
    params = {
        'USER' : oUser.displayName.value,
        'AUTO_RUN' : '',
        'RUN_MAXIMIZED' : 0,
        'SETTINGS_DISABLED' : '',
        'LOGOFF_DISABLED' : ''
    }
    if hasattr(oUser, 'authenticate'):
        settings = oUser.settings
        params['AUTO_RUN'] = \
            settings.value.setdefault('AUTO_RUN', '')
        params['RUN_MAXIMIZED'] = \
            int(settings.value.setdefault('RUN_MAXIMIZED', False))
        taskbar_position = \
            settings.value.setdefault('TASK_BAR_POS', 'bottom')
    else:
        taskbar_position = 'bottom'
        params['SETTINGS_DISABLED'] = 'true'
        params['LOGOFF_DISABLED'] = 'true'
    
    params['REPOSITORY_DISABLED'] = 'true'
    params['PERSONAL_FOLDER'] = ''
    if hasattr(oUser, 'personalFolder'):
        params['REPOSITORY_DISABLED'] = 'false'
        params['PERSONAL_FOLDER'] = oUser.personalFolder.value
    
    # has the user access to recycle bin?
    rb_icon = ''
    rb = db.getItem('rb')
    if rb:
        rb_icon = '''
            <icon top="80" left="10" width="80" height="80"
                imgalign="top" ondblclick="generic.openContainer"
                img="desktop/images/trashcan_full.gif" color="white"
                caption="%s">
                    <prop name="folderID" value="rb"></prop>
            </icon>
        ''' % rb.displayName.value
    
    desktop_pane = DESKSTOP_PANE % (self.displayName.value, rb_icon)
    
    if taskbar_position == 'bottom':
        params['TOP'] = desktop_pane
        params['BOTTOM'] = ''
    else:
        params['TOP'] = ''
        params['BOTTOM'] = desktop_pane
    
    # get applications
    oCmd = OqlCommand()
    sOql = "select launchUrl,displayName,icon from 'apps' " + \
           "order by displayName asc"
    apps = oCmd.execute(sOql)
    sApps = ''
    if len(apps) > 0:
        for app in apps:
            sApps += '''<menuoption img="%s" caption="%s"
                onclick="generic.runApp">
                    <prop name="url" value="%s"></prop>
                </menuoption>''' % \
                (app['icon'], app['displayName'], app['launchUrl'])
        params['APPS'] = sApps
    else:
        params['APPS'] = '<menuoption caption="@@EMPTY@@"' + \
                         ' disabled="true"></menuoption>'

    return params