# @summary
#   Authentication service for the communication module.
#
#   Sets up the authentication service for the communication module in the
#   new exam system. Connects to the broker to authenticate users.
#
#
# @param keytab_production_base64
#   Keytab contents (in base64) for the Kerberos host key used to authenticate
#   in the production environment (aes-devel.edu.liu.se).
#
# @param keytab_devel_base64
#   Keytab contents (in base64) for the Kerberos host key used to authenticate
#   in the development environment (aes-devel.edu.liu.se).
#
class aes::auth (
  Optional[String] $keytab_production_base64 = undef,
  Optional[String] $keytab_devel_base64 = undef
) {
  $auth_user = auth
  $auth_group = $auth_user
  $auth_home = "/srv/${auth_user}"
  $auth_service = 'aes_auth'

  # Decode base64 encoded keytabs
  $keytab_production  = Binary.new($keytab_production_base64, '%b')
  $keytab_devel = Binary.new($keytab_devel_base64, '%b')

  # Pick the right keytab for the current environment. We use the fqdn rather than 
  # $environment since the keys are tied to the domain name rather than what 
  # environment the machine is configured in.
  if $facts[fqdn] == 'aes.edu.liu.se' {
    # The AD service account for this key is: ida_sys002_srv
    $auth_keytab_data = $keytab_production
    $server_type = 'production'
  } elsif $facts[fqdn] == 'aes-devel.edu.liu.se' {
    # The AD service account for this key is: ida_sys004_srv
    $auth_keytab_data = $keytab_devel
    $server_type = 'devel'
  } else {
    $auth_keytab_data = undef
  }

  # Note: We rely on Boost being installed by the broker. It seems Puppet does not like
  # that we specify "boost" multiple times, even though it would look nice, modularity-wise
  # since both the auth server and the broker requires boost.
  package {
    [
      'krb5-libs',
      'krb5-devel',
      'openssl-devel',
    ]:
      ensure => installed,
  }

  # Group for local authentication. All accounts that are members
  # of this group are considered trusted by the authentication system.
  group { 'aes_local_auth' :
    ensure => present,
  }

  user { $auth_user :
    ensure     => present,
    home       => $auth_home,
    comment    => 'Authentication server for AES',
    managehome => false,
    membership => inclusive,
    groups     => ['aes_local_auth'],
    system     => true,
    shell      => '/sbin/nologin',
  }

  file { $auth_home :
    ensure => directory,
    owner  => $auth_user,
    group  => $auth_group,
    mode   => '0755',
  }

  file { "/etc/systemd/system/${auth_service}.service" :
    ensure => file,
    owner  => root,
    group  => root,
    mode   => '0644',
    source => "puppet:///modules/${module_name}/auth/auth.service",
  }

  file { "${auth_home}/on_update.sh" :
    ensure => file,
    owner  => $auth_user,
    group  => $auth_group,
    mode   => '0755',
    source => "puppet:///modules/${module_name}/auth/on_update.sh",
  }

  file { "${auth_home}/config.json" :
    ensure => file,
    owner  => $auth_user,
    group  => $auth_group,
    mode   => '0644',
    source => "puppet:///modules/${module_name}/auth/config.json",
  }

  file { "${auth_home}/start.sh" :
    ensure => file,
    owner  => $auth_user,
    group  => $auth_group,
    mode   => '0755',
    source => "puppet:///modules/${module_name}/auth/start.sh",
  }

  file { "${auth_home}/keys" :
    ensure => directory,
    owner  => $auth_user,
    group  => $auth_group,
    mode   => '0700',
  }

  if $auth_keytab_data {
    file { "${auth_home}/keys/kerberos.keytab" :
      ensure  => file,
      owner   => root,
      group   => $auth_group,
      mode    => '0640',
      content => $auth_keytab_data,
    }
  }

  vcsrepo { "${auth_home}/src":
    ensure   => latest,
    provider => git,
    source   => 'https://oauth2:F-agHaRXCdyFy38q4c-N@gitlab.liu.se/upp-aes/communication.git',
    revision => $server_type,
    owner    => $auth_user,
    group    => $auth_group,
    notify   => Exec['compile-auth-repo'],
  }

  exec { 'compile-auth-repo':
    user        => $auth_user,
    group       => $auth_group,
    cwd         => $auth_home,
    path        => '/bin:/usr/bin',
    command     => "${auth_home}/on_update.sh",
    environment => ["HOME=${auth_home}"],
    refreshonly => true,
    require     => File["${auth_home}/on_update.sh"],
    notify      => Service[$auth_service],
  }

  service { $auth_service :
    ensure => 'running',
    enable => true,
  }
}