Not logged in. · Lost password · Register
Forum: Non-English Discussion German discussion RSS
Login-Seite bei "Zugriff verweigert" darstellen
og #1
Member since May 2006 · 20 posts · Location: 86899 Landsberg
Group memberships: Members
Show profile · Link to this post
Subject: Login-Seite bei "Zugriff verweigert" darstellen
Hallo,

ich habe ein public wiki, bei dem bestimmte Seiten geschützt sind. Dort erhält ein unpriviligierter User eine "Zugriff verweigert" Meldung. Mit folgendem Hack in der inc/template.php habe ich es geschafft direkt darunter die Login-Seite darzustellen:

case 'denied':
      print p_locale_xhtml('denied');
      if ($INFO['perm']==0) {
        html_login();
      }
      break;

Wenn es einen eleganteren Weg gibt (ohne solch harten Eingriff in die Quellen), bitte ich um Hinweise !
Avatar
chi (Moderator) #2
Member since Jun 2006 · 607 posts · Location: Munich Germany
Group memberships: Global Moderators, Members
Show profile · Link to this post
So was dürfte sich mit einem action plugin [1] implementieren lassen.

[1] http://wiki.splitbrain.org/wiki:plugins:action
Please add [SOLVED] to the initial thread subject if you feel your question has been answered.
og #3
Member since May 2006 · 20 posts · Location: 86899 Landsberg
Group memberships: Members
Show profile · Link to this post
Das Konzept ist mir bekannt, aber wie finde ich den passenden Event?
Avatar
chi (Moderator) #4
Member since Jun 2006 · 607 posts · Location: Munich Germany
Group memberships: Global Moderators, Members
Show profile · Link to this post
Quote by og:
Das Konzept ist mir bekannt, aber wie finde ich den passenden Event?

War mir irgendwie aus der Fragestellung nicht ersichtlich, sorry ;-).

Mal frei aus dem Kopf heraus:

Der Event heißt ACTION_ACT_PREPROCESS. In dem Plugin checkst du ob die action "show" ist, ob der user noch nicht eingeloggt ist ($_SERVER['REMOTE_USER'] ist nicht gesetzt) und ob die aufgerufene Seite schreibgeschützt ist (die Funtion dafür heißt auth_quickaclcheck()).

Treffen alle diese Vorraussetzung zu, setzt du einfach $event->data = "login" und DokuWiki sollte die login seite anzeigen.
Please add [SOLVED] to the initial thread subject if you feel your question has been answered.
og #5
Member since May 2006 · 20 posts · Location: 86899 Landsberg
Group memberships: Members
Show profile · Link to this post
Erstmal Danke für die Antwort. Ich habe mich inzwischen mit dem Event-System auseinander gesetzt und ein Plugin geschrieben welches auch funktioniert. Jedoch ist der Ansatz bei mir ganz anders. Jetzt ist es eine Frage der Eleganz und ich würde gern noch etwas dazulerenen!

Der Event heißt ACTION_ACT_PREPROCESS. In dem Plugin checkst du ob die action "show" ist, ob der user noch nicht eingeloggt ist ($_SERVER['REMOTE_USER'] ist nicht gesetzt) und ob die aufgerufene Seite schreibgeschützt ist (die Funtion dafür heißt auth_quickaclcheck()).
Treffen alle diese Vorraussetzung zu, setzt du einfach $event->data = "login" und DokuWiki sollte die login seite anzeigen.
  * Der Event "ACTION_ACT_PREPROCESS" wird in act_dispatch() zwei mal aufgerufen und ich vermute Du meinst den "BEFORE" Event?
  * Woher nehme ich im Event-Hanlder die $ID die ich für auth_quickaclcheck() benötige? (global $ID; ?)

Ich versuche das mal so zu programmieren, denn es klingt alles logisch. Vielleicht wirst Du auch mal einen Blick auf meine derzeitige Lösung und sagst mir ob ich da falsch liege, denn ich bin einen ganz anderen Ansatz gegangen.

Meine Lösung:
sieht bislang so aus, das ich den Event "TPL_CONTENT_DISPLAY"/"AFTER" hooke. Hier habe ich eine $ACT von "denied", also es wurde bereits die "Zugriff Verweigert" Seite ausgegeben. Im Event-Handler rufe ich dann html_login() auf, was die Login-Seite rendert und hinzufügt. So habe ich oben in der Seite den Grund und darunter direkt die Loginfelder.

<?php
/**
 * Dokuwiki Action Plugin: Show Login-Page on "Access Denied"
 *
 * @author Oliver Geisen <oliver.geisen@kreisbote.de>
 */
 
if(!defined('DOKU_INC')) die();
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
require_once(DOKU_PLUGIN.'action.php');
 
class action_plugin_showlogin extends DokuWiki_Action_Plugin {

  /**
   * return some info
   */
  function getInfo(){
    return array(
                 'author' => 'Oliver Geisen',
                 'email'  => 'oliver.geisen@kreisbote.de',
                 'date'   => '2008-04-17',
                 'name'   => 'Show Login',
                 'desc'   => 'Shows login page on access denied.',
                 'url'    => 'http://service.kreisbote.de/downloads/public/showlogin.zip',
                 );
  }

  /**
   * Register its handlers with the dokuwiki's event controller
   */
  function register(&$controller) {
    $controller->register_hook('TPL_CONTENT_DISPLAY', 'AFTER',  $this, 'append_to_content');
  }
 
  function append_to_content(&$event, $param) {
    global $ACT;
    global $INFO;
    if ($ACT == 'denied') {
      if ($INFO['perm'] == 0) {
        html_login();
      }
    }
  }
}
This post was edited on 2008-04-22, 08:45 by og.
Avatar
chi (Moderator) #6
Member since Jun 2006 · 607 posts · Location: Munich Germany
Group memberships: Global Moderators, Members
Show profile · Link to this post
Quote by og:
Ich versuche das mal so zu programmieren, denn es klingt alles logisch. Vielleicht wirst Du auch mal einen Blick auf meine derzeitige Lösung und sagst mir ob ich da falsch liege, denn ich bin einen ganz anderen Ansatz gegangen.

Meine Lösung:
sieht bislang so aus, das ich den Event "TPL_CONTENT_DISPLAY"/"AFTER" hooke. Hier habe ich eine $ACT von "denied", also es wurde bereits die "Zugriff Verweigert" Seite ausgegeben. Im Event-Handler rufe ich dann html_login() auf, was die Login-Seite rendert und hinzufügt. So habe ich oben in der Seite den Grund und darunter direkt die Loginfelder.


Hehe :-), es gibt immer eine elegantere Lösung ;-), in diesem Fall die deine da du das Berücksichtigen der ACLs usw. gar nicht brauchst weil DokuWiki das alles schon erledigt hat. Sieht gut aus! Bis auf einen Kleinigkeit. Ich würde zusätzlich checken ob der user schon eingeloggt ist (ist $_SERVER['REMOTE_USER'] gesetzt) - sonst bekommen bereits eingeloggte user wenn sie sie in einen namespace navigieren für den sie keine leserechte haben wieder die login form.
Please add [SOLVED] to the initial thread subject if you feel your question has been answered.
og #7
Member since May 2006 · 20 posts · Location: 86899 Landsberg
Group memberships: Members
Show profile · Link to this post
Ich denke das "$INFO['perm'] == 0" gleichbedeutend ist mit "auth_quickaclcheck() == AUTH_NONE", daher verwende ich lieber letzteres.
Weiterhin glaube ich das eine Prüfung auf "denied" + einem AUTH_NONE check redundant ist. Eines von beidem sollte genügen und da "denied" ja eigentlich schon alles prüft...
Ich frage mich, ob ich den REMOTE_USER check brauche, da es ohne login doch immer AUTH_NONE gibt, oder?

Achja, habe das Plugin auf die dokuwiki homepage gestellt: http://wiki.splitbrain.org/plugin:showlogin
Avatar
chi (Moderator) #8
Member since Jun 2006 · 607 posts · Location: Munich Germany
Group memberships: Global Moderators, Members
Show profile · Link to this post
Quote by og:
Ich frage mich, ob ich den REMOTE_USER check brauche, da es ohne login doch immer AUTH_NONE gibt, oder?

AUTH_NONE bekommst du auch wenn ein User eingeloggt ist und z.B. die ACL für die Seite auf 0 steht.
Please add [SOLVED] to the initial thread subject if you feel your question has been answered.
og #9
Member since May 2006 · 20 posts · Location: 86899 Landsberg
Group memberships: Members
Show profile · Link to this post
Okay, jetzt hab ichs kapiert. Du hast recht! Gibt es für $_SERVER['REMOTE_USER'] auch eine dokuwiki-Funktion? Oder sollte man wirklich so "tief" ansetzen?
Avatar
chi (Moderator) #10
Member since Jun 2006 · 607 posts · Location: Munich Germany
Group memberships: Global Moderators, Members
Show profile · Link to this post
$_SERVER['REMOTE_USER'] wird expliziet von DokuWikis auth backend gesetzt - ist quasi DokuWiki spezifisch ;-).
Please add [SOLVED] to the initial thread subject if you feel your question has been answered.
og #11
Member since May 2006 · 20 posts · Location: 86899 Landsberg
Group memberships: Members
Show profile · Link to this post
Prima. Ich habe auch noch einen englischen Thread zum gleichen Thema gefunden (hier http://forum.dokuwiki.org/thread/1437).
Ich denke wir können das Thema dann hiermit beenden, oder?!
Vielen Dank für deine Mithilfe, ich bin sicher wir werden mal wieder Kontakt haben... beim nächsten Plugin oder so.

og
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please note the verification code from the picture into the text field next to it.
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Go to forum
Imprint
This board is powered by the Unclassified NewsBoard software, 1.6.4, © 2003-7 by Yves Goergen
Current time: 2008-05-17, 06:26:16 (UTC +02:00)
WikiForumIRCBugsTranslate