def remove_users_from_group(self,
                             userIds,
                             groupId,
                             format="json",
                             **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     try:
         userIds = split_list_sanitized(userIds)
         groupId = int(strip_tags(groupId))
         group = session.query(Group).filter(Group.id == groupId).one()
         if group.owner_id == user.id or AccountService.user_has_permission(
                 user, "admin"):
             for userId in userIds:
                 user = AccountService.get_user(userId)
                 group.members.remove(user)
             session.add(
                 AuditLog(
                     user.id, Actions.UPDATE_GROUP,
                     "%s user(s) removed from group \"%s\"(%s)" %
                     (len(userIds), group.name, group.id)))
             session.commit()
             sMessages.append("Group members removed successfully")
         else:
             fMessages.append(
                 "You do not have permission to modify group with ID:%s" %
                 str(groupId))
     except ValueError:
         fMessages.append("Invalid group Id")
     except sqlalchemy.orm.exc.NoResultFound, nrf:
         fMessages.append("Group with ID:%s could not be found" %
                          str(groupId))
Example #2
0
    def process_login(self, username, password, **kwargs):
        rootURL, local = cherrypy.request.app.config['filelocker']['root_url'], False
        if kwargs.has_key("local") and kwargs['local'] == str(True):
            local = True
        username = strip_tags(username)

        if password is None or password == "":
            raise cherrypy.HTTPRedirect("%s/login?msg=3&local=%s" % (rootURL, str(local)))
        else:
            directory = AccountService.ExternalDirectory(local)
            if directory.authenticate(username, password):
                cherrypy.session['request-origin'] = str(os.urandom(32).encode('hex'))[0:32]
                currentUser = AccountService.get_user(username, True) #if they are authenticated and local, this MUST return a user object
                if currentUser is not None:
                    if not currentUser.authorized:
                        raise cherrypy.HTTPError(403, "You do not have permission to access this system")
                    session.add(AuditLog(cherrypy.session.get("user").id, "Login", "User %s logged in successfully from IP %s" % (currentUser.id, Filelocker.get_client_address())))
                    session.commit()
                    raise cherrypy.HTTPRedirect(rootURL)
                else: #This should only happen in the case of a user existing in the external directory, but having never logged in before
                    try:
                        newUser = directory.lookup_user(username)
                        AccountService.install_user(newUser)
                        currentUser = AccountService.get_user(username, True)
                        if currentUser is not None and currentUser.authorized != False:
                            raise cherrypy.HTTPRedirect(rootURL)
                        else:
                            raise cherrypy.HTTPError(403, "You do not have permission to access this system")
                    except Exception, e:
                        return "Unable to install user: %s" % str(e)
            else:
 def remove_users_from_group(self, userIds, groupId, format="json", requestOrigin="", **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         try:
             userIds = split_list_sanitized(userIds)
             groupId = int(strip_tags(groupId))
             group = session.query(Group).filter(Group.id==groupId).one()
             if group.owner_id == user.id or AccountService.user_has_permission(user, "admin"):
                 for userId in userIds:
                     user = AccountService.get_user(userId)
                     group.members.remove(user)
                 session.add(AuditLog(user.id, Actions.UPDATE_GROUP, "%s user(s) removed from group \"%s\"(%s)" % (len(userIds), group.name, group.id)))
                 session.commit()
                 sMessages.append("Group members removed successfully")
             else:
                 fMessages.append("You do not have permission to modify group with ID:%s" % str(groupId))
         except ValueError:
             fMessages.append("Invalid group Id")
         except sqlalchemy.orm.exc.NoResultFound, nrf:
             fMessages.append("Group with ID:%s could not be found" % str(groupId))
         except Exception, e:
             session.rollback()
             fMessages.append("Couldn't remove members from group: %s" % str(e))
             cherrypy.log.error("[%s] [remove_users_from_group] [Couldn't remove members from group: %s]" % (user.id, str(e)))
 def update_user(self, userId, quota=None, email=None, firstName=None, lastName=None, password=None, confirmPassword=None, format="json", requestOrigin="", **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         try:
             userId = strip_tags(userId)
             if userId == user.id or AccountService.user_has_permission(user, "admin"):
                 updateUser = AccountService.get_user(userId) #This kind of implicitly enforces permissions
                 updateUser.email = strip_tags(email) if strip_tags(email) is not None else updateUser.email
                 updateUser.quota = int(strip_tags(quota)) if strip_tags(quota) is not None else updateUser.quota
                 updateUser.first_name = strip_tags(firstName) if strip_tags(firstName) is not None else updateUser.first_name
                 updateUser.last_name = strip_tags(lastName) if strip_tags(lastName) is not None else updateUser.last_name
                 if password != "" and password is not None and confirmPassword != "" and confirmPassword is not None:
                     if password == confirmPassword:
                         updateUser.set_password(password)
                     else:
                         fMessages.append("Passwords do not match, password has not been reset")
                 sMessages.append("Successfully updated user settings")
                 session.add(AuditLog(user.id, Actions.UPDATE_USER, "%s updated user account \"%s\"" % (user.id, userId), userId))
                 session.commit()
             else:
                  fMessages.append("You do not have permission to update this user")
         except Exception, e:
             session.rollback()
             cherrypy.log.error("[%s] [update_user] [Problem rupdating user: %s]" % (user.id, str(e)))
             fMessages.append("Problem while updating user: %s" % str(e))
 def files(self, **kwargs):
     user, role, defaultExpiration, uploadRequests, userFiles, userShareableAttributes, attributeFilesDict, sharedFiles = (
         cherrypy.session.get("user"), cherrypy.session.get("current_role"),
         None, [], [], [], {}, [])
     config = cherrypy.request.app.config['filelocker']
     orgConfig = get_config_dict_from_objects(
         session.query(ConfigParameter).filter(
             ConfigParameter.name.like('org_%')).all())
     maxDays = int(
         session.query(ConfigParameter).filter(
             ConfigParameter.name == 'max_file_life_days').one().value)
     geoTagging = get_config_dict_from_objects([
         session.query(ConfigParameter).filter(
             ConfigParameter.name == 'geotagging').one()
     ])['geotagging']
     adminEmail = session.query(ConfigParameter).filter(
         ConfigParameter.name == 'admin_email').one().value
     defaultExpiration = datetime.date.today() + (datetime.timedelta(
         days=maxDays))
     userFiles = self.file.get_user_file_list(format="list")
     if role is None:
         uploadRequests = session.query(UploadRequest).filter(
             UploadRequest.owner_id == user.id).all()
         userShareableAttributes = AccountService.get_shareable_attributes_by_user(
             user)
         attributeFilesDict = ShareService.get_files_shared_with_user_by_attribute(
             user)
         sharedFiles = ShareService.get_files_shared_with_user(user)
     else:
         userShareableAttributes = AccountService.get_shareable_attributes_by_role(
             role)
     tpl = Template(file=get_template_file('files.tmpl'),
                    searchList=[locals(), globals()])
     return str(tpl)
 def admin_console(self, **kwargs):
     user, config = cherrypy.session.get(
         "user"), cherrypy.request.app.config['filelocker']
     orgConfig = get_config_dict_from_objects(
         session.query(ConfigParameter).filter(
             ConfigParameter.name.like('org_%')).all())
     templateFiles = os.listdir(os.path.join(config['root_path'], "view"))
     configParameters = session.query(ConfigParameter).order_by(
         ConfigParameter.name).all()
     flUsers = session.query(User).slice(0, 50)
     flRoles = session.query(Role)
     totalFileCount = session.query(func.count(File.id)).scalar()
     totalUserCount = session.query(func.count(User.id)).scalar()
     totalMessageCount = session.query(func.count(Message.id)).scalar()
     currentUsersList = []
     currentUploads = len(cherrypy.file_uploads)
     logsFile = open(cherrypy.config["log.error_file"])
     logs = tail(logsFile, 50)
     attributes = AccountService.get_shareable_attributes_by_user(user)
     currentUserIds = []
     sessionCache = {}
     sessionCache = cherrypy.session.cache
     for key in sessionCache.keys():
         try:
             if sessionCache[key][0].has_key('user') and sessionCache[key][
                     0]['user'] is not None and sessionCache[key][0][
                         'user'].id not in currentUserIds:
                 currentUser = sessionCache[key][0]['user']
                 currentUsersList.append(currentUser)
                 currentUserIds.append(currentUser.id)
         except Exception, e:
             cherrypy.log.error(
                 "[%s] [admin] [Unable to read user session: %s]" %
                 (user.id, str(e)))
Example #7
0
 def get_public_shares_by_file_ids(self, fileIds, format="json", **kwargs):
     user, role, sMessages, fMessages, publicShares = (
         cherrypy.session.get("user"), cherrypy.session.get("current_role"),
         [], [], [])
     fileIds = split_list_sanitized(fileIds)
     try:
         publicShareIds = []
         for fileId in fileIds:
             try:
                 flFile = session.query(File).filter(
                     File.id == fileId).one()
                 if role is not None:
                     if flFile.role_owner_id == role.id:
                         for publicShare in flFile.public_shares:
                             if publicShare.id not in publicShareIds:
                                 publicShareIds.append(publicShare.id)
                                 publicShares.append(publicShare)
                     else:
                         fMessages.append(
                             "This role does not have permission to access public shares on file with ID: %s"
                             % fileId)
                 elif flFile.owner_id == user.id or AccountService.user_has_permission(
                         user, "admin"):
                     for publicShare in flFile.public_shares:
                         if publicShare.id not in publicShareIds:
                             publicShareIds.append(publicShare.id)
                             publicShares.append(publicShare)
                 else:
                     fMessages.append(
                         "You do not have permission to access public shares on file with ID:%s"
                         % fileId)
             except sqlalchemy.orm.exc.NoResultFound:
                 fMessages.append("File with ID:%s not found" % fileId)
     except Exception, e:
         fMessages.append(str(e))
 def delete_messages(self,
                     messageIds,
                     format="json",
                     requestOrigin="",
                     **kwargs):
     user, sMessages, fMessages = cherrypy.session.get("user"), [], []
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         try:
             messageIdList = split_list_sanitized(messageIds)
             for messageId in messageIdList:
                 message = session.query(Message).filter(
                     Message.id == messageId).scalar()
                 if (message.owner_id == user.id
                         or AccountService.user_has_permission(
                             user, "admin")):
                     session.delete(message)
                 else:
                     fMessages.append(
                         "You do not have permission to delete message with ID: %s"
                         % messageId)
             session.commit()
             sMessages.append("Message(s) deleted")
         except Exception, e:
             cherrypy.log.error(
                 "[%s] [delete_messages] [Could not delete message: %s]" %
                 (user.id, str(e)))
             fMessages.append("Could not delete message: %s" % str(e))
Example #9
0
 def take_file(self, fileId, format="json", requestOrigin="", **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         config = cherrypy.request.app.config['filelocker']
         try:
             flFile = session.query(File).filter(File.id==fileId).one()
             if flFile.owner_id == user.id:
                 fMessages.append("You cannot take your own file")
             elif flFile.shared_with(user) or AccountService.user_has_permission(user, "admin"):
                 if (FileService.get_user_quota_usage_bytes(user) + flFile.size) >= (user.quota*1024*1024):
                     cherrypy.log.error("[%s] [take_file] [User has insufficient quota space remaining to check in file: %s]" % (user.id, flFile.name))
                     raise Exception("You may not copy this file because doing so would exceed your quota")
                 takenFile = flFile.get_copy()
                 takenFile.owner_id = user.id
                 takenFile.date_uploaded = datetime.datetime.now()
                 takenFile.notify_on_download = False
                 session.add(takenFile)
                 session.commit()
                 shutil.copy(os.path.join(config['vault'],str(flFile.id)), os.path.join(config['vault'],str(takenFile.id)))
                 sMessages.append("Successfully took ownership of file %s. This file can now be shared with other users just as if you had uploaded it. " % flFile.name)
             else:
                 fMessages.append("You do not have permission to take this file")
         except sqlalchemy.orm.exc.NoResultFound, nrf:
             fMessages.append("Could not find file with ID: %s" % str(fileId))
         except Exception, e:
             session.rollback()
             fMessages.append(str(e))
Example #10
0
 def delete_public_share(self, shareId, format="json", **kwargs):
     user, role, sMessages, fMessages = (
         cherrypy.session.get("user"), cherrypy.session.get("current_role"),
         [], [])
     shareId = strip_tags(shareId)
     try:
         ps = session.query(PublicShare).filter(
             PublicShare.id == shareId).one()
         if role is not None and ps.role_owner_id == role.id:
             session.delete(ps)
             session.add(
                 AuditLog(
                     user.id, Actions.DELETE_PUBLIC_SHARE,
                     "Role %s stopped sharing files publicly via URL using share ID: %s"
                     % (role.name, str(ps.id)), None, role.id))
             session.commit()
             sMessages.append("Successfully unshared files")
         elif ps.owner_id == user.id or AccountService.user_has_permission(
                 user, "admin"):
             session.delete(ps)
             session.add(
                 AuditLog(
                     user.id, Actions.DELETE_PUBLIC_SHARE,
                     "You stopped sharing files publicly via URL using share ID: %s"
                     % str(ps.id)))
             session.commit()
             sMessages.append("Successfully unshared files")
         else:
             fMessages.append(
                 "You do not have permission to modify share ID: %s" %
                 str(ps.id))
     except Exception, e:
         fMessages.append(str(e))
Example #11
0
 def CLI_login(self, CLIkey, userId, format="cli", **kwargs):
     rootURL, local, sMessages, fMessages = cherrypy.request.app.config['filelocker']['root_url'], False, [], []
     if session.query(ConfigParameter).filter(ConfigParameter.name == "cli_feature").one().value == 'Yes':
         userId = strip_tags(userId)
         CLIkey = strip_tags(CLIkey)
         hostIP = Filelocker.get_client_address()
         if(self.validIPv4.match(hostIP)):
             hostIPv4 = hostIP
             hostIPv6 = ""
         elif(self.validIPv6.match(hostIP)):
             hostIPv4 = ""
             hostIPv6 = hostIP 
     
         self.directory = CLIDirectory.CLIDirectory()
         if self.directory.authenticate(userId, CLIkey, hostIPv4, hostIPv6):
             currentUser = AccountService.get_user(userId, True)
             cherrypy.session['request-origin'] = str(os.urandom(32).encode('hex'))[0:32]
             if currentUser is not None:
                 session.add(AuditLog(cherrypy.session.get("user").id, "Login", "User %s logged in successfully from IP %s" % (currentUser.id, Filelocker.get_client_address())))
                 session.commit()
                 sMessages.append(cherrypy.session['request-origin'])
             else:
                 fMessages.append("Failure: Not Authorized!")
         else:
             fMessages.append("Failure: Not Authorized!")
     else:
         fMessages.append("Failure: CLI not supported by server!")
     return fl_response(sMessages, fMessages, format)
Example #12
0
 def create_attribute_shares(self,
                             fileIds,
                             attributeId,
                             format="json",
                             **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     try:
         userShareableAttributes, permission = AccountService.get_shareable_attributes_by_user(
             user), False
         for attribute in userShareableAttributes:
             if attributeId == attribute.id:
                 permission = True
                 break
         if permission:
             fileIds = split_list_sanitized(fileIds)
             for fileId in fileIds:
                 session.add(
                     AttributeShare(file_id=fileId,
                                    attribute_id=attributeId))
             sMessages.append(
                 "Successfully shared file(s) with users having the %s attribute"
                 % attributeId)
         else:
             fMessages.append(
                 "You do not have permission to share with this attribute")
     except Exception, e:
         fMessages.append(str(e))
Example #13
0
 def delete_attribute_shares(self,
                             fileIds,
                             attributeId,
                             format="json",
                             **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     try:
         userShareableAttributes, permission = AccountService.get_shareable_attributes_by_user(
             user), False
         for attribute in userShareableAttributes:
             if attributeId == attribute.id:
                 permission = True
                 break
         if permission:
             fileIdList = split_list_sanitized(fileIds)
             for fileId in fileIdList:
                 share = session.query(AttributeShare).filter(
                     AttributeShare.attribute_id == attributeId
                     and AttributeShare.fileId == fileId).one()
                 session.delete(share)
             sMessages.append(
                 "Successfully unshared file(s) with users having the %s attribute"
                 % attributeId)
         else:
             fMessages.append(
                 "You do not have permission to delete attribute shares for this attribute"
             )
     except Exception, e:
         fMessages.append(str(e))
Example #14
0
 def delete_user_shares(self, fileIds, userId, format="json"):
     user, role, sMessages, fMessages = (
         cherrypy.session.get("user"), cherrypy.session.get("current_role"),
         [], [])
     fileIds = split_list_sanitized(fileIds)
     for fileId in fileIds:
         try:
             flFile = session.query(File).filter(File.id == fileId).one()
             if (
                     role is not None and flFile.role_owner_id == role.id
             ) or flFile.owner_id == user.id or AccountService.user_has_permission(
                     user, "admin"):
                 ps = session.query(UserShare).filter(
                     and_(UserShare.user_id == userId,
                          UserShare.file_id == flFile.id)).scalar()
                 if ps is not None:
                     session.delete(ps)
                     session.add(
                         AuditLog(
                             user.id, Actions.DELETE_USER_SHARE,
                             "You stopped sharing file %s with %s" %
                             (flFile.name, userId), None,
                             role.id if role is not None else None))
                     session.commit()
                     sMessages.append("Share has been successfully deleted")
                 else:
                     fMessages.append("This share does not exist")
             else:
                 fMessages.append(
                     "You do not have permission to modify shares for file with ID: %s"
                     % str(flFile.id))
         except Exception, e:
             session.rollback()
             fMessages.append("Problem deleting share for file: %s" %
                              str(e))
Example #15
0
    def upload(self, format="json", **kwargs):
        cherrypy.response.timeout = 86400
        user, role, uploadRequest, uploadKey, config, sMessages, fMessages, uploadIndex = None, None, None, None, cherrypy.request.app.config['filelocker'], [], [], None

        notify_user = False

        #Check Permission to upload since we can't wrap in requires login for public uploads
        if cherrypy.session.has_key("uploadRequest") and cherrypy.session.get("uploadRequest") is not None and cherrypy.session.get("uploadRequest").expired == False:
            uploadRequest = cherrypy.session.get("uploadRequest")
            user = AccountService.get_user(uploadRequest.owner_id)
            uploadKey = "%s:%s" % (user.id, uploadRequest.id)
            if uploadRequest.notify_user:
                notify_user = True
        else:
            #cherrypy.tools.requires_login()
            user, sMessages, fMessages = cherrypy.session.get("user"), cherrypy.session.get("sMessages"), cherrypy.session.get("fMessages")
            uploadKey = user.id
            if cherrypy.session.get("current_role") is not None:
                role = cherrypy.session.get("current_role")

        #Check upload size
        lcHDRS = {}
        for key, val in cherrypy.request.headers.iteritems():
            lcHDRS[key.lower()] = val
        try:
            fileSizeBytes = int(lcHDRS['content-length'])
        except KeyError, ke:
            fMessages.append("Request must have a valid content length")
            raise cherrypy.HTTPError(411, "Request must have a valid content length")
Example #16
0
 def update_file(self, fileId, format="json", requestOrigin="", **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         fileId = strip_tags(fileId)
         try:
             flFile = session.query(File).filter(File.id == fileId).one()
             if flFile.owner_id == user.id or AccountService.user_has_permission(
                     user, "admin"):
                 if kwargs.has_key("fileName"):
                     flFile.name = strip_tags(kwargs['fileName'])
                 if kwargs.has_key('notifyOnDownload'):
                     flFile.notify_on_download = True if kwargs[
                         'notifyOnDownload'].lower() == "true" else False
                 if kwargs.has_key('fileNotes'):
                     flFile.notes = strip_tags(kwargs['fileNotes'])
                 session.commit()
                 sMessages.append("Successfully updated file %s" %
                                  flFile.name)
             else:
                 fMessages.append(
                     "You do not have permission to update file with ID: %s"
                     % str(flFile.id))
         except sqlalchemy.orm.exc.NoResultFound, nrf:
             fMessages.append("Could not find file with ID: %s" %
                              str(fileId))
         except Exception, e:
             fMessages.append(str(e))
Example #17
0
 def delete_upload_request(self, ticketId, format="json", requestOrigin=""):
     user, sMessages, fMessages = cherrypy.session.get("user"), [], []
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         try:
             ticketId = strip_tags(ticketId)
             uploadRequest = session.query(UploadRequest).filter(
                 UploadRequest.id == ticketId).one()
             if uploadRequest.owner_id == user.id or AccountService.user_has_permission(
                     user, "admin"):
                 session.delete(uploadRequest)
                 session.add(
                     AuditLog(
                         user.id, Actions.DELETE_UPLOAD_REQUEST,
                         "You deleted an upload request with ID: %s" %
                         uploadRequest.id))
                 session.commit()
                 sMessages.append("Upload request deleted")
             else:
                 fMessages.append(
                     "You do not have permission to delete this upload request"
                 )
         except Exception, e:
             fMessages.append(str(e))
 def search_users(self,
                  firstName=None,
                  lastName=None,
                  userId=None,
                  format="json",
                  external="false",
                  **kwargs):
     config = cherrypy.request.app.config['filelocker']
     user, foundUsers, sMessages, fMessages, tooManyResults = (
         cherrypy.session.get("user"), [], [], [], False)
     external = False if external.lower() != "true" else True
     try:
         if firstName is not None or lastName is not None or userId is not None:  #Must have something to search on
             firstName = strip_tags(firstName)
             lastName = strip_tags(lastName)
             userId = strip_tags(userId)
             directory = AccountService.ExternalDirectory(external != True)
             foundUsers = directory.get_user_matches(
                 firstName, lastName, userId)
         else:
             fMessages.append(
                 "Please specify the first name, last name, or username of the user for whom you are searching"
             )
     except Exception, e:
         if str(e) == "toomany":
             tooManyResults = True
         else:
             cherrypy.log.error(
                 "[%s] [search_users] [Errors during directory search: %s]"
                 % (user.id, str(fMessages)))
             fMessages.append(str(e))
Example #19
0
 def get_public_shares_by_file_ids(self, fileIds, format="json", **kwargs):
     user, role, sMessages, fMessages, publicShares = (cherrypy.session.get("user"), cherrypy.session.get("current_role"), [], [], [])
     fileIds = split_list_sanitized(fileIds)
     try:
         publicShareIds = []
         for fileId in fileIds:
             try:
                 flFile = session.query(File).filter(File.id==fileId).one()
                 if role is not None:
                     if flFile.role_owner_id == role.id:
                         for publicShare in flFile.public_shares:
                             if publicShare.id not in publicShareIds:
                                 publicShareIds.append(publicShare.id)
                                 publicShares.append(publicShare)
                     else:
                         fMessages.append("This role does not have permission to access public shares on file with ID: %s" % fileId)
                 elif flFile.owner_id == user.id or AccountService.user_has_permission(user, "admin"):
                     for publicShare in flFile.public_shares:
                         if publicShare.id not in publicShareIds:
                             publicShareIds.append(publicShare.id)
                             publicShares.append(publicShare)
                 else:
                     fMessages.append("You do not have permission to access public shares on file with ID:%s" % fileId)
             except sqlalchemy.orm.exc.NoResultFound:
                 fMessages.append("File with ID:%s not found" % fileId)
     except Exception, e:
         fMessages.append(str(e))
Example #20
0
 def admin_console(self, **kwargs):
     user, config = cherrypy.session.get("user"), cherrypy.request.app.config['filelocker']
     orgConfig = get_config_dict_from_objects(session.query(ConfigParameter).filter(ConfigParameter.name.like('org_%')).all())
     templateFiles = os.listdir(os.path.join(config['root_path'], "view"))
     configParameters = session.query(ConfigParameter).order_by(ConfigParameter.name).all()
     flUsers = session.query(User).slice(0,50)
     flRoles = session.query(Role)
     totalFileCount = session.query(func.count(File.id)).scalar()
     totalUserCount = session.query(func.count(User.id)).scalar()
     totalMessageCount = session.query(func.count(Message.id)).scalar()
     currentUsersList = []
     currentUploads = len(cherrypy.file_uploads)
     logsFile = open(cherrypy.config["log.error_file"],"a+")
     logs = tail(logsFile, 50)
     attributes = AccountService.get_shareable_attributes_by_user(user)
     currentUserIds = []
     sessionCache = {}
     sessionCache = cherrypy.session.cache
     for key in sessionCache.keys():
         try:
             if sessionCache[key][0].has_key('user') and sessionCache[key][0]['user'] is not None and sessionCache[key][0]['user'].id not in currentUserIds:
                 currentUser = sessionCache[key][0]['user']
                 currentUsersList.append(currentUser)
                 currentUserIds.append(currentUser.id)
         except Exception, e:
             cherrypy.log.error("[%s] [admin] [Unable to read user session: %s]" % (user.id, str(e)))
Example #21
0
 def delete_files(self, fileIds, format="json", requestOrigin="", **kwargs):
     user, role, sMessages, fMessages = (cherrypy.session.get("user"),cherrypy.session.get("current_role"), [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         fileIds = split_list_sanitized(fileIds)
         for fileId in fileIds:
             try:
                 fileId = int(fileId)
                 flFile = session.query(File).filter(File.id == fileId).one()
                 if flFile.role_owner_id is not None and role is not None and flFile.role_owner_id == role.id:
                     FileService.queue_for_deletion(flFile.id)
                     session.delete(flFile)
                     session.add(AuditLog(user.id, Actions.DELETE_FILE, "File %s (%s) owned by role %s has been deleted by user %s. " % (flFile.name, flFile.id, role.name, user.id)))
                     session.commit()
                     sMessages.append("File %s deleted successfully" % flFile.name)
                 elif flFile.owner_id == user.id or AccountService.user_has_permission(user, "admin"):
                     FileService.queue_for_deletion(flFile.id)
                     session.delete(flFile)
                     session.add(AuditLog(user.id, Actions.DELETE_FILE, "File %s (%s) has been deleted" % (flFile.name, flFile.id)))
                     session.commit()
                     sMessages.append("File %s deleted successfully" % flFile.name)
                 else:
                     fMessages.append("You do not have permission to delete file %s" % flFile.name)
             except sqlalchemy.orm.exc.NoResultFound, nrf:
                 fMessages.append("Could not find file with ID: %s" % str(fileId))
             except Exception, e:
                 session.rollback()
                 cherrypy.log.error("[%s] [delete_files] [Could not delete file: %s]" % (user.id, str(e)))
                 fMessages.append("File not deleted: %s" % str(e))
 def update_group(self,
                  groupId,
                  groupName=None,
                  groupScope="private",
                  format="json",
                  **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     try:
         groupId = strip_tags(groupId)
         group = session.query(Group).filter(Group.id == groupId).one()
         if group.owner_id == user.id or AccountService.user_has_permission(
                 user, "admin"):
             group.name = strip_tags(groupName) if strip_tags(
                 groupName) is not None else group.name
             group.scope = strip_tags(groupScope.lower(
             )) if groupScope is not None else group.scope
             session.add(
                 AuditLog(
                     user.id, Actions.UPDATE_GROUP,
                     "Group \"%s\"(%s) has been updated" %
                     (group.name, group.id)))
             session.commit()
             sMessages.append("Group updated")
         else:
             fMessages.append(
                 "You do not have permission to update this group")
     except sqlalchemy.orm.exc.NoResultFound, nrf:
         fMessages.append("Could not find group with ID: %s" % str(groupId))
 def take_file(self, fileId, format="json", **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     config = cherrypy.request.app.config['filelocker']
     try:
         flFile = session.query(File).filter(File.id == fileId).one()
         if flFile.owner_id == user.id:
             fMessages.append("You cannot take your own file")
         elif flFile.shared_with(
                 user) or AccountService.user_has_permission(user, "admin"):
             if (FileService.get_user_quota_usage_bytes(user) +
                     flFile.size) >= (user.quota * 1024 * 1024):
                 cherrypy.log.error(
                     "[%s] [take_file] [User has insufficient quota space remaining to check in file: %s]"
                     % (user.id, flFile.name))
                 raise Exception(
                     "You may not copy this file because doing so would exceed your quota"
                 )
             takenFile = flFile.get_copy()
             takenFile.owner_id = user.id
             takenFile.date_uploaded = datetime.datetime.now()
             takenFile.notify_on_download = False
             session.add(takenFile)
             session.commit()
             shutil.copy(os.path.join(config['vault'], str(flFile.id)),
                         os.path.join(config['vault'], str(takenFile.id)))
             sMessages.append(
                 "Successfully took ownership of file %s. This file can now be shared with other users just as if you had uploaded it. "
                 % flFile.name)
         else:
             fMessages.append(
                 "You do not have permission to take this file")
     except sqlalchemy.orm.exc.NoResultFound, nrf:
         fMessages.append("Could not find file with ID: %s" % str(fileId))
    def upload(self, format="json", **kwargs):
        cherrypy.response.timeout = 86400
        user, role, uploadRequest, uploadKey, config, sMessages, fMessages, uploadIndex = None, None, None, None, cherrypy.request.app.config[
            'filelocker'], [], [], None

        #Check Permission to upload since we can't wrap in requires login for public uploads
        if cherrypy.session.has_key("uploadRequest") and cherrypy.session.get(
                "uploadRequest") is not None and cherrypy.session.get(
                    "uploadRequest").expired == False:
            uploadRequest = cherrypy.session.get("uploadRequest")
            user = AccountService.get_user(uploadRequest.owner_id)
            uploadKey = "%s:%s" % (user.id, uploadRequest.id)
        else:
            #cherrypy.tools.requires_login()
            user, sMessages, fMessages = cherrypy.session.get(
                "user"), cherrypy.session.get(
                    "sMessages"), cherrypy.session.get("fMessages")
            uploadKey = user.id
            if cherrypy.session.get("current_role") is not None:
                role = cherrypy.session.get("current_role")

        #Check upload size
        lcHDRS = {}
        for key, val in cherrypy.request.headers.iteritems():
            lcHDRS[key.lower()] = val
        try:
            fileSizeBytes = int(lcHDRS['content-length'])
        except KeyError, ke:
            fMessages.append("Request must have a valid content length")
            raise cherrypy.HTTPError(
                411, "Request must have a valid content length")
 def get_search_widget(self, context, **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     orgConfig = get_config_dict_from_objects(session.query(ConfigParameter).filter(ConfigParameter.name.like('org_%')).all())
     groups = session.query(User).filter(User.id==user.id).one().groups
     directoryType = session.query(ConfigParameter).filter(ConfigParameter.name=="directory_type").one().value
     userShareableAttributes = AccountService.get_shareable_attributes_by_user(user)
     tpl = Template(file=get_template_file('search_widget.tmpl'), searchList=[locals(),globals()])
     return str(tpl)
Example #26
0
    def process_login(self, username, password, **kwargs):
        rootURL, local = cherrypy.request.app.config['filelocker'][
            'root_url'], False
        if kwargs.has_key("local") and kwargs['local'] == str(True):
            local = True
        username = strip_tags(username)

        if password is None or password == "":
            raise cherrypy.HTTPRedirect("%s/login?msg=3&local=%s" %
                                        (rootURL, str(local)))
        else:
            directory = AccountService.ExternalDirectory(local)
            if directory.authenticate(username, password):
                cherrypy.session['request-origin'] = str(
                    os.urandom(32).encode('hex'))[0:32]
                currentUser = AccountService.get_user(
                    username, True
                )  #if they are authenticated and local, this MUST return a user object
                if currentUser is not None:
                    if not currentUser.authorized:
                        raise cherrypy.HTTPError(
                            403,
                            "You do not have permission to access this system")
                    session.add(
                        AuditLog(
                            cherrypy.session.get("user").id, "Login",
                            "User %s logged in successfully from IP %s" %
                            (currentUser.id, Filelocker.get_client_address())))
                    session.commit()
                    raise cherrypy.HTTPRedirect(rootURL)
                else:  #This should only happen in the case of a user existing in the external directory, but having never logged in before
                    try:
                        newUser = directory.lookup_user(username)
                        AccountService.install_user(newUser)
                        currentUser = AccountService.get_user(username, True)
                        if currentUser is not None and currentUser.authorized != False:
                            raise cherrypy.HTTPRedirect(rootURL)
                        else:
                            raise cherrypy.HTTPError(
                                403,
                                "You do not have permission to access this system"
                            )
                    except Exception, e:
                        return "Unable to install user: %s" % str(e)
            else:
 def add_user_to_group(self, userId, groupId, format="json", requestOrigin="", **kwargs):
     user, sMessages, fMessages  = (cherrypy.session.get("user"), [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         try:
             userId = strip_tags(userId)
             groupId = int(strip_tags(groupId))
             group = session.query(Group).filter(Group.id == groupId).one()
             if group.owner_id == user.id or AccountService.user_has_permission(user, "admin"):
                 try:
                     user = AccountService.get_user(userId)
                     group.members.append(user)
                     session.add(AuditLog(user.id, Actions.UPDATE_GROUP, "User %s added to group \"%s\"(%s)" % (user.id, group.name, group.id)))
                     session.commit()
                 except sqlalchemy.orm.exc.NoResultFound, nrf:
                     fMessages.append("Invalid user ID: %s, not added to group" % str(userId))
             else:
Example #28
0
 def files(self, **kwargs):
     user, role, defaultExpiration, uploadRequests, userFiles, userShareableAttributes,attributeFilesDict,sharedFiles = (cherrypy.session.get("user"), cherrypy.session.get("current_role"), None, [], [], [], {}, [])
     config = cherrypy.request.app.config['filelocker']
     orgConfig = get_config_dict_from_objects(session.query(ConfigParameter).filter(ConfigParameter.name.like('org_%')).all())
     maxDays = int(session.query(ConfigParameter).filter(ConfigParameter.name=='max_file_life_days').one().value)
     geoTagging = get_config_dict_from_objects([session.query(ConfigParameter).filter(ConfigParameter.name=='geotagging').one()])['geotagging']
     adminEmail = session.query(ConfigParameter).filter(ConfigParameter.name=='admin_email').one().value
     defaultExpiration = datetime.date.today() + (datetime.timedelta(days=maxDays))
     userFiles = self.file.get_user_file_list(format="list")
     if role is None:
         uploadRequests = session.query(UploadRequest).filter(UploadRequest.owner_id==user.id).all()
         userShareableAttributes = AccountService.get_shareable_attributes_by_user(user)
         attributeFilesDict = ShareService.get_files_shared_with_user_by_attribute(user)
         sharedFiles = ShareService.get_files_shared_with_user(user)
     else:
         userShareableAttributes = AccountService.get_shareable_attributes_by_role(role)
     tpl = Template(file=get_template_file('files.tmpl'), searchList=[locals(),globals()])
     return str(tpl)
 def get_group_members(self, groupId, **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"),  [], [])
     searchWidget = self.get_search_widget("manage_groups")
     groupId = strip_tags(groupId)
     group = session.query(Group).filter(Group.id == groupId).one()
     if group.owner_id == user.id or AccountService.user_has_permission(user, "admin"):
         tpl = Template(file=get_template_file('view_group.tmpl'), searchList=[locals(),globals()])
         return str(tpl)
     else:
         raise cherrypy.HTTPError(413, "Not permitted")
Example #30
0
 def delete_group_shares(self, fileIds, groupId, format="json"):
     user, role, sMessages, fMessages = (
         cherrypy.session.get("user"), cherrypy.session.get("current_role"),
         [], [])
     fileIds = split_list_sanitized(fileIds)
     for fileId in fileIds:
         try:
             group = session.query(Group).filter(Group.id == groupId).one()
             if (
                     role is not None and group.role_owner_id == role.id
             ) or group.owner_id == user.id or AccountService.user_has_permission(
                     user, "admin"):
                 flFile = session.query(File).filter(
                     File.id == fileId).one()
                 if (
                         role is not None
                         and flFile.role_owner_id == role.id
                 ) or flFile.owner_id == user.id or AccountService.user_has_permission(
                         user, "admin"):
                     share = session.query(GroupShare).filter(
                         GroupShare.group_id == groupId
                         and GroupShare.file_id == flFile.id).scalar()
                     if share is not None:
                         session.delete(share)
                         session.add(
                             AuditLog(
                                 user.id, Actions.DELETE_GROUP_SHARE,
                                 "You stopped sharing file %s with group %s"
                                 % (flFile.name, group.name), None,
                                 role.id if role is not None else None))
                         session.commit()
                 else:
                     fMessages.append(
                         "You do not have permission to modify shares for file with ID: %s"
                         % str(flFile.id))
             else:
                 fMessages.append(
                     "You do not have permission delete shares with this group"
                 )
         except Exception, e:
             session.rollback()
             fMessages.append("Problem deleting share for file: %s" %
                              str(e))
Example #31
0
 def delete_files(self, fileIds, format="json", requestOrigin="", **kwargs):
     user, role, sMessages, fMessages = (
         cherrypy.session.get("user"), cherrypy.session.get("current_role"),
         [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         fileIds = split_list_sanitized(fileIds)
         for fileId in fileIds:
             try:
                 fileId = int(fileId)
                 flFile = session.query(File).filter(
                     File.id == fileId).one()
                 if flFile.role_owner_id is not None and role is not None and flFile.role_owner_id == role.id:
                     FileService.queue_for_deletion(flFile.id)
                     session.delete(flFile)
                     session.add(
                         AuditLog(
                             user.id, Actions.DELETE_FILE,
                             "File %s (%s) owned by role %s has been deleted by user %s. "
                             %
                             (flFile.name, flFile.id, role.name, user.id)))
                     session.commit()
                     sMessages.append("File %s deleted successfully" %
                                      flFile.name)
                 elif flFile.owner_id == user.id or AccountService.user_has_permission(
                         user, "admin"):
                     FileService.queue_for_deletion(flFile.id)
                     session.delete(flFile)
                     session.add(
                         AuditLog(
                             user.id, Actions.DELETE_FILE,
                             "File %s (%s) has been deleted" %
                             (flFile.name, flFile.id)))
                     session.commit()
                     sMessages.append("File %s deleted successfully" %
                                      flFile.name)
                 else:
                     fMessages.append(
                         "You do not have permission to delete file %s" %
                         flFile.name)
             except sqlalchemy.orm.exc.NoResultFound, nrf:
                 fMessages.append("Could not find file with ID: %s" %
                                  str(fileId))
             except Exception, e:
                 session.rollback()
                 cherrypy.log.error(
                     "[%s] [delete_files] [Could not delete file: %s]" %
                     (user.id, str(e)))
                 fMessages.append("File not deleted: %s" % str(e))
Example #32
0
 def create_user_shares(self, fileIds, userId=None, notify="no", cc="false", format="json", requestOrigin="", **kwargs):
     config = cherrypy.request.app.config['filelocker']
     orgConfig = get_config_dict_from_objects(session.query(ConfigParameter).filter(ConfigParameter.name.like('org_%')).all())
     user, role, sMessages, fMessages  = (cherrypy.session.get("user"), cherrypy.session.get("current_role"), [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         fileIds = split_list_sanitized(fileIds)
         userId = strip_tags(userId) if userId is not None and userId != "" else None
         notify = True if notify.lower() == "true" else False
         cc = True if cc.lower() == "true" else False
         sharedFiles, recipients = [], []
         try:
             if userId is not None:
                 shareUser = AccountService.get_user(userId)
                 if (shareUser.email is not None and shareUser.email != ""):
                     recipients.append(shareUser)
                 for fileId in fileIds:
                     flFile = session.query(File).filter(File.id==fileId).one()
                     
                     if (role is not None and flFile.role_owner_id == role.id) or flFile.owner_id == user.id or AccountService.user_has_permission(user, "admin"):
                         existingShare = session.query(UserShare).filter(and_(UserShare.file_id==fileId, UserShare.user_id==userId)).scalar()
                         if existingShare is None:
                             flFile.user_shares.append(UserShare(user_id=userId, file_id=fileId))
                             session.commit()
                             sharedFiles.append(flFile)
                             if role is not None: session.add(AuditLog(user.id, Actions.CREATE_USER_SHARE, "Role %s shared file %s(%s) with %s" % (role.id, flFile.name, flFile.id, shareUser.id), shareUser.id, role.id))
                             else: session.add(AuditLog(user.id, "Create User Share", "%s shared file %s(%s) with %s" % (user.id, flFile.name, flFile.id, shareUser.id), shareUser.id))
                             session.commit()
                     else:
                         fMessages.append("You do not have permission to share file with ID: %s" % str(flFile.id))
                 if notify:
                     cherrypy.session.release_lock()
                     if cc:
                         if (user is not None and user != ""):
                             recipients.append(user)
                         else:
                             fMessages.append("You elected to receive a carbon copy of the share notification, however your account does not have an email address set.")
                     for recipient in recipients:
                         try:
                             Mail.notify(get_template_file('share_notification.tmpl'),{'sender':user.email if role is None else role.email,'recipient':recipient.email, 'ownerId':user.id if role is None else role.id, 'ownerName':user.display_name if role is None else role.name, 'sharedFiles':sharedFiles, 'filelockerURL': config['root_url'], 'org_url': orgConfig['org_url'], 'org_name': orgConfig['org_name'], 'personalMessage': ""})
                             session.add(AuditLog(user.id, Actions.SEND_EMAIL, "%s(%s) has been notified via email that you have shared a file with him or her." % (recipient.display_name, recipient.id), None, role.id if role is not None else None))
                         except Exception, e:
                             session.rollback()
                             fMessages.append("Problem sending email notification to %s: %s" % (recipient.display_name, str(e)))
                     session.commit()
                 sMessages.append("Shared file(s) successfully")
             else:
                 fMessages.append("You did not specify a user to share the file with")
Example #33
0
 def create_message(self, subject, body, recipientIds, expiration, format="json", **kwargs):
     user, sMessages, fMessages = cherrypy.session.get("user"), [], []
     try:
         maxDays = int(session.query(ConfigParameter).filter(ConfigParameter.name=='max_file_life_days').one().value)
         maxExpiration = datetime.datetime.today() + datetime.timedelta(days=maxDays)
         expiration = datetime.datetime(*time.strptime(strip_tags(expiration), "%m/%d/%Y")[0:5]) if (kwargs.has_key('expiration') and strip_tags(expiration) is not None and expiration.lower() != "never") else maxExpiration
         recipientIdList = split_list_sanitized(recipientIds)
         subject = strip_tags(subject)
         if subject is None or subject.strip()=="":
             raise Exception("Subject cannot be blank")
         #Process the expiration data for the file
         if expiration is None and (AccountService.user_has_permission(user, "expiration_exempt") == False and AccountService.user_has_permission(user, "admin")==False): #Check permission before allowing a non-expiring upload
             expiration = maxExpiration
         else:
             if maxExpiration < expiration and AccountService.user_has_permission(user, "expiration_exempt")==False:
                 raise Exception("Expiration date must be between now and %s." % maxExpiration.strftime("%m/%d/%Y"))
         if body is None or body.strip()=="":
             raise Exception("Message body cannot be blank")
         newMessage = Message(subject=subject, body=body, date_sent=datetime.datetime.now(), owner_id=user.id, date_expires=expiration, encryption_key=Encryption.generatePassword())
         session.add(newMessage)
         session.commit()
         encrypt_message(newMessage)
         for recipientId in recipientIdList:
             rUser = AccountService.get_user(recipientId)
             if rUser is not None:
                 newMessage.message_shares.append(MessageShare(message_id=newMessage.id, recipient_id=rUser.id))
                 session.add(AuditLog(user.id, "Send Message", "%s sent a message with subject: \"%s\" to %s(%s)" % (user.id, newMessage.subject, rUser.display_name, rUser.id), rUser.id, None))
             else:
                 fMessages.append("Could not send to user with ID:%s - Invalid user ID" % str(recipientId))
         session.commit()
         sMessages.append("Message \"%s\" sent." % subject)
     except ValueError:
         fMessages.append("Invalid expiration date format. Date must be in mm/dd/yyyy format.")
     except Exception, e:
         cherrypy.log.error("[%s] [create_message] [Could not create message: %s]" % (user.id, str(e)))
         fMessages.append("Could not send message: %s" % str(e))
Example #34
0
 def delete_upload_request(self, ticketId, format="json", requestOrigin=""):
     user,  sMessages, fMessages = cherrypy.session.get("user"), [], []
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         try:
             ticketId = strip_tags(ticketId)
             uploadRequest = session.query(UploadRequest).filter(UploadRequest.id == ticketId).one()
             if uploadRequest.owner_id == user.id or AccountService.user_has_permission(user, "admin"):
                 session.delete(uploadRequest)
                 session.add(AuditLog(user.id, Actions.DELETE_UPLOAD_REQUEST, "You deleted an upload request with ID: %s" % uploadRequest.id))
                 session.commit()
                 sMessages.append("Upload request deleted")
             else:
                 fMessages.append("You do not have permission to delete this upload request")
         except Exception, e:
             fMessages.append(str(e))
 def delete_messages(self, messageIds, format="json", requestOrigin="", **kwargs):
     user, sMessages, fMessages = cherrypy.session.get("user"), [], []
     if requestOrigin != cherrypy.session["request-origin"]:
         fMessages.append("Missing request key!!")
     else:
         try:
             messageIdList = split_list_sanitized(messageIds)
             for messageId in messageIdList:
                 message = session.query(Message).filter(Message.id == messageId).scalar()
                 if message.owner_id == user.id or AccountService.user_has_permission(user, "admin"):
                     session.delete(message)
                 else:
                     fMessages.append("You do not have permission to delete message with ID: %s" % messageId)
             session.commit()
             sMessages.append("Message(s) deleted")
         except Exception, e:
             cherrypy.log.error("[%s] [delete_messages] [Could not delete message: %s]" % (user.id, str(e)))
             fMessages.append("Could not delete message: %s" % str(e))
 def delete_clikey(self, hostIPv4, hostIPv6, format="json", requestOrigin="", **kwargs):
     user, sMessages, fMessages  = (cherrypy.session.get("user"),  [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         try:
             clikey = session.query(CLIKey).filter(CLIKey.host_ipv4==hostIPv4).filter(CLIKey.host_ipv6==hostIPv6).one()
             if clikey.user_id == user.id or AccountService.user_has_permission(user, "admin"):
                 session.delete(clikey)
                 sMessages.append("Key %s deleted successfully" % clikey.value)
                 session.add(AuditLog(user.id, Actions.DELETE_CLIKEY, "%s deleted CLI Key for host: %s%s" % (user.id, hostIPv4, hostIPv6)))
         except sqlalchemy.orm.exc.NoResultFound, nrf:
             fMessages.append("Could not find key for host: %s%s" % str(hostIPv4), str(hostIPv6))
             session.commit()
         except Exception, e:
             session.rollback()
             fMessages.append("Could not delete Key: %s" % str(e))
             cherrypy.log.error("[%s] [delete_clikey] [Could not delete key: %s]" % (user.id, str(e)))
 def remove_users_from_role(self, roleId, userIds, format="json", **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     try:
         roleId = strip_tags(roleId)
         userIds = split_list_sanitized(userIds)
         if userIds is not None and roleId is not None:
             role = session.query(Role).filter(Role.id == roleId).one()
             for userId in userIds:
                 try:
                     user = AccountService.get_user(userId)
                     role.members.remove(user)
                     session.commit()
                 except sqlalchemy.orm.exc.NoResultFound, nrf:
                     fMessages.append("User with ID:%s could not be found" %
                                      str(roleId))
             sMessages.append("Removed user(s) from role: %s" % str(roleId))
     except sqlalchemy.orm.exc.NoResultFound, nrf:
         fMessages.append("Role with ID:%s could not be found" %
                          str(roleId))
Example #38
0
 def create_attribute_shares(self, fileIds, attributeId, format="json", requestOrigin="", **kwargs):
     user, sMessages, fMessages  = (cherrypy.session.get("user"), [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         try:
             userShareableAttributes, permission = AccountService.get_shareable_attributes_by_user(user), False
             for attribute in userShareableAttributes:
                 if attributeId == attribute.id:
                     permission = True
                     break
             if permission:
                 fileIds = split_list_sanitized(fileIds)
                 for fileId in fileIds:
                     session.add(AttributeShare(file_id=fileId, attribute_id=attributeId))
                 sMessages.append("Successfully shared file(s) with users having the %s attribute" % attributeId )
             else:
                 fMessages.append("You do not have permission to share with this attribute")
         except Exception, e:
             fMessages.append(str(e))
Example #39
0
def requires_login(permissionId=None, **kwargs):
    from lib import AccountService

    format, rootURL = None, cherrypy.request.app.config["filelocker"]["root_url"]
    if cherrypy.request.params.has_key("format"):
        format = cherrypy.request.params["format"]
    if cherrypy.session.has_key("user") and cherrypy.session.get("user") is not None:
        user = cherrypy.session.get("user")
        if user.date_tos_accept == None:
            raise cherrypy.HTTPRedirect(rootURL + "/sign_tos")
        elif permissionId is not None:
            try:
                if not AccountService.user_has_permission(user, permissionId):
                    raise cherrypy.HTTPError(403)
            except Exception, e:
                raise cherrypy.HTTPError(
                    500,
                    "The server is having problems communicating with the database server. Please try again in a few minutes.",
                )
        else:
            pass
 def delete_groups(self, groupIds, format="json", requestOrigin="", **kwargs):
     user, sMessages, fMessages  = (cherrypy.session.get("user"),  [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         try:
             groupIds = split_list_sanitized(groupIds)
             for groupId in groupIds:
                 try:
                     group = session.query(Group).filter(Group.id==groupId).one()
                     if group.owner_id == user.id or AccountService.user_has_permission(user, "admin"):
                         session.delete(group)
                         sMessages.append("Group %s deleted successfully" % group.name)
                         session.add(AuditLog(user.id, Actions.DELETE_GROUP, "%s deleted group \"%s\"(%s)" % (user.id, group.name, group.id), None))
                 except sqlalchemy.orm.exc.NoResultFound, nrf:
                     fMessages.append("Could not find group with ID: %s" % str(groupId))
             session.commit()
         except Exception, e:
             session.rollback()
             fMessages.append("Could not delete groups: %s" % str(e))
             cherrypy.log.error("[%s] [remove_users_from_group] [Could not delete groups: %s]" % (user.id, str(e)))
    def history(self,
                userId=None,
                startDate=None,
                endDate=None,
                logAction=None,
                format="html",
                **kwargs):
        sMessages, fMessages, user, role = (
            [], [], cherrypy.session.get("user"),
            cherrypy.session.get("current_role"))
        config = cherrypy.request.app.config['filelocker']
        orgConfig = get_config_dict_from_objects(
            session.query(ConfigParameter).filter(
                ConfigParameter.name.like('org_%')).all())

        userId = strip_tags(userId) if strip_tags(userId) != None else user.id
        if (userId != user.id and AccountService.user_has_permission(
                user, "admin") == False):
            raise cherrypy.HTTPError(403)
        actionList, actionLogList = ([], [])
        try:
            startDateFormatted, endDateFormatted = None, None
            sevenDays = datetime.timedelta(days=7)
            today = datetime.datetime.now().replace(hour=0,
                                                    minute=0,
                                                    second=0,
                                                    microsecond=0)
            sevenDaysAgo = today - sevenDays
            sevenDaysAgo = sevenDaysAgo.replace(hour=0,
                                                minute=0,
                                                second=0,
                                                microsecond=0)
            if startDate is not None:
                try:
                    startDateFormatted = datetime.datetime(
                        *time.strptime(strip_tags(startDate), "%m/%d/%Y")[0:5])
                except Exception, e:
                    fMessages.append("Start date was not properly formatted")
                    startDateFormatted = sevenDaysAgo
            else:
 def delete_groups(self, groupIds, format="json", **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     try:
         groupIds = split_list_sanitized(groupIds)
         for groupId in groupIds:
             try:
                 group = session.query(Group).filter(
                     Group.id == groupId).one()
                 if group.owner_id == user.id or AccountService.user_has_permission(
                         user, "admin"):
                     session.delete(group)
                     sMessages.append("Group %s deleted successfully" %
                                      group.name)
                     session.add(
                         AuditLog(
                             user.id, Actions.DELETE_GROUP,
                             "%s deleted group \"%s\"(%s)" %
                             (user.id, group.name, group.id), None))
             except sqlalchemy.orm.exc.NoResultFound, nrf:
                 fMessages.append("Could not find group with ID: %s" %
                                  str(groupId))
         session.commit()
Example #43
0
 def delete_public_share(self, shareId, format="json", requestOrigin="", **kwargs):
     user, role, sMessages, fMessages = (cherrypy.session.get("user"), cherrypy.session.get("current_role"), [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         shareId = strip_tags(shareId)
         try:
             ps = session.query(PublicShare).filter(PublicShare.id == shareId).one()
             if role is not None and ps.role_owner_id == role.id:
                 session.delete(ps)
                 session.add(AuditLog(user.id, Actions.DELETE_PUBLIC_SHARE, "Role %s stopped sharing files publicly via URL using share ID: %s" % (role.name, str(ps.id)), None, role.id))
                 session.commit()
                 sMessages.append("Successfully unshared files")
             elif ps.owner_id == user.id or AccountService.user_has_permission(user, "admin"):
                 session.delete(ps)
                 session.add(AuditLog(user.id, Actions.DELETE_PUBLIC_SHARE, "You stopped sharing files publicly via URL using share ID: %s" % str(ps.id)))
                 session.commit()
                 sMessages.append("Successfully unshared files")
             else:
                 fMessages.append("You do not have permission to modify share ID: %s" % str(ps.id))
         except Exception, e:
             fMessages.append(str(e))
 def update_group(self, groupId, groupName=None, groupScope="private", format="json", requestOrigin="", **kwargs):
     user, sMessages, fMessages  = (cherrypy.session.get("user"), [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         try:
             groupId = strip_tags(groupId)
             group = session.query(Group).filter(Group.id == groupId).one()
             if group.owner_id == user.id or AccountService.user_has_permission(user, "admin"):
                 group.name = strip_tags(groupName) if strip_tags(groupName) is not None else group.name
                 group.scope = strip_tags(groupScope.lower()) if groupScope is not None else group.scope
                 session.add(AuditLog(user.id, Actions.UPDATE_GROUP, "Group \"%s\"(%s) has been updated" % (group.name, group.id)))
                 session.commit()
                 sMessages.append("Group updated")
             else:
                 fMessages.append("You do not have permission to update this group")
         except sqlalchemy.orm.exc.NoResultFound, nrf:
             fMessages.append("Could not find group with ID: %s" % str(groupId))
         except Exception, e:
             session.rollback()
             cherrypy.log.error("[%s] [update_group] [Couldn't update group: %s]" % (user.id, str(e)))
             fMessages.append("Could not update group: %s" % str(e))
Example #45
0
def requires_login(permissionId=None, **kwargs):
    from lib import AccountService
    format, rootURL = None, cherrypy.request.app.config['filelocker'][
        'root_url']
    if cherrypy.request.params.has_key("format"):
        format = cherrypy.request.params['format']
    if cherrypy.session.has_key("user") and cherrypy.session.get(
            'user') is not None:
        user = cherrypy.session.get('user')
        if user.date_tos_accept == None:
            raise cherrypy.HTTPRedirect(rootURL + "/sign_tos")
        elif permissionId is not None:
            try:
                if not AccountService.user_has_permission(user, permissionId):
                    raise cherrypy.HTTPError(403)
            except Exception, e:
                raise cherrypy.HTTPError(
                    500,
                    "The server is having problems communicating with the database server. Please try again in a few minutes."
                )
        else:
            pass
Example #46
0
    def history(self, userId=None, startDate=None, endDate=None, logAction=None, format="html", **kwargs):
        sMessages, fMessages, user, role= ([],[],cherrypy.session.get("user"),cherrypy.session.get("current_role"))
        config = cherrypy.request.app.config['filelocker']
        orgConfig = get_config_dict_from_objects(session.query(ConfigParameter).filter(ConfigParameter.name.like('org_%')).all())

        userId = strip_tags(userId) if strip_tags(userId) != None else user.id
        if (userId != user.id and AccountService.user_has_permission(user, "admin")==False):
            raise cherrypy.HTTPError(403)
        actionList, actionLogList = ([], [])
        try:
            startDateFormatted, endDateFormatted = None, None
            sevenDays = datetime.timedelta(days=7)
            today = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
            sevenDaysAgo = today - sevenDays
            sevenDaysAgo = sevenDaysAgo.replace(hour=0, minute=0, second=0, microsecond=0)
            if startDate is not None:
                try:
                    startDateFormatted = datetime.datetime(*time.strptime(strip_tags(startDate), "%m/%d/%Y")[0:5])
                except Exception, e:
                    fMessages.append("Start date was not properly formatted")
                    startDateFormatted = sevenDaysAgo
            else:
 def remove_users_from_role(self, roleId, userIds, format="json", requestOrigin="", **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         try:
             roleId = strip_tags(roleId)
             userIds = split_list_sanitized(userIds)
             if userIds is not None and roleId is not None:
                 role = session.query(Role).filter(Role.id==roleId).one()
                 for userId in userIds:
                     try:
                         user = AccountService.get_user(userId)
                         role.members.remove(user)
                         session.commit()
                     except sqlalchemy.orm.exc.NoResultFound, nrf:
                         fMessages.append("User with ID:%s could not be found" % str(roleId))
                 sMessages.append("Removed user(s) from role: %s" % str(roleId))
         except sqlalchemy.orm.exc.NoResultFound, nrf:
             fMessages.append("Role with ID:%s could not be found" % str(roleId))
         except Exception, e:
             fMessages.append("Unable to remove users from roles: %s" % str(e))
             cherrypy.log.error("[%s] [remove_users_from_role] [Unable to remove users from roles: %s]" % (userIds, str(e)))
Example #48
0
 def update_file(self, fileId, format="json", requestOrigin="", **kwargs):
     user,  sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         fileId = strip_tags(fileId)
         try:
             flFile = session.query(File).filter(File.id==fileId).one()
             if flFile.owner_id == user.id or AccountService.user_has_permission(user, "admin"):
                 if kwargs.has_key("fileName"):
                     flFile.name = strip_tags(kwargs['fileName'])
                 if kwargs.has_key('notifyOnDownload'):
                     flFile.notify_on_download = True if kwargs['notifyOnDownload'].lower()=="true" else False
                 if kwargs.has_key('fileNotes'):
                     flFile.notes = strip_tags(kwargs['fileNotes'])
                 session.commit()
                 sMessages.append("Successfully updated file %s" % flFile.name)
             else:
                 fMessages.append("You do not have permission to update file with ID: %s" % str(flFile.id))
         except sqlalchemy.orm.exc.NoResultFound, nrf:
             fMessages.append("Could not find file with ID: %s" % str(fileId))
         except Exception, e:
             fMessages.append(str(e))
Example #49
0
 def delete_user_shares(self, fileIds, userId, format="json", requestOrigin=""):
     user, role, sMessages, fMessages = (cherrypy.session.get("user"), cherrypy.session.get("current_role"), [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         fileIds = split_list_sanitized(fileIds)
         for fileId in fileIds:
             try:
                 flFile = session.query(File).filter(File.id==fileId).one()
                 if (role is not None and flFile.role_owner_id == role.id) or flFile.owner_id == user.id or AccountService.user_has_permission(user, "admin"):
                     ps = session.query(UserShare).filter(and_(UserShare.user_id == userId, UserShare.file_id == flFile.id)).scalar()
                     if ps is not None:
                         session.delete(ps)
                         session.add(AuditLog(user.id, Actions.DELETE_USER_SHARE, "You stopped sharing file %s with %s" % (flFile.name, userId), None, role.id if role is not None else None))
                         session.commit()
                         sMessages.append("Share has been successfully deleted")
                     else:
                         fMessages.append("This share does not exist")
                 else:
                     fMessages.append("You do not have permission to modify shares for file with ID: %s" % str(flFile.id))
             except Exception, e:
                 session.rollback()
                 fMessages.append("Problem deleting share for file: %s" % str(e))
 def create_message(self, subject, body, recipientIds, expiration, format="json", requestOrigin="", **kwargs):
     user, sMessages, fMessages = cherrypy.session.get("user"), [], []
     if requestOrigin != cherrypy.session["request-origin"]:
         fMessages.append("Missing request key!!")
     else:
         try:
             maxDays = int(
                 session.query(ConfigParameter).filter(ConfigParameter.name == "max_file_life_days").one().value
             )
             maxExpiration = datetime.datetime.today() + datetime.timedelta(days=maxDays)
             expiration = (
                 datetime.datetime(*time.strptime(strip_tags(expiration), "%m/%d/%Y")[0:5])
                 if (
                     kwargs.has_key("expiration")
                     and strip_tags(expiration) is not None
                     and expiration.lower() != "never"
                 )
                 else maxExpiration
             )
             recipientIdList = split_list_sanitized(recipientIds)
             subject = strip_tags(subject)
             if subject is None or subject.strip() == "":
                 raise Exception("Subject cannot be blank")
             # Process the expiration data for the file
             if expiration is None and (
                 AccountService.user_has_permission(user, "expiration_exempt") == False
                 and AccountService.user_has_permission(user, "admin") == False
             ):  # Check permission before allowing a non-expiring upload
                 expiration = maxExpiration
             else:
                 if (
                     maxExpiration < expiration
                     and AccountService.user_has_permission(user, "expiration_exempt") == False
                 ):
                     raise Exception(
                         "Expiration date must be between now and %s." % maxExpiration.strftime("%m/%d/%Y")
                     )
             if body is None or body.strip() == "":
                 raise Exception("Message body cannot be blank")
             newMessage = Message(
                 subject=subject,
                 body=body,
                 date_sent=datetime.datetime.now(),
                 owner_id=user.id,
                 date_expires=expiration,
                 encryption_key=Encryption.generatePassword(),
             )
             session.add(newMessage)
             session.commit()
             encrypt_message(newMessage)
             for recipientId in recipientIdList:
                 rUser = AccountService.get_user(recipientId)
                 if rUser is not None:
                     newMessage.message_shares.append(MessageShare(message_id=newMessage.id, recipient_id=rUser.id))
                     session.add(
                         AuditLog(
                             user.id,
                             "Send Message",
                             '%s sent a message with subject: "%s" to %s(%s)'
                             % (user.id, newMessage.subject, rUser.display_name, rUser.id),
                             rUser.id,
                             None,
                         )
                     )
                 else:
                     fMessages.append("Could not send to user with ID:%s - Invalid user ID" % str(recipientId))
             session.commit()
             sMessages.append('Message "%s" sent.' % subject)
         except ValueError:
             fMessages.append("Invalid expiration date format. Date must be in mm/dd/yyyy format.")
         except Exception, e:
             cherrypy.log.error("[%s] [create_message] [Could not create message: %s]" % (user.id, str(e)))
             fMessages.append("Could not send message: %s" % str(e))
Example #51
0
 def create_public_share(self, fileIds, expiration, shareType, message, notifyEmails, cc="false", format="json", requestOrigin="", **kwargs):
     user, role, sMessages, fMessages, shareId, ps = (cherrypy.session.get("user"), cherrypy.session.get("current_role"), [], [], None, None)
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         config = cherrypy.request.app.config['filelocker']
         orgConfig = get_config_dict_from_objects(session.query(ConfigParameter).filter(ConfigParameter.name.like('org_%')).all())
         fileIds = split_list_sanitized(fileIds)
         cc = True if cc == "true" else False
         try:
             try:
                 expiration = datetime.datetime(*(time.strptime(strip_tags(expiration), "%m/%d/%Y")[0:6]))
             except Exception, e:
                 raise Exception("Invalid expiration date format. Date must be in mm/dd/yyyy format.")
             if expiration is None or expiration == "":
                 raise Exception("Public shares must have a valid expiration date")
             message = strip_tags(message)
             shareType = "single" if shareType != "multi" else "multi"
             ps = PublicShare(date_expires=expiration, reuse=shareType, message=message)
             if role is not None:
                 ps.role_owner_id = role.id
             else:
                 ps.owner_id = user.id
                 
             if (kwargs.has_key("password") and kwargs['password']!=""):
                 ps.set_password(kwargs['password'])
             elif shareType=="multi":
                 raise Exception("You must specify a password for public shares that don't expire after 1 use")
 
             ps.generate_share_id()
             session.add(ps)
             sharedFiles = []
             for fileId in fileIds:
                 flFile = session.query(File).filter(File.id==fileId).one()
                 if flFile.owner_id == user.id or AccountService.user_has_permission(user, "admin"):
                     ps.files.append(flFile)
                     session.commit()
                     sharedFiles.append(flFile)
                     session.commit()
                 else:
                     fMessages.append("You do not have permission to share file with ID: %s" % str(flFile.id))
             session.add(AuditLog(user.id, Actions.CREATE_PUBLIC_SHARE, "%s file(s) publicly shared." % len(ps.files), None, role.id if role is not None else None))
             notifyEmailList = split_list_sanitized(notifyEmails)
             if cc:
                 if (user.email is not None and user.email != ""):
                     notifyEmailList.append(user.email)
                 else:
                     fMessages.append("You elected to receive a carbon copy of the share notification, however your account does not have an email address set.")
             cherrypy.session.release_lock()
             for recipient in notifyEmailList:
                 if recipient is not None and recipient != "":
                     Mail.notify(get_template_file('public_share_notification.tmpl'), {'sender':user.email if role is None else role.email, 'recipient':recipient, 'sharedFiles':sharedFiles, 'ownerId':user.id if role is None else role.id, 'ownerName': user.display_name if role is None else role.name, 'shareId':ps.id, 'filelockerURL':config['root_url'], 'org_url': orgConfig['org_url'], 'org_name': orgConfig['org_name'], 'personalMessage': message})
             if len(notifyEmailList) > 0:
                 session.add(AuditLog(user.id, Actions.SEND_EMAIL, "Email notifications about a public share were sent to the following addresses: %s" % ",".join(notifyEmailList), None, role.id if role is not None else None))
             session.commit()
             shareId = ps.id
             sMessages.append("Files shared successfully")
         except Exception, e:
             session.rollback()
             fMessages.append(str(e))
             cherrypy.log.error("[%s] [create_public_share] [Unable to create public share: %s]" % (user.id, str(e)))
Example #52
0
 def delete_group_shares(self, fileIds, groupId, format="json", requestOrigin=""):
     user, role, sMessages, fMessages = (cherrypy.session.get("user"), cherrypy.session.get("current_role"), [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         fileIds = split_list_sanitized(fileIds)
         for fileId in fileIds:
             try:
                 group = session.query(Group).filter(Group.id==groupId).one()
                 if (role is not None and group.role_owner_id == role.id) or group.owner_id == user.id or AccountService.user_has_permission(user, "admin"):
                     flFile = session.query(File).filter(File.id==fileId).one()
                     if (role is not None and flFile.role_owner_id == role.id) or flFile.owner_id == user.id or AccountService.user_has_permission(user, "admin"):
                         share = session.query(GroupShare).filter(GroupShare.group_id == groupId and GroupShare.file_id == flFile.id).scalar()
                         if share is not None:
                             session.delete(share)
                             session.add(AuditLog(user.id, Actions.DELETE_GROUP_SHARE, "You stopped sharing file %s with group %s" % (flFile.name, group.name), None, role.id if role is not None else None))
                             session.commit()
                     else:
                         fMessages.append("You do not have permission to modify shares for file with ID: %s" % str(flFile.id))
                 else:
                     fMessages.append("You do not have permission delete shares with this group")
             except Exception, e:
                 session.rollback()
                 fMessages.append("Problem deleting share for file: %s" % str(e))
Example #53
0
 def create_group_shares(self, fileIds, groupId, notify="false", cc="false", format="json", requestOrigin=""):
     user, role, sMessages, fMessages, config  = (cherrypy.session.get("user"), cherrypy.session.get("current_role"), [], [], cherrypy.request.app.config['filelocker'])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         orgConfig = get_config_dict_from_objects(session.query(ConfigParameter).filter(ConfigParameter.name.like('org_%')).all())
         fileIds = split_list_sanitized(fileIds)
         groupId = strip_tags(groupId) if groupId is not None and groupId != "" else None
         notify = True if notify.lower() == "true" else False
         cc = True if cc.lower() == "true" else False
         try:
             if groupId is not None:
                 sharedFiles = []
                 group = session.query(Group).filter(Group.id==groupId).one()
                 if (role is not None and group.role_owner_id == role.id) or group.owner_id == user.id or AccountService.user_has_permission(user, "admin"):
                     for fileId in fileIds:
                         flFile = session.query(File).filter(File.id == fileId).one()
                         existingShare = session.query(GroupShare).filter(and_(GroupShare.group_id==group.id, GroupShare.file_id==fileId)).scalar()
                         if existingShare is not None:
                             fMessages.append("File %s is already shared with group %s" % (flFile.name, group.name))
                         elif (role is not None and flFile.role_owner_id == role.id) or flFile.owner_id == user.id or AccountService.user_has_permission(user, "admin"):
                             flFile.group_shares.append(GroupShare(group_id=groupId, file_id=fileId))
                             sharedFiles.append(flFile)
                         else:
                             fMessages.append("You do not have permission to share file with ID: %s" % fileId)
                     sMessages.append("Shared file(s) successfully")
                     if role is not None:
                         session.add(AuditLog(user.id, Actions.CREATE_GROUP_SHARE, "Role %s shared %s files with group %s(%s)" % (role.id, len(fileIds), group.name, group.id), None, role.id))
                     else:
                         session.add(AuditLog(user.id, Actions.CREATE_GROUP_SHARE, "%s shared %s files with group %s(%s)" % (user.id, len(fileIds), group.name, group.id), None))
                 else:
                     fMessages.append("You do not have permission to share with this group")
                 session.commit()
                 if notify:
                     cherrypy.session.release_lock()
                     for groupMember in group.members:
                         try:
                             Mail.notify(get_template_file('share_notification.tmpl'),{'sender':user.email if role is None else role.email,'recipient':groupMember.email, 'ownerId':user.id if role is None else role.id, 'ownerName':user.display_name if role is None else role.name, 'sharedFiles':sharedFiles, 'filelockerURL': config['root_url'], 'org_url': orgConfig['org_url'], 'org_name': orgConfig['org_name']})
                             session.add(AuditLog(user.id, Actions.SEND_EMAIL, "%s has been notified via email that you have shared a file with him or her." % (groupMember.email), None, role.id if role is not None else None))
                             session.commit()
                         except Exception, e:
                             session.rollback()
                             fMessages.append("Problem sending email notification to %s: %s" % (groupMember.display_name, str(e)))
                     if cc:
                         if (user.email is not None and user.email != ""):
                             try:
                                 Mail.notify(get_template_file('share_notification.tmpl'),{'sender':user.email if role is None else role.email,'recipient':user.email if role is None else role.email, 'ownerId':user.id if role is None else role.id, 'ownerName':user.display_name if role is None else role.name, 'sharedFiles':sharedFiles, 'filelockerURL': config['root_url'], 'org_url': orgConfig['org_url'], 'org_name': orgConfig['org_name']})
                                 session.add(AuditLog(user.id, Actions.SEND_EMAIL, "You have been carbon copied via email on the notification that was sent out as a result of your file share."))
                                 session.commit()
                             except Exception, e:
                                 session.rollback()
                                 fMessages.append("Problem carbon copying email notification: %s" % (str(e)))
                         else:
                             fMessages.append("You elected to receive a carbon copy of the share notification, however your account does not have an email address set.")