source: t29-www/lib/simplepassword.php @ 1102

Last change on this file since 1102 was 1102, checked in by sven, 7 years ago

Kleiner Bugfix beim Passwortzaun (Parametername aus Zaunname bestimmen).

File size: 4.8 KB
Line 
1<?php
2/**
3 * Simpler Passwortschutz von Textbereichen in einer t29-Seite.
4 * Prinzipiell ist dieser Passwortschut wirkungsvoll, sofern HTTPS
5 * verwendet wird. Die primitive Übermittlung per GET (oder POST)
6 * sorgt aber dafür, dass die Benutzererfahrung schwach ist (das
7 * Passwort wird etwa plain-text in der URL angezeigt oder ein einfaches
8 * Neuladen einer ansonsten statischen Seite führt stets zu den POST-
9 * Warnungen).
10 *
11 * In der Praxis auf t29 ist dieser Passwortschutz allerdings schon alleine
12 * deswegen völlig wirkungslos, weil die Files alle öffentlich per
13 * SVN einsehbar sind. Aber Heribert wollte es ja so. Ist nur ein
14 * Demonstrator.
15 *
16 * Beispiel einer verwenden Seite gibt es weiter unten.
17 *
18 * Es gibt zwei Varianten des Schutzes, wobei der t29FencedContent
19 * der allgemeinere ist. Die t29PasswordBarrier hingegen geht nur,
20 * wenn die Seite danach aufhört.
21 *
22 * Aktuelle Demo zu t29FencedContent gibt es unter
23 * /physical-computing/geschuetzte-demo.php
24 *
25 **/
26
27class t29FencedContent {
28        public $password;
29        public $id; // used in form #id and in paramkey
30        public $paramkey; // computed from $id
31
32        function __construct($id, $password=Null) {
33                $this->id = $id;
34                $this->password = $password;
35                $this->paramkey = "pwd-fence-$id";
36        }
37
38        function isAuthenticated() {
39                return (isset($_GET[$this->paramkey]) &&
40                        $_GET[$this->paramkey] == $this->password);
41        }
42
43        function failedToAuthenticate() {
44                return (isset($_GET[$this->paramkey]) &&
45                        $_GET[$this->paramkey] != $this->password);
46        }
47
48        function printAnchor() {
49                print '<!-- t29FencedContent anchor -->';
50                print '<a id="'.$this->id.'"></a>';
51        }
52
53        function printMiniForm() {
54                // Print small inline "login/logut" form, Heribert style
55                if( $this->failedToAuthenticate()) {
56                        ?>
57                        Passwort falsch, bitte nochmal probieren:
58                        <?php
59                        $this->printLoginForm();
60                } else if($this->isAuthenticated()) {
61                        $this->printLogoutForm();
62                } else {
63                        ?>
64                        Passwort:
65                        <?php
66                        $this->printLoginForm();
67                }
68        }
69
70        function printLoginForm() {
71                ?>
72                <form method="get" style="display: inline-block;"
73                   action="#<?php echo $this->id; ?>">
74                        <input type="password" name="<?= $this->paramkey; ?>">
75                        <input type="submit" value="Anmelden">
76                </form>
77                <?php
78        }
79
80        function printLogoutForm() {
81                ?>
82                <form method="get" class="inline">
83                        <input type="submit" value="Abmelden">
84                </form>
85                <?php
86        }
87
88        function start() {
89                if(!$this->isAuthenticated()) {
90                        // buffer (thus hide) content
91                        ob_start();
92                }
93        }
94
95        function end() {
96                if(!$this->isAuthenticated()) {
97                        // delete buffer content, thus hide content
98                        ob_end_clean();
99                }
100        }
101
102}
103
104
105
106/**
107 * Simpler Passwortschutz im Sinne einer "Barriere", die inmitten einer
108 * t29-Seite stehen kann.
109 * Prinzipiell ist dieser Passwortschut wirkungsvoll, sofern HTTPS
110 * verwendet wird. Die primitive Übermittlung per GET (oder POST)
111 * sorgt aber dafür, dass die Benutzererfahrung schwach ist (das
112 * Passwort wird etwa plain-text in der URL angezeigt oder ein einfaches
113 * Neuladen einer ansonsten statischen Seite führt stets zu den POST-
114 * Warnungen).
115 *
116 * In der Praxis auf t29 ist dieser Passwortschutz allerdings schon alleine
117 * deswegen völlig wirkungslos, weil die Files alle öffentlich per
118 * SVN einsehbar sind. Aber Heribert wollte es ja so. Ist nur ein
119 * Demonstrator.
120 *
121 * Beispiel einer verwenden Seite gibt es weiter unten.
122 *
123 **/
124
125class t29PasswordBarrier {
126        public $password;
127        public $paramkey = 't29-pwd-barrier';
128
129        function __construct($password=Null) {
130                $this->password = $password;
131        }
132
133        function isAuthenticated() {
134                return (isset($_GET[$this->paramkey]) &&
135                        $_GET[$this->paramkey] == $this->password);
136        }
137
138        function failedToAuthenticate() {
139                return (isset($_GET[$this->paramkey]) &&
140                        $_GET[$this->paramkey] != $this->password);
141        }
142
143        function printAuthForm() {
144                $failed = $this->failedToAuthenticate();
145
146                ?>
147                <div class="alert">
148                        Passwort benötigt, um diesen Teil der Seite zu sehen:
149                        <form method="get" class="inline">
150                                <input type="password" name="<?= $this->paramkey; ?>">
151                                <input type="submit" value="Anmelden">
152                        </form>
153                </div>
154                <?php
155        }
156
157        function printSuccessForm() {
158                ?>
159                <div class="alert alert-success">
160                        <h4>Erfolgreich eingeloggt</h4>
161                        Sie sind berechtigt, den folgenden Text zu lesen.
162                        <form method="get" class="inline">
163                                <input type="submit" value="Abmelden">
164                        </form>
165                </div>
166                <?php
167        }
168}
169
170/* Demo-Seite:
171
172<?php
173        $seiten_id = 'passwort-demo';
174        $titel = 'Passwort-Demo';
175
176        $dynamischer_inhalt = true;
177        require "../lib/simplepassword.php";
178        $barriere = new t29PasswordBarrier();
179        $barriere->password = "huhn";
180        // $barriere->startCheck();
181
182        require "../lib/technikum29.php";
183?>
184
185<h2>Schüleraufgaben</h2>
186
187<p>Den Text hier kann jeder lesen</p>
188
189<?php
190        if(! $barriere->isAuthenticated()) {
191                $barriere->printAuthForm();
192                return;
193        } else {
194                $barriere->printSuccessForm();
195        }
196?>
197
198Den hier kann man nur lesen, wenn man an der Barriere vorbei ist.
199
200*/
Note: See TracBrowser for help on using the repository browser.
© 2008 - 2013 technikum29 • Sven Köppel • Some rights reserved
Powered by Trac
Expect where otherwise noted, content on this site is licensed under a Creative Commons 3.0 License