Scénario:
L'utilisateur poste une demande ajax sur le site Joomla (via com_ajax ).
Dans la méthode appelée, je souhaite récupérer l'intégralité de la sortie html d'un sous-menu Joomla connu (disons/contact). Le sous-menu joomla est uniquement accessible à un utilisateur différent de celui actuellement connecté.
OK, je peux faire les n ° 1 et n ° 3, pas de problème. Comment puis-je faire # 2?
Choses que j'ai explorées:
ob_start
, puis en utilisant la méthode redirect
de JApplication
. Cela envoie uniquement les en-têtes de redirection.Des "solutions" qui ne fonctionneront pas (pour vous faire gagner du temps):
require
/include
fichier X: non, car je veux une URL complète (pouvant contenir plusieurs composants/modules)J'ai eu un succès partiel avec ce qui suit, grâce à this répondre principalement:
<?php
function retrieveURL($relativeURL){
$uname = "user"; //this is the privileged user to the relative url we want
$upswd = "pass";
$domain = $_SERVER['HTTP_Host'];
$prefix = $_SERVER['HTTPS'] ? 'https://' : 'http://';
$url_get_key = $prefix.$domain."index.php?option=com_users";
//GET return & key
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url_get_key );
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE );
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__).'/cookie.txt'); //as far as i understand, this stores a *new* session to a cookie file
curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__).'/cookie.txt');
curl_setopt($ch, CURLOPT_HEADER, 0 );
$results = curl_exec($ch);
preg_match_all("(<input type=\"hidden\" name=\"return\" value=\"(.*)\" />)siU", $results, $matches1); //Should not be needed if username and password are correct
preg_match_all("(<input type=\"hidden\" name=\"(.*)\" value=\"1\" />(.*)</fieldset>)iU", $results, $matches2); //Same as above
// POST
$url_post = $prefix.$domain."index.php?option=com_users&task=user.login";
$postdata = "username=".urlencode($uname)."&password=".urlencode($upswd)."&return=".urlencode($matches1[1][0])."&".urlencode($matches2[1][0])."=1";
curl_setopt($ch, CURLOPT_URL, $url_post);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
$results1 = curl_exec($ch);
$url_data = $prefix.$domain.$relativeURL;
curl_setopt($ch, CURLOPT_URL, $url_data); //Now we can retrieve the proper url
$results2 = curl_exec($ch);
$error = curl_error($ch);
$errno = curl_errno($ch);
curl_close($ch);
return $results2; //could probably use a bit more error checking
}
?>
Cela récupère le code HTML de la page de sortie avec les informations d'identification de l'utilisateur privilégié. Maintenant, si je pouvais conserver les variables de session de l'utilisateur précédent ou les injecter dans la nouvelle session, tout serait parfait. D'après ce que j'ai compris, ce que j'essaie de faire peut s'appeler "Session empoisonnée" :)