weedo

Nous faisons du web


Karim Cassam Chenaï

Nous créons des sites web profitables en utilisant des technologies Open-Source et des méthodes Agiles

Photos

Posts

January 19, 12:53 PM

Un nouveau client Weedo, un site en construction :Haymann Editions, maison d'édition de meubles et objets contemporains :) 

David Haymann vous invite à découvrir la première collection de sa maison d'édition de meubles et objets contemporains, conçue par le designer Toni Grilo au Salon Maison et Objet du 20 au 24 janvier 2012, Paris Nord Villepinte

Permalink | Leave a comment  »

December 02, 04:12 AM

Extrait de la documentation Xiti :

La variable xt_page permet de renseigner le nom de la page et de créer les chapitres XiTi. Les libellés qui y
sont renseignés ne doivent contenir que des caractères suivants :
  Les lettres abcdefghijklmnopqrstuvwxyz en majuscules ou minuscules
  Les chiffres 123467890
  Les points .
  Les slashs /
  Les moins -
  Les underscores _
  Les tildes ~

Il est donc nécessaire d’effectuer un retraitement des noms si l’affichage est fait dynamiquement, afin de
nettoyer les caractères interdits lors du remplissage de cette variable.

Voici une petite fonction qui permet de le faire :

 function cleanStringForXiti($string,$replace){
       
        return  preg_replace("#[^a-zA-Z0-9_/\.~-]#",$replace, $string);
       
 }

On remplace chaque caractère interdit trouvé par un caractère au choisi.

Permalink | Leave a comment  »

July 27, 07:10 PM

Avoir accès à un objet PDO n'est pas suffisant pour être certain d'avoir une connexion à une bdd. Il arrive de passer une requête et d'obtenir l'erreur :

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2006 MySQL server has gone away' in…

Pour obtenir cette erreur, vous pouvez faire le test suivant :

$pdo = new PDO($dsn, $user, $password);
echo get_class ($pdo);
// On a bien un objet PDO
$pdo->query('select 1');
// ça passe
sleep(20);
// Vous avez 20 secondes pour killer manuellement la connexion mysql. Faites-le pour les besoins du tests, 
echo get_class ($pdo);
// On a toujours un objet PDO, mais cet objet n'est pas informé que la connexion correspondante a été killée, ce qu'on va voir tout de suite : 
$pdo->query('select 1');
// !! ça casse : Erreur MySQL server has gone away. Pourtant, on avait bien un objet PDO

Les raisons possibles de cette erreurs sont nombreuses : http://dev.mysql.com/doc/refman/5.0/en/gone-away.html

En plus de/plutôt que/en attendant de résoudre le problème, j'ai trouvé 2 méthodes (assez proche) pour contourner le problème : On tente la connexion avec notre vieille connexion pdo, et si on obtient une erreur, on créé un nouvel objet pdo tout neuf.

Méthode 1

$sql = 'SELECT count(*) FROM `TABLE`;';
for ($i = 1; $i <= 2; $i++) {
    try {
        $nb = $pdo->query($sql)->fetchColumn();
        if (is_int($nb)) {
            // C'est bon, ma vieille connexion a fonctionné.
            break;
        }
    } catch (PDOException $e) {
    //Oups, j'ai une erreur de connexion
        if ($i == 1) {
            // C'est la première fois ? OK, je recréé une connexion.
            $pdo = new PDO($dsn, $user, $password);
        } else {
            // C'est la 2eme fois ? OK, c'est mort.
            $nb = "(nombre inconnu)";
            echo 'PDO Connection failed: ' . $e->getMessage().'. ';
        }
    }
}

Méthode 2

// Je test si ma vieille connexion est OK avec une requête toute simple
try {
    $pdo->query('select 1;')
    //C'est bon;
} catch (PDOException $e) {
    //Oups, j'ai une erreur de connexion
    // Je recréé une connexion.
    $pdo = new PDO($dsn, $user, $password);
}
// Ici j'ai plus de chance d'avoir un objet pdo viable que si je n'avais pas fait le petit try/catch au-dessus => Je fais ma requête
$sql = 'SELECT count(*) FROM `TABLE`;';
$nb = $pdo->query($sql)->fetchColumn();

Comme d'hab, si quelqu'un a mieux, ce que j'espère, je suis preneur !

Permalink | Leave a comment  »

July 22, 10:42 AM

Après un

header("Location: $url");

Si vous ne voulez pas que la suite du php s'exécute, il faut le préciser, en mettant un exit juste derrière par exemple.

Sinon, le script php continue de s'exécuter et la page est redirigée à la fin de l'exécution du script.

Voici une démo :

// Le fichier toto.txt va être créé et écrit, et ce n'est qu'au bout des 10 sec d'exécution du script que le navigateur va être redirigé.
header("Location:http://www.weedo.fr");
$f = fopen('toto.txt', "w");
for ($i = 1; $i <= 10; $i++) {
    sleep(1);
    fwrite($f, $i.PHP_EOL);
}

Jusqu'à maintenant je pensais que le header+location faisait un exit implicite, ce qui, après réflexion, n'est pas logique.

Permalink | Leave a comment  »

July 19, 06:38 AM

Je n'ai pas encore testé cette astuce, je l'ai simplement vu sur un serveur (appelons le exemple.com) :

L'admin a mis la règle suivant dans le fichier vhosts.conf (CentOS) :

# more  vhosts.conf

RewriteEngine On
RewriteMap lowercase int:tolower
RewriteRule ^/(.*)$ /home/${lowercase:%{SERVER_NAME}}/$1

Ainsi, les utilisateurs créent des dossiers .exemple.com dans le dossier home, ce qui créé dynamiquement les sous domaine.

Par exemple, si un utilisateur crée un dossier foo.exemple.com, les fichiers dans le dossier seront disponibles à l'adresse foo.exemple.com

Permalink | Leave a comment  »

July 12, 09:06 AM

Mis à jour le 12 juillet 2011.

Attention : A utiliser avec précaution.

  • Vider dossier ~/Library/PubSub/ : http://discussions.info.apple.com/thread.jspa?threadID=2174894
  • Vider dossier ~/Library/Preferences/Macromedia/
  • Supprimer des fichiers mail qui ne servent plus : http://support.apple.com/kb/TA23076
  • Supprimer les langues que vous n'utilisez jamais : http://monolingual.sourceforge.net/
  • Vider le contenu du dossier cache de votre dossier utilisateur : ~/Library/Caches/
  • Rechercher tous les fichiers de type ‘Archive’, et supprimer ceux qui sont inutiles, en commençant par les plus gros.
  • Rechercher tous les fichiers de type ‘Image disque’, et supprimer ceux qui sont inutiles, en commençant par les plus gros.
  • Autre ressource : Spring Clean chez MacWorld
  • Utiliser un logiciel de détection de doublons. Je conseille Tidy Up.
  • Spécial bonus passage à Mac OS Lion : Supprimer vos applis Classic et PowerPC. Par ici pour les repérer
  • L'application MobileMe Backup est obsolète (http://support.apple.com/kb/dl1025), supprimer le dossier /Users/ka/Library/Application Support/Backup
  • Le dossier est backup d'iPhone se trouve ici : /Users/ka/Library/Application Support/MobileSync/Backup. Garder ce dossier de côté, faire un backup frais des iBidules et supprimer le dossier

Combien avez-vous gagné d'espace disque en utilisant ces astuces ?
Partagez vos astuces dans les commentaires !

Permalink | Leave a comment  »

July 02, 11:25 AM

Snippet pour rendre myFunction applicable à une collection

/*
 * myFunctionArray function.      
 * Replace 'myFunction' with the name of the function you want to use. Keep the quotes.      
 * @param array $array, collection of elements to pass to the function      
 * @return array of elements which have been processed by the function      
 */

function myFunctionArray(array $array) {
    return array_map(array($this, 'myFunction'), $array);
}

Snippet d'une fonction qui rend n'importe quelle méthode de l'objet applicable à une collection, en passant le nom de la fonction en paramètre

/*
 * anyFunctionArray function.
 * Pour une méthode static, remplacer `$this` par `self`
 * @param string $functionName, Name of the function to call
 * @param array $array, collection of elements to pass to the function
 * @return array of elements which have been processed by the function
 */

function anyFunctionArray($functionName, array $array) {
    return array_map(array($this, $functionName), $array);
}

On peut aussi utiliser une boucle foreach, mais c'est moins élégant.

Permalink | Leave a comment  »

June 30, 10:35 AM

Je suis tombé sur un bug PDO qui m'a fait perdre beaucoup de temps :

J'avais cette requête :

$query = $pdo->prepare($sql);
$result = $query->execute();
if ($result === false) {
    var_dump($result);
    echo $pdo->errorCode();
    var_dump($pdo->errorInfo());
}

J'obtenais :

(bool)false
00000
Array() /* c'est à dire tableau vide, pas de message d'erreur */

execute() échouait mais sans code ni message d'erreur

J'ai remplacé mon code par :

$result = $pdo->query($sql);
if ($result === false) {
    var_dump($result);
    echo $pdo->errorCode();
    var_dump($pdo->errorInfo());
}

Et là j'ai eu mon message erreur :

(bool)false
00000
[0] => 42S02
[1] => 1146
[2] => Table 'xxxx' doesn't exist

Conclusion, si votre prepare()/execute() ne fonctionne pas sans message d'erreur, remplacez le temporairement par un query() qui sera peut-être plus bavard.

[EDIT] Ce bug est le même que celui décrit ici : https://bugs.php.net/bug.php?id=37285

K.

Permalink | Leave a comment  »

June 10, 09:05 AM

Lorsque vous utilisez des variables dans des vues html, il faut faire attention aux caractères spéciaux html : quote, double quote, < >, etc., qui pourraient être contenus dans la variable et interférer avec le html

Exemple, cas réel : a href = '$variable'

avec $variable qui contient COTE D'AZUR… => #fail (cas réel).

Donc, au niveau de la vue :

  • Passez toujours vos variables dans la fonction htmlspecialchars($variable, ENT_COMPAT ,'UTF-8')
  • Utilisez toujours UTF-8 quand c'est possible.
  • Préférez les double quotes dans la vue : a href = "$variable" plutôt que a href = '$variable' car les doubles quotes sont moins fréquents dans l'écrit (en français en tout cas). Cela permet aussi d'utiliser htmlspecialchars ou htmlentities avec le deuxième paramètre par défaut.

Snippet :

$converted = htmlspecialchars($variable, ENT_COMPAT ,'UTF-8');

link :php.net/htmlspecialchars

K.

Permalink | Leave a comment  »

June 09, 12:40 PM

I wrote a simpler email validator for Zend. Here it is :

namespace Weedo\Validate;

/**
 * Weedo EmailAddress Validator class.
 *
 * @author http://twitter.com/kaweedo
 */

class EmailAddress extends \Zend_Validate_Abstract
{
    const INVALID = 'emailAddressInvalid';

    protected $_messageTemplates = array(
        self::INVALID => "Email is not valid"
    );

     /**
     * isValid function.
     * Defined by Zend_Validate_Interface
     *
     * Returns true if and only if $value is a valid email address
     * according to RFC2822
     *
     * @access public
     * @link   http://php.net/manual/en/function.filter-var.php
     * @param  string $value
     * @return boolean
     */

    public function isValid($value)
    {
        if(filter_var($value, FILTER_VALIDATE_EMAIL) === false) {
            $this->_error(self::INVALID);
            return false;
        } else {
            // We only check the presence of a dot on the domain part
            $components = explode("@", $value);
            $domain = $components[1];

            if (strpos($domain, ".") === false) {
                $this->_error(self::INVALID);
                return false;
            }

            return true;
        }
    }
}

Usage example :

$emailAddressValidator = new Weedo\Validate\EmailAddress();
/* $emailAddressValidator = new Zend_Validate_EmailAddress(); too complicated */

$this->addElement(
        'text',
        'email',
        array(
            'placeholder'     => ucfirst($this->getTranslator()->translate('Your email'))."*",
            'required'  => true,
            'validators' => 
            array(
                array('NotEmpty', true, array('messages' => $this->getTranslator()->translate('Email is mandatory'))),
                array($emailAddressValidator,true),
            ),
        )
    );

source : http://www.electrictoolbox.com/php-email-validation-filter-var/
http://php.net/manual/en/function.filter-var.php

Permalink | Leave a comment  »

June 07, 08:24 AM

http://stackoverflow.com/questions/3288901/zend-form-setaction-using-named-ro...

// in your form
public function init()
{
$router = Zend_Controller_Front::getInstance()->getRouter();
$url = $router->assemble(
array(
'paramterName0' => 'parameterValue0',
'paramterName1' => 'parameterValue1',
),
'routeName'
);

$this->setAction($url);
...
}

ou

// in your form public function init()
{
$url = Zend_Layout::getMvcInstance()->getView()->url(array(), 'routeName';
$this->setAction($url);
...
}

Permalink | Leave a comment  »

May 05, 05:20 AM

Mission

Vous prendrez en charge la conception et la réalisation de projets Web.

Dans le cadre de la mission, les techniques utilisées seront :

  • php5 (orientée objet)
  • frameworks PHP Zend et Symfony
  • CMS WordPress
  • mysql, doctrine
  • html, css, javascript (ajax, jquery)
  • administration de serveurs web Unix
  • administration de BDD MySQL

Profil

Vous êtes passionné par le développement web, rigoureux, autonome, réactif, courageux.

Ce que nous faisons

  • Nous développons des sites web pour des clients.
  • Notre priorité est de fournir un travail de haute qualité, en respectant les budgets et les délais.
  • Notre objectif est de fidéliser nos clients.
  • Nous sommes une entreprise ouverte aux nouvelles idées et aux nouvelles techniques.
  • Nous améliorons notre savoir-faire et nos pratiques en permanence.

Voir l'annonce sur lolix
Voir l'annonce sur alsacreations

Permalink | Leave a comment  »

April 29, 06:27 AM

Dans la plupart des cas, sous Mac OS X, pour changer de machine ou de disque dur, il est inutile de faire une migration manuelle et il suffit d'utiliser l'Assistant de Migration dans le dossier Utilitaires. Ce mémento s'adresse à ceux qui souhaitent faire une migration manuellement sans passer par l'Assistant de Migration.

  • Débrancher les DD externes
  • Installer Mac OS X 10.6 à partir du DVD, clé USB Apple ou de votre disque d'installation Apple.
  • Renseigner votre identifiant Apple (utilisé pour iTunes ou Mobile me)
  • Aller dans Préférences Système/Économie d'énergie et modifier le réglage Ordinateur en veille : régler sur ‘Jamais’
  • Faire la mise à jour combo (–> 10.6.last)
  • Configurer les préférences du Finder
  • Configurer le nom de la machine dans les préférences systèmes/partage

PIM : Comme pour l'iPhone, ces données sont gérables sur le cloud. Ne pas les migrer donc, configurer simplement vos comptes.

  • Carnet d'adresses : Mon carnet d'adresse est sur mon compte gmail => Préférences Synchroniser avec Google
  • iCal : Préférences, ajouter un compte google
  • Mail : Créer votre compte google (IMAP). Supprimer les RSS créés automatiquement

Mots de passe (keychain access/trousseau d'accès)

  • Ouvrir votre disque de sauvegarde à cette adresse: Nom_du_disque_de_sauvegarde/Utilisateurs/votredossier/Bibliothèque/
  • Glisser le dossier “Keychains” sur le bureau.
  • Ouvrir votre disque cible tout neuf et glisser le dossier “Keychains” à cet endroit : Nom_du_disque_tout_neuf/Utilisateurs/votredossier/Bibliothèque/

Copier/coller le contenu des dossiers du compte

  • ~/Bureau
  • ~/Documents
  • ~/Images
  • ~/Musique
  • ~/Videos
  • ~/Sites
  • /Users/Shared/

iTunes

Applis : Comme sur iphone, les applis qui avaient été installées avec l'app store devraient être téléchargeables gratuitement si vous avez bien gardé votre compte en ligne App Store. : là aussi, on est dans le cloud Quelques applis indispensables :

  • iPhoto : J'avais la version 8. Plutot que de réinstaller une vieille version, j'ai installé la version 9.1.1 avec l'App Store
  • Dropbox, configuer le compte, les fichiers se synchronisent
  • 1password, faire le lien avec son fichier keychain (1password + dropbox fonctionnent très bien ensemble)
  • Spotify, configurer son compte
  • Installer easyfind
  • Installer airfoil
  • Configurer iChat

Rebrancher les DD externes.

Sources :

Permalink | Leave a comment  »

April 14, 07:46 AM

14 avril 2011 :
Weedo cherche un développeur web en stage ou contrat en alternance.
Nous cherchons un développeur pour faire de la création et de l'intégration de sites web.

Les compétences techniques indispensables sont :

  • php (programmation orientée objet)
  • mysql, doctrine
  • javascript (ajax, jquery)
  • html
  • css

Un niveau avancé dans ces technologies est demandé.

Une bonne connaissance des frameworks PHP Zend et Symfony est appréciée.
Une bonne connaissance du CMS WordPress est appréciée.
Des compétences en administration de serveurs web Unix sont appréciées.
Des compétences en administration de BDD MySQL sont appréciées.

Expérience : Le candidat devra avoir une expérience significative dans le développement web.

Le candidat doit avoir les qualités suivantes :

  • Passionné par le développement web.
  • Intéressé, travailleur, rigoureux, autonome, adaptable, très motivé.
  • Déterminé à faire aboutir les taches confiées dans le temps imparti.
  • Courageux dans le traitement des problèmes.
  • Curieux et capable d'apprendre rapidement.
  • Capable de travailler en équipe.
  • Très bonne expression orale et écrite.
  • Excellente maitrise de l'anglais écrite et orale.

Nous développons des sites web pour des clients.
Notre priorité est de fournir un travail de haute qualité, en respectant les budgets et les délais.
Notre objectif est de fidéliser nos clients.
Nous sommes une entreprise ouverte aux nouvelles idées et aux nouvelles techniques.
Nous améliorons notre savoir-faire et nos pratiques en permanence.

Permalink | Leave a comment  »

April 08, 09:25 AM

Voici une check-list de ressources pour installer un package PEAR/PHP (exemple de PHPUnit) pour l'utiliser avec MAMP/MAC OS X. Le nombre d'infos qu'il faut connaitre pour faire ça est assez incroyable. Je pense avoir rassemblé ici la liste des ressources d'informations que j'ai utilisé.

Comment installer PHPUnit

http://www.phpunit.de/manual/current/en/installation.html

Comment mettre à jour pear

http://serverfault.com/questions/184741/upgrading-pear-from-1-9-0-to-1-9-1-fails

Comment installer pear (prérequis : l'exécutable php de MAMP)

Attention, ce n'est pas précisé dans la doc, mais il faut se mettre dans le bon dossier ! http://pear.php.net/manual/en/installation.getting.php

Comment vérifier la config de pear

pear config-show

Comment savoir quelle version de php j'utilise

$ which php

Comment pointer vers l'exécutable php et pear de MAMP via la variable $path

Editer le fichier de setup du shell utilisé (Le fichier de setup shell est le shell appelé au moment du login) . Par exemple, pour tcsh, il s'agira de .tcshrc :

setenv PATH /usr/local/bin:$PATH
set path=($path /Developer/Tools)
set path=(/Applications/MAMP/bin/php5.3/bin $path)

exemple, pour bash, il peut s'agir de .bash :

export PATH=/Applications/MAMP/bin/php5.3/bin:$PATH

http://docstore.mik.ua/orelly/unix3/upt/ch03_03.htm
http://www.kitebird.com/csh-tcsh-book/csh-intro.pdf

Comment pointer vers l' exécutable php de MAMP via lien symbolique (préférer la méthode ci-dessus, utilisant la variable $path)

$ cd /usr/bin
$ cp php php.bak (Backup the old version)
$ ln -s /Applications/MAMP/bin/php5.3/bin/php (link to the version of MAMP php)

Comment s'assurer que les scripts dans /Applications/MAMP/bin/php5.3/bin/php sont exécutables

Cas d'obtention du message
/Applications/MAMP/bin/php5.2/bin/php: Permission denied.
ou
/Applications/MAMP/bin/php5.3/bin/php: Permission denied.

$ sudo chmod 0554 /Applications/MAMP/bin/php5.3/bin/* (makes all the scripts executable)

Comment lire les variables d'environnement du shell

$ set

Logs, Message d'erreur

  • Problème Failed opening required /Filter.php
    • Log

      PHP Fatal error:  require_once(): Failed opening required 'PHP/CodeCoverage/Filter.php' (include_path='.:/Applications/MAMP/bin/php5.3/lib/php') in /Applications/MAMP/bin/php5.3/bin/phpunit on line 38
    • Solution
      Modifier php.ini :

      ;;;;;;;;;;;;;;;;;;;;;;;;;
      ; Paths and Directories ;
      ;;;;;;;;;;;;;;;;;;;;;;;;;
      
      ; UNIX: "/path1:/path2"  
      include_path = ".:/Applications/MAMP/bin/php5.3/lib/php"
      include_path = ".:/Applications/MAMP/bin/php5.3/lib/php/PEAR"

Permalink | Leave a comment  »

April 06, 10:42 AM

Si vous voulez qu'un fichier php ne soit jamais appelé directement via un navigateur mais seulement par des include par exemple, vous pouvez utiliser la solution suivante :

Définir une fonction :

function forbidDirectAccess($file) {
    $self = getcwd()."/".trim($_SERVER["PHP_SELF"], "/");
    (substr_compare($file, $self, -strlen($self)) != 0) or die('Restricted access');
}

Appeler la fonction depuis le fichier à protéger :

forbidDirectAccess(__FILE__);

Cette solution a l'avantage d'être 100% php, invariable & autonome et compatible http et cli.

Pour approfondir : http://stackoverflow.com/questions/409496/prevent-direct-access-to-a-php-incl...

Permalink | Leave a comment  »

April 05, 09:55 AM

Pour créer un site web en quelques minutes avec 0€ et sans compétence technique, vous pouvez choisir l'une de ces plateformes, qui s'adressent notamment aux non développeurs :

Conclusion : Ne dérangez les agences web que pour des sites à valeur ajoutée et que vous ne pouvez pas faire vous-mêmes :)

Vos retours d'expériences dans les commentaires de ce post sont les bienvenus.

Permalink | Leave a comment  »

January 27, 06:08 AM

 

Souvent, lorsque l'on utilise des éléments d'interface graphique venant de librairies javascript telles que jQuery UI, on peut se retrouver confronté à des problèmes de sélection :

 

  • Par exemple avec jcarousel, si on double-clique sur les boutons de navigation, les images sont sélectionnées,
  • Lorsque l'on utilise une barre de défilement, le même problème peut apparaître.

 

 

Pour l'empêcher, il suffit d'une simple règle css : (ici on empêche uniquement la sélection d'image)

img{
    user-select: none;
    -khtml-user-select: none;
    -o-user-select: none;
    user-select: none;
    -moz-user-select: -moz-none;
    -webkit-user-select: none;
    }

 

Le soucis est que les navigateurs ne se comportent pas de la même façon face à la sélection par double-clic ou par défilement, et vous aurez à adapter vos règles pour interdire la sélection des éléments qui vous intéressent.

 

Dans mon cas (empêcher une sélection lors du clic sur les boutons de navigation), j'ai simplement fait :

html{
/* safari sélectionne également */
    -webkit-user-select: none;
   }

img{
    user-select: none;
    -khtml-user-select: none;
    -o-user-select: none;
    user-select: none;
    -moz-user-select: -moz-none;
}

à cause de safari, qui sélectionnait des divs également.

 

Pour info :

 faire un

html{
-moz-user-select: -moz-none;
}

n'empèche pas firefox de sélectionner certaines portions de texte sur un CTRL+a

 

Le code permettant de ne rien sélectionner ( le clic droit est toujours disponible) est :

html{
   -moz-user-select: -moz-none;
   -khtml-user-select: none;
   -webkit-user-select: none;
   -o-user-select: none;
   user-select: none;
}


::selection { background: transparent;color:inherit; }
::-moz-selection { background: transparent;color:inherit; }

 

Le deuxième bloc est surtout destiné à FF, mais il reste un point gênant :

Certains morceaux de texte peuvent encore être sélectionnés, même si ça ne se voit pas, et lorsque vous cliquez dans la barre d'URL, le background des zones sélectionnées devient gris.

 

D'après mes recherches, il s'agit d'une propriété client, mais si vous savez comment résoudre ce problème,

 

n'hésitez pas à partager !

 

 

 

Permalink | Leave a comment  »

January 04, 07:03 AM

It can be interesting to have his author name attributed by the svn server (particularly when using the same login to connect on the svn server over ssh). This post will show you how that can be done.

This tutorial has been made and used to configure a multi-user svn environment on a OVH shared host (hébergement mutualisé).
The source guide is available here : http://help.ovh.co.uk/SVNMutu (in english) and here : http://guides.ovh.com/SVNMutu (in french). We push things a bit forward as we explain how to have access both by svn+ssh and by ssh and we resolve a common problem described here : http://forum.ovh.com/showthread.php?t=48610.

We simplify a bit this tutorial by not using ssh config file, but we’ll try to use ssh config files in another version. If you want more information on ssh config file, type man ssh_config in you terminal or google it.

As always, feedbacks/comments appreciated.

Let’s go !

1) Generating 2 rsa private/public key

Before configuring server, we need to generate 2 rsa private/public key, one for ssh protocol and one for ssh+svn protocol.

To do so, do the following on your computer terminal.

We generate : * a rsa key with the default name (id_rsa) to use it for ssh+svn protocol. * a rsa key with another name (id_rsa_hostname for example) to use it for ssh protocol. This second key is optional but recommended.

So you’ll have to do that twice :

prompt$ ssh-keygen -t rsa

Terminal will answer:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):

You can enter a new filepath if you want to store the key to another location or with an other name. We suggest having a different key for each host you connect to and giving a meaningful name to your file. Example : /home/user/.ssh/id_rsa_server_name.

Enter passphrase (empty for no passphrase): Enter same passphrase again:

Your identification has been saved /home/user/.ssh/in id_rsa_server_name.
Your public key has been saved in id_rsa_server_name.pub.
The key fingerprint is:
5e:13:8c:62:f7:45:12:4g:x6:fd:67:r5:68:s5:78:k4 user@computername
The key's randomart image is:
+--[ RSA 2048]----+
|  . =..+D o      |
|   . .*=o*       |
|  . L . .+. .    |
|   *  .o.+.o     |
|        X .o     |
|          .      |
|                 |
|                 |
|                 |
+-----------------+

2) Copy public key files to server

To configure the server you will need the public key you generated previously, so copy it from local to server. To do that you can use scp.

prompt$ scp path_to_public_key_file login_for_server@server_name:path_you_want_to_copy_file

3) Connection to server hosting svn

Launch a terminal and connect to server like that:

prompt$ ssh yourlogin@yourserver

You should find the public key files you copy before in the path you specified to scp command.

4) Configuring server

First go into folder .ssh located in your home path or create it if not exist.

yourlogin@yourserver# cd .ssh

In the folder, open file authorized_keys2 with an editor (emacs, nano, vi, ee). Add the following sentence at the end, replace svnserve_bin_path by the path to svnserve binary (/usr/bin/svnserve ?), home_path by your home path (/homez.XXX/yourlogin ?), root_path by the path you want to be the root for the ssh connection, login_you_want by the login you want svn server attributes to you.

command="svnserve_bin_path --root=home_path/root_path --tunnel --tunnel-user=login_you_want",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty

After that add the public key to the same line, you can type this command.

yourlogin@yourserver# cat path_to_public_key_with_default_name >> authorized_keys2

Check that the public key has been inserted on the same line with a space as separator that what you added previously to the file.

For the other public key (the one with the non default name, just copy it on a new line :

yourlogin@yourserver# cat path_to_public_key_2 >> authorized_keys2

5) Errors when connecting with command ssh

Now that you configured the server to attribute author name to one person using svn, if you try to connect to the server over normal ssh connection, you will encounter problems.

PTY allocation request failed on channel 0
( success ( 1 2 ( ANONYMOUS EXTERNAL ) ( edit-pipeline svndiff1 absent-entries ) ) ) Connection to yourserver closed.
  • If you did not make rsa key : To avoid this error, just launch ssh command with -i with an other identifying file path or nothing. ssh -i . yourlogin@yourserver The password will be asked.

  • If you made a rsa key : ssh -i path_to_private_key_2 yourlogin@yourserver The password won’t be asked.

6) Multi-user

To auto-attribute author name for other people, repeat this operation. Only one author name can be attributed for the same public key.

7) Multiple repositories

You can manage repositories for multiple projects on the same shared host. We ourselves manage 2 multi-users projects on the same shared host.

8) Test

svn checkout svn+ssh://yourlogin@yourserver/repository_folder

(You must not mention here the full path (home_path/root_path), because it is taken from the command parameters in the authorized_keys file.)

9) Other information resources

in french : http://doc.fedora-fr.org/wiki/SSH:Authentification_par_cl%C3%A9 in english : http://www.debuntu.org/ssh-key-based-authentication

Permalink | Leave a comment  »

About us

Abonnez vous à notre mailing-list

Nous suivre


    Contact

    Karim Cassam Chenaï

    ka@weedo.fr

    tél : +33 6 99 04 89 12


    Siège : 23 rue du Mail, 75002 Paris

    Bureaux : 111 rue Marceau, 93100 Montreuil

    Siren : 488039843

    Answers

    Ask a question

    Profile

    Software developer and entrepreneur
    Computer Software | Paris Area, France, FR

    Experience

    • Mar 2008 - Present
      CEO / weedo

    Education

    • 1994 - 1997
      ESCP Europe
    • 1992 - 1994
    abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz