jbox-web/redmine_git_hosting

View on GitHub
app/controllers/gitolite_public_keys_controller.rb

Summary

Maintainability
A
35 mins
Test Coverage
# frozen_string_literal: true

class GitolitePublicKeysController < ApplicationController
  include RedmineGitHosting::GitoliteAccessor::Methods

  before_action :require_login
  before_action :find_user
  before_action :find_gitolite_public_key, only: [:destroy]

  helper :gitolite_public_keys
  helper :git_hosting

  def index
    @gitolite_user_keys   = @user.gitolite_public_keys.user_key.sorted
    @gitolite_deploy_keys = @user.gitolite_public_keys.deploy_key.sorted
  end

  def create
    if params[:create_button]
      @gitolite_public_key = @user.gitolite_public_keys.new
      @gitolite_public_key.safe_attributes = params[:gitolite_public_key]
      if @gitolite_public_key.save
        create_ssh_key @gitolite_public_key
        flash[:notice] = l :notice_public_key_created, title: view_context.keylabel(@gitolite_public_key)
      else
        flash[:error] = @gitolite_public_key.errors.full_messages.to_sentence
      end
      redirect_to @redirect_url
    else
      redirect_to @cancel_url
    end
  end

  def destroy
    return unless request.delete?

    if @gitolite_public_key.user == @user || @user.admin?
      if @gitolite_public_key.destroy
        destroy_ssh_key @gitolite_public_key
        flash[:notice] = l :notice_public_key_deleted, title: view_context.keylabel(@gitolite_public_key)
      end
      redirect_to @redirect_url
    else
      render_403
    end
  end

  private

  def find_user
    if params[:user_id]
      set_user_from_params
    else
      set_user_from_current_user
    end
  end

  def set_user_from_params
    @user = params[:user_id] == 'current' ? User.current : User.find_by(id: params[:user_id])
    if @user
      @cancel_url = @redirect_url = url_for controller: 'users', action: 'edit', id: params[:user_id], tab: 'keys'
    else
      render_404
    end
  end

  def set_user_from_current_user
    if User.current.allowed_to_create_ssh_keys?
      @user = User.current
      @redirect_url = url_for controller: 'gitolite_public_keys', action: 'index'
      @cancel_url = url_for controller: 'my', action: 'account'
    else
      render_403
    end
  end

  def find_gitolite_public_key
    @gitolite_public_key = @user.gitolite_public_keys.find params[:id]
  rescue ActiveRecord::RecordNotFound
    render_404
  end

  def create_ssh_key(ssh_key)
    gitolite_accessor.create_ssh_key ssh_key
  end

  def destroy_ssh_key(ssh_key)
    gitolite_accessor.destroy_ssh_key ssh_key
  end
end