Sur un fond bleu clair, un texte noir indique "< ? PHP ?", avec une icône d'éléphant géométrique bleue remplaçant le deuxième "P". Il s'agit d'un clin d'œil au langage de programmation PHP, souvent rencontré dans les problèmes d'erreur preg_match ou de plage invalide dans la classe de caractères.

PHP : résoudre l’erreur “Creating default object from empty value”

Suite à une mise à jour de PHP, le fichier d’erreurs de mon site a commencé à afficher le message suivant :

PHP Warning: Creating default object from empty value in /wp-content/themes/skyminds/functions.php on line 1213

La ligne en question ressemblait à ceci :

$posts[0]->comment_status = 'closed';Code language: PHP (php)

À première vue, cette ligne semble anodine. Pourtant, elle suppose plusieurs choses : que $posts existe, que $posts est un tableau, que l’index 0 existe, et que $posts[0] est bien un objet.

Si l’une de ces conditions n’est pas vraie, PHP tente parfois de créer un objet par défaut à partir d’une valeur vide. C’est ce qui déclenche l’avertissement Creating default object from empty value.

Pourquoi cette erreur apparaît

Le problème vient généralement d’une assignation de propriété sur une variable qui n’est pas un objet valide.

Exemple simple :

$post = null;
$post->comment_status = 'closed';Code language: PHP (php)

Ou encore :

$posts = array();
$posts[0]->comment_status = 'closed';Code language: PHP (php)

Dans le second cas, $posts existe bien, mais $posts[0] n’existe pas. PHP ne peut donc pas modifier la propriété comment_status d’un objet absent.

La bonne correction dépend donc du type de donnée que vous manipulez : tableau, objet générique stdClass, instance de classe, ou objet WordPress comme WP_Post.

Correction rapide : vérifier que l’objet existe

La correction la plus prudente consiste à tester l’existence du premier élément avant de modifier sa propriété :

if ( isset( $posts[0] ) && is_object( $posts[0] ) ) {
    $posts[0]->comment_status = 'closed';
}Code language: PHP (php)

Cette version évite l’avertissement, car elle ne modifie comment_status que si $posts[0] existe et contient bien un objet.

Dans un thème WordPress, si l’on s’attend à recevoir un objet WP_Post, on peut être plus strict :

if ( isset( $posts[0] ) && $posts[0] instanceof WP_Post ) {
    $posts[0]->comment_status = 'closed';
}Code language: PHP (php)

C’est généralement préférable, car on vérifie le type exact attendu. WordPress documente WP_Post comme la classe utilisée pour représenter les objets d’articles retournés par des fonctions comme get_post().

Lire la suite

Postfix : résoudre l'avertissement "Untrusted TLS connection established" photo

Postfix : corriger “Untrusted TLS connection established”

Si vous possédez votre propre serveur email avec Postfix, vous pouvez parfois voir passer cet avertissement dans les logs lorsque Postfix établit une connexion TLS vers un serveur distant :

postfix/smtp[13461]: Untrusted TLS connection established to gmail-smtp-in.l.google.com[64.233.166.27]:25: TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)Code language: JavaScript (javascript)

À première vue, le message peut inquiéter. Pourtant, il ne signifie pas forcément que la connexion n’est pas chiffrée. Il signifie plutôt que Postfix a bien établi une connexion TLS, mais qu’il ne considère pas le certificat du serveur distant comme vérifié ou digne de confiance.

En clair : la session est chiffrée, mais la chaîne de confiance du certificat n’a pas été validée comme Postfix l’attendait.

Comprendre le message “Untrusted TLS connection established”

Le log contient deux informations importantes :

  • TLS connection established : la connexion TLS a bien été établie ;
  • Untrusted : Postfix n’a pas pu valider la confiance du certificat présenté.

Donc le problème ne vient pas forcément du chiffrement lui-même. Il vient souvent de la vérification du certificat : bundle CA absent, chemin CA non déclaré, certificats racines non installés, certificat distant incomplet, ou niveau de sécurité TLS qui ne force pas la validation.

Postfix distingue la configuration TLS côté client SMTP, utilisée quand votre serveur envoie un mail vers un autre serveur, et la configuration TLS côté serveur SMTPD, utilisée quand un autre serveur ou client se connecte au vôtre. Dans les noms de paramètres, smtp_ concerne le client sortant, tandis que smtpd_ concerne le serveur entrant. La documentation TLS de Postfix sépare d’ailleurs clairement les deux rôles.

Vérifier les certificats racines du système

Sur Debian ou Ubuntu, commencez par vérifier que le paquet ca-certificates est installé. C’est lui qui fournit les certificats racines utilisés pour valider les chaînes TLS.

sudo apt update
sudo apt install ca-certificates
sudo update-ca-certificates

Ensuite, vérifiez que le répertoire des certificats existe :

ls -ld /etc/ssl/certs
ls -l /etc/ssl/certs/ca-certificates.crt

Sur Debian et Ubuntu, les deux chemins les plus fréquents sont :

/etc/ssl/certs
/etc/ssl/certs/ca-certificates.crt

Le premier est un répertoire de certificats hachés. Le second est un fichier bundle contenant les certificats racines.

Lire la suite

Un cercle vert lumineux avec le logo blanc de Linux Mint est centré sur un arrière-plan en dégradé de sombre à clair, mettant en évidence l'édition Debian. Derrière le cercle, un logo plus grand et semi-transparent s'estompe dans l'arrière-plan avec un éclairage vert vibrant.

Installer wine sous Linux Mint Debian Edition

J’ai réinstallé Linux Mint Debian Edition, aussi appelée LMDE, sur mon portable, et j’en suis toujours aussi satisfait. On retrouve le confort de Linux Mint, mais avec une base Debian directe, sans couche Ubuntu.

Depuis les premières versions de LMDE, beaucoup de choses ont changé. À l’époque, il fallait parfois ajouter un dépôt tiers pour installer Wine. Aujourd’hui, ce n’est plus une bonne idée : on privilégie les dépôts officiels Debian/Linux Mint, ou le dépôt officiel WineHQ si l’on veut une version plus récente.

Dans cet article, nous allons installer Wine proprement sur Linux Mint Debian Edition 7 “Gigi”, basée sur Debian 13 “Trixie”. LMDE 7 est la version actuelle de Linux Mint Debian Edition et utilise la base Debian plutôt qu’Ubuntu. Page officielle de téléchargement de LMDE 7

À quoi sert Wine ?

Wine permet d’exécuter certaines applications Windows sous Linux, macOS ou d’autres systèmes compatibles POSIX. Wine n’est pas un émulateur au sens classique : il traduit les appels de l’API Windows vers des appels système compatibles avec l’environnement hôte. WineHQ le définit justement comme une couche de compatibilité, et non comme une machine virtuelle. WineHQ : présentation de Wine

En pratique, Wine peut servir à lancer un ancien logiciel Windows, un utilitaire métier, un petit programme portable, un installeur, ou certains jeux. Tout ne fonctionne pas parfaitement, mais c’est souvent très utile.

Pour les jeux, on utilisera parfois plutôt Steam Proton, Lutris ou Bottles. Pour un logiciel Windows précis, Wine reste une excellente base.

Méthode recommandée : installer Wine depuis les dépôts LMDE/Debian

La méthode la plus simple et la plus stable consiste à utiliser les paquets fournis par la distribution.

On commence par mettre à jour les dépôts :

sudo apt update

Ensuite, on installe Wine :

sudo apt install wine

Sur une machine 64 bits, beaucoup d’applications Windows restent en 32 bits, ou utilisent encore des composants 32 bits. Il est donc conseillé d’activer l’architecture i386 avant d’installer Wine. Le wiki Debian indique justement qu’une installation Wine complète sur une architecture 64 bits nécessite l’ajout de l’architecture étrangère i386. Debian Wiki : Wine

sudo dpkg --add-architecture i386
sudo apt update
sudo apt install wine wine32 wine64

Cette méthode suffit dans la plupart des cas. Elle a l’avantage d’être simple, cohérente avec le système, et maintenue via les mises à jour classiques de LMDE/Debian.

Lire la suite