simplification de l'authentification à Misskey
This commit is contained in:
parent
e6cee6d426
commit
8fdef7ee2f
@ -24,6 +24,12 @@ RewriteEngine On
|
||||
Deny from all
|
||||
</FilesMatch>
|
||||
|
||||
# Désactiver l'accès aux anciens fichiers d'authentification (qui n'existent plus)
|
||||
<FilesMatch "^(oauth\.php|callback\.php)$">
|
||||
Order Allow,Deny
|
||||
Deny from all
|
||||
</FilesMatch>
|
||||
|
||||
# Désactiver l'affichage du contenu des répertoires
|
||||
Options -Indexes
|
||||
|
||||
|
95
callback.php
95
callback.php
@ -1,95 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* FavMasToKey - Callback OAuth pour Misskey
|
||||
*/
|
||||
|
||||
// Définir la constante pour inclure les fichiers
|
||||
define('FAVMASTOKEY', true);
|
||||
|
||||
// Inclure les fichiers requis
|
||||
require_once 'includes/config.php';
|
||||
require_once 'includes/functions.php';
|
||||
|
||||
// Vérifier si l'état est valide (protection CSRF)
|
||||
if (!isset($_GET['state']) || !isset($_SESSION['oauth_state']) || $_GET['state'] !== $_SESSION['oauth_state']) {
|
||||
$_SESSION['messages'][] = [
|
||||
'type' => 'danger',
|
||||
'text' => 'Paramètre d\'état invalide. Veuillez réessayer.'
|
||||
];
|
||||
header('Location: index.php');
|
||||
exit;
|
||||
}
|
||||
|
||||
// Vérifier si le code d'autorisation est présent
|
||||
if (!isset($_GET['code']) || empty($_GET['code'])) {
|
||||
$_SESSION['messages'][] = [
|
||||
'type' => 'danger',
|
||||
'text' => 'Aucun code d\'autorisation reçu. L\'authentification a échoué ou a été annulée.'
|
||||
];
|
||||
header('Location: index.php');
|
||||
exit;
|
||||
}
|
||||
|
||||
// Récupérer l'instance Misskey depuis la session
|
||||
if (!isset($_SESSION['misskey_instance']) || empty($_SESSION['misskey_instance'])) {
|
||||
$_SESSION['messages'][] = [
|
||||
'type' => 'danger',
|
||||
'text' => 'Instance Misskey non définie. Veuillez recommencer.'
|
||||
];
|
||||
header('Location: index.php');
|
||||
exit;
|
||||
}
|
||||
|
||||
// Récupérer le client_secret depuis la session
|
||||
if (!isset($_SESSION['misskey_client_secret']) || empty($_SESSION['misskey_client_secret'])) {
|
||||
$_SESSION['messages'][] = [
|
||||
'type' => 'danger',
|
||||
'text' => 'Informations d\'application manquantes. Veuillez recommencer.'
|
||||
];
|
||||
header('Location: index.php');
|
||||
exit;
|
||||
}
|
||||
|
||||
$instance = $_SESSION['misskey_instance'];
|
||||
$code = $_GET['code'];
|
||||
$client_secret = $_SESSION['misskey_client_secret'];
|
||||
|
||||
// Récupérer le client_id depuis les données d'application
|
||||
if (!isset($app_data['instances'][$instance]) || !isset($app_data['instances'][$instance]['client_id'])) {
|
||||
$_SESSION['messages'][] = [
|
||||
'type' => 'danger',
|
||||
'text' => 'Informations d\'application introuvables pour ' . $instance . '. Veuillez recommencer.'
|
||||
];
|
||||
header('Location: index.php');
|
||||
exit;
|
||||
}
|
||||
|
||||
$client_id = $app_data['instances'][$instance]['client_id'];
|
||||
|
||||
// Échanger le code contre un token d'accès
|
||||
$exchange_result = exchange_oauth_code($instance, $code, $client_id, $client_secret);
|
||||
|
||||
if (!$exchange_result['success']) {
|
||||
$_SESSION['messages'][] = [
|
||||
'type' => 'danger',
|
||||
'text' => 'Erreur lors de l\'échange du code d\'autorisation: ' . $exchange_result['message']
|
||||
];
|
||||
header('Location: index.php');
|
||||
exit;
|
||||
}
|
||||
|
||||
// Stocker le token dans la session
|
||||
$_SESSION['misskey_token'] = $exchange_result['access_token'];
|
||||
|
||||
// Nettoyer les données temporaires de la session
|
||||
unset($_SESSION['oauth_state']);
|
||||
unset($_SESSION['misskey_client_secret']);
|
||||
|
||||
// Ajouter un message de succès
|
||||
$_SESSION['messages'][] = [
|
||||
'type' => 'success',
|
||||
'text' => 'Connecté avec succès à ' . $instance . '.'
|
||||
];
|
||||
|
||||
// Rediriger vers la page de migration (étape 3)
|
||||
header('Location: index.php#step3');
|
15
deploy.sh
15
deploy.sh
@ -1,15 +0,0 @@
|
||||
#!/bin/bash
|
||||
# Script de déploiement simplifié pour FavMasToKey
|
||||
|
||||
# Créer les répertoires nécessaires
|
||||
mkdir -p includes css js images
|
||||
|
||||
# Définir les permissions
|
||||
chmod 755 ./ ./includes ./css ./js ./images
|
||||
chmod 644 ./*.php ./css/*.css ./js/*.js ./.htaccess
|
||||
|
||||
# Créer app_data.php
|
||||
touch includes/app_data.php
|
||||
chmod 666 includes/app_data.php
|
||||
|
||||
echo "Déploiement terminé avec succès!"
|
305
diagnostic.php
Normal file
305
diagnostic.php
Normal file
@ -0,0 +1,305 @@
|
||||
<?php
|
||||
/**
|
||||
* FavMasToKey - Page de diagnostic
|
||||
*/
|
||||
|
||||
// Définir la constante pour inclure les fichiers
|
||||
define('FAVMASTOKEY', true);
|
||||
|
||||
// Inclure les fichiers requis
|
||||
require_once 'includes/config.php';
|
||||
require_once 'includes/functions.php';
|
||||
|
||||
// Fonction pour tester si une URL est accessible
|
||||
function test_url($url) {
|
||||
$ch = curl_init($url);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_NOBODY, true);
|
||||
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
|
||||
curl_exec($ch);
|
||||
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
return $http_code;
|
||||
}
|
||||
|
||||
// Déterminer les URLs importantes
|
||||
$current_url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
|
||||
$root_url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']);
|
||||
|
||||
// Tester l'API Misskey si un token est disponible
|
||||
$misskey_api_status = 'Non testé';
|
||||
$misskey_api_details = '';
|
||||
if (isset($_SESSION['misskey_token']) && isset($_SESSION['misskey_instance'])) {
|
||||
$token_test = validate_misskey_token($_SESSION['misskey_instance'], $_SESSION['misskey_token']);
|
||||
if ($token_test['success']) {
|
||||
$misskey_api_status = 'OK';
|
||||
$misskey_api_details = 'Token valide, API accessible';
|
||||
} else {
|
||||
$misskey_api_status = 'Erreur';
|
||||
$misskey_api_details = isset($token_test['message']) ? $token_test['message'] : 'Erreur inconnue';
|
||||
}
|
||||
}
|
||||
|
||||
// Test de connexion à l'API process.php
|
||||
$process_url = $root_url . '/process.php';
|
||||
$process_status = test_url($process_url);
|
||||
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr" data-bs-theme="dark">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="theme-color" content="#7e57c2">
|
||||
<link rel="icon" href="images/favicon.svg" type="image/svg+xml">
|
||||
<title>Diagnostic - FavMasToKey</title>
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="css/styles.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="container py-5">
|
||||
<header class="text-center mb-4">
|
||||
<h1>FavMasToKey - Diagnostic</h1>
|
||||
<p class="lead">Informations de débogage pour l'application</p>
|
||||
<p><a href="index.php" class="btn btn-primary">Retour à l'application</a></p>
|
||||
</header>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h2 class="card-title h5 mb-0">Configuration actuelle</h2>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<dl class="row">
|
||||
<dt class="col-sm-3">Environnement</dt>
|
||||
<dd class="col-sm-9"><?php echo ENVIRONMENT; ?></dd>
|
||||
|
||||
<dt class="col-sm-3">URL de l'application (config)</dt>
|
||||
<dd class="col-sm-9"><?php echo $config['app_url']; ?></dd>
|
||||
|
||||
<dt class="col-sm-3">URL courante</dt>
|
||||
<dd class="col-sm-9"><?php echo $current_url; ?></dd>
|
||||
|
||||
<dt class="col-sm-3">Test de l'API process.php</dt>
|
||||
<dd class="col-sm-9">
|
||||
<?php
|
||||
if ($process_status >= 200 && $process_status < 400) {
|
||||
echo '<span class="badge bg-success">OK (' . $process_status . ')</span>';
|
||||
} else {
|
||||
echo '<span class="badge bg-danger">Échec (' . $process_status . ')</span> - L\'API process.php n\'est pas accessible';
|
||||
}
|
||||
?>
|
||||
</dd>
|
||||
|
||||
<dt class="col-sm-3">Version de l'application</dt>
|
||||
<dd class="col-sm-9"><?php echo $config['app_version']; ?></dd>
|
||||
|
||||
<dt class="col-sm-3">Instance Misskey connectée</dt>
|
||||
<dd class="col-sm-9">
|
||||
<?php
|
||||
if (isset($_SESSION['misskey_instance'])) {
|
||||
echo htmlspecialchars($_SESSION['misskey_instance']);
|
||||
} else {
|
||||
echo '<span class="text-muted">Non connecté</span>';
|
||||
}
|
||||
?>
|
||||
</dd>
|
||||
|
||||
<dt class="col-sm-3">Statut de l'API Misskey</dt>
|
||||
<dd class="col-sm-9">
|
||||
<?php
|
||||
if ($misskey_api_status === 'OK') {
|
||||
echo '<span class="badge bg-success">OK</span> ' . htmlspecialchars($misskey_api_details);
|
||||
} elseif ($misskey_api_status === 'Erreur') {
|
||||
echo '<span class="badge bg-danger">Erreur</span> ' . htmlspecialchars($misskey_api_details);
|
||||
} else {
|
||||
echo '<span class="badge bg-secondary">Non testé</span> (Aucun jeton disponible)';
|
||||
}
|
||||
?>
|
||||
</dd>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h2 class="card-title h5 mb-0">État de la session</h2>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<dl class="row">
|
||||
<dt class="col-sm-3">ID de session</dt>
|
||||
<dd class="col-sm-9"><?php echo session_id(); ?></dd>
|
||||
|
||||
<dt class="col-sm-3">Token stocké</dt>
|
||||
<dd class="col-sm-9">
|
||||
<?php
|
||||
if (isset($_SESSION['misskey_token'])) {
|
||||
$token = $_SESSION['misskey_token'];
|
||||
$masked_token = substr($token, 0, 4) . '...' . substr($token, -4);
|
||||
echo '<code>' . htmlspecialchars($masked_token) . '</code>';
|
||||
} else {
|
||||
echo '<span class="text-muted">Non défini</span>';
|
||||
}
|
||||
?>
|
||||
</dd>
|
||||
|
||||
<dt class="col-sm-3">Instance Misskey</dt>
|
||||
<dd class="col-sm-9">
|
||||
<?php
|
||||
if (isset($_SESSION['misskey_instance'])) {
|
||||
echo htmlspecialchars($_SESSION['misskey_instance']);
|
||||
} else {
|
||||
echo '<span class="text-muted">Non défini</span>';
|
||||
}
|
||||
?>
|
||||
</dd>
|
||||
|
||||
<dt class="col-sm-3">Données de localStorage</dt>
|
||||
<dd class="col-sm-9">
|
||||
<div id="local-storage-info">
|
||||
<span class="text-muted">Chargement...</span>
|
||||
</div>
|
||||
</dd>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h2 class="card-title h5 mb-0">Actions</h2>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form method="post" class="mb-3">
|
||||
<button type="submit" name="reset_session" class="btn btn-warning">Réinitialiser la session</button>
|
||||
<button type="button" id="clear-localstorage" class="btn btn-danger">Effacer les données localStorage</button>
|
||||
<?php if (ENVIRONMENT === 'development'): ?>
|
||||
<button type="submit" name="test_connection" class="btn btn-info">Tester la connexion à l'API Misskey</button>
|
||||
<?php endif; ?>
|
||||
</form>
|
||||
|
||||
<?php
|
||||
// Traitement des actions
|
||||
if (isset($_POST['reset_session'])) {
|
||||
// Conserver l'ID de session pour les messages
|
||||
$old_session_id = session_id();
|
||||
|
||||
// Détruire la session et en démarrer une nouvelle
|
||||
session_destroy();
|
||||
session_start();
|
||||
|
||||
echo '<div class="alert alert-success">Session réinitialisée. Ancien ID: ' . $old_session_id . ', Nouvel ID: ' . session_id() . '</div>';
|
||||
}
|
||||
|
||||
if (isset($_POST['test_connection']) && ENVIRONMENT === 'development') {
|
||||
if (isset($_SESSION['misskey_token']) && isset($_SESSION['misskey_instance'])) {
|
||||
$test_result = validate_misskey_token($_SESSION['misskey_instance'], $_SESSION['misskey_token']);
|
||||
|
||||
if ($test_result['success']) {
|
||||
echo '<div class="alert alert-success">Connexion à l\'API Misskey réussie!</div>';
|
||||
|
||||
if (ENVIRONMENT === 'development' && isset($test_result['data'])) {
|
||||
echo '<pre class="bg-dark text-light p-3">';
|
||||
print_r($test_result['data']);
|
||||
echo '</pre>';
|
||||
}
|
||||
|
||||
} else {
|
||||
echo '<div class="alert alert-danger">Échec de la connexion à l\'API Misskey: ' . htmlspecialchars($test_result['message']) . '</div>';
|
||||
}
|
||||
} else {
|
||||
echo '<div class="alert alert-warning">Aucun token ou instance disponible dans la session.</div>';
|
||||
}
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h2 class="card-title h5 mb-0">Instructions pour résoudre les problèmes</h2>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<h5>Problème de connexion avec le jeton</h5>
|
||||
<p>Si vous obtenez une erreur lors de la connexion avec votre jeton Misskey :</p>
|
||||
|
||||
<ol>
|
||||
<li>Vérifiez que vous avez copié correctement le jeton d'accès complet, sans espaces supplémentaires.</li>
|
||||
<li>Assurez-vous que vous avez accordé la permission <code>i/favorites/create</code> lors de la création du jeton.</li>
|
||||
<li>Essayez de générer un nouveau jeton d'accès depuis votre instance Misskey.</li>
|
||||
<li>Vérifiez que votre instance Misskey est accessible et fonctionne correctement.</li>
|
||||
</ol>
|
||||
|
||||
<h5>Problème avec localStorage</h5>
|
||||
<p>Si l'application ne se souvient pas de votre progression :</p>
|
||||
|
||||
<ol>
|
||||
<li>Assurez-vous que JavaScript est activé dans votre navigateur.</li>
|
||||
<li>Vérifiez que votre navigateur autorise l'utilisation de localStorage pour ce site.</li>
|
||||
<li>Essayez d'effacer les données localStorage en utilisant le bouton ci-dessus, puis recommencez le processus.</li>
|
||||
</ol>
|
||||
|
||||
<h5>Problème de traitement des favoris</h5>
|
||||
<p>Si certains favoris ne peuvent pas être ajoutés :</p>
|
||||
|
||||
<ol>
|
||||
<li>Vérifiez que votre instance Misskey peut se fédérer avec les instances des publications originales.</li>
|
||||
<li>Certaines publications peuvent avoir été supprimées ou rendues privées, ce qui les rend inaccessibles.</li>
|
||||
<li>Votre instance peut avoir des limitations de taux (rate limiting). Dans ce cas, essayez de réduire la vitesse de traitement en modifiant le délai entre les requêtes dans le fichier de configuration.</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
||||
<script>
|
||||
// Afficher les informations de localStorage
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const localStorageInfo = document.getElementById('local-storage-info');
|
||||
const clearLocalStorageBtn = document.getElementById('clear-localstorage');
|
||||
|
||||
function updateLocalStorageInfo() {
|
||||
let html = '<ul class="list-unstyled mb-0">';
|
||||
|
||||
if (localStorage.getItem('favmastokey_favorites')) {
|
||||
const favorites = JSON.parse(localStorage.getItem('favmastokey_favorites'));
|
||||
html += '<li><strong>Favoris stockés:</strong> ' + favorites.length + ' URLs</li>';
|
||||
} else {
|
||||
html += '<li><strong>Favoris stockés:</strong> <span class="text-muted">Aucun</span></li>';
|
||||
}
|
||||
|
||||
if (localStorage.getItem('favmastokey_migration')) {
|
||||
const migration = JSON.parse(localStorage.getItem('favmastokey_migration'));
|
||||
html += '<li><strong>État de la migration:</strong> ' + migration.status + '</li>';
|
||||
html += '<li><strong>Progression:</strong> ' + migration.progress.current + '/' + migration.progress.total + ' (' + migration.progress.percentage.toFixed(1) + '%)</li>';
|
||||
|
||||
if (migration.lastUpdateTime) {
|
||||
const date = new Date(migration.lastUpdateTime);
|
||||
html += '<li><strong>Dernière mise à jour:</strong> ' + date.toLocaleString() + '</li>';
|
||||
}
|
||||
} else {
|
||||
html += '<li><strong>État de la migration:</strong> <span class="text-muted">Aucune migration en cours</span></li>';
|
||||
}
|
||||
|
||||
html += '</ul>';
|
||||
localStorageInfo.innerHTML = html;
|
||||
}
|
||||
|
||||
// Mettre à jour au chargement
|
||||
updateLocalStorageInfo();
|
||||
|
||||
// Gérer le bouton d'effacement
|
||||
clearLocalStorageBtn.addEventListener('click', function() {
|
||||
if (confirm('Êtes-vous sûr de vouloir effacer toutes les données de migration stockées localement ?')) {
|
||||
localStorage.removeItem('favmastokey_favorites');
|
||||
localStorage.removeItem('favmastokey_migration');
|
||||
updateLocalStorageInfo();
|
||||
alert('Données localStorage effacées avec succès.');
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
29
doc.php
29
doc.php
@ -63,9 +63,18 @@ require_once 'includes/config.php';
|
||||
<h4>2.2 Connexion à votre compte Misskey</h4>
|
||||
<ol>
|
||||
<li>Entrez l'URL de votre instance Misskey (ex: misskey.io)</li>
|
||||
<li>Cliquez sur "Se connecter à Misskey"</li>
|
||||
<li>Vous serez redirigé vers votre instance Misskey pour autoriser l'application</li>
|
||||
<li>Suivez les instructions à l'écran pour autoriser FavMasToKey</li>
|
||||
<li>Générez un jeton d'accès depuis les paramètres de votre compte Misskey:
|
||||
<ol type="a">
|
||||
<li>Connectez-vous à votre compte Misskey</li>
|
||||
<li>Allez dans <strong>Paramètres</strong> > <strong>API</strong></li>
|
||||
<li>Cliquez sur <strong>Générer un nouveau jeton d'accès</strong></li>
|
||||
<li>Donnez un nom à votre jeton (ex: "FavMasToKey")</li>
|
||||
<li>Sélectionnez uniquement la permission <strong>i/favorites/create</strong> (pour ajouter aux favoris)</li>
|
||||
<li>Cliquez sur <strong>Générer</strong> et copiez le jeton</li>
|
||||
</ol>
|
||||
</li>
|
||||
<li>Collez le jeton d'accès dans le champ correspondant</li>
|
||||
<li>Cliquez sur "Se connecter à Misskey" pour continuer</li>
|
||||
</ol>
|
||||
|
||||
<h4>2.3 Migration des favoris</h4>
|
||||
@ -90,17 +99,19 @@ require_once 'includes/config.php';
|
||||
<p>Solution : Malheureusement, il n'y a pas de solution simple pour ce problème, car il s'agit d'une limitation du réseau fédéré. Vous pouvez essayer de visiter manuellement les URLs qui ont échoué.</p>
|
||||
|
||||
<h4>3.2 Erreurs d'authentification</h4>
|
||||
<p>Si vous rencontrez des problèmes lors de l'authentification avec Misskey :</p>
|
||||
<p>Si vous rencontrez des problèmes avec votre jeton d'accès :</p>
|
||||
<ul>
|
||||
<li>Vérifiez que vous êtes bien connecté à votre compte Misskey</li>
|
||||
<li>Assurez-vous que vous autorisez les cookies tiers dans votre navigateur</li>
|
||||
<li>Essayez de vous déconnecter puis de vous reconnecter à votre compte Misskey</li>
|
||||
<li>Vérifiez que vous avez copié le jeton entier et sans espaces supplémentaires</li>
|
||||
<li>Assurez-vous d'avoir sélectionné les permissions correctes lors de la génération du jeton</li>
|
||||
<li>Essayez de générer un nouveau jeton d'accès</li>
|
||||
<li>Vérifiez que votre instance Misskey est accessible et fonctionne correctement</li>
|
||||
</ul>
|
||||
|
||||
<h4>3.3 Migration interrompue</h4>
|
||||
<p>Si votre migration est interrompue (par exemple, en fermant l'onglet ou en perdant la connexion Internet), FavMasToKey peut la reprendre :</p>
|
||||
<ul>
|
||||
<li>Retournez simplement sur la page de FavMasToKey</li>
|
||||
<li>Authentifiez-vous à nouveau si nécessaire</li>
|
||||
<li>L'application détectera automatiquement la migration en cours</li>
|
||||
<li>Confirmez que vous souhaitez reprendre là où vous vous êtes arrêté</li>
|
||||
</ul>
|
||||
@ -116,7 +127,7 @@ require_once 'includes/config.php';
|
||||
<p>FavMasToKey fonctionne en suivant ces étapes :</p>
|
||||
<ol>
|
||||
<li><strong>Analyse du fichier JSON</strong> - L'application extrait les URLs des favoris depuis votre fichier Mastodon</li>
|
||||
<li><strong>Authentification OAuth</strong> - L'application s'enregistre auprès de votre instance Misskey et obtient votre autorisation</li>
|
||||
<li><strong>Authentification par jeton</strong> - L'application utilise le jeton d'accès que vous avez généré pour s'authentifier auprès de votre instance Misskey</li>
|
||||
<li><strong>Recherche fédérée</strong> - Pour chaque favori, l'application recherche la publication équivalente sur le réseau fédéré</li>
|
||||
<li><strong>Ajout aux favoris</strong> - Si la publication est trouvée, elle est ajoutée à vos favoris Misskey</li>
|
||||
</ol>
|
||||
@ -125,7 +136,7 @@ require_once 'includes/config.php';
|
||||
<p>FavMasToKey a été conçu en mettant l'accent sur la confidentialité et la sécurité :</p>
|
||||
<ul>
|
||||
<li>Aucune donnée n'est stockée sur le serveur, tout est traité localement dans votre navigateur</li>
|
||||
<li>Les tokens d'authentification sont temporaires et ne sont stockés que pendant la durée de votre session</li>
|
||||
<li>Les jetons d'accès sont temporaires et ne sont stockés que pendant la durée de votre session</li>
|
||||
<li>Le code est open source et peut être audité</li>
|
||||
<li>L'application ne demande que les permissions minimales nécessaires (ajouter aux favoris)</li>
|
||||
</ul>
|
||||
|
@ -15,6 +15,10 @@ define('ENVIRONMENT', 'development');
|
||||
if (ENVIRONMENT === 'development') {
|
||||
error_reporting(E_ALL);
|
||||
ini_set('display_errors', 1);
|
||||
|
||||
// Activer la journalisation pour le débogage
|
||||
ini_set('log_errors', 1);
|
||||
ini_set('error_log', __DIR__ . '/../debug.log');
|
||||
} else {
|
||||
error_reporting(0);
|
||||
ini_set('display_errors', 0);
|
||||
@ -25,10 +29,10 @@ $config = [
|
||||
// Informations de l'application
|
||||
'app_name' => 'FavMasToKey',
|
||||
'app_description' => 'Outil de transfert des favoris de Mastodon vers Misskey',
|
||||
'app_version' => '0.2.0',
|
||||
'app_version' => '0.3.0', // Mise à jour de la version pour la nouvelle méthode d'authentification
|
||||
|
||||
// URLs de base
|
||||
'app_url' => (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']),
|
||||
// URL de base - Utilisée pour les liens dans l'application
|
||||
'app_url' => 'https://concepts.esenjin.xyz/favmastokey', // Remplacez par l'URL exacte de votre application
|
||||
|
||||
// Paramètres Misskey API
|
||||
'misskey_api_endpoint' => '/api/notes/favorites/create',
|
||||
@ -40,7 +44,7 @@ $config = [
|
||||
'delay_between_requests' => 500 // Délai entre les requêtes en millisecondes (pour éviter le rate limiting)
|
||||
];
|
||||
|
||||
// Fichier de stockage des informations d'application par instance
|
||||
// Fichier de stockage des données d'application - Plus utilisé pour OAuth mais conservé pour compatibilité
|
||||
$app_data_file = __DIR__ . '/app_data.php';
|
||||
|
||||
// Charger ou créer le fichier de données d'application
|
||||
@ -70,11 +74,33 @@ function save_app_data() {
|
||||
// Session
|
||||
session_start();
|
||||
|
||||
// Fonctions utilitaires
|
||||
function debug($data) {
|
||||
if (ENVIRONMENT === 'production') {
|
||||
echo '<pre>';
|
||||
print_r($data);
|
||||
echo '</pre>';
|
||||
/**
|
||||
* Affiche ou journalise des informations de débogage
|
||||
*
|
||||
* @param mixed $data Les données à déboguer
|
||||
* @param string $title Titre optionnel pour faciliter l'identification des logs
|
||||
* @param bool $log_to_file Journaliser dans un fichier plutôt que d'afficher
|
||||
*/
|
||||
function debug($data, $title = '', $log_to_file = false) {
|
||||
if (ENVIRONMENT === 'development') {
|
||||
$output = '';
|
||||
|
||||
if (!empty($title)) {
|
||||
$output .= "=== {$title} ===\n";
|
||||
}
|
||||
|
||||
if (is_array($data) || is_object($data)) {
|
||||
$output .= print_r($data, true);
|
||||
} else {
|
||||
$output .= $data;
|
||||
}
|
||||
|
||||
if ($log_to_file) {
|
||||
error_log($output);
|
||||
} else {
|
||||
echo '<pre style="background:#111; color:#eee; padding:10px; border-radius:5px; overflow:auto; max-height:500px;">';
|
||||
echo htmlspecialchars($output);
|
||||
echo '</pre>';
|
||||
}
|
||||
}
|
||||
}
|
@ -167,162 +167,20 @@ function misskey_api_request($instance, $endpoint, $data, $token) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Enregistre une application sur l'instance Misskey
|
||||
* Valide un jeton d'accès Misskey en effectuant une requête test
|
||||
*
|
||||
* @param string $instance Instance Misskey
|
||||
* @return array Résultat de l'opération contenant client_id et client_secret
|
||||
* @param string $token Jeton d'accès à valider
|
||||
* @return array Résultat de la validation
|
||||
*/
|
||||
function register_misskey_app($instance) {
|
||||
global $config;
|
||||
function validate_misskey_token($instance, $token) {
|
||||
// Endpoint pour vérifier si le token est valide (me/i est un bon endpoint de test)
|
||||
$endpoint = '/api/i';
|
||||
|
||||
// URL de l'API pour créer une application
|
||||
$url = "https://{$instance}/api/app/create";
|
||||
// Effectuer la requête
|
||||
$result = misskey_api_request($instance, $endpoint, [], $token);
|
||||
|
||||
// Construire l'URL de callback
|
||||
$callback_url = $config['app_url'] . '/callback.php';
|
||||
|
||||
// Données pour la création d'application
|
||||
$data = [
|
||||
'name' => $config['app_name'],
|
||||
'description' => $config['app_description'],
|
||||
'permission' => ['write:favorites'],
|
||||
'callbackUrl' => $callback_url
|
||||
];
|
||||
|
||||
// Initialiser cURL
|
||||
$ch = curl_init();
|
||||
|
||||
// Configurer la requête
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_URL => $url,
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
CURLOPT_POST => true,
|
||||
CURLOPT_POSTFIELDS => json_encode($data),
|
||||
CURLOPT_HTTPHEADER => [
|
||||
'Content-Type: application/json',
|
||||
'User-Agent: FavMasToKey/' . $config['app_version']
|
||||
],
|
||||
CURLOPT_TIMEOUT => $config['timeout'],
|
||||
CURLOPT_SSL_VERIFYPEER => true
|
||||
]);
|
||||
|
||||
// Exécuter la requête
|
||||
$response = curl_exec($ch);
|
||||
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
$error = curl_error($ch);
|
||||
|
||||
// Fermer la session cURL
|
||||
curl_close($ch);
|
||||
|
||||
// Vérifier les erreurs
|
||||
if ($error) {
|
||||
return [
|
||||
'success' => false,
|
||||
'message' => 'Erreur cURL: ' . $error,
|
||||
'http_code' => $http_code
|
||||
];
|
||||
}
|
||||
|
||||
// Décoder la réponse
|
||||
$response_data = json_decode($response, true);
|
||||
|
||||
// Vérifier si la requête a réussi
|
||||
if ($http_code >= 200 && $http_code < 300 && isset($response_data['id'])) {
|
||||
return [
|
||||
'success' => true,
|
||||
'client_id' => $response_data['id'],
|
||||
'client_secret' => $response_data['secret'],
|
||||
'http_code' => $http_code
|
||||
];
|
||||
} else {
|
||||
return [
|
||||
'success' => false,
|
||||
'message' => isset($response_data['error']) ? $response_data['error'] : 'Erreur API Misskey',
|
||||
'http_code' => $http_code,
|
||||
'data' => $response_data
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Échange un code d'autorisation contre un token d'accès
|
||||
*
|
||||
* @param string $instance Instance Misskey
|
||||
* @param string $code Code d'autorisation reçu du serveur OAuth
|
||||
* @param string $client_id ID de l'application
|
||||
* @param string $client_secret Secret de l'application
|
||||
* @return array Résultat de l'opération contenant le token d'accès
|
||||
*/
|
||||
function exchange_oauth_code($instance, $code, $client_id, $client_secret) {
|
||||
global $config;
|
||||
|
||||
// URL pour l'échange du code
|
||||
$url = "https://{$instance}/oauth/token";
|
||||
|
||||
// Construire l'URL de callback (doit correspondre à celle utilisée pour l'autorisation)
|
||||
$callback_url = $config['app_url'] . '/callback.php';
|
||||
|
||||
// Données pour l'échange du code
|
||||
$data = [
|
||||
'client_id' => $client_id,
|
||||
'client_secret' => $client_secret,
|
||||
'grant_type' => 'authorization_code',
|
||||
'code' => $code,
|
||||
'redirect_uri' => $callback_url
|
||||
];
|
||||
|
||||
// Initialiser cURL
|
||||
$ch = curl_init();
|
||||
|
||||
// Configurer la requête
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_URL => $url,
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
CURLOPT_POST => true,
|
||||
CURLOPT_POSTFIELDS => http_build_query($data),
|
||||
CURLOPT_HTTPHEADER => [
|
||||
'Content-Type: application/x-www-form-urlencoded',
|
||||
'User-Agent: FavMasToKey/' . $config['app_version']
|
||||
],
|
||||
CURLOPT_TIMEOUT => $config['timeout'],
|
||||
CURLOPT_SSL_VERIFYPEER => true
|
||||
]);
|
||||
|
||||
// Exécuter la requête
|
||||
$response = curl_exec($ch);
|
||||
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
$error = curl_error($ch);
|
||||
|
||||
// Fermer la session cURL
|
||||
curl_close($ch);
|
||||
|
||||
// Vérifier les erreurs
|
||||
if ($error) {
|
||||
return [
|
||||
'success' => false,
|
||||
'message' => 'Erreur cURL: ' . $error,
|
||||
'http_code' => $http_code
|
||||
];
|
||||
}
|
||||
|
||||
// Décoder la réponse
|
||||
$response_data = json_decode($response, true);
|
||||
|
||||
// Vérifier si la requête a réussi et si un token est présent
|
||||
if ($http_code >= 200 && $http_code < 300 && isset($response_data['access_token'])) {
|
||||
return [
|
||||
'success' => true,
|
||||
'access_token' => $response_data['access_token'],
|
||||
'http_code' => $http_code
|
||||
];
|
||||
} else {
|
||||
return [
|
||||
'success' => false,
|
||||
'message' => isset($response_data['error']) ? $response_data['error'] : 'Erreur lors de l\'échange du code',
|
||||
'http_code' => $http_code,
|
||||
'data' => $response_data
|
||||
];
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -371,37 +229,4 @@ function add_to_favorites($instance, $note_id, $token) {
|
||||
$result = misskey_api_request($instance, $endpoint, $data, $token);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Génère une URL d'autorisation OAuth pour Misskey
|
||||
*
|
||||
* @param string $instance Instance Misskey
|
||||
* @param string $client_id ID de l'application
|
||||
* @return string URL d'autorisation
|
||||
*/
|
||||
function generate_oauth_url($instance, $client_id) {
|
||||
global $config;
|
||||
|
||||
// Générer un état aléatoire pour la sécurité
|
||||
$state = bin2hex(random_bytes(16));
|
||||
$_SESSION['oauth_state'] = $state;
|
||||
$_SESSION['misskey_instance'] = $instance;
|
||||
|
||||
// Construire l'URL de callback
|
||||
$callback_url = $config['app_url'] . '/callback.php';
|
||||
|
||||
// Paramètres de la requête d'autorisation
|
||||
$params = [
|
||||
'client_id' => $client_id,
|
||||
'response_type' => 'code',
|
||||
'redirect_uri' => $callback_url,
|
||||
'scope' => 'write:favorites',
|
||||
'state' => $state
|
||||
];
|
||||
|
||||
// Construire l'URL d'autorisation
|
||||
$auth_url = "https://{$instance}/oauth/authorize?" . http_build_query($params);
|
||||
|
||||
return $auth_url;
|
||||
}
|
114
index.php
114
index.php
@ -14,6 +14,78 @@ require_once 'includes/functions.php';
|
||||
$is_authenticated = isset($_SESSION['misskey_token']) && !empty($_SESSION['misskey_token']);
|
||||
$instance = isset($_SESSION['misskey_instance']) ? $_SESSION['misskey_instance'] : '';
|
||||
|
||||
// Traiter le formulaire de connexion Misskey
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'connect_token') {
|
||||
if (isset($_POST['misskey_instance']) && isset($_POST['misskey_token'])) {
|
||||
$instance = trim($_POST['misskey_instance']);
|
||||
$token = trim($_POST['misskey_token']);
|
||||
|
||||
// Vérifier que l'instance et le token sont valides
|
||||
if (empty($instance) || empty($token)) {
|
||||
$_SESSION['messages'][] = [
|
||||
'type' => 'danger',
|
||||
'text' => 'Veuillez renseigner à la fois l\'instance Misskey et le jeton d\'accès.'
|
||||
];
|
||||
} else {
|
||||
// Valider le format de l'instance
|
||||
$instance = preg_replace('/^https?:\/\//', '', $instance);
|
||||
$instance = rtrim($instance, '/');
|
||||
|
||||
if (!preg_match('/^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/', $instance)) {
|
||||
$_SESSION['messages'][] = [
|
||||
'type' => 'danger',
|
||||
'text' => 'L\'URL de l\'instance Misskey semble invalide.'
|
||||
];
|
||||
} else {
|
||||
// Vérifier la validité du token en effectuant une requête test
|
||||
$validate_result = validate_misskey_token($instance, $token);
|
||||
|
||||
if ($validate_result['success']) {
|
||||
// Stocker le token et l'instance dans la session
|
||||
$_SESSION['misskey_token'] = $token;
|
||||
$_SESSION['misskey_instance'] = $instance;
|
||||
|
||||
$_SESSION['messages'][] = [
|
||||
'type' => 'success',
|
||||
'text' => 'Connecté avec succès à ' . $instance . '.'
|
||||
];
|
||||
|
||||
// Rediriger vers l'étape 3
|
||||
header('Location: index.php#step3');
|
||||
exit;
|
||||
} else {
|
||||
$_SESSION['messages'][] = [
|
||||
'type' => 'danger',
|
||||
'text' => 'Le jeton d\'accès semble invalide ou a expiré.',
|
||||
'details' => isset($validate_result['message']) ? $validate_result['message'] : 'Erreur inconnue'
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$_SESSION['messages'][] = [
|
||||
'type' => 'danger',
|
||||
'text' => 'Données manquantes.'
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
// Traitement de la déconnexion
|
||||
if (isset($_GET['action']) && $_GET['action'] === 'logout') {
|
||||
// Supprimer les informations d'authentification
|
||||
unset($_SESSION['misskey_token']);
|
||||
unset($_SESSION['misskey_instance']);
|
||||
|
||||
$_SESSION['messages'][] = [
|
||||
'type' => 'info',
|
||||
'text' => 'Vous avez été déconnecté.'
|
||||
];
|
||||
|
||||
// Rediriger vers la page d'accueil
|
||||
header('Location: index.php');
|
||||
exit;
|
||||
}
|
||||
|
||||
// Initialiser les messages
|
||||
$messages = [];
|
||||
if (isset($_SESSION['messages'])) {
|
||||
@ -46,6 +118,13 @@ if (isset($_SESSION['messages'])) {
|
||||
<?php foreach ($messages as $message): ?>
|
||||
<div class="alert alert-<?php echo $message['type']; ?> alert-dismissible fade show" role="alert">
|
||||
<?php echo $message['text']; ?>
|
||||
<?php if (isset($message['details']) && ENVIRONMENT === 'development'): ?>
|
||||
<hr>
|
||||
<details>
|
||||
<summary>Détails techniques (mode développement)</summary>
|
||||
<pre class="mt-2 p-2 bg-dark text-light"><?php echo htmlspecialchars($message['details']); ?></pre>
|
||||
</details>
|
||||
<?php endif; ?>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Fermer"></button>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
@ -89,12 +168,36 @@ if (isset($_SESSION['messages'])) {
|
||||
|
||||
<div id="file-summary" class="alert alert-info mb-4"></div>
|
||||
|
||||
<form id="misskey-form" class="mt-4">
|
||||
<div class="card bg-light mb-4">
|
||||
<div class="card-body">
|
||||
<h5>Comment obtenir un jeton d'accès Misskey ?</h5>
|
||||
<ol>
|
||||
<li>Connectez-vous à votre compte Misskey</li>
|
||||
<li>Allez dans <strong>Paramètres</strong> > <strong>API</strong></li>
|
||||
<li>Cliquez sur <strong>Générer un nouveau jeton d'accès</strong></li>
|
||||
<li>Donnez un nom à votre jeton (ex: "FavMasToKey")</li>
|
||||
<li>Sélectionnez uniquement la permission <strong>i/favorites/create</strong> (pour ajouter aux favoris)</li>
|
||||
<li>Cliquez sur <strong>Générer</strong> et copiez le jeton</li>
|
||||
</ol>
|
||||
<div class="alert alert-warning mt-2 mb-0">
|
||||
<strong>Important :</strong> Conservez ce jeton en lieu sûr. FavMasToKey ne stocke pas votre jeton de manière permanente, mais uniquement dans votre session de navigation.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form id="misskey-form" method="post" class="mt-4">
|
||||
<input type="hidden" name="action" value="connect_token">
|
||||
<div class="mb-3">
|
||||
<label for="misskey-instance" class="form-label">Instance Misskey</label>
|
||||
<input type="url" class="form-control" id="misskey-instance" name="misskey_instance"
|
||||
placeholder="https://misskey.io" required>
|
||||
<div class="form-text">Entrez l'URL complète de votre instance Misskey (ex: https://misskey.io)</div>
|
||||
<input type="text" class="form-control" id="misskey-instance" name="misskey_instance"
|
||||
placeholder="misskey.io" required>
|
||||
<div class="form-text">Entrez le nom de domaine de votre instance Misskey (ex: misskey.io)</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="misskey-token" class="form-label">Jeton d'accès</label>
|
||||
<input type="password" class="form-control" id="misskey-token" name="misskey_token"
|
||||
placeholder="Votre jeton d'accès Misskey" required>
|
||||
<div class="form-text">Collez le jeton d'accès généré dans les paramètres de votre compte Misskey</div>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">Se connecter à Misskey</button>
|
||||
<button type="button" class="btn btn-link" id="back-to-step1">Retour</button>
|
||||
@ -110,6 +213,9 @@ if (isset($_SESSION['messages'])) {
|
||||
<div class="alert alert-success mb-4">
|
||||
<strong>Connecté à <?php echo htmlspecialchars($instance); ?></strong>
|
||||
<p class="mb-0">Vous êtes authentifié et prêt à importer vos favoris.</p>
|
||||
<div class="mt-2">
|
||||
<a href="index.php?action=logout" class="btn btn-sm btn-outline-dark">Se déconnecter</a>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
|
40
js/app.js
40
js/app.js
@ -6,7 +6,6 @@
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
// Éléments DOM
|
||||
const uploadForm = document.getElementById('upload-form');
|
||||
const misskeyForm = document.getElementById('misskey-form');
|
||||
const jsonFileInput = document.getElementById('json-file');
|
||||
const step1 = document.getElementById('step1');
|
||||
const step2 = document.getElementById('step2');
|
||||
@ -130,32 +129,25 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
});
|
||||
}
|
||||
|
||||
// Gérer la connexion à Misskey
|
||||
if (misskeyForm) {
|
||||
misskeyForm.addEventListener('submit', function(e) {
|
||||
e.preventDefault();
|
||||
// Vérifier si nous sommes à l'étape 3 (basé sur l'ancre dans l'URL)
|
||||
if (window.location.hash === '#step3' && document.getElementById('step3')) {
|
||||
// Récupérer les favoris du localStorage
|
||||
if (localStorage.getItem('favmastokey_favorites')) {
|
||||
favoritesList = JSON.parse(localStorage.getItem('favmastokey_favorites'));
|
||||
totalItems = favoritesList.length;
|
||||
|
||||
const instanceInput = document.getElementById('misskey-instance');
|
||||
let instance = instanceInput.value.trim();
|
||||
// Montrer l'étape 3
|
||||
step1.classList.add('d-none');
|
||||
step2.classList.add('d-none');
|
||||
step3.classList.remove('d-none');
|
||||
|
||||
// Vérifier que l'instance est valide
|
||||
if (!instance) {
|
||||
alert('Veuillez entrer l\'URL de votre instance Misskey.');
|
||||
return;
|
||||
// Récupérer les données de migration du localStorage
|
||||
if (localStorage.getItem('favmastokey_migration')) {
|
||||
migration = JSON.parse(localStorage.getItem('favmastokey_migration'));
|
||||
currentIndex = migration.progress.current;
|
||||
updateProgress(migration.progress.percentage);
|
||||
}
|
||||
|
||||
// Supprimer le protocole et les slash de fin si présents
|
||||
instance = instance.replace(/^https?:\/\//, '').replace(/\/$/, '');
|
||||
|
||||
// Vérifier que l'URL semble valide
|
||||
if (!/^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(instance)) {
|
||||
alert('L\'URL de l\'instance Misskey semble invalide.');
|
||||
return;
|
||||
}
|
||||
|
||||
// Rediriger vers l'authentification OAuth
|
||||
window.location.href = `oauth.php?instance=${encodeURIComponent(instance)}`;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
97
oauth.php
97
oauth.php
@ -1,97 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* FavMasToKey - Authentification OAuth avec Misskey
|
||||
*/
|
||||
|
||||
// Définir la constante pour inclure les fichiers
|
||||
define('FAVMASTOKEY', true);
|
||||
|
||||
// Inclure les fichiers requis
|
||||
require_once 'includes/config.php';
|
||||
require_once 'includes/functions.php';
|
||||
|
||||
// Vérifier si l'instance est fournie
|
||||
if (!isset($_GET['instance']) || empty($_GET['instance'])) {
|
||||
$_SESSION['messages'][] = [
|
||||
'type' => 'danger',
|
||||
'text' => 'Aucune instance Misskey spécifiée.'
|
||||
];
|
||||
header('Location: index.php');
|
||||
exit;
|
||||
}
|
||||
|
||||
// Récupérer l'instance
|
||||
$instance = trim($_GET['instance']);
|
||||
|
||||
// Supprimer le protocole et les slash de fin si présents
|
||||
$instance = preg_replace('/^https?:\/\//', '', $instance);
|
||||
$instance = rtrim($instance, '/');
|
||||
|
||||
// Vérifier que l'instance semble valide
|
||||
if (!preg_match('/^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/', $instance)) {
|
||||
$_SESSION['messages'][] = [
|
||||
'type' => 'danger',
|
||||
'text' => 'L\'URL de l\'instance Misskey semble invalide.'
|
||||
];
|
||||
header('Location: index.php');
|
||||
exit;
|
||||
}
|
||||
|
||||
// Stocker l'instance dans la session
|
||||
$_SESSION['misskey_instance'] = $instance;
|
||||
|
||||
// Vérifier si cette instance est déjà enregistrée
|
||||
$client_id = null;
|
||||
$client_secret = null;
|
||||
|
||||
if (isset($app_data['instances'][$instance])) {
|
||||
$client_id = $app_data['instances'][$instance]['client_id'];
|
||||
$client_secret = $app_data['instances'][$instance]['client_secret'];
|
||||
} else {
|
||||
// L'application n'est pas encore enregistrée, on l'enregistre
|
||||
$registration = register_misskey_app($instance);
|
||||
|
||||
if ($registration['success']) {
|
||||
// Enregistrement réussi, stocker les informations
|
||||
$client_id = $registration['client_id'];
|
||||
$client_secret = $registration['client_secret'];
|
||||
|
||||
// Sauvegarder dans le fichier de données
|
||||
$app_data['instances'][$instance] = [
|
||||
'client_id' => $client_id,
|
||||
'client_secret' => $client_secret,
|
||||
'registered_at' => time()
|
||||
];
|
||||
|
||||
save_app_data();
|
||||
} else {
|
||||
// Échec de l'enregistrement
|
||||
$_SESSION['messages'][] = [
|
||||
'type' => 'danger',
|
||||
'text' => 'Erreur lors de l\'enregistrement de l\'application sur ' . $instance . ': ' . $registration['message']
|
||||
];
|
||||
header('Location: index.php');
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
// Stocker le client_secret dans la session pour l'utiliser plus tard
|
||||
$_SESSION['misskey_client_secret'] = $client_secret;
|
||||
|
||||
// Générer l'URL d'autorisation
|
||||
try {
|
||||
// Générer l'URL avec le client_id obtenu
|
||||
$auth_url = generate_oauth_url($instance, $client_id);
|
||||
|
||||
// Rediriger vers l'URL d'autorisation
|
||||
header('Location: ' . $auth_url);
|
||||
exit;
|
||||
|
||||
} catch (Exception $e) {
|
||||
$_SESSION['messages'][] = [
|
||||
'type' => 'danger',
|
||||
'text' => 'Erreur lors de la préparation de l\'authentification: ' . $e->getMessage()
|
||||
];
|
||||
header('Location: index.php');
|
||||
exit;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user