Forum général.cherche-logiciel Photomaton lors d'un mariage

Posté par .
6
28
mar.
2011

Bonjour,

Un mariage se préparant dans mon entourage, je cherche à transformer un PC sous Linux (Debian) muni d'une webcam en photomaton improvisé.
Je connais bien sûr Cheese mais je voudrais sécuriser un peu l'installation en empêchant l'utilisateur d'éteindre l'application, d'aller se promener sur le PC etc....

Au final, je souhaiterai bloquer l'utilisateur dans une application de type photomaton.

Connaissez-vous des applications de type photomaton libres ?
Avez-vous des idées à me conseiller pour sécuriser un tant soit peu mon photomaton OpenSource ?

Merci pour votre aide, et bonne journée

  • # autologin qui demarre uniquement Cheese

    Posté par . Évalué à 9.

    faut jouer un peu de script pour faire une session GDM/KDM qui demarres juste Cheese en plein ecran.

    si la personne quitte cheese ca ferme la session et ca revient sur GDM/KDM qui est reglé pour lancer automatique la bonne session apres X secondes (timed login)

  • # Conseils

    Posté par (page perso) . Évalué à 4.

    Pour sécuriser l'installation. Je te conseille d'abord d'utiliser un compte utilisateurs sans aucuns droits (à part d'accéder à la webcam bien sûr). L'application devrait être en plein écran et le clavier ne devrait pas être accessible.

    « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

    • [^] # Re: Conseils

      Posté par . Évalué à 1.

      Comme je prévois de le faire sur un PC portable (ben oui, déplacer toute une grosse machine, ça commence à transformer le mariage en expédition... ;-)) rendre le clavier inacessible est délicat.
      A moins de jouer des ciseaux et de confectionner une jolie boîte en carton fermée !

      • [^] # Re: Conseils

        Posté par (page perso) . Évalué à 3.

        Le problème du clavier, c'est que les gens peuvent utiliser alt-f4, ctrl-alt-f1… Si ce n'est pas possible de s'en passer, il faut désactiver ctrl-alt-bksp et les touches magiques.

        « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

  • # Je n'ai pas de solutions à proposer

    Posté par . Évalué à 3.

    Mais j'adore ton idée, ça va faire de bons souvenirs!

  • # idée comme ca

    Posté par . Évalué à 1.

    Si tu as un bouton sur ta webcam, tu l'utilises pour déclencher une action photo + impression.
    Pour le retour, tu mets vlc en lecture et tu le mets en plein écran et pas de clavier.

    Vous voulez pas la jouer soft ? Je suis pas contraignant... vous voulez la jouer hard ? On va la jouer hard

  • # Solution adoptée ?

    Posté par . Évalué à 10. Dernière modification le 29/03/11 à 19:47.

    Bonjour,

    Alors finalement, je suis parti d'un script perl de Chris Sincock et l'ai adapté pour mon usage.
    Le script initial est dispo ici :
    http://sourceforge.net/projects/lk4b/files/lk4b/

    Il permet de capturer tous les événements du clavier et ne débloque qu'à la saisie d'un mot de passe.

    J'ai ajouté :

    • l'utilisation d'xmodmap afin de désactiver les touches 'Ctrl' (pour éviter que l'utilisateur ne puisse appeler Ctrl+Alt+F1 par exemple)
    • l'utilisation d'xdotool (http://www.semicomplete.com/projects/xdotool/) pour transmettre la touche Espace à Cheese afin de provoquer la prise de la photo

    D'ailleurs, dans mes recherches, j'ai également découvert l'application xdrtool qui permet aussi de bloquer clavier et souris jusqu'à saisie d'un mot de passe.

    Et voici le code en l'état actuel :

    #!/bin/env perl
    use warnings;
    use strict;
    use Data::Dumper;
    my $lastmod="2006/05/25";
    my $datemod="2011/03/29";
    my $defaultpassword="mypassword";
    my $progname=$0;
    $progname =~ s%.*/%%g;
    
    sub usage($)
    {
      my ($exitcode)=@_;
    
      print STDERR <<END_OF_USAGE ;
    usage for $progname
    $progname [-xy=XX,YY]
    			  [-p|password thepassword]
    			  [-stars|-visible|-visible=maxlen]
    			  [-message]
    			  [-w|-withmouse]
    			  [-help]
    
    $progname was written by:Chris Sincock
    (this version $datemod)
    Copyright (C) 2006 Chris Sincock
     -withmouse option added 2008 Andrew Oakley under GPL
     adapted by PAB to work with cheese to do a photobooth !
    
    This is free software; see the GNU GPL license for copying conditions.
    There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR
    A PARTICULAR PURPOSE
    
    
    If you specify -password or -stars it will default to not telling you
     what password to type
    If you do not specify -password or -stars or -vis, it will tell you
     what password to type and the password will be $defaultpassword
    
    You can clear whatever has already been typed by hitting <Return>
    END_OF_USAGE
    
      exit($exitcode);
    }
    
    
    my $password=$defaultpassword;
    my $message="Type the password to quit\n:";
    my $true=1;
    my $false=0;
    my $noshow=$false;
    my $withmouse=$false;
    my $maxshownlength=30;
    my $defaults_changed=$false;
    my $defaults_changed_vis=$false;
    
    my @startpos=(50,50);
    
    while (@ARGV)
    {
      my $arg=shift @ARGV;
      if($arg =~ /^-xy=(\d+),(\d+)$/i)
      {
        @startpos=($1,$2);
      }
      elsif($arg =~ /^(-|--)(h|help|usage|[?])$/i)
      {
        usage(0);
      }
      elsif($arg =~ /^(-|--)(p|pass|password)$/i)
      {
        if(!@ARGV)
        {
          print STDERR "missing argument\n";
          usage(-1);
        }
        $password=shift @ARGV;
        $defaults_changed=$true;
      }
      elsif($arg =~ /^(-|--)(s|stars)$/i)
      {
        $noshow="stars";
        $defaults_changed=$true;
      }
      elsif($arg =~ /^(-|--)(w|withmouse)$/i)
      {
        $withmouse=$true;
        $defaults_changed=$true;
        $defaults_changed_vis=$true;
      }
      elsif($arg =~ /^(-|--)(v|vis|visible)(=(\d+)|)$/i)
      {
        $noshow=$false;
        if(length($4))
        {
          $maxshownlength=$4;
        }
        $defaults_changed=$true;
        $defaults_changed_vis=$true;
      }
      elsif($arg =~ /^(-|--)(m|msg|message)$/i)
      {
        if(!@ARGV)
        {
          print STDERR "missing argument\n";
          usage(-1);
        }
        $message=shift @ARGV;
        if(length($message))
        {
          $message.="\n";
        }
        $defaults_changed=$true;
      }
      else
      {
        usage(-1);
      }
    }
    if(!$defaults_changed)
    {
      $noshow=$false;
    }
    if((!$defaults_changed || $defaults_changed_vis))
    {
      $message="Type password to quit\n";
    }
    
    use Gtk2 -init;
    my $w  = new Gtk2::Window -popup;
    my $l  = new Gtk2::Label $message;
    my $eb = new Gtk2::EventBox;
    my $gdkwin;
    my $grabstatus;
    my $typed="";
    
    sub do_grab()
    {
      system "xdotool search --onlyvisible --classname 'Cheese' windowactivate --sync key F11";
      system "xmodmap -e 'keycode 37 = ' ";
      system "xmodmap -e 'keycode 105 = ' ";
      $grabstatus= Gtk2::Gdk->keyboard_grab(
          $gdkwin,$true,Gtk2::Gdk::X11->get_server_time($gdkwin) );
      if($grabstatus ne "success")
      {
        $l->set_text("keyboard grab failed");
      }
      if($withmouse)
      {
        $grabstatus= Gtk2::Gdk->pointer_grab(
           $gdkwin,$true,['button-press-mask','button-release-mask'],undef,undef,Gtk2::Gdk::X11->get_server_time($gdkwin));
        if($grabstatus ne "success")
        {
          $l->set_text("pointer grab failed");
        }
      }
    }
    
    sub do_ungrab()
    {
      system "xmodmap -e 'keycode 37 = Control_L NoSymbol Control_L'";
      system "xmodmap -e 'keycode 105 = Control_R NoSymbol Control_R'";
      Gtk2::Gdk->keyboard_ungrab(Gtk2::Gdk::X11->get_server_time($gdkwin));
      if($withmouse)
      {
         Gtk2::Gdk->pointer_ungrab(Gtk2::Gdk::X11->get_server_time($gdkwin));
      }
    }
    
    sub do_keypress(@)
    {
      my ($widg,$evt)=@_;
      my $kv = $evt->keyval;
      my $cs = Gtk2::Gdk->keyval_name($kv);
    
      if($cs =~ /Return|Enter/)
      {
        if($typed eq $password)
        {
          do_ungrab();
          Gtk2->main_quit;
        }
        else
        {
          $typed="";
        }
      }
      elsif($cs =~ /space/)
      {
        system "xdotool search --onlyvisible --classname 'Cheese' windowactivate --sync key space";
      }
      elsif(length($cs) == 1 && $cs =~ /[[:print:]]/)
      {
        $typed .= $cs;
      }
      my $showtyped=$typed;
      if($noshow eq "stars")
      {
        $showtyped =~ s/[^*]/*/g;
      }
      elsif($noshow)
      {
        $showtyped="";
      }
      if(length($showtyped) > $maxshownlength)
      {
        $showtyped=substr($showtyped,0,$maxshownlength);
      }
      $l->set_text($message.$showtyped);
    }
    $w->add($eb);
    $eb->add($l);
    $w->add_events( [ qw(key_press_mask) ]);
    $w->signal_connect('key_press_event', 669cc01ce3a2f62b9ad1e9ea2aeb4789562db6a2amp;do_keypress);
    $w->signal_connect('realize', sub { $w->window->move(@startpos); });
    $w->signal_connect('map', sub { $gdkwin=$w->window; do_grab(); });
    $w->show_all;
    Gtk2->main;
    
    • [^] # Re: Solution adoptée ?

      Posté par . Évalué à 0.

      Bonjour Pierre Alain
      je ne sais pas comment te contacter.
      ton système me serais vraiment très utile puisque je souhaite faire presque la même chose que toi (une application qui en un clic face les photos, la sauvegarde et l'impression et redevienne prête pour le prochain cycle)
      j'espère que ce commentaire te parviendra et que tu pourra lire le message suivant qui décrit mon projet.
      merci

  • # help...

    Posté par . Évalué à 1.

    Bonjour
    Je ne suis pas développeur et la programmation m'est complètement étrangère.
    Je suis simple utilisateur d'ubuntu et je suis exactement dans ton cas, Pierre Alain, un mariage se prépare dans mon entourage et en temps que bricoleur, je suis chargé de fabriquer une cabine Photomaton et pour la partie info, ta solution est la meilleur que j'ai trouvé en faisant des recherches.
    Dans mon cas, je souhaiterais également avoirs un seul bouton accessible qui lancerait chaque cycle (prises de vues + sauvegarde + impressions)

    Mes questions sont:
    -1- Est il possible a un novice comme moi d'utiliser ta solution? si oui, peut tu m'expliquer?
    Devant le jolie script que tu publi, "je suis comme une poule qui aurait trouvé un couteau".
    -2- Si il est nécessaire que j'apprenne un langage de programmation avant de me lancer, je renoncerais a sécuriser l'accès au reste du PC. Mais dans ce cas, comment juste automatiser un cycle de 4 photos + impression + sauvegarde disque dans cheese?
    merci pour votre aide

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.