web-dev-qa-db-fra.com

Donner aux visiteurs accéder à la page protégée de mot de passe/publier via un script externe

Vue d'ensemble:
Sur mon site, je souhaite créer un espace client. Il existe un formulaire dans lequel le visiteur entre un nom (par exemple "event_xyz") et un mot de passe. Seuls certains cercles bien informés (les participants à l'événement xyz souhaitant télécharger des fichiers) connaissent les données d'accès. En soumettant, le visiteur est redirigé vers un fichier pp-redirect.php qui doit définir le cookie pour accéder au site spécifique auquel le visiteur souhaite accéder - $ _POST ["nom"] est égal au slug du message.

J'ai trouvé ce script pour installer ce cookie et j'ai essayé de résoudre mon problème comme ceci:

global $wp_hasher;
if ( empty( $wp_hasher ) ) {
    require_once( ABSPATH . 'wp-includes/class-phpass.php' );
    $wp_hasher = new PasswordHash(8, true);
}

setcookie( 'wp-postpass_' . COOKIEHASH, $wp_hasher->HashPassword( stripslashes( $_POST['pw'] ) ), 0, COOKIEPATH );

wp_safe_redirect( "http://www.domain.com/wordpress/".$_POST['name'] );
exit();

Mais cela me montre que, dans ce fichier et dans wp-includes/pluggable.php, les en-têtes ont déjà été envoyés. Je ne sais pas non plus comment le script, qui provient du fichier wp-login.php? Action = postpass, sait à quel site je veux accéder. Des solutions?

2
luke

Enfin, j'ai trouvé la solution:

form.php

<form action="<?php echo bloginfo('template_directory'); ?>/pp-redirect.php" method="post">
Event: <input name="event" type="text" size="25" /><br />
Passwort: <input name="post_password" type="password" size="25" /><br />
<input name="submit" type="submit" value="Los" />
</form>

pp-redirect.php

<?php
/** Make sure that the WordPress bootstrap has run before continuing. */
require( dirname(__FILE__) . './../../../wp-load.php');
global $wp_hasher;
if ( empty( $wp_hasher ) ) {
    require_once( ABSPATH . 'wp-includes/class-phpass.php' );
    $wp_hasher = new PasswordHash(8, true);
}
if ( get_magic_quotes_gpc() )
    $_POST['post_password'] = stripslashes($_POST['post_password']);

// Expires when the browser shuts down
setcookie( 'wp-postpass_' . COOKIEHASH, $wp_hasher->HashPassword( stripslashes( $_POST['post_password'] ) ), 0, COOKIEPATH );

wp_safe_redirect( get_bloginfo('url') . "/" . $_POST['event'] );
?>

Salue!

2
luke

Vous devrez accrocher ce code pour qu'il s'exécute avant que toute donnée ne soit envoyée au navigateur.

function remote_login_wpse_104911() {
  global $wp_hasher;
  if ( empty( $wp_hasher ) ) {
    require_once( ABSPATH . 'wp-includes/class-phpass.php' );
    $wp_hasher = new PasswordHash(8, true);
  }

  setcookie( 'wp-postpass_' . COOKIEHASH, $wp_hasher->HashPassword( stripslashes( $_POST['pw'] ) ), 0, COOKIEPATH );

  wp_safe_redirect( "http://www.domain.com/wordpress/".$_POST['name'] );
}
add_action('template_include','remote_login_wpse_104911');

C'est complètement non testé. Je n'ai pas toutes les informations nécessaires pour le tester si je le souhaite. :) Vous devrez presque certainement modifier cela pour fonctionner dans le nouveau contexte. Mais c'est l'idée.

1
s_ha_dum