flant/superhosting

View on GitHub
lib/superhosting/controller/user.rb

Summary

Maintainability
A
2 hrs
Test Coverage
module Superhosting
  module Controller
    class User < Base
      def initialize(**kwargs)
        super(**kwargs)
        @container_controller = controller(Container)
      end

      def list(container_name:)
        if (resp = @container_controller.available_validation(name: container_name)).net_status_ok?
          { data: _list(container_name: container_name) }
        else
          resp
        end
      end

      def _list(container_name:)
        all_users = _group_get_users_names(name: container_name)
        admins, users = all_users.partition { |u| admin?(name: u, container_name: container_name) }
        system_users, users = users.partition { |u| system?(name: u, container_name: container_name) }
        [{ 'user' => users }, { 'admin' => admins }, { 'system' => system_users }]
      end

      def add(name:, container_name:, ftp_dir: nil, ftp_only: false, generate: false)
        return { error: :logical_error, code: :option_ftp_only_is_required } if ftp_dir && !ftp_only

        web_mapper = PathMapper.new("/web/#{container_name}")
        home_dir = ftp_dir.nil? ? web_mapper.path : web_mapper.f(ftp_dir).path

        if (resp = @container_controller.available_validation(name: container_name)).net_status_ok?
          if !File.exist? home_dir
            resp = { error: :logical_error, code: :incorrect_ftp_dir, data: { dir: home_dir.to_s } }
          elsif (resp = not_existing_validation(name: name, container_name: container_name)).net_status_ok?
            shell = ftp_only ? '/usr/sbin/nologin' : '/bin/bash'
            if (resp = _add(name: name, container_name: container_name, home_dir: home_dir, shell: shell)).net_status_ok? && generate
              resp = passwd(name: name, container_name: container_name, generate: generate)
            end
          end
        end
        resp
      end

      def passwd(name:, container_name:, generate: false)
        if (resp = @container_controller.available_validation(name: container_name)).net_status_ok?
          user_name = "#{container_name}_#{name}"
          passwords = _create_password(generate: generate)
          _update_password(name: user_name, encrypted_password: passwords[:encrypted_password])
          generate ? { data: passwords[:password] } : {}
        else
          resp
        end
      end

      def delete(name:, container_name:)
        if (resp = @container_controller.available_validation(name: container_name)).net_status_ok? &&
           (resp = existing_validation(name: name, container_name: container_name)).net_status_ok?
          container_lib_mapper = @lib.containers.f(container_name)
          passwd_mapper = container_lib_mapper.config.f('etc-passwd')
          user_name = "#{container_name}_#{name}"
          _del(name: user_name, group: container_name)
          passwd_mapper.remove_line!(/^#{user_name}:.*/)
        end
        resp
      end

      def change(name:, container_name:, ftp_dir: nil, ftp_only: false, generate: false)
        if (resp = delete(name: name, container_name: container_name)).net_status_ok?
          add(name: name, container_name: container_name, ftp_dir: ftp_dir, ftp_only: ftp_only, generate: generate)
        else
          resp
        end
      end
    end
  end
end