source: tags/version_1_3/admin/install.php @ 1600

Last change on this file since 1600 was 2, checked in by z0rglub, 21 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 18.8 KB
Line 
1<?php
2/***************************************************************************
3 *               install_step1.php is a part of PhpWebGallery              *
4 *                            -------------------                          *
5 *   last update          : Tuesday, July 16, 2002                         *
6 *   email                : pierrick@z0rglub.com                           *
7 *                                                                         *
8 ***************************************************************************/
9
10/***************************************************************************
11 *                                                                         *
12 *   This program is free software; you can redistribute it and/or modify  *
13 *   it under the terms of the GNU General Public License as published by  *
14 *   the Free Software Foundation;                                         *
15 *                                                                         *
16 ***************************************************************************/
17        function header_install()
18        {
19                $output = "
20<html>
21        <head>
22                <title>PhpWebGallery 1.2</title>
23                <style>
24                        a
25                        {
26                                text-decoration : none;
27                                color : #006699;
28                        }
29                        a:hover
30                        {
31                                text-decoration : underline;
32                        }
33                        body,table,input,form,select,textarea
34                        {
35                                font-family : Arial, Verdana, Sans-Serif;
36                                font-size : 12px;
37                        }
38                        .miniature
39                        {
40                                border : solid 1px black;
41                        }
42                        body
43                        {
44                                background-color :  #E5E5E5;
45                        }
46                        .titretable1
47                        {
48                                color : black;
49                                background-color : #D3DCE3;
50                                text-align : center;
51                                border : 2px solid #006699;
52                        }
53                        .grostitre
54                        {
55                                text-align : center;
56                                font-size : 20px;
57                                margin-bottom : 20px;
58                        }
59                        .plan
60                        {
61                                margin : 10px 10px 10px 2px;
62                                white-space : nowrap;
63                        }
64                        .table1
65                        {
66                                border-collapse : collapse;
67                                background-color : #FFFFFF;
68                        }
69                        .contenucellule
70                        {
71                                background-color : #EEEEEE;
72                                border : 2px solid #006699;
73                        }
74                        .style1
75                        {
76                                margin-top : 20px;
77                        }
78                        th
79                        {
80                                font-weight : bold;
81                                background-color : #D3DCE3;
82                        }
83                        td.row1
84                        {
85                                background-color : #DDDDDD;
86                        }
87                        td.row2
88                        {
89                                background-color : #E8E8E8;
90                        }
91                        .cat_plan
92                        {
93                                font-weight : bold;
94                        }
95                        .retrait
96                        {
97                                margin : 10px;
98                                margin-left : 30px;
99                                margin-top : 2px;
100                        }
101                        input,textarea
102                        {
103                                border-width : 1;
104                                border-color : #000000;
105                                background : #ffffff;
106                                color: #000000;
107                        }
108                        .erreur
109                        {
110                                color : red;
111                                text-align : center;
112                        }
113                        .info
114                        {
115                                color : darkblue;
116                                text-align : center;
117                        }
118                </style>
119        </head>
120        <body>
121                <table style=\"width:100%;height:100%\">
122                        <tr align=\"center\" valign=\"middle\">
123                                <td>
124                                        <div class=\"grostitre\">PhpWebGallery 1.2</div>
125                                        <table width=\"700\" class=\"table1\" style=\"margin:auto;\">
126                                                <tr>
127                                                        <td class=\"contenucellule\">";
128                return $output;
129        }
130       
131        function footer_install()
132        {
133                $output = "
134                                                        </td>
135                                                </tr>
136                                        </table>
137                                </td>
138                        </tr>
139                </table>
140        </body>
141</html>";
142                return $output;
143        }
144       
145        if ( isset( $HTTP_GET_VARS['language'] ) )
146        {
147                $isadmin = true;
148                $lang = array();
149                include( "../language/".$HTTP_GET_VARS['language'].".php" );
150        }
151       
152        /*---------------------------------------Step 1------------------------------------*/
153        if ( $HTTP_GET_VARS['step'] == 1 )
154        {
155                $erreur1 = true;
156                $message = "";
157                // création du fichier de configuration de connexion à la BD mysql
158                if( isset( $HTTP_POST_VARS['cfgBase'] ) && isset( $HTTP_POST_VARS['cfgUser'] ) && isset( $HTTP_POST_VARS['cfgPassword'] ) && isset( $HTTP_POST_VARS['cfgHote'] ) )
159                {
160                        if ( @mysql_connect( $HTTP_POST_VARS['cfgHote'], $HTTP_POST_VARS['cfgUser'], $HTTP_POST_VARS['cfgPassword'] ) )
161                        {
162                                if ( @mysql_select_db($HTTP_POST_VARS['cfgBase'] ) )
163                                {
164                                        $message.= "<div class=\"info\">".$lang['step1_confirmation']."</div>";
165                                        $erreur1 = false;
166                                }
167                                else
168                                {
169                                        $message.= "<div class=\"erreur\">".$lang['step1_err_db']."</div>";
170                                }
171                        }
172                        else
173                        {
174                                $message.= "<div class=\"erreur\">".$lang['step1_err_server']."</div>";
175                        }
176                       
177                        if ( !$erreur1 )
178                        {                               
179                                // écriture du fichier de configuration
180                                if ( $fp = @fopen("../include/mysql.inc.php","a+") )
181                                {
182                                        fwrite( $fp, "<?php\n\t\$cfgBase='".$HTTP_POST_VARS['cfgBase']."';\n\t\$cfgUser='".$HTTP_POST_VARS['cfgUser']."';\n\t\$cfgPassword='".$HTTP_POST_VARS['cfgPassword']."';\n\t\$cfgHote='".$HTTP_POST_VARS['cfgHote']."';\n\t\$prefixeTable='".$HTTP_POST_VARS['prefixe']."';\n?>" ); 
183                                        fclose( $fp );
184                                }
185                                $cfgHote = "";
186                                $cfgUser = "";
187                                $cfgPassword = "";
188                                $cfgBase = "";
189                                include ( "../include/mysql.inc.php" );
190                                $erreur2 = true;
191                                if ( @mysql_connect( $cfgHote, $cfgUser, $cfgPassword ) )
192                                {
193                                        if ( @mysql_select_db ( $cfgBase ) )
194                                        {
195                                                $erreur2 = false;
196                                        }
197                                }
198                                if ( $erreur2 )
199                                {
200                                        $message.="<br /><br />".$lang['step1_err_copy']." :<br />
201                                                        -----------------------------------------------------<br />
202                                                        <div style=\"color:blue;\">&lt;?php<br />
203                                                        \$cfgBase = '".$HTTP_POST_VARS['cfgBase']."';<br />
204                                                        \$cfgUser = '".$HTTP_POST_VARS['cfgUser']."';<br />
205                                                        \$cfgPassword = '".$HTTP_POST_VARS['cfgPassword']."';<br />
206                                                        \$cfgHote = '".$HTTP_POST_VARS['cfgHote']."';<br />
207                                                        \$prefixeTable = '".$HTTP_POST_VARS['prefixe']."';<br />
208                                                        ?&gt;</div>
209                                                        -----------------------------------------------------<br />";
210                                        $message.= "<div style=\"text-align:center;\">".$lang['step1_err_copy_2']."<br />";
211                                        $message.= "<a href=\"install.php?step=2&amp;language=".$HTTP_GET_VARS['language']."\">".$lang['step1_err_copy_next']."</a></div>";
212                                }
213                                else
214                                {
215                                        $url = "install.php?step=2&language=".$HTTP_GET_VARS['language'];
216                                        header("Request-URI: $url"); 
217                                        header("Content-Location: $url"); 
218                                        header("Location: $url");
219                                        exit();
220                                }
221                        }
222                }
223               
224                echo header_install();
225                if ( isset( $message ) && $message != "" )
226                {
227                        echo"
228                                        <table width=\"100%\">
229                                                <tr>
230                                                        <th>".$lang['install_message']."</th>
231                                                </tr>
232                                                <tr>
233                                                        <td>$message</td>
234                                                </tr>
235                                        </table>";
236                }
237                if ( $erreur1 )
238                {
239                        echo"
240                                        <form method=\"post\" action=\"install.php?step=1&amp;language=".$HTTP_GET_VARS['language']."\">
241                                                <table width=\"100%\">
242                                                        <tr>
243                                                                <th colspan=\"3\">".$lang['step1_title']."</th>
244                                                        </tr>
245                                                        <tr>
246                                                                <td colspan=\"3\">&nbsp;</th>
247                                                        </tr>
248                                                        <tr>
249                                                                <td>".$lang['step1_host']."</td>
250                                                                <td align=center><input type='text' name='cfgHote' value='";
251                        if ( !isset( $HTTP_POST_VARS['cfgHote'] ) )
252                        {
253                                echo"localhost";
254                        }
255                        else
256                        {
257                                echo $HTTP_POST_VARS['cfgHote'];
258                        }
259                        echo"'></td>
260                                                                <td class=\"row2\">".$lang['step1_host_info']."</td>
261                                                        </tr>
262                                                        <tr>
263                                                                <td>".$lang['step1_user']."</td>
264                                                                <td align=center><input type='text' name='cfgUser' value='".$HTTP_POST_VARS['cfgUser']."'></td>
265                                                                <td class=\"row2\">".$lang['step1_user_info']."</td>
266                                                        </tr>
267                                                        <tr>
268                                                                <td>".$lang['step1_pass']."</td>
269                                                                <td align=center><input type='password' name='cfgPassword' value=''></td>
270                                                                <td class=\"row2\">".$lang['step1_pass_info']."</td>
271                                                        </tr>
272                                                        <tr>
273                                                                <td>".$lang['step1_database']."</td>
274                                                                <td align=center><input type='text' name='cfgBase' value='".$HTTP_POST_VARS['cfgBase']."'></td>
275                                                                <td class=\"row2\">".$lang['step1_database_info']."</td>
276                                                        </tr>
277                                                        <tr>
278                                                                <td>".$lang['step1_prefix']."</td>
279                                                                <td align=center><input type='text' name='prefixe' value='";
280                        if ( !isset( $HTTP_POST_VARS['prefixe'] ) )
281                        {
282                                echo"phpwebgallery_";
283                        }
284                        else
285                        {
286                                echo $HTTP_POST_VARS['prefixe'];
287                        }
288                        echo"'></td>
289                                                                <td class=\"row2\">".$lang['step1_prefix_info']."</td>
290                                                        </tr>
291                                                        <tr>
292                                                                <td colspan=\"3\">&nbsp;</th>
293                                                        </tr>
294                                                        <tr>
295                                                                <td colspan=3 align=center><input type='submit' name='Valider' value=\"".$lang['submit']." *\"></td>
296                                                        </tr>
297                                                </table>
298                                        </form>";
299                }
300                echo footer_install();
301        }
302        /*---------------------------------------Step 2------------------------------------*/
303        else if ( $HTTP_GET_VARS['step'] == 2 )
304        {
305                include( "../include/mysql.inc.php" );
306                mysql_connect( $cfgHote, $cfgUser, $cfgPassword ) or die ( "erreur de connexion au serveur" );
307                mysql_select_db( $cfgBase ) or die ( "erreur de connexion a la base de donnees" );
308               
309                if ( !isset( $HTTP_POST_VARS['submit'] ) )
310                {
311                        $query = "CREATE TABLE ".$prefixeTable."categories (
312                                id tinyint(3) unsigned NOT NULL auto_increment,
313                          date_dernier date NOT NULL default '0000-00-00',
314                          nb_images smallint(5) unsigned NOT NULL default '0',
315                          name varchar(255) default NULL,
316                          id_uppercat tinyint(3) unsigned default NULL,
317                          comment text,
318                          dir varchar(255) NOT NULL default '',
319                          rank tinyint(3) unsigned default NULL,
320                          status enum('visible','invisible') NOT NULL default 'visible',
321                          site_id tinyint(4) unsigned NOT NULL default '1',
322                          PRIMARY KEY (id)
323                        );";
324                        mysql_query( $query );
325                        $query = "CREATE TABLE ".$prefixeTable."comments (
326                          id int(11) unsigned NOT NULL auto_increment,
327                          image_id smallint(5) unsigned NOT NULL default '0',
328                          date int(11) unsigned NOT NULL default '0',
329                          author varchar(255) NOT NULL default '',
330                          content longtext,
331                          PRIMARY KEY  (id)
332                        );";
333                        mysql_query( $query );
334                        $query = "CREATE TABLE ".$prefixeTable."config (
335                          periode_courte smallint(5) unsigned NOT NULL default '7',
336                          periode_longue smallint(5) unsigned NOT NULL default '14',
337                          prefixe_thumbnail varchar(10) NOT NULL default 'TN-',
338                          webmaster varchar(255) NOT NULL default '',
339                          mail_webmaster varchar(255) NOT NULL default '',
340                          acces enum('libre','restreint') NOT NULL default 'libre',
341                          session_id_size tinyint(3) unsigned NOT NULL default '4',
342                          session_keyword varchar(255) NOT NULL default '',
343                          session_time tinyint(3) unsigned NOT NULL default '30',
344                          max_user_listbox tinyint(3) unsigned NOT NULL default '10',
345                          expand enum('true','false') NOT NULL default 'false',
346                          show_comments enum('true','false') NOT NULL default 'true',
347                          nb_comment_page tinyint(4) NOT NULL default '10',
348                          upload_available enum('true','false') NOT NULL default 'false',
349                          upload_maxfilesize smallint(5) unsigned NOT NULL default '150',
350                          upload_maxwidth smallint(5) unsigned NOT NULL default '800',
351                          upload_maxheight smallint(5) unsigned NOT NULL default '600',
352                          upload_maxwidth_thumbnail smallint(5) unsigned NOT NULL default '150',
353                          upload_maxheight_thumbnail smallint(5) unsigned NOT NULL default '100'
354                        );";
355                        mysql_query( $query );
356                        $query = "CREATE TABLE ".$prefixeTable."favorites (
357                          user_id smallint(5) unsigned NOT NULL default '0',
358                          image_id smallint(5) unsigned NOT NULL default '0',
359                          KEY user_id (user_id,image_id)
360                        );";
361                        mysql_query( $query );
362                        $query = "CREATE TABLE ".$prefixeTable."history (
363                          date int(11) NOT NULL default '0',
364                          login varchar(15) default NULL,
365                          IP varchar(50) NOT NULL default '',
366                          categorie varchar(150) default NULL,
367                          page varchar(50) default NULL,
368                          titre varchar(150) default NULL,
369                          commentaire varchar(200) default NULL
370                        );";
371                        mysql_query( $query );
372                        $query = "CREATE TABLE ".$prefixeTable."images (
373                          id smallint(5) unsigned NOT NULL auto_increment,
374                          file varchar(255) NOT NULL default '',
375                          cat_id tinyint(3) unsigned NOT NULL default '0',
376                          date_available date NOT NULL default '0000-00-00',
377                          date_creation date default NULL,
378                          tn_ext char(3) NOT NULL default 'jpg',
379                          name varchar(255) default NULL,
380                          comment varchar(255) default NULL,
381                          author varchar(255) default NULL,
382                          hit int(10) unsigned NOT NULL default '0',
383                          filesize mediumint(9) unsigned default NULL,
384                          width smallint(9) unsigned default NULL,
385                          height smallint(9) unsigned default NULL,
386                          PRIMARY KEY  (id),
387                          KEY cat_id (cat_id)
388                        );";
389                        mysql_query( $query );
390                        $query = "CREATE TABLE ".$prefixeTable."restrictions (
391                          user_id smallint(5) unsigned NOT NULL default '0',
392                          cat_id tinyint(3) unsigned NOT NULL default '0',
393                          PRIMARY KEY  (user_id,cat_id)
394                        );";
395                        mysql_query( $query );
396                        $query = "CREATE TABLE ".$prefixeTable."sessions (
397                          id varchar(255) binary NOT NULL default '',
398                          user_id smallint(5) unsigned NOT NULL default '0',
399                          expiration int(10) unsigned NOT NULL default '0',
400                          ip varchar(255) NOT NULL default '',
401                          PRIMARY KEY  (id)
402                        );";
403                        mysql_query( $query );
404                        $query = "CREATE TABLE ".$prefixeTable."sites (
405                          id tinyint(4) NOT NULL auto_increment,
406                          galleries_url varchar(255) NOT NULL default '',
407                          PRIMARY KEY  (id),
408                          UNIQUE KEY galleries_url (galleries_url)
409                        );";
410                        mysql_query( $query );
411                        $query = "CREATE TABLE ".$prefixeTable."users (
412                          id smallint(5) unsigned NOT NULL auto_increment,
413                          pseudo varchar(20) binary NOT NULL default '',
414                          password varchar(255) NOT NULL default '',
415                          mail_address varchar(255) default NULL,
416                          nombre_image_ligne tinyint(1) unsigned NOT NULL default '5',
417                          nombre_ligne_page tinyint(3) unsigned NOT NULL default '3',
418                          theme varchar(255) NOT NULL default 'melodie/blue',
419                          status enum('admin','membre','visiteur') NOT NULL default 'visiteur',
420                          language varchar(50) NOT NULL default 'english',
421                          maxwidth smallint(6) default NULL,
422                          maxheight smallint(6) default NULL,
423                          PRIMARY KEY  (id),
424                          UNIQUE KEY pseudo (pseudo)
425                        );";
426                        mysql_query( $query );
427                        $query = "CREATE TABLE ".$prefixeTable."waiting (
428                          id int(10) unsigned NOT NULL auto_increment,
429                          cat_id tinyint(3) unsigned NOT NULL default '0',
430                          file varchar(255) NOT NULL default '',
431                          username varchar(255) NOT NULL default '',
432                          mail_address varchar(255) NOT NULL default '',
433                          date int(10) unsigned NOT NULL default '0',
434                          tn_ext char(3) default NULL,
435                          PRIMARY KEY  (id)
436                        );";
437                        mysql_query( $query );
438                }
439                if ( isset( $HTTP_POST_VARS['submit'] ) )
440                {
441                        $configuration = false;
442                        $erreur = "";
443                        $nb_erreur = 0;
444                        // le pseudo du webmaster ne doit pas
445                        // 1. être vide
446                        // 2. commencer ou se terminer par un espace
447                        // 3. comporter les caractères ' ou "
448                        // Notes sur le pseudo du webmaster :
449                        // - lorsque l'on trouve plusieurs occurences
450                        // consécutives du caractère espace, on réduit à une seule occurence
451                        if ( $HTTP_POST_VARS['webmaster'] == "" )
452                        {
453                                $erreur .= "<li>".$lang['step2_err_login1']."</li>";
454                                $nb_erreur++;
455                        }
456                        $webmaster = ereg_replace( "[ ]{2,}", " ", $HTTP_POST_VARS['webmaster'] );
457                        if ( ereg( "^.* $", $webmaster ) || ereg( "^ .*$", $webmaster) )
458                        {
459                                $erreur .= "<li>".$lang['step2_err_login2']."</li>";
460                                $nb_erreur++;
461                        }
462                        if ( ereg( "'",$webmaster ) || ereg( "\"",$webmaster ) )
463                        {
464                                $erreur .= "<li>".$lang['step2_err_login3']."</li>";
465                                $nb_erreur++;
466                        }
467                        // on vérifie que le password rentré correspond bien à la confirmation faite par l'utilisateur
468                        if ( $HTTP_POST_VARS['pwdWebmaster'] != $HTTP_POST_VARS['pwdWebmasterConf'] )
469                        {
470                                $erreur .= "<li>".$lang['step2_err_pass']."</li>";
471                                $nb_erreur++;
472                        }
473                        // le mail doit être conforme à qqch du type : nom@serveur.com
474                        if( !ereg("([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)+)", $HTTP_POST_VARS['mail_webmaster'] ) )
475                        {
476                                $erreur .= "<li>".$lang['step2_err_mail']."</li>";
477                                $nb_erreur++;
478                        }
479                        // on met à jour les paramètres de l'application dans le cas où il n'y aucune erreur
480                        if ( $nb_erreur == 0 )
481                        {
482                                mysql_query( "delete from $prefixeTable"."config" );
483                                $query = "insert into $prefixeTable"."config (webmaster,mail_webmaster) values ('$webmaster','".$HTTP_POST_VARS['mail_webmaster']."')";
484                                mysql_query($query);
485                                $query = "insert into $prefixeTable"."sites values (1, './galleries/');";
486                                mysql_query($query);
487                                $query = "insert into $prefixeTable"."users (pseudo,password,status,language) values ('$webmaster','".md5( $pwdWebmaster )."','admin','".$HTTP_GET_VARS['language']."')";
488                                mysql_query($query);
489                                mysql_query("insert into $prefixeTable"."users (pseudo,password,status,language) values ('visiteur','".md5( "" )."','visiteur','".$HTTP_GET_VARS['language']."')");
490                                $configuration = true;
491                        }
492                }
493               
494                echo header_install();
495                if ( $configuration )
496                {
497                        echo"
498                                                <table width=\"100%\">
499                                                        <tr>
500                                                                <th>".$lang['install_end_title']."</th>
501                                                        </tr>
502                                                        <tr>
503                                                                <td>&nbsp;</th>
504                                                        </tr>
505                                                        <tr>
506                                                                <td>".$lang['install_end_message']."</td>
507                                                        </tr>
508                                                </table>";
509                }
510                else
511                {
512                        if ( $nb_erreur > 0 )
513                        {
514                                echo"
515                                                <table width=100%>
516                                                        <tr>
517                                                                <th>".$lang['install_message']."</th>
518                                                        </tr>
519                                                        <tr>
520                                                                <td>&nbsp;</td>
521                                                        </tr>
522                                                        <tr>
523                                                                <td>$erreur</td>
524                                                        </tr>
525                                                        <tr>
526                                                                <td>&nbsp;</td>
527                                                        </tr>
528                                                </table>";
529                        }
530                        echo"
531                                        <form method=\"post\" action=\"install.php?step=2&amp;language=".$HTTP_GET_VARS['language']."\">
532                                                <table width=100%>
533                                                        <tr>
534                                                                <th colspan=\"3\">".$lang['step2_title']."</th>
535                                                        </tr>
536                                                        <tr>
537                                                                <td colspan=\"3\">&nbsp;</td>
538                                                        </tr>
539                                                        <tr>
540                                                                <td>".$lang['conf_general_webmaster']."</td>
541                                                                <td align=\"center\"><input type='text' name='webmaster' value=\"".$HTTP_POST_VARS['webmaster']."\"></td>
542                                                                <td class=\"row2\">".$lang['conf_general_webmaster_info']."</td>
543                                                        </tr>
544                                                        <tr>
545                                                                <td>".$lang['step2_pwd']."</td>
546                                                                <td align=center><input type='password' name='pwdWebmaster' value=''></td>
547                                                                <td class=\"row2\">".$lang['step2_pwd_info']."</td>
548                                                        </tr>
549                                                        <tr>
550                                                                <td>".$lang['step2_pwd_conf']."</td>
551                                                                <td align=center><input type='password' name='pwdWebmasterConf' value=''></td>
552                                                                <td class=\"row2\">".$lang['step2_pwd_conf_info']."</td>
553                                                        </tr>
554                                                        <tr>
555                                                                <td>".$lang['conf_general_mail']."</td>
556                                                                <td align=center><input type='text' name='mail_webmaster' value=\"".$HTTP_POST_VARS['mail_webmaster']."\"></td>
557                                                                <td class=\"row2\">".$lang['conf_general_mail_info']."</td>
558                                                        </tr>
559                                                        <tr>
560                                                                <td colspan=\"3\">&nbsp;</th>
561                                                        </tr>
562                                                        <tr>
563                                                                <td colspan=3 align=center>
564                                                                        <input type='submit' name='submit' value='".$lang['submit']."'>
565                                                                </td>
566                                                        </tr>
567                                                </table>
568                                        </form>";
569                }
570                echo footer_install();
571        }
572        /*----------------------------------Language choice------------------------------------*/
573        else
574        {
575                include( "../include/functions.php" );
576                echo header_install();
577                echo"
578                                        <form method=\"get\" action=\"install.php\">
579                                                <input type=\"hidden\" name=\"step\" value=\"1\"/>
580                                                <table width=\"100%\">
581                                                        <tr>
582                                                                <td align=\"center\">
583                                                                        <select name=\"language\">";
584                $languages = get_languages( "../language/" );
585                for ( $i = 0; $i < sizeof ( $languages ); $i++ )
586                {
587                        echo"
588                                                                                <option>".$languages[$i]."</option>";
589                }
590                echo"
591                                                                                </select>
592                                                                                <input type=\"submit\" value=\"Go\">
593                                                                </td>
594                                                        </tr>
595                                                </table>
596                                        </form>";
597                echo footer_install();
598        }
599?>
Note: See TracBrowser for help on using the repository browser.