Пример #1
0
def overrides_delete(path):
    if not request.user.can_manage:
        return abort(403)

    separator = "/"

    repo_path, overrides_path = file_utils.split_url_path(path)
    repo = get_target_for(repo_path)
    if not isinstance(repo, Repository):
        return abort(404)

    return_path_parts = path.split(separator)
    return_path = separator.join(return_path_parts[:-1])
    cwd = os.path.join(utils.get_override_path(repo),
                       overrides_path.replace('/', os.sep))

    session['errors'] = []
    try:
        file_utils.delete(cwd)
        utils.flash('Object was deleted.')
    except BaseException as exc:
        app.logger.info(exc)
        session['errors'].append('Could not delete \'' +
                                 return_path_parts[-1] + '\'.')

    return redirect(url_for('overrides_list', path=return_path))
Пример #2
0
def overrides_edit(path):
  if not request.user.can_manage:
    return abort(403)

  separator = "/"
  context = {}
  errors = []

  repo_path, context['overrides_path'] = file_utils.split_url_path(path)
  context['repo'] = get_target_for(repo_path)
  if not isinstance(context['repo'], Repository):
    return abort(404)

  file_path = os.path.join(utils.get_override_path(context['repo']), context['overrides_path'].replace('/', os.sep))

  if request.method == 'POST':
    override_content = request.form.get('override_content')
    try:
      file_utils.write_file(file_path, override_content)
      utils.flash('Changes in file was saved.')
    except BaseException as exc:
      app.logger.info(exc)
      errors.append('Could not write into file.')

  dir_path_parts = path.split("/")
  context['dir_path'] = separator.join(dir_path_parts[:-1])

  try:
    context['content'] = file_utils.read_file(file_path)
  except BaseException as exc:
    app.logger.info(exc)
    errors.append('Could not read file.')

  return render_template('overrides_edit.html', user=request.user, **context, errors=errors)
Пример #3
0
def overrides_upload(path):
    if not request.user.can_manage:
        return abort(403)

    separator = "/"
    context = {}
    errors = [] + session.pop('errors', [])

    repo_path, context['overrides_path'] = file_utils.split_url_path(path)
    repo = get_target_for(repo_path)
    if not isinstance(repo, Repository):
        return abort(404)

    context['list_path'] = url_for('overrides_list', path=path)
    cwd = os.path.join(utils.get_override_path(repo),
                       context['overrides_path'].replace('/', os.sep))

    if request.method == 'POST':
        session['errors'] = []
        files = request.files.getlist('upload_file')
        if not files:
            utils.flash('No file was uploaded.')
        else:
            file_uploads = []
            for file in files:
                filepath = os.path.join(cwd, secure_filename(file.filename))
                try:
                    file.save(filepath)
                    file_uploads.append("File '{}' was uploaded.".format(
                        file.filename))
                except BaseException as exc:
                    app.logger.info(exc)
                    session['errors'].append("Could not upload '{}'.".format(
                        file.filename))
            utils.flash(" ".join(file_uploads))
            if not session['errors']:
                return redirect(url_for('overrides_list', path=path))

    dir_path_parts = path.split("/")
    context['dir_path'] = separator.join(dir_path_parts[:-1])

    return render_template('overrides_upload.html',
                           user=request.user,
                           **context,
                           errors=errors)
Пример #4
0
def generate_keypair(path):
    if not request.user.can_manage:
        return abort(403)

    repo = get_target_for(path)
    if not isinstance(repo, Repository):
        return abort(404)

    session['errors'] = []

    utils.makedirs(utils.get_customs_path(repo))

    try:
        private_key, public_key = utils.generate_ssh_keypair(repo.name +
                                                             '@FluxCI')
        private_key_path = utils.get_repo_private_key_path(repo)
        public_key_path = utils.get_repo_public_key_path(repo)

        try:
            file_utils.create_file_path(private_key_path)
            file_utils.create_file_path(public_key_path)

            file_utils.write_file(private_key_path, private_key)
            file_utils.write_file(public_key_path, public_key)

            try:
                os.chmod(private_key_path, 0o600)
                utils.flash('SSH keypair generated.')
            except BaseException as exc:
                app.logger.info(exc)
                session['errors'].append(
                    'Could not set permissions to newly generated private key.'
                )
        except BaseException as exc:
            app.logger.info(exc)
            session['errors'].append('Could not save generated SSH keypair.')
    except BaseException as exc:
        app.logger.info(exc)
        session['errors'].append('Could not generate new SSH keypair.')

    return redirect(url_for('edit_repo', repo_id=repo.id))
Пример #5
0
def remove_keypair(path):
    if not request.user.can_manage:
        return abort(403)

    repo = get_target_for(path)
    if not isinstance(repo, Repository):
        return abort(404)

    session['errors'] = []

    private_key_path = utils.get_repo_private_key_path(repo)
    public_key_path = utils.get_repo_public_key_path(repo)

    try:
        file_utils.delete(private_key_path)
        file_utils.delete(public_key_path)
        utils.flash('SSH keypair removed.')
    except BaseException as exc:
        app.logger.info(exc)
        session['errors'].append('Could not remove SSH keypair.')

    return redirect(url_for('edit_repo', repo_id=repo.id))
Пример #6
0
def delete():
    repo_id = request.args.get('repo_id', '')
    build_id = request.args.get('build_id', '')
    user_id = request.args.get('user_id', '')

    delete_target = None
    return_to = 'dashboard'
    if build_id:
        delete_target = Build.get(id=build_id)
        return_to = delete_target.repo.url()
        if not request.user.can_manage:
            return abort(403)
    elif repo_id:
        delete_target = Repository.get(id=repo_id)
        return_to = url_for('repositories')
        if not request.user.can_manage:
            return abort(403)
    elif user_id:
        delete_target = User.get(id=user_id)
        return_to = url_for('users')
        if delete_target and delete_target.id != request.user.id and not request.user.can_manage:
            return abort(403)

    if not delete_target:
        return abort(404)

    try:
        delete_target.delete()
    except Build.CanNotDelete as exc:
        models.rollback()
        utils.flash(str(exc))
        referer = request.headers.get('Referer', return_to)
        return redirect(referer)

    utils.flash('{} deleted'.format(type(delete_target).__name__))
    return redirect(return_to)
Пример #7
0
def overrides_actions(action):
  if not request.user.can_manage:
    return abort(403)

  separator = "/"
  session['errors'] = []
  repo_id = request.args.get('repo_id', '')
  path = request.args.get('path', '')

  repo = Repository.get(id=repo_id)
  if not repo:
    return abort(404)

  if action == OVERRIDES_ACTION_CREATEFOLDER:
    name = secure_filename(request.args.get('name', ''))
    try:
      file_utils.create_folder(os.path.join(utils.get_override_path(repo), path.replace('/', os.sep)), name)
      utils.flash('Folder was created.')
      return redirect(url_for('overrides_list', path = separator.join([repo.name, path, name]).replace('//', '/')))
    except BaseException as exc:
      app.logger.info(exc)
      session['errors'].append('Could not create folder.')
      return redirect(url_for('overrides_list', path = separator.join([repo.name, path]).replace('//', '/')))
  elif action == OVERRIDES_ACTION_CREATEFILE:
    name = secure_filename(request.args.get('name', ''))
    try:
      file_utils.create_file(os.path.join(utils.get_override_path(repo), path.replace('/', os.sep)), name)
      utils.flash('File was created.')
      return redirect(url_for('overrides_edit', path = separator.join([repo.name, path, name]).replace('//', '/')))
    except BaseException as exc:
      app.logger.info(exc)
      session['errors'].append('Could not create file.')
      return redirect(url_for('overrides_list', path = separator.join([repo.name, path]).replace('//', '/')))
  elif action == OVERRIDES_ACTION_RENAME:
    name = request.args.get('name', '').replace('../', '')
    original_name = request.args.get('original_name', '').replace('../', '')
    new_path = os.path.join(utils.get_override_path(repo), path.replace('/', os.sep), name)
    original_path = os.path.join(utils.get_override_path(repo), path.replace('/', os.sep), original_name)

    try:
      file_utils.rename(original_path, new_path)
      utils.flash('Object was renamed.')
    except BaseException as exc:
      app.logger.info(exc)
      session['errors'].append('Could not rename \'' + original_name + '\'.')
    return redirect(url_for('overrides_list', path = separator.join([repo.name, path]).replace('//', '/')))

  return abort(404)