:-y

Kriss blog

vendredi 20 avril 2012 - 20:47

Bienvenue à toi petit Mathis !

Ce n'était pas prévu pour tout de suite, mais je suis tontof pour la deuxième fois depuis hier soir. Au moins ce ne sera pas compliqué pour retenir les anniversaires.

Chose promise chose due, voici le code de kriss blog. Le nom est sans surprise inspiré du principe de programmation KISS. J'ai hésité à changer de nom, mais même si je compte garder le principe minimaliste de picoblog proposé par BohwaZ, les fonctionnalités que j'ai et que je compte ajouter vont rendre kriss blog différent du projet original.

La TODO list est encore très sommaire, mais j'envisage de :
- convertir en html5
- sauvegarder automatiquement l'édition d'articles
- coder en utilisant la syntaxe PEAR
- pouvoir poster des messages futurs automatiquement

J'ai déjà fait quelques modifications importantes :
- mise en place d'une procédure d'installation
- ajout d'un titre par article
- ajout des commentaires
- ajout d'un captcha

Pour le captcha, une petite classe php et le tour est joué. J'ai cherché des polices ASCII pour m'en créer une petite perso :
 _   _   __  _   __  __  __     ___ ___         _ _ 
|_| |_) | | \ |__ |_ / _ |_| | | |_/ | |||
| | |_) |__ |_/ |__ | \_/ | | _|_ _| | \ |__ | |
__   _   _   _   _   _  ___                     ___ 
| | / \ |_| | | |_| (_ | | | \ / \ / \_/ |_| /
| | \_/ | |_\ | \ _) | |_| v w / \ _| /__
 _       _   _       _   _   __  _   _  
|/| /| _| _| |_| |_ |_ | |_| |_|
|_| | |_ _| | _| |_| / |_| _|


Il est possible de définir sa propre police, il suffit juste que les caractères soient de la même largeur. Par défaut, le constructeur utilise la police ci-dessus. Et pour finir, voici cette petite classe qui permet de générer une chaîne automatiquement et de l'encoder facilement pour obtenir un captcha dans une balise pre.


<?php 
/**
 * Captcha management class
 * 
 * Features:
 * - Use an ASCII font by default but can be customized
 *   (letter width should be the same)
 * - generate random strings with 5 letters
 * - convert string into captcha using the ASCII font
 */

class Captcha
{
    public 
$alphabet="";
    public 
$alphabet_font;
    public 
$col_font 0;
    public 
$row_font 0;

    public function 
__construct($alpha_font=array(
                                    
'A'=>" _ |_|| |",
                                    
'B'=>" _ |_)|_)",
                                    
'C'=>" __|  |__",
                                    
'D'=>" _ | \\|_/",
                                    
'E'=>" __|__|__",
                                    
'F'=>" __|_ |  ",
                                    
'G'=>" __/ _\\_/",
                                    
'H'=>"   |_|| |",
                                    
'I'=>"___ | _|_",
                                    
'J'=>"___ | _| ",
                                    
'K'=>"   |_/| \\",
                                    
'L'=>"   |  |__",
                                    
'M'=>"_ _|||| |",
                                    
'N'=>"__ | || |",
                                    
'O'=>" _ / \\\\_/",
                                    
'P'=>" _ |_||  ",
                                    
'Q'=>" _ | ||_\\",
                                    
'R'=>" _ |_|| \\",
                                    
'S'=>" _ (_  _)",
                                    
'T'=>"___ |  | ",
                                    
'U'=>"   | ||_|",
                                    
'V'=>"   \\ / v ",
                                    
'W'=>"   \\ / w ",
                                    
'X'=>"   \\_// \\",
                                    
'Y'=>"   |_| _|",
                                    
'Z'=>"___ / /__",
                                    
'0'=>" _ |/||_|",
                                    
'1'=>"    /|  |",
                                    
'2'=>" _  _||_ ",
                                    
'3'=>" _  _| _|",
                                    
'4'=>"   |_|  |",
                                    
'5'=>" _ |_  _|",
                                    
'6'=>" _ |_ |_|",
                                    
'7'=>" __  | / ",
                                    
'8'=>" _ |_||_|",
                                    
'9'=>" _ |_| _|"),
                                
$row_font=3){
        
$this->alphabet_font $alpha_font;

        
$keys array_keys($this->alphabet_font);

        foreach (
$keys as $k){
            
$this->alphabet .= $k;
        }

        if (
$keys[0]){
            
$this->row_font $row_font;
            
$this->col_font =
                (int)
strlen($this->alphabet_font[$keys[0]])/$this->row_font;
        }
    }

    public function 
generateString($len=5){
        
$i=0;
        
$str='';
        while (
$i<$len){
            
$str.=$this->alphabet[mt_rand(0,strlen($this->alphabet)-1)];
            
$i++;
        }
        return 
$str;
    }

    public function 
convertString($str_in){
        
$str_out="\n";
        
$str_out.='<pre>';
        
$str_out.="\n";
        
$i=0;
        while(
$i<$this->row_font){
            
$j=0;
            while(
$j<strlen($str_in)){
                
$str_out.= substr($this->alphabet_font[$str_in[$j]],
                                  
$i*$this->col_font,
                                  
$this->col_font)." ";
                
$j++;
            }
            
$str_out.= "\n";
            
$i++;
        }
        
$str_out.='</pre>';
        return 
$str_out;
    }
}
 
?>

Joyeux anniversaire

mercredi 18 avril 2012 - 19:00

Cela fait 2 ans jour pour jour, 2 ans déjà que Tontof existe. Aujourd'hui était donc le jour idéal pour se lancer.

Depuis quelques temps l'idée me trottait dans la tête. Et puis, j'ai hésité à me lancer dans l'auto-hébergement, et j'ai finalement choisi l'option de facilité en prenant un hébergeur... ce n'est que partie remise.

Qu'est-ce que vous trouverez sur tontof.net ? Un peu de tout mais surtout des choses qui concernent le libre, linux, l'informatique et bien sûr d'autres activités diverses et variées que je vous laisserai découvrir. Je cherche à m'émanciper et à quitter les services privés qui je sais ne font pas bon usage de toutes nos informations. Et puis j'en ai marre de devoir accepter qu'une application ait besoin d'accéder à la liste de mes contacts pour une boussole. Alors je partagerai avec vous les codes que je développe pour répondre à des besoins précis sans avoir à baisser son...

Bref, vous avez compris.

Alors pour commencer, il a fallu que je me trouve un joli moteur pour faire mon blog. J'ai pensé à blogotext de Timo que je suis régulièrement, mais cela me semblait un peu trop compliqué et je cherchais un outil encore plus minimaliste. Dans sa liste de moteurs de blog, je me suis très vite orienté vers picoblog . J'ai regardé le code, il m'a bien plu et j'ai commencé à ajouter les choses qui me manquaient :
- une installation automatique
- une gestion de session sécurisée
- des commentaires

Il me reste encore beaucoup d'autres choses à faire, mais je ne voulais pas attendre pour vous rejoindre. Je partagerai évidemment avec vous ce code, mais pour vous faire patienter, je vous livre la gestion de la session que j'ai réalisée grâce au code de Sebsauvage.
Comme je ne voulais pas plusieurs fichiers et que je voulais ajouter d'autres possibilités, j'ai fait un mixte avec shaarli pour créer une classe Session qui permet de gérer facilement les sessions.

J'espère que cela vous plaira. N'hésitez pas à faire des critiques dans les commentaires et à m'ajouter dans vos amis facebook, google+ et twitter. Ah ben non je suis bête j'ai pas de compte. Mais vous pouvez maintenant me suivre grâce à mon flux RSS :-)

Au fait, j'allais oublier. Très bon anniversaire Noé !

Edit : 2013-08-31 : voir http://tontof.net/kriss/php5/session pour une version à jour

<?php 
/**
 * Session management class
 * http://www.developpez.net/forums/d51943/php/langage/sessions/
 * http://sebsauvage.net/wiki/doku.php?id=php:session
 * http://sebsauvage.net/wiki/doku.php?id=php:shaarli
 *
 * Features:
 * - Everything is stored on server-side (we do not trust client-side data,
 *   such as cookie expiration)
 * - IP addresses + user agent are checked on each access to prevent session
 *   cookie hijacking (such as Firesheep)
 * - Session expires on user inactivity (Session expiration date is
 *   automatically updated everytime the user accesses a page.)
 * - A unique secret key is generated on server-side for this session
 *   (and never sent over the wire) which can be used
 *   to sign forms (HMAC) (See $_SESSION['uid'] )
 * - Token management to prevent XSRF attacks.
 * 
 * TODO:
 * - log login fail
 * - prevent brute force (ban IP)
 *
 * HOWTOUSE:
 * - Just call Session::init(); to initialize session and
 *   check if connected with Session::isLogged()
 */

class Session
{  
    
// If the user does not access any page within this time,
    // his/her session is considered expired (in seconds).
    
public static $inactivity_timeout 3600;
    private static 
$_instance;
 
    
// constructor
    
private function __construct()
    {
        
// Use cookies to store session.
        
ini_set('session.use_cookies'1);
        
// Force cookies for session  (phpsessionID forbidden in URL)
        
ini_set('session.use_only_cookies'1);
        if (!
session_id()){
            
// Prevent php to use sessionID in URL if cookies are disabled.
            
ini_set('session.use_trans_sid'false);
            
session_start(); 
        }
    } 

    
// initialize session
    
public static function init()
    {
        if (!isset(
self::$_instance)) {
            
self::$_instance = new Session();
        }
    }

    
// Returns the IP address, user agent and language of the client
    // (Used to prevent session cookie hijacking.)
    
private static function _allInfos()
    {
        
$infos $_SERVER["REMOTE_ADDR"];
        if (isset(
$_SERVER['HTTP_X_FORWARDED_FOR'])) {
            
$infos.=$_SERVER['HTTP_X_FORWARDED_FOR'];
        }
        if (isset(
$_SERVER['HTTP_CLIENT_IP'])) {
            
$infos.='_'.$_SERVER['HTTP_CLIENT_IP'];
        }
        
$infos.='_'.$_SERVER['HTTP_USER_AGENT'];
        
$infos.='_'.$_SERVER['HTTP_ACCEPT_LANGUAGE'];
        return 
sha1($infos);
    }
 
    
// Check that user/password is correct and init some SESSION variables.
    
public static function login($login,$password,$login_test,$password_test,
                                 
$pValues = array())
    {
        foreach (
$pValues as $key => $value) { 
            
$_SESSION[$key] = $value
        } 
        if (
$login==$login_test && $password==$password_test){
            
// generate unique random number to sign forms (HMAC)
            
$_SESSION['uid'] = sha1(uniqid('',true).'_'.mt_rand());
            
$_SESSION['info']=Session::_allInfos(); 
            
$_SESSION['username']=$login;
            
// Set session expiration.
            
$_SESSION['expires_on']=time()+Session::$inactivity_timeout;
            return 
true;
        }
        return 
false;
    }
 
    
// Force logout
    
public static function logout()
    {
        unset(
$_SESSION['uid'],$_SESSION['info'],$_SESSION['expires_on']);
    } 

    
// Make sure user is logged in.
    
public static function isLogged()
    {
        if (!isset (
$_SESSION['uid'])
            || 
$_SESSION['info']!=Session::_allInfos()
            || 
time()>=$_SESSION['expires_on']){
            
Session::logout();
            return 
false;
        }
        
// User accessed a page : Update his/her session expiration date.
        
$_SESSION['expires_on']=time()+Session::$inactivity_timeout;  
        return 
true;
    }

    
// Returns a token.
    
public static function getToken()
    {
        if (!isset(
$_SESSION['tokens'])){
            
$_SESSION['tokens']=array();
        }
        
// We generate a random string and store it on the server side.
        
$rnd sha1(uniqid('',true).'_'.mt_rand());
        
$_SESSION['tokens'][$rnd]=1;  
        return 
$rnd;
    }

    
// Tells if a token is ok. Using this function will destroy the token.
    // return true if token is ok.
    
public static function isToken($token)
    {
        if (isset(
$_SESSION['tokens'][$token]))
        {
            unset(
$_SESSION['tokens'][$token]); // Token is used: destroy it.
            
return true// Token is ok.
        
}
        return 
false// Wrong token, or already used.
    
}
}
 
?>