def delete_users(self, userIds, format="json", requestOrigin="", **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"),  [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         userIds = split_list_sanitized(userIds)
         try:
             for userId in userIds:
                 try:
                     delUser = session.query(User).filter(User.id == userId).one()
                     session.delete(delUser)
                     for flFile in session.query(File).filter(File.owner_id == delUser.id):
                         FileService.queue_for_deletion(flFile.id)
                         session.delete(flFile)
                         session.add(AuditLog(user.id, Actions.DELETE_FILE, "File %s (%s) owned by user %s has been deleted as a result of the owner being deleted. " % (flFile.name, flFile.id, delUser.id), "admin"))
                     session.add(AuditLog(user.id, Actions.DELETE_USER, "User with ID: \"%s\" deleted from system" % delUser.id, "admin"))
                     sMessages.append("Successfully deleted user %s" % userId)
                 except sqlalchemy.orm.exc.NoResultFound:
                     fMessages.append("User with ID:%s does not exist" % userId)
                 except Exception, e:
                     fMessages.append("Could not delete user: %s" % str(e))
                 session.commit()
         except Exception, e:
             session.rollback()
             cherrypy.log.error("[%s] [delete_users] [Could not delete users: %s]" % (user.id, str(e)))
             fMessages.append("Could not delete users: %s" % str(e))
 def create_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:
         if self.validIPv4.match(hostIPv4):
             hostIPv6 = ''
         elif self.validIPv6.match(hostIPv6):
             hostIPv4 = ''
         else:
             fMessages.append("No IP address specified.")
             return fl_response(sMessages, fMessages, format)
         CLIkeyGen = str(os.urandom(32).encode('hex'))[0:32]
         try:
             existingKey = session.query(CLIKey).filter(CLIKey.user_id==user.id).filter(CLIKey.host_ipv4==hostIPv4).filter(CLIKey.host_ipv6==hostIPv6).one()
             existingKey.value=CLIkeyGen
             session.add(AuditLog(user.id, Actions.UPDATE_CLIKEY, "%s updated CLI Key for host: %s%s" % (user.id, hostIPv4, hostIPv6)))
             session.commit()
             sMessages.append("Successfully updated key for host: %s%s." % (str(hostIPv4),str(hostIPv6)))
         except sqlalchemy.orm.exc.NoResultFound, nrf:
             newKey = CLIKey(user_id=strip_tags(user.id), host_ipv4=strip_tags(hostIPv4), host_ipv6=strip_tags(hostIPv6), value=CLIkeyGen)
             session.add(newKey)
             session.add(AuditLog(user.id, Actions.CREATE_CLIKEY, "%s created CLI Key for host: %s%s" % (user.id, hostIPv4, hostIPv6)))
             session.commit()
             sMessages.append("Successfully added key for host: %s%s." % (str(hostIPv4),str(hostIPv6)))
         except Exception, e:
             session.rollback()
             cherrypy.log.error("[%s] [create_clikey] [Problem creating key: %s]" % (user.id, str(e)))
             fMessages.append("Problem creating key: %s" % 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 grant_user_permission(self,
                           userId,
                           permissionId,
                           format="json",
                           **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     try:
         userId = strip_tags(userId)
         permission = session.query(Permission).filter(
             Permission.id == permissionId).one()
         try:
             flUser = session.query(User).filter(User.id == userId).one()
             flUser.permissions.append(permission)
             session.commit()
             sMessages.append("User %s granted permission %s" %
                              (userId, permissionId))
         except sqlalchemy.orm.exc.NoResultFound:
             fMessages.append("User with ID: %s does not exist" %
                              str(userId))
     except sqlalchemy.orm.exc.NoResultFound:
         fMessages.append("Permission with ID: %s does not exist" %
                          str(permissionId))
     except Exception, e:
         session.rollback()
         cherrypy.log.error(
             "[%s] [grant_user_permission] [Problem granting user a permission: %s]"
             % (user.id, str(e)))
         fMessages.append("Problem granting a user permission: %s" % str(e))
 def sign_tos(self, **kwargs):
     config = cherrypy.request.app.config['filelocker']
     orgConfig = get_config_dict_from_objects(
         session.query(ConfigParameter).filter(
             ConfigParameter.name.like('org_%')).all())
     if cherrypy.session.has_key("user") and cherrypy.session.get(
             "user") is not None:
         user = cherrypy.session.get("user")
         if kwargs.has_key('action') and kwargs['action'] == "sign":
             attachedUser = session.query(User).filter(
                 User.id == user.id).one()
             attachedUser.date_tos_accept = datetime.datetime.now()
             cherrypy.session['user'] = attachedUser.get_copy()
             session.commit()
             raise cherrypy.HTTPRedirect(config['root_url'])
         else:
             currentYear = datetime.date.today().year
             footerText = str(
                 Template(file=get_template_file('footer_text.tmpl'),
                          searchList=[locals(), globals()]))
             return str(
                 Template(file=get_template_file('tos.tmpl'),
                          searchList=[locals(), globals()]))
     else:
         raise cherrypy.HTTPRedirect(config['root_url'])
Example #6
0
 def update_server_config(self, format="json", requestOrigin="", **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         try:
             for key in kwargs:
                 if key.startswith("config_name_"):
                     parameterName = key[12:]
                     # Parameter description should not be updated by client
                     #description = kwargs['config_desc_%s' % parameterName]
                     value = None
                     if parameterName.endswith("pass"): #Don't strip characters from passwords
                         value = kwargs[key]
                     else:
                         value = strip_tags(kwargs[key])
                     parameter = session.query(ConfigParameter).filter(ConfigParameter.name == parameterName).one()
                     # Parameter description should not be updated by client
                     #parameter.description = description
                     parameter.value = value
             session.commit()
             #TODO: Make sure this if phased out properly
             #Filelocker.update_config(cherrypy.request.app.config)
         except Exception, e:
             session.rollback()
             cherrypy.log.error("[%s] [update_server_config] [Could not update server config: %s]" % (user.id, str(e)))
             fMessages.append("Unable to update config: %s" % str(e))
 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)))
Example #8
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))
Example #9
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 #10
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 #11
0
def routine_maintenance(config):
    from lib import AccountService

    expiredFiles = session.query(File).filter(File.date_expires < datetime.datetime.now())
    for flFile in expiredFiles:
        try:
            for share in flFile.user_shares:
                session.delete(share)
            for share in flFile.group_shares:
                session.delete(share)
            for share in flFile.public_shares:
                session.delete(share)
            for share in flFile.attribute_shares:
                session.delete(share)
            FileService.queue_for_deletion(flFile.id)
            session.add(
                AuditLog(
                    "admin",
                    Actions.DELETE_FILE,
                    "File %s (ID:%s) has expired and has been purged by the system." % (flFile.name, flFile.id),
                    flFile.owner_id,
                )
            )
            session.delete(flFile)
            session.commit()
        except Exception, e:
            session.rollback()
            cherrypy.log.error("[system] [routine_maintenance] [Error while deleting expired file: %s]" % str(e))
 def delete_roles(self, roleIds, format="json", **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     try:
         roleIds = split_list_sanitized(roleIds)
         for roleId in roleIds:
             try:
                 role = session.query(Role).filter(Role.id == roleId).one()
                 session.delete(role)
                 for flFile in session.query(File).filter(
                         File.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 as a result of the role owner being deleted. "
                             % (flFile.name, flFile.id, role.id), "admin"))
                 session.add(
                     AuditLog(
                         user.id, Actions.DELETE_ROLE,
                         "%s deleted role \"%s\"(%s) from the system" %
                         (user.id, role.name, role.id), None))
                 sMessages.append("Successfully deleted roles%s." %
                                  str(roleId))
             except sqlalchemy.orm.exc.NoResultFound:
                 fMessages.append("The role ID: %s does not exist" %
                                  str(roleId))
         session.commit()
     except Exception, e:
         session.rollback()
         cherrypy.log.error(
             "[%s] [delete_roles] [Problem deleting roles: %s]" %
             (user.id, str(e)))
         fMessages.append("Problem deleting roles: %s" % str(e))
Example #13
0
 def bulk_create_user(self, quota, password, permissions, format="json", requestOrigin="", **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"),[], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         try:
             permissions = split_list_sanitized(permissions)
             line = cherrypy.request.body.readline()
             count = 0
             while line != "":
                 (userId, userFirstName, userLastName, userEmailAddress) = split_list_sanitized(line)
                 if session.query(User).filter(User.id==userId).scalar() is None:
                     newUser = User(first_name=userFirstName, last_name=userLastName, email=userEmailAddress.replace("\n",""), quota=quota, id=userId)
                     newUser.set_password(password)
                     session.add(newUser)
                     for permissionId in permissions:
                         permission = session.query(Permission).filter(Permission.id==permissionId).one()
                         newUser.permissions.append(permission)
                     session.commit()
                     count += 1
                 else:
                     fMessages.append("User %s already exists." % userId)
                 line = cherrypy.request.body.readline()
             if len(fMessages) == 0:
                 sMessages.append("Created %s users" % count)
         except ValueError, ve:
             fMessages.append("CSV file not parsed correctly, possibly in wrong format.")
         except Exception, e:
             cherrypy.log.error("[%s] [bulk_create_user] [Problem creating users in bulk: %s]" % (user.id, str(e)))
             fMessages.append("Problem creating users in bulk: %s" % str(e))
 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 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))
Example #16
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 #17
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 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 read_message(self, messageId, format="json", **kwargs):
     user, sMessages, fMessages = cherrypy.session.get("user"), [], []
     try:
         messageShare = session.query(MessageShare).filter(
             MessageShare.message_id == messageId).one()
         if messageShare.recipient_id == user.id:
             messageShare.date_viewed = datetime.datetime.now()
             session.add(
                 AuditLog(
                     user.id, "Read Message",
                     "%s read message sent by %s with subject \"%s\"" %
                     (user.id, messageShare.message.owner_id,
                      messageShare.message.subject),
                     messageShare.message.owner_id))
         else:
             fMessages.append(
                 "You do not have permission to read this message")
         session.commit()
     except sqlalchemy.orm.exc.NoResultFound:
         fMessages.append("Invalid message id")
     except Exception, e:
         cherrypy.log.error(
             "[%s] [read_message] [Could not mark message as read: %s]" %
             (user.id, str(e)))
         fMessages.append("Could not mark message as read: %s" % str(e))
Example #20
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)
 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))
 def update_role(self,
                 roleId,
                 roleName,
                 email,
                 quota,
                 format="json",
                 **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     try:
         roleId = strip_tags(roleId)
         existingRole = session.query(Role).filter(Role.id == roleId).one()
         existingRole.name = strip_tags(roleName)
         existingRole.email = strip_tags(email)
         existingRole.quota = int(quota)
         session.add(
             AuditLog(
                 user.id, Actions.UPDATE_ROLE,
                 "%s updated role \"%s\"(%s)" %
                 (user.id, existingRole.name, existingRole.id), None,
                 existingRole.id))
         session.commit()
         sMessages.append("Successfully updated a role named %s." %
                          str(roleName))
     except ValueError:
         fMessages.append("Quota must be a positive integer")
     except sqlalchemy.orm.exc.NoResultFound:
         fMessages.append("Role with ID:%s could not be found to update." %
                          str(roleId))
     except Exception, e:
         session.rollback()
         cherrypy.log.error(
             "[%s] [update_role] [Problem creating role: %s]" %
             (user.id, str(e)))
         fMessages.append("Problem creating role: %s" % str(e))
Example #23
0
def routine_maintenance(config):
    from lib import AccountService
    expiredFiles = session.query(File).filter(
        File.date_expires < datetime.datetime.now())
    for flFile in expiredFiles:
        try:
            for share in flFile.user_shares:
                session.delete(share)
            for share in flFile.group_shares:
                session.delete(share)
            for share in flFile.public_shares:
                session.delete(share)
            for share in flFile.attribute_shares:
                session.delete(share)
            FileService.queue_for_deletion(flFile.id)
            session.add(
                AuditLog(
                    "admin", Actions.DELETE_FILE,
                    "File %s (ID:%s) has expired and has been purged by the system."
                    % (flFile.name, flFile.id), flFile.owner_id))
            session.delete(flFile)
            session.commit()
        except Exception, e:
            session.rollback()
            cherrypy.log.error(
                "[system] [routine_maintenance] [Error while deleting expired file: %s]"
                % str(e))
 def revoke_role_permission(self,
                            roleId,
                            permissionId,
                            format="json",
                            **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     try:
         roleId = strip_tags(roleId)
         permission = session.query(Permission).filter(
             Permission.id == permissionId).one()
         try:
             role = session.query(Role).filter(Role.id == roleId).one()
             role.permissions.remove(permission)
             session.commit()
             sMessages.append("Role %s no longer has permission %s" %
                              (roleId, permissionId))
         except sqlalchemy.orm.exc.NoResultFound:
             fMessages.append("Role with ID: %s does not exist" %
                              str(roleId))
     except sqlalchemy.orm.exc.NoResultFound:
         fMessages.append("Permission with ID: %s does not exist" %
                          str(permissionId))
     except Exception, e:
         session.rollback()
         cherrypy.log.error(
             "[%s] [revoke_role_permission] [Problem revoking a role permission: %s]"
             % (user.id, str(e)))
         fMessages.append("Problem revoking a role permission: %s" % str(e))
Example #25
0
def check_in_file(tempFileName, flFile):
    config = cherrypy.request.app.config['filelocker']
    filePath = os.path.join(config['vault'], tempFileName)
    #Virus scanning if requested
    avCommand =  session.query(ConfigParameter).filter(ConfigParameter.name=="antivirus_command").one().value
    if(avCommand):
        avCommandList = avCommand.split(" ")
        avCommandList.append(filePath)
        scanFile = True
    else:
        scanFile = False
    try:
        if(scanFile):
            p = subprocess.Popen(avCommandList, stdout=subprocess.PIPE)
            output = p.communicate()[0]
            if(p.returncode != 0):
                cherrypy.log.error("[%s] [check_in_file] [File %s did not pass requested virus scan, return code: %s, output: %s]" % (flFile.owner_id, flFile.name, p.returncode, output))
                queue_for_deletion(tempFileName)
                flFile.passed_avscan = False
                raise Exception('Virus found during scan!')
            else:
                flFile.passed_avscan = True
        else:
            flFile.passed_avscan = False
        session.add(flFile)
        session.commit()

    except OSError, oe:
        cherrypy.log.error("[%s] [check_in_file] [AVSCAN execution failed: %s]" % (flFile.owner_id, str(oe)))
        flFile.passed_avscan = False
        raise Exception('Virus scan failed!')
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:
Example #27
0
 def update_server_config(self, format="json", requestOrigin="", **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         try:
             for key in kwargs:
                 if key.startswith("config_name_"):
                     parameterName = key[12:]
                     # Parameter description should not be updated by client
                     #description = kwargs['config_desc_%s' % parameterName]
                     value = None
                     if parameterName.endswith(
                             "pass"
                     ):  #Don't strip characters from passwords
                         value = kwargs[key]
                     else:
                         value = strip_tags(kwargs[key])
                     parameter = session.query(ConfigParameter).filter(
                         ConfigParameter.name == parameterName).one()
                     # Parameter description should not be updated by client
                     #parameter.description = description
                     parameter.value = value
             session.commit()
             #TODO: Make sure this if phased out properly
             #Filelocker.update_config(cherrypy.request.app.config)
         except Exception, e:
             session.rollback()
             cherrypy.log.error(
                 "[%s] [update_server_config] [Could not update server config: %s]"
                 % (user.id, str(e)))
             fMessages.append("Unable to update config: %s" % str(e))
Example #28
0
def purge_expired_nodes():
    # Clean node table, check for master, if none run election
    expirationTime = datetime.datetime.now() - datetime.timedelta(minutes=5)
    expiredNodes = session.query(ClusterNode).filter(ClusterNode.last_seen_timestamp < expirationTime).all()
    for node in expiredNodes:
        session.delete(node)
    session.commit()
Example #29
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))
 def revoke_user_permission(self,
                            userId,
                            permissionId,
                            format="json",
                            **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     try:
         permission = session.query(Permission).filter(
             Permission.id == permissionId).one()
         try:
             flUser = session.query(User).filter(User.id == userId).one()
             if flUser.id == user.id and permission.id == "admin":
                 fMessages.append(
                     "You cannot remove admin permissions from your own account"
                 )
             else:
                 flUser.permissions.remove(permission)
                 session.commit()
                 sMessages.append("User %s no longer has permission %s" %
                                  (userId, permissionId))
         except sqlalchemy.orm.exc.NoResultFound:
             fMessages.append("User with ID: %s does not exist" %
                              str(userId))
     except sqlalchemy.orm.exc.NoResultFound:
         fMessages.append("Permission with ID: %s does not exist" %
                          str(permissionId))
     except Exception, e:
         session.rollback()
         cherrypy.log.error(
             "[%s] [revoke_user_permission] [Problem revoking a user permission: %s]"
             % (user.id, str(e)))
         fMessages.append("Problem revoking a user permission: %s" % str(e))
 def create_role(self, roleId, roleName, email, quota, 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)
             existingRole = session.query(Role).filter(Role.id == roleId).scalar()
             if existingRole is None:
                 roleName = strip_tags(roleName)
                 email = strip_tags(email)
                 quota = int(quota)
                 newRole = Role(id=roleId, name=roleName, email=email, quota=quota)
                 session.add(newRole)
                 session.add(AuditLog(user.id, Actions.CREATE_ROLE, "%s added a role to the system named \"%s\"" % (user.id, newRole.name), None))
                 session.commit()
                 sMessages.append("Successfully created a role named %s. Other users who are added to this role may act on behalf of this role now." % str(roleName))
             else:
                 fMessages.append("A role with role ID: %s already exists" % str(roleId))
         except ValueError:
             fMessages.append("Quota must be a positive integer")
         except Exception, e:
             session.rollback()
             cherrypy.log.error("[%s] [create_role] [Problem creating role: %s]" % (user.id, str(e)))
             fMessages.append("Problem creating role: %s" % str(e))
Example #32
0
def secure_delete(config, fileName):
    import errno
    vault = config['filelocker']['vault']
    deleteConfig = get_config_dict_from_objects(session.query(ConfigParameter).filter(ConfigParameter.name.like('delete_%')).all())
    deleteCommand = deleteConfig['delete_command']
    deleteArguments = deleteConfig['delete_arguments']
    deleteList = [deleteCommand]
    for argument in deleteArguments.split(" "):
        deleteList.append(argument)
    deleteList.append(os.path.join(vault,fileName))
    try:
        p = subprocess.Popen(deleteList, stdout=subprocess.PIPE)
        output = p.communicate()[0]
        if(p.returncode != 0):
            cherrypy.log.error("[%s] [secure_delete] [The command to delete the file returned a failure code of %s: %s]" % ("admin", p.returncode, output))
        else:
            deletedFile = session.query(DeletedFile).filter(DeletedFile.file_name==fileName).scalar()
            if deletedFile is not None:
                session.delete(deletedFile)
                session.commit()
    except OSError, oe:
        if oe.errno == errno.ENOENT:
            cherrypy.log.error("[admin] [secure_delete] [Couldn't delete because the file was not found (dequeing): %s]" % str(oe))
            deletedFile = session.query(DeletedFile).filter(DeletedFile.file_name==fileName).scalar()
            if deletedFile is not None:
                session.delete(deletedFile)
                session.commit()
        else:
            cherrypy.log.error("[admin] [secure_delete] [Generic system error while deleting file: %s" % str(oe))
Example #33
0
def purge_expired_nodes():
    #Clean node table, check for master, if none run election
    expirationTime = datetime.datetime.now() - datetime.timedelta(minutes=5)
    expiredNodes = session.query(ClusterNode).filter(
        ClusterNode.last_seen_timestamp < expirationTime).all()
    for node in expiredNodes:
        session.delete(node)
    session.commit()
Example #34
0
def queue_for_deletion(filePath):
    try:
        if session.query(DeletedFile).filter(DeletedFile.file_name==filePath).scalar() is None:
            session.add(DeletedFile(file_name=filePath))
            session.commit()
    except Exception, e:
        cherrypy.log.error("Unable to queue file for deletion: %s" % str(e))
        session.rollback()
Example #35
0
def install_user(user):
    if user is not None:
        if user.quota is None:
            user.quota = int(session.query(ConfigParameter).filter(ConfigParameter.name=="default_quota").one().value)
        session.add(user)
        session.add(AuditLog(user.id, "Install User", "User %s (%s) installed" % (user.display_name, user.id)))
        session.commit()
    else:
        raise Exception("User %s doesn't exist in directory" % user.id)
Example #36
0
 def unhide_all_shares(self, format="json"):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     try:
         session.query(HiddenShare).filter(
             HiddenShare.owner_id == user.id).delete()
         session.commit()
         sMessages.append("Successfully unhid shares")
     except Exception, e:
         fMessages.append(str(e))
Example #37
0
 def unhide_all_shares(self, format="json", requestOrigin=""):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         try:
             session.query(HiddenShare).filter(HiddenShare.owner_id==user.id).delete()
             session.commit()
             sMessages.append("Successfully unhid shares")
         except Exception, e:
             fMessages.append(str(e))
Example #38
0
 def unhide_shares(self, format="json", requestOrigin="",**kwargs):
     user, sMessages, fMessages  = (cherrypy.session.get("user"), [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         try:
             session.query(HiddenShare).filter(HiddenShare.owner_id==user.id).delete(synchronize_session=False)
             session.commit()
             sMessages.append("All shares have been unhidden")
         except Exception, e:
             fMessages.append("Could not unhide shares: %s" % str(e))
             cherrypy.log.error("[%s] [unhide_shares] [Could not unhide shares: %s]" % (user.id, str(e)))
Example #39
0
def create_database_tables(dburi):
    engine = create_engine(dburi, echo=True)
    Base.metadata.create_all(engine)
    Session = sessionmaker(bind=engine)
    session = Session()
    from Filelocker import __version__
    initialConfigList = [("org_name", "Name of your organization.", "text", "My Company"),
    ("version", "Currently running version of Filelocker", "text", str(__version__)),
    ("org_url", "Home page of your organization.", "text", "http://www.mycompany.com"),
    ("admin_email", "Public email address of the Filelocker Administrator.", "text", "*****@*****.**"),
    ("max_file_life_days", "Max number of days a file can exist on the system. After this time, the file will be securely erased along with any shares it was associated with.", "number", "7"),
    ("user_inactivity_expiration", "Max number of days of inactivity permitted on a user account before the account is deleted from the system.", "number", "90"),
    ("delete_command", "Command used by the operating system that Filelocker is installed on to securely erase a file. This does not include arguments to the command (e.g. 'rm' not 'rm -p')", "text", "rm"),
    ("delete_arguments", "Any parameters needed by the delete command (in an additive fashion, such as -P, -fP, -fPq, etc)", "text", "-f"),
    ("antivirus_command", "Command to execute a virus scan of a file on the operating system on which Filelocker is installed.", "text", "clamscan"),
    ("file_command", "Command which returns information about a file's type. On most *nix systems, this will be the 'file -b' command", "text", "file -b"),
    ("max_file_size", "Maximum size (in Megabytes) for a single file on the system. Individual user quotas will ultimately override this if a user has less space available than this value.(DVD: 4812, CD: 700)","number", "4812"),
    ("default_quota", "Default quota (in Megabytes) assigned to each user. This can be changed by an administrator","number", "750"),
    ("smtp_sender", "This is the email address that Filelocker will send email notifications as.","text", "*****@*****.**"),
    ("smtp_server", "The server that Filelocker will use to send mail","text", ""),
    ("smtp_start_tls", "Should Filelocker use StartTLS when connection the SMTP server?","boolean", "No"),
    ("smtp_port", "SMTP Port","number", "25"),
    ("smtp_auth_required", "Does this SMTP server require authentication?","boolean", "No"),
    ("smtp_user", "If SMTP server requires authentication, what username should be used to connect (leave blank if no auth required)?","text", ""),
    ("smtp_pass", "If SMTP server requires authentication, what password should be used (leave blank if no auth required)?","text", ""),
    ("smtp_obscure_links", """Would you like for links in emails to obscured by adding spaces between periods and stripping off http:// and https://?""","boolean", "Yes"),
    ("auth_type", "Authentication mechanism Filelocker should use (e.g. LDAP, CAS, Local)","text", "local"),
    ("directory_type", "Type of directory to use (e.g. local, ldap)","text", "local"),
    ("cas_url", "URL of CAS server","text", ""),
    ("ldap_host", "URI of LDAP directory","text", ""),
    ("ldap_bind_dn", "LDAP Bind DN (e.g. ou=ped,dc=purdue,dc=edu)","text", ""),
    ("ldap_bind_user", "Account to use when binding to LDAP for searching (anonymous if blank)?", "text", ""),
    ("ldap_bind_pass", "Password to use when binding to LDAP for searching (anonymous if blank)?", "text", ""),
    ("ldap_is_active_directory", "Is this LDAP server and Active Directory server?", "boolean", "No"),
    ("ldap_domain_name", "Active Directory will not authenticate a bind unless you use the FQDN", "text", ""),
    ("ldap_user_name_attr", "LDAP username attribute","text", "uid"),
    ("ldap_last_name_attr", "LDAP last name attribute","text", "sn"),
    ("ldap_first_name_attr", "LDAP first name attribute","text", "givenName"),
    ("ldap_displayname_attr", "LDAP display name attribute, if one is to be used","text", "displayName"),
    ("ldap_email_attr", "LDAP email address attribute","text", "mail"),
    ("banner", "Message displayed to all users upon login", "text", ""),
    ("geotagging", "Should users be allowed to geotag Filelocker uploads?", "boolean", "No"),
    ("cli_feature", "Allow use of the CLI features in Filelocker", "boolean", "Yes"),
    ("use_x_forwarded_for", "Should FileLocker get clients IP address from \"X-Forwarded-For\" header param?", "boolean", "No")] 
    for cTuple in initialConfigList:
        confParameter = ConfigParameter(name=cTuple[0], description=cTuple[1], type=cTuple[2], value=cTuple[3])
        session.add(confParameter)
    adminPerm = Permission(id="admin", name="Administrator")
    expirationExemptPerm = Permission(id="expiration_exempt", name="User may have files that don't expire")
    session.add(adminPerm)
    session.add(expirationExemptPerm)
    session.commit()
Example #40
0
 def hide_shares(self, fileIds, format="json", **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     try:
         fileIds = split_list_sanitized(fileIds)
         for fileId in fileIds:
             session.add(HiddenShare(file_id=fileId, owner_id=user.id))
         session.commit()
         sMessages.append("Share has been hidden")
     except Exception, e:
         fMessages.append("Could not hide share: %s" % str(e))
         cherrypy.log.error(
             "[%s] [unhide_shares] [Could not unhide shares: %s]" %
             (user.id, str(e)))
Example #41
0
 def hide_share(self, fileIds, format="json", requestOrigin=""):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         fileIds = split_list_sanitized(fileIds)
         for fileId in fileIds:
             try:
                 session.add(HiddenShare(file_id=fileId, owner_id=user.id))
             except Exception, e:
                 fMessages.append(str(e))
         sMessages.append("Successfully hid shares. Unhide shares in Account Settings.")
         session.commit()
Example #42
0
def install_user(user):
    if user is not None:
        if user.quota is None:
            user.quota = int(
                session.query(ConfigParameter).filter(
                    ConfigParameter.name == "default_quota").one().value)
        session.add(user)
        session.add(
            AuditLog(user.id, "Install User",
                     "User %s (%s) installed" % (user.display_name, user.id)))
        session.commit()
    else:
        raise Exception("User %s doesn't exist in directory" % user.id)
Example #43
0
def cluster_elections(config):
    try:
        currentNodeId = int(config["filelocker"]["cluster_member_id"])
        currentNode = session.query(ClusterNode).filter(ClusterNode.member_id == currentNodeId).scalar()
        if currentNode is None:  # This node isn't in the DB yet, check in
            import socket

            currentNode = ClusterNode(
                member_id=currentNodeId,
                hostname=socket.gethostname(),
                is_master=False,
                last_seen_timestamp=datetime.datetime.now(),
            )
            session.add(currentNode)
            session.commit()
        else:  # In the DB, update last seen to avoid purging
            currentNode.last_seen_timestamp = datetime.datetime.now()
            session.commit()
        currentMaster = session.query(ClusterNode).filter(ClusterNode.is_master == True).scalar()
        # If this is default master node and another node has assumed master, reset and force election
        if currentNodeId == 0 and currentNode.is_master == False and currentMaster is not None:
            for node in session.query(ClusterNode).all():
                node.is_master = False
            session.commit()
        # This isn't the default master, there is one, but it's expired
        elif currentMaster is not None and currentMaster.last_seen_timestamp < datetime.datetime.now() - datetime.timedelta(
            minutes=5
        ):  # master is expired
            session.delete(currentMaster)
            session.commit()
        # No master, hold election
        elif currentMaster is None:  # No master nodes found, become master if eligible
            purge_expired_nodes()
            highestPriority = currentNode.member_id
            for node in session.query(ClusterNode).all():
                if node.member_id < highestPriority:
                    highestPriority = node.member_id
                    break
            if (
                highestPriority == currentNode.member_id
            ):  # Current node has lowest node id, thus highest priority, assume master
                currentNode.is_master = True
                session.commit()
        return True
    except sqlalchemy.orm.exc.ConcurrentModificationError, cme:
        cherrypy.log.error(
            "[system] [cluster_elections] [Concurrency error during elections. This can occur if locks on the DB inhibit normal cluster elections. If this error occurs infrequently, it can usually be disregarded. Full Error: %s]"
            % str(cme)
        )
        session.rollback()
        return False
Example #44
0
def create_admin_user(dburi, password):
    engine = create_engine(dburi, echo=False)
    Session = sessionmaker(bind=engine)
    session = Session()
    adminUser = session.query(User).filter(User.id=="admin").scalar()
    if adminUser is None:
        adminUser = User(id="admin", first_name="Administrator", quota=1024, date_tos_accept=datetime.datetime.now())
        session.add(adminUser)
        session.commit()
    adminUser.set_password(password)
    adminPermission = session.query(Permission).filter(Permission.id == "admin").one()
    if adminPermission not in adminUser.permissions:
        adminUser.permissions.append(adminPermission)
    session.commit()
Example #45
0
 def hide_shares(self, fileIds, format="json", requestOrigin="", **kwargs):
     user, sMessages, fMessages  = (cherrypy.session.get("user"), [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         try:
             fileIds = split_list_sanitized(fileIds)
             for fileId in fileIds:
                 session.add(HiddenShare(file_id=fileId, owner_id=user.id))
             session.commit()
             sMessages.append("Share has been hidden")
         except Exception, e:
             fMessages.append("Could not hide share: %s" % str(e))
             cherrypy.log.error("[%s] [unhide_shares] [Could not unhide shares: %s]" % (user.id, str(e)))
Example #46
0
def get_upload_ticket_by_password(ticketId, password):
    uploadRequest = session.query(UploadRequest).filter(UploadRequest.id == ticketId)
    if uploadRequest is None:
        raise Exception("Invalid Upload Request ID")
    if password is None and uploadRequest.password is None:
        return uploadRequest
    else:
        isValid = lib.Encryption.compare_password_hash(password, uploadRequest.password)
        if isValid and len(uploadRequest.password) == 32:
            newHash = lib.Encryption.hash_password(password)
            uploadRequest.password = newHash
            session.commit() #New has stored in the db
            return uploadRequest
        else:
            raise Exception("You must enter the correct password to access this upload request.")
Example #47
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))
Example #48
0
 def sign_tos(self, **kwargs):
     config = cherrypy.request.app.config['filelocker']
     orgConfig = get_config_dict_from_objects(session.query(ConfigParameter).filter(ConfigParameter.name.like('org_%')).all())
     if cherrypy.session.has_key("user") and cherrypy.session.get("user") is not None:
         user = cherrypy.session.get("user")
         if kwargs.has_key('action') and kwargs['action']=="sign":
             attachedUser = session.query(User).filter(User.id == user.id).one()
             attachedUser.date_tos_accept = datetime.datetime.now()
             cherrypy.session['user'] = attachedUser.get_copy()
             session.commit()
             raise cherrypy.HTTPRedirect(config['root_url'])
         else:
             currentYear = datetime.date.today().year
             footerText = str(Template(file=get_template_file('footer_text.tmpl'), searchList=[locals(),globals()]))
             return str(Template(file=get_template_file('tos.tmpl'), searchList=[locals(),globals()]))
     else:
         raise cherrypy.HTTPRedirect(config['root_url'])
 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 delete_attributes(self, attributeIds, format="json", requestOrigin="", **kwargs):
     user, sMessages, fMessages = (cherrypy.session.get("user"), [], [])
     if requestOrigin != cherrypy.session['request-origin']:
         fMessages.append("Missing request key!!")
     else:
         try:
             attributeIdList = split_list_sanitized(attributeIds)
             for attributeId in attributeIdList:
                 try:
                     delAttribute = session.query(Attribute).filter(Attribute.id==attributeId).one()
                     session.delete(delAttribute)
                     sMessages.append("Successfully deleted attribute: %s" % attributeId)
                 except sqlalchemy.orm.exc.NoResultFound:
                     fMessages.append("Attribute with ID: %s does not exist" % str(attributeId))
             session.commit()
         except Exception, e:
             cherrypy.log.error("[%s] [delete_attributes] [Could not delete attributes: %s]" % (user.id, str(e)))
             fMessages.append("Unable to delete attribute: %s" % 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))