babash.psm1

function Remove-LocalUser {
    param([String]$name)
    userdel $name --force
}
function New-LocalUser {
    param([String]$name,[String]$password)
    useradd --password $(openssl passwd -1 $password) $name --create-home --shell '/bin/bash'
}
function New-Level {
    param([String]$instruction,[String]$indice,[String]$solution)
    $Script:level++
    New-LocalUser "babash$Script:level" -Password $solution
    $SecureSolution = ConvertFrom-SecureString (ConvertTo-SecureString "Le mot de passe pour babash$Script:level est '$solution'." -AsPlainText -Force) -key(1..16)
    $SecureIndice   = ConvertFrom-SecureString (ConvertTo-SecureString $indice -AsPlainText -Force) -key(1..16)
    New-Item "/home/babash$($Script:level-1)/.instruction" -Value "Le mot de passe pour babash$Script:level est $instruction." -Force
    New-Item "/home/babash$($Script:level-1)/.indice"      -Value $SecureIndice   -Force
    New-Item "/home/babash$($Script:level-1)/.solution"    -Value $SecureSolution -Force
}
function Get-Instruction {
    if ($env:USER -match 'babash') {
        Get-Content "$env:HOME/.instruction"
    } else {
        Get-Content /home/babash0/.instruction
    }
}
function Get-Indice {
    if ($env:USER -match 'babash') {
        $SecureIndice = ConvertTo-SecureString (Get-Content "$env:HOME/.indice") -key(1..16)
        (New-Object System.Management.Automation.PSCredential 'N/A', $SecureIndice).GetNetworkCredential().Password
        [int](Get-Content /tmp/.malus)+5 | Set-Content /tmp/.malus
    } else {
        Get-Content /home/babash0/.instruction
    }
}
function Get-Solution {
    if ($env:USER -match 'babash') {
        $SecureSolution = ConvertTo-SecureString (Get-Content "$env:HOME/.solution") -key(1..16)
        (New-Object System.Management.Automation.PSCredential 'N/A', $SecureSolution).GetNetworkCredential().Password
        [int](Get-Content /tmp/.malus)+10 | Set-Content /tmp/.malus
    } else {
        Get-Content /home/babash0/.instruction
    }
}
function Build-Levels {
    New-Level babash1 babash1 babash1
    # Niveau 1
    $alea = Get-Random -Maximum 6
    New-Level "le raccourci clavier pour basculer sur le terminal texte n°$alea" "3 touches pressées simultanément" "CtrlAltF$alea"
    # Niveau 2
    $alea = 'galere','noob','bug','oops','help','what','retry','lost','nul','bleu' | Get-Random
    New-Item "/home/babash$Script:level/$alea" -Force
    New-Level "le raccourci pour basculer sur la console graphique + le nom du fichier dans le dossier personnel" "Utilisez la commande 'ls'" "CtrlAltF7$alea"
    # Niveau 3
    $alea = Get-Random -Maximum 10000
    New-Item "/home/babash$Script:level/$alea" -ItemType Directory -Force
    New-Level "le raccourci pour ouvrir un émulateur de terminal + le nom du répertoire dans le dossier personnel" "Utilisez l'option '-l'" "CtrlAltT$alea"
    # Niveau 4
    $alea = 'galere','noob','bug','oops','help','what','retry','lost','nul','bleu' | Get-Random
    New-Item "/home/babash$Script:level/$alea" -ItemType Directory -Force
    $alea = Get-Random -Maximum 10000
    New-Item "/home/babash$Script:level/$alea" -Force
    New-Level "les 2 interfaces graphiques Linux les plus légères + le nom du fichier dans le dossier personnel" "La 1ère termine par 't', la 2ème commence par 'X'" "LXQtXFCE$alea"
    # Niveau 5
    $alea = 'galere','noob','bug','oops','help','what','retry','lost','nul','bleu' | Get-Random
    New-Item "/home/babash$Script:level/$alea" -Force
    $alea = Get-Random -Maximum 1000
    New-Item "/home/babash$Script:level/$alea" -ItemType Directory -Force
    New-Level "ce qui permet de vérifier l'identité de l’utilisateur + le nom du répertoire dans le dossier personnel" "Commence par 'auth'" "authentification$alea"
    # Niveau 6
    New-Level "le prompt de l'utilisateur du prochain niveau" "Le prompt vous invite à taper une commande" "babash$($Script:level+1)@$(hostname):~$"
    # Niveau 7
    $cmd = 'adduser','ls','who','passwd','wc','echo','date','sleep' | Get-Random
    New-Level "le nom + version des utilitaires dont fait partie '$cmd' dans le manuel" "Utilisez la commande 'man'" (man $cmd | tail -n 1).Split(' ')[0].Replace(' ','')
    # Niveau 8
    $un_service = (Get-Content /etc/services)[(8..98 | Get-Random)].Split("`t")[0]
    $nb_services= (Get-Content /etc/services | Measure-Object).Count
    New-Item "/home/babash$Script:level/$un_service" -Force
    New-Level "le nom du fichier dans le dossier personnel + le nombre de services répertoriés dans '/etc/services'" "Utilisez la commande 'wc'" "$un_service$nb_services"
    # Niveau 9
    New-Level "le nombre de secondes entre l'époque UNIX (01-01-1970 UTC) et aujourd'hui (date sans heure)" "Utilisez les formats %D et %s" (date --date (date +%D) +%s)
}
function Start-Playing {
    $Script:level=0
    Remove-Item /home/babash* -Recurse -Force -Confirm:$false
    1..10 | ForEach-Object { Remove-LocalUser "babash$_" -ErrorAction SilentlyContinue }
    Remove-Item /tmp/.malus -Force
    (New-Item /tmp/.malus -Force).UnixFileMode += 'OtherWrite,GroupWrite'
    New-Item /home/babash0 -ItemType Directory -Force
    Build-Levels
    Get-Help babash
}