web-dev-qa-db-fra.com

Avant de vous connecter, vous devez répondre à ces questions 3?

J'ai deux enfants qui aiment tellement Ubuntu qu'ils ne font pas leurs devoirs de maths. Donc, dans l’esprit de Monty Python, je voudrais leur présenter quelque chose comme:

"Arrêtez-vous. Qui traverserait le Pont de la Mort doit me répondre à ces trois questions, avant qu'il ne voie de l'autre côté."

à la connexion.

Ils devraient résoudre quelques problèmes mathématiques avant de pouvoir se connecter.

Ma question est la suivante: ce genre de chose peut-il être fait?

22
user187493

Ce qui suit est testé avec Ubuntu 13.04 et Python du système, en utilisant les liaisons Gtk (PyGobject).

Voici une façon un peu sale cependant et cela nécessite plus d'investigation:

Sommaire

  • Ajoutez un fichier .desktop à /usr/share/xsessions nous le nommerons custom

  • Ajoutez un fichier .xsession à l'utilisateur en question (vos enfants) et l'appelons comme étant kid

  • Créez l’application graphique Python pour le casse-tête mathématique et exécutez-la à partir de .xsession, nous l’appellerons ainsi: puzzle.py

Détails

  • Sudo vi /usr/share/xsessions/custom.desktop

Ajoutez ce qui suit dans le fichier:

[Desktop Entry]
Name=Custom
Comment=This session logs you into your managed desktop environment
Exec=/etc/X11/Xsession
X-Ubuntu-Gettext-Domain=gnome-session-3.0
  • vi /home/kid/.xsession

Ajoutez ce qui suit dans le fichier:

#!/bin/bash
lightdm &
exec /home/kid/puzzle.py
  • vi /home/kid/puzzle.py

Ajoutez ce qui suit dans le fichier:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import subprocess
import random
from gi.repository import Gtk


#----------------------------------------------------------------------
class PuzzleWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Math Puzzle", resizable=False)

        super(PuzzleWindow, self).set_position(Gtk.WindowPosition.CENTER)
        super(PuzzleWindow, self).maximize()

        self.a_number = random.randint(1, 5)
        self.b_number = random.randint(1, 5)
        self.result = self.a_number + self.b_number

        self.vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5)

        self.label = Gtk.Label("What is the sum of the numbers bellow?")
        self.number_label = Gtk.Label("{num_a} + {num_b}".format(
            num_a=self.a_number, num_b=self.b_number))

        self.entry = Gtk.Entry()
        self.button = Gtk.Button(label="Check answer!")
        self.button.connect("clicked", self.on_button_clicked)

        self.vbox.pack_start(self.label, True, True, 0)
        self.vbox.pack_start(self.number_label, True, True, 0)
        self.vbox.pack_start(self.entry, True, True, 0)
        self.vbox.pack_start(self.button, True, True, 0)
        self.add(self.vbox)

    def on_button_clicked(self, widget):

        if int(self.entry.get_text()) == self.result:
            subprocess.call("unity &", Shell=True)
        else:
            self.label.set_text("Wrong answer, try again.")
#----------------------------------------------------------------------
def main():
    """Application's entry point"""
    win = PuzzleWindow()
    win.connect("delete-event", Gtk.main_quit)
    win.show_all()
    Gtk.main()

if __== "__main__":
    main()

Résultats:

  • Si vous vous déconnectez, une nouvelle session nommée Personnalisé apparaît à l'écran de connexion.
  • En choisissant la session personnalisée et après une connexion réussie, vous serez présenté par une petite fenêtre PyGtk (utilisant pygobject) demandant un casse-tête mathématique. Il n'y aura pas de barre supérieure, de lanceur et du reste des widgets de bureau par défaut:

Custom access to Unity

  • Si vous répondez correctement, Unity chargera ...

Des recherches plus approfondies sont nécessaires, mais j’espère que cela servira de point de départ.

30
Stef K

Cela peut être fait, mais cela demanderait beaucoup de savoir-faire technique. Le moyen le plus simple de le faire est d'écrire un script exécuté en tant que root:

  • change automatiquement son mot de passe en réponse à une question donnée,
  • change son fond d'écran pour montrer la question à laquelle il essaie de répondre

Vous devrez probablement conserver la liste des problèmes mathématiques dans un fichier texte (ou une base de données) et utiliser les outils de ligne de commande imagemagick pour ajouter le texte du problème au papier peint de bureau. Utilisez cron pour planifier l'exécution de ce script de temps en temps (quotidiennement?).

Obtenir l'écran de connexion pour poser 3 questions différentes nécessiterait un lot de piratage personnalisé et impliquerait probablement le remplacement de grandes parties de votre système. Ce n'est donc pas recommandé. Même le "simple" script ci-dessus nécessite beaucoup de compétences et de connaissances et pourrait potentiellement endommager votre système s'il était mal fait.

3
ImaginaryRobots