Example #1
0
    def repo_restored_cb(sender, **kwargs):
        repo_id = kwargs['repo_id']
        operator = kwargs['operator']
        repo = seafile_api.get_repo(repo_id)
        org_id = get_org_id_by_repo_id(repo_id)
        if org_id > 0:
            related_users = seafile_api.org_get_shared_users_by_repo(
                org_id, repo_id)
            repo_owner = seafile_api.get_org_repo_owner(repo_id)
        else:
            related_users = seafile_api.get_shared_users_by_repo(repo_id)
            repo_owner = seafile_api.get_repo_owner(repo_id)

        if repo_owner not in related_users:
            related_users.append(repo_owner)

        record = {
            'op_type': 'recover',
            'obj_type': 'repo',
            'timestamp': datetime.datetime.utcnow(),
            'repo_id': repo_id,
            'repo_name': repo.repo_name,
            'path': '/',
            'op_user': operator,
            'related_users': related_users,
            'org_id': org_id,
        }

        from utils import SeafEventsSession
        session = SeafEventsSession()
        seafevents.save_user_activity(session, record)
        session.close()
Example #2
0
def FileUpdateEventHandler(session, msg):
    elements = msg.body.split('\t')
    if len(elements) != 3:
        logging.warning("got bad message: %s", elements)
        return

    repo_id = elements[1]
    commit_id = elements[2]

    org_id = get_org_id_by_repo_id(repo_id)

    commit = get_commit(repo_id, 1, commit_id)
    if commit is None:
        commit = get_commit(repo_id, 0, commit_id)
        if commit is None:
            return

    time = datetime.datetime.utcfromtimestamp(msg.ctime)

    #KEEPER:
    #logging.info("FILE UPDATE EVENT: %s, start generate_certificate", commit.desc)
    generate_certificate_by_commit(commit) 

    save_file_update_event(session, time, commit.creator_name, org_id, \
                           repo_id, commit_id, commit.desc)
Example #3
0
def RepoUpdateEventHandler(session, msg):
    elements = msg.body.split('\t')
    if len(elements) != 3:
        logging.warning("got bad message: %s", elements)
        return

    etype = 'repo-update'
    repo_id = elements[1]
    commit_id = elements[2]

    detail = {'repo_id': repo_id,
          'commit_id': commit_id,
    }

    org_id = get_org_id_by_repo_id(repo_id)
    if org_id > 0:
        users = get_related_users_by_org_repo(org_id, repo_id)
    else:
        users = get_related_users_by_repo(repo_id)

    if not users:
        return

    time = datetime.datetime.utcfromtimestamp(msg.ctime)
    if org_id > 0:
        save_org_user_events (session, org_id, etype, detail, users, time)
    else:
        save_user_events (session, etype, detail, users, time)
Example #4
0
    def repo_restored_cb(sender, **kwargs):
        repo_id = kwargs['repo_id']
        operator = kwargs['operator']
        repo = seafile_api.get_repo(repo_id)
        org_id = get_org_id_by_repo_id(repo_id)
        if org_id > 0:
            related_users = seafile_api.org_get_shared_users_by_repo(org_id, repo_id)
            repo_owner = seafile_api.get_org_repo_owner(repo_id)
        else:
            related_users = seafile_api.get_shared_users_by_repo(repo_id)
            repo_owner = seafile_api.get_repo_owner(repo_id)

        related_users.append(repo_owner)

        record = {
            'op_type':'recover',
            'obj_type':'repo',
            'timestamp': datetime.datetime.utcnow(),
            'repo_id': repo_id,
            'repo_name': repo.repo_name,
            'path': '/',
            'op_user': operator,
            'related_users': [related_users],
            'org_id': org_id,
        }

        from utils import SeafEventsSession
        session = SeafEventsSession()
        seafevents.save_user_activity(session, record)
        session.close()
Example #5
0
def FileUpdateEventHandler(session, msg):
    elements = msg['content'].split('\t')
    if len(elements) != 3:
        logging.warning("got bad message: %s", elements)
        return

    repo_id = elements[1]
    commit_id = elements[2]

    org_id = get_org_id_by_repo_id(repo_id)

    commit = get_commit(repo_id, 1, commit_id)
    if commit is None:
        commit = get_commit(repo_id, 0, commit_id)
        if commit is None:
            return

    time = datetime.datetime.utcfromtimestamp(msg['ctime'])

    # KEEPER
    logging.info("FILE UPDATE EVENT: %s, try generate_certificate", commit.desc)
    generate_certificate_by_commit(commit)

    save_file_update_event(session, time, commit.creator_name, org_id,
                           repo_id, commit_id, commit.desc)
Example #6
0
def DraftPublishEventHandler(session, msg):

    elements = msg['content'].split('\t')
    if len(elements) != 6:
        logging.warning("got bad message: %s", elements)
        return

    record = dict()
    record["timestamp"] = datetime.datetime.utcfromtimestamp(msg['ctime'])
    record["op_type"] = elements[0]
    record["obj_type"] = elements[1]
    record["repo_id"] = elements[2]
    repo = seafile_api.get_repo(elements[2])
    record["repo_name"] = repo.name if repo else ''
    record["op_user"] = elements[3]
    record["path"] = elements[4]
    record["old_path"] = elements[5]

    users = []
    org_id = get_org_id_by_repo_id(elements[2])
    if org_id > 0:
        users.extend(seafile_api.org_get_shared_users_by_repo(org_id, elements[2]))
        owner = seafile_api.get_org_repo_owner(elements[2])
    else:
        users.extend(seafile_api.get_shared_users_by_repo(elements[2]))
        owner = seafile_api.get_repo_owner(elements[2])

    if owner not in users:
        users = users + [owner]
    if not users:
        return

    record["related_users"] = users

    save_user_activity(session, record)
Example #7
0
def access_org_repo(request, repo_id):
    """
    Check whether user can view org repo.
    """
    if not request.user.org:
        return False
    cur_org_id = request.user.org['org_id']
    org_id = get_org_id_by_repo_id(repo_id)
    return True if cur_org_id == org_id else False
Example #8
0
def check_and_get_org_by_repo(repo_id, user):
    """
    Check whether repo is org repo, get org info if it is, and set
    base template.
    """
    org_id = get_org_id_by_repo_id(repo_id)
    if org_id > 0:
        # this repo is org repo, get org info
        org = get_org_by_id(org_id)
        org._dict['is_staff'] = is_org_staff(org_id, user)
        org._dict['email'] = user
        base_template = 'org_base.html'
    else:
        org = None
        base_template = 'myhome_base.html'
    
    return org, base_template
Example #9
0
def check_and_get_org_by_repo(repo_id, user):
    """
    Check whether repo is org repo, get org info if it is, and set
    base template.
    """
    org_id = get_org_id_by_repo_id(repo_id)
    if org_id > 0:
        # this repo is org repo, get org info
        org = get_org_by_id(org_id)
        org._dict['is_staff'] = is_org_staff(org_id, user)
        org._dict['email'] = user
        base_template = 'org_base.html'
    else:
        org = None
        base_template = 'myhome_base.html'
    
    return org, base_template
Example #10
0
def FileAuditEventHandler(session, msg):
    elements = msg.body.split('\t')
    if len(elements) != 6:
        logging.warning("got bad message: %s", elements)
        return

    timestamp = datetime.datetime.utcfromtimestamp(msg.ctime)
    msg_type = elements[0]
    user_name = elements[1]
    ip = elements[2]
    user_agent = elements[3]
    repo_id = elements[4]
    file_path = elements[5].decode('utf-8')

    org_id = get_org_id_by_repo_id(repo_id)

    save_file_audit_event(session, timestamp, msg_type, user_name, ip, \
                          user_agent, org_id, repo_id, file_path)
Example #11
0
def PermAuditEventHandler(session, msg):
    elements = msg.body.split('\t')
    if len(elements) != 7:
        logging.warning("got bad message: %s", elements)
        return

    timestamp = datetime.datetime.utcfromtimestamp(msg.ctime)
    etype = elements[1]
    from_user = elements[2]
    to = elements[3]
    repo_id = elements[4]
    file_path = elements[5].decode('utf-8')
    perm = elements[6]

    org_id = get_org_id_by_repo_id(repo_id)

    save_perm_audit_event(session, timestamp, etype, from_user, to, org_id,
                          repo_id, file_path, perm)
Example #12
0
def FileAuditEventHandler(session, msg):
    elements = msg.body.split('\t')
    if len(elements) != 6:
        logging.warning("got bad message: %s", elements)
        return

    timestamp = datetime.datetime.utcfromtimestamp(msg.ctime)
    msg_type = elements[0]
    user_name = elements[1]
    ip = elements[2]
    user_agent = elements[3]
    repo_id = elements[4]
    file_path = elements[5].decode('utf-8')

    org_id = get_org_id_by_repo_id(repo_id)

    save_file_audit_event(session, timestamp, msg_type, user_name, ip,
                          user_agent, org_id, repo_id, file_path)
Example #13
0
def PermAuditEventHandler(session, msg):
    elements = msg.body.split('\t')
    if len(elements) != 7:
        logging.warning("got bad message: %s", elements)
        return

    timestamp = datetime.datetime.utcfromtimestamp(msg.ctime)
    etype = elements[1]
    from_user = elements[2]
    to = elements[3]
    repo_id = elements[4]
    file_path = elements[5].decode('utf-8')
    perm = elements[6]

    org_id = get_org_id_by_repo_id(repo_id)

    save_perm_audit_event(session, timestamp, etype, from_user, to, \
                          org_id, repo_id, file_path, perm)
Example #14
0
def FileUpdateEventHandler(session, msg):
    elements = msg.body.split('\t')
    if len(elements) != 3:
        logging.warning("got bad message: %s", elements)
        return

    repo_id = elements[1]
    commit_id = elements[2]

    org_id = get_org_id_by_repo_id(repo_id)

    commit = get_commit(repo_id, 1, commit_id)
    if commit is None:
        commit = get_commit(repo_id, 0, commit_id)
        if commit is None:
            return

    time = datetime.datetime.utcfromtimestamp(msg.ctime)

    save_file_update_event(session, time, commit.creator_name, org_id, repo_id,
                           commit_id, commit.desc)
Example #15
0
def get_org_id(repo_id):
    global is_org
    if is_org == -1:
        org_conf = seafile_api.get_server_config_string(
            'general', 'multi_tenancy')
        if not org_conf:
            is_org = 0
        elif org_conf.lower() == 'true':
            is_org = 1
        else:
            is_org = 0
    if not is_org:
        return -1

    if not repo_org.has_key(repo_id):
        org_id = get_org_id_by_repo_id(repo_id)
        repo_org[repo_id] = org_id
    else:
        org_id = repo_org[repo_id]

    return org_id
Example #16
0
def RepoUpdateEventHandler(session, msg):
    elements = msg.body.split('\t')
    if len(elements) != 3:
        logging.warning("got bad message: %s", elements)
        return

    repo_id = elements[1]
    commit_id = elements[2]
    if isinstance(repo_id, str):
        repo_id = repo_id.decode('utf8')
    if isinstance(commit_id, str):
        commit_id = commit_id.decode('utf8')

    commit = commit_mgr.load_commit(repo_id, 1, commit_id)
    if commit is None:
        commit = commit_mgr.load_commit(repo_id, 0, commit_id)

    # TODO: maybe handle merge commit.
    if commit is not None and commit.parent_id and not commit.second_parent_id:

        parent = commit_mgr.load_commit(repo_id, commit.version, commit.parent_id)

        if parent is not None:
            differ = CommitDiffer(repo_id, commit.version, parent.root_id, commit.root_id,
                                  True, True)
            added_files, deleted_files, added_dirs, deleted_dirs, modified_files,\
                    renamed_files, moved_files, renamed_dirs, moved_dirs = differ.diff_to_unicode()

            if renamed_files or renamed_dirs or moved_files or moved_dirs:
                changer = ChangeFilePathHandler()
                for r_file in renamed_files:
                    changer.update_db_records(repo_id, r_file.path, r_file.new_path, 0)
                for r_dir in renamed_dirs:
                    changer.update_db_records(repo_id, r_dir.path, r_dir.new_path, 1)
                for m_file in moved_files:
                    changer.update_db_records(repo_id, m_file.path, m_file.new_path, 0)
                for m_dir in moved_dirs:
                    changer.update_db_records(repo_id, m_dir.path, m_dir.new_path, 1)
                changer.close_session()

            users = []
            org_id = get_org_id_by_repo_id(repo_id)
            if org_id > 0:
                users = seafile_api.org_get_shared_users_by_repo(org_id, repo_id)
                owner = seafile_api.get_org_repo_owner(repo_id)
            else:
                users = seafile_api.get_shared_users_by_repo(repo_id)
                owner = seafile_api.get_repo_owner(repo_id)

            if owner not in users:
                users = users + [owner]
            if not users:
                return

            time = datetime.datetime.utcfromtimestamp(msg.ctime)
            if added_files or deleted_files or added_dirs or deleted_dirs or \
                    modified_files or renamed_files or moved_files or renamed_dirs or moved_dirs:

                if appconfig.fh.enabled:
                    records = generate_filehistory_records(added_files, deleted_files,
                                    added_dirs, deleted_dirs, modified_files, renamed_files,
                                    moved_files, renamed_dirs, moved_dirs, commit, repo_id,
                                    parent, time)
                    save_file_histories(session, records)

                records = generate_activity_records(added_files, deleted_files,
                        added_dirs, deleted_dirs, modified_files, renamed_files,
                        moved_files, renamed_dirs, moved_dirs, commit, repo_id,
                        parent, users, time)

                save_user_activities(session, records)
            else:
                save_repo_rename_activity(session, commit, repo_id, parent, org_id, users, time)
    def do_work(self):
        self._current_commit_position = 0
        repo = seafile_api.get_repo_list(self._current_repo_position, 1)
        if not repo:
            return -1
        repo = repo[0]
        logging.info('Start processing repo :%s', repo.repo_id)

        org_id = get_org_id_by_repo_id(repo.repo_id)
        repo_id = repo.repo_id
        if org_id > 0:
            users_obj = seafile_api.org_get_shared_users_by_repo(
                org_id, repo_id)
            owner = seafile_api.get_org_repo_owner(repo_id)
        else:
            users_obj = seafile_api.get_shared_users_by_repo(repo_id)
            owner = seafile_api.get_repo_owner(repo_id)
        users = [e.user for e in users_obj] + [owner]

        self._last_commit_id = None
        if repo_id in self._history_repo.keys():
            commit_ids = self.get_repo_last_commits(repo_id)
            count = 0
            k = 0
            bk = False
            while True:
                temp = [
                    e.id for e in seafile_api.get_commit_list(
                        repo_id, k * 100, 100)
                ]
                if not temp:
                    break
                # avoid two commit at the same time
                for commit_id in commit_ids:
                    if commit_id[0] in temp:
                        count += 1

                    if count == len(commit_ids):
                        self._current_commit_position = k * 100 + temp.index(
                            commit_id[0]) + 1
                        self._last_commit_id = commit_id[0]
                        bk = True
                        break
                if bk:
                    break
                k += 1
        else:
            # keeping _current_commit_position zero will restore all activity records of the repo
            commit_objs = seafile_api.get_commit_list(
                repo_id, self._current_commit_position, 1)
            current_commit_id = [e.id for e in commit_objs][0]
            self._last_commit_id = current_commit_id
            self.diff_and_update(repo_id, current_commit_id, org_id, users)

        start_commit_position = self._current_commit_position
        count_offest = 0
        while True:
            # get last commit and another commits
            # avoid current_commit_position expired by generate new record
            commit_objs = seafile_api.get_commit_list(
                repo_id, self._current_commit_position - 1, 5)
            commit_ids = [e.id for e in commit_objs]

            if not commit_objs or len(commit_objs) == 1:
                break

            if self._last_commit_id not in commit_ids or commit_objs[
                    -1].id == self._last_commit_id:
                self._current_commit_position += 4
                count_offest = 4
            else:
                offset = commit_ids.index(self._last_commit_id)
                self._current_commit_position += offset
                current_commit_id = commit_ids[offset + 1]
                self._last_commit_id = commit_ids[offset + 1]
                self.diff_and_update(repo_id, current_commit_id, org_id, users)
                count_offest = 1

        count = self._current_commit_position - start_commit_position - count_offest
        logging.info("%s recover %s activity records" % (repo_id, count))
Example #18
0
def RepoUpdateEventHandler(session, msg):
    elements = msg['content'].split('\t')
    if len(elements) != 3:
        logging.warning("got bad message: %s", elements)
        return

    repo_id = elements[1]
    commit_id = elements[2]

    commit = commit_mgr.load_commit(repo_id, 1, commit_id)
    if commit is None:
        commit = commit_mgr.load_commit(repo_id, 0, commit_id)

    # TODO: maybe handle merge commit.
    if commit is not None and commit.parent_id and not commit.second_parent_id:

        parent = commit_mgr.load_commit(repo_id, commit.version, commit.parent_id)

        if parent is not None:
            differ = CommitDiffer(repo_id, commit.version, parent.root_id, commit.root_id,
                                  True, True)
            added_files, deleted_files, added_dirs, deleted_dirs, modified_files,\
                renamed_files, moved_files, renamed_dirs, moved_dirs = differ.diff()

            if renamed_files or renamed_dirs or moved_files or moved_dirs:
                changer = ChangeFilePathHandler()
                for r_file in renamed_files:
                    changer.update_db_records(repo_id, r_file.path, r_file.new_path, 0)
                for r_dir in renamed_dirs:
                    changer.update_db_records(repo_id, r_dir.path, r_dir.new_path, 1)
                for m_file in moved_files:
                    changer.update_db_records(repo_id, m_file.path, m_file.new_path, 0)
                for m_dir in moved_dirs:
                    changer.update_db_records(repo_id, m_dir.path, m_dir.new_path, 1)
                changer.close_session()

            users = []
            org_id = get_org_id_by_repo_id(repo_id)
            if org_id > 0:
                users = seafile_api.org_get_shared_users_by_repo(org_id, repo_id)
                owner = seafile_api.get_org_repo_owner(repo_id)
            else:
                users = seafile_api.get_shared_users_by_repo(repo_id)
                owner = seafile_api.get_repo_owner(repo_id)

            if owner not in users:
                users = users + [owner]
            if not users:
                return

            time = datetime.datetime.utcfromtimestamp(msg['ctime'])
            if added_files or deleted_files or added_dirs or deleted_dirs or \
                    modified_files or renamed_files or moved_files or renamed_dirs or moved_dirs:

                if appconfig.fh.enabled:
                    records = generate_filehistory_records(added_files, deleted_files,
                                    added_dirs, deleted_dirs, modified_files, renamed_files,
                                    moved_files, renamed_dirs, moved_dirs, commit, repo_id,
                                    parent, time)
                    save_file_histories(session, records)

                records = generate_activity_records(added_files, deleted_files,
                        added_dirs, deleted_dirs, modified_files, renamed_files,
                        moved_files, renamed_dirs, moved_dirs, commit, repo_id,
                        parent, users, time)

                save_user_activities(session, records)
            else:
                save_repo_rename_activity(session, commit, repo_id, parent, org_id, users, time)

            # TODO check: catalog entry update
            # KEEPER
            logging.info("REPO UPDATED EVENT repo_id: %s" % repo_id)
            logging.info("Trying to create/update keeper catalog entry for repo_id: %s..." % repo_id)
            if bool(generate_catalog_entry_by_repo_id(repo_id)):
                logging.info("Success!")
            else:
                logging.error("Something went wrong...")


            if appconfig.enable_collab_server:
                send_message_to_collab_server(repo_id)