Commit 2868a390 authored by root's avatar root

initial source code of the prosody web account manager

parents
Prosody account manager for La Quadrature du Net
================================================
This is the code used by https://jabber.lqdn.fr/ to manage prosody accounts
on our jabber server.
It is distributed under the GPLv3+ License.
Requirements: php5.3, mcrypt, mysql, a small database with the table on dump.sql
a running prosody with the mod_telnet_admin enabled on port 5582.
edit config.sample.php and rename it to config.php
inject the dump.sql into a mysql database
add the cron.php script to the daily crontab
<?php
// regenerate header/footer every day
//if (filemtime("header.php")+86400 < time()) {
$s=file_get_contents("https://jabber.lqdn.fr");
$lines=explode("\n",$s);
$header=fopen("header.php.temp","wb");
$footer=fopen("footer.php.temp","wb");
$pos=0;
foreach($lines as $line) {
if (preg_match("#<article #",$line)) {
$pos=1;
}
if (preg_match("#</article#",$line)) {
$pos=2;
}
if ($pos==0) fputs($header,$line);
if ($pos==2) fputs($footer,$line);
}
fclose($header);
fclose($footer);
rename("header.php.temp","header.php");
rename("footer.php.temp","footer.php");
//}
CREATE TABLE `accounts` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`jabberid` varchar(255) NOT NULL,
`createdate` datetime NOT NULL,
`disabledate` datetime NOT NULL,
`lastlogin` datetime NOT NULL,
`email` varchar(255) NOT NULL,
`ack` tinyint(4) DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
<?php
require_once("captcha.php");
$captcha->wordsFile = 'words/es.php';
$captcha->lineWidth = 1;
$captcha->scale = 6; $captcha->blur = true;
$captcha->resourcesPath = "/var/www/htdocs/my";
if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
$langs = array('en', 'es', 'fr', 'de');
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
if (in_array($lang, $langs)) {
$captcha->wordsFile = "words/$lang.php";
}
}
// Image generation
$captcha->CreateImage();
?>
\ No newline at end of file
This diff is collapsed.
<?php
mysql_connect("localhost","user","password");
mysql_select_db("database");
$csrf_key="random long string of characters (seriously, change me, pwgen 40 1 is good ;) )";
$domain="jabber.lqdn.fr";
require_once("functions.php");
<?php
require_once("config.php");
session_start();
$debug=false;
$fields=array("login","pass1","pass2","email","url","cap");
$found=0;
foreach($fields as $f) if (isset($_POST[$f])) $found++;
$error=array();
$info=array();
if ($found==6 && $_POST["url"]=="") {
if ($_SESSION["captcha"]!=$_POST["cap"]) {
$error[]=_("The captcha is incorrect, please try again");
}
if (!csrf_check($_POST["csrf"])) {
$error[]=_("The captcha is incorrect, please try again (2)");
}
$login=fixlogin($_POST["login"]);
if ($login!=$_POST["login"] || strlen($login)<3 || strlen($login)>80) {
$error[]=_("The login must be between 3 and 80 characters long, and must not contains special characters (unicode and accents authorized though)");
}
$pass=fixlogin($_POST["pass1"]);
if ($_POST["pass1"]!=$_POST["pass2"] || $pass!=$_POST["pass1"]) {
$error[]=_("Your passwords are not the same, or contains special characters (unicode and accents authorized though), please try again");
}
if (count($error)==0) {
sleep(5); // Let create some artificial waiting for the one who want to create many accounts ...
// Try to create the account.
$already=@mysql_fetch_assoc(mysql_query("SELECT id FROM accounts WHERE jabberid='".addslashes($_POST["login"]."@$domain")."';"));
if ($already) {
$error[]=_("This account already exist, or is disabled. You can't create that login now, please find another one!");
}
if (count($error)==0) {
mysql_query("INSERT INTO accounts SET jabberid='".addslashes($_POST["login"]."@$domain")."', createdate=NOW(), email='".hashmail(trim($_POST["email"]))."', ack=0;");
// Connect to the telnet console of prosody.
$f=fsockopen("localhost",5582,$errno,$errstr,5);
if (!$f) {
$error[]=_("Can't connect to jabber server");
mysql_query("DELETE FROM accounts WHERE jabberid='".addslashes($_POST["login"]."@$domain")."';");
} else {
for($i=0;$i<12;$i++) {
$s=fgets($f,1024);
if ($debug) echo ":".$s.":<br>";
}
fputs($f,"user:create(\"".$login."@$domain\",\"".$password."\")\n");
$s=fgets($f,1024);
if ($debug) echo ":".$s.":<br>";
if (trim($s)=="| OK: User created") {
mysql_query("UPDATE accounts SET ack=1 WHERE jabberid='".addslashes($_POST["login"]."@$domain")."';");
$info[]=_("Your account has been created successfully. You can use it immediately.");
unset($_POST);
unset($_REQUEST);
} else {
if ($debug) { $s=fgets($f,1024); echo ":".$s.":<br>"; }
mysql_query("DELETE FROM accounts WHERE jabberid='".addslashes($_POST["login"]."@$domain")."';");
$error[]=_("An error occurred trying to create your account, please try again later");
// TODO : send an email to us ;)
}
fclose($f);
}
}
}
}
require_once("header.php");
?>
<style type="text/css">
.error {
color: #F00;
background-color: #FEE;
padding: 10px;
margin: 10px;
border: 2px solid #F00;
}
.info {
color: #090;
background-color: #EFE;
padding: 10px;
margin: 10px;
border: 2px solid #090;
}
sup {
color:red; font-size: 0.6em
}
.wichtig { display: none }
.btn {
padding: 6px 10px; background: #497ed5; color: white; font-weight: bold;
}
</style>
<p>
<b><?php __("Menu:"); ?></b>
<?php __("Create an account"); ?> -
<a href="lost.php"><?php __("I lost my password"); ?></a> -
<a href="disabled.php"><?php __("My account is disabled"); ?></a>
</p>
<h1><?php __("Account creation on our Jabber server"); ?></h1>
<?php
if (count($error)) {
echo "<div class=\"error\">";
foreach($error as $e) echo $e."<br>\n";
echo "</div>";
}
if (count($info)) {
echo "<div class=\"info\">";
foreach($info as $e) echo $e."<br>\n";
echo "</div>";
}
?>
<p><?php __("If you want to create an account on our Jabber server, please enter a login name and enter a password two times in the form below. You can also give us a non-mandatory email address which will allow you to change your password if you lose it later."); ?></p>
<form method="post" action="create.php">
<input type="hidden" name="csrf" value="<?php echo csrf_gen(); ?>" />
<table style="width: 700px">
<tr><th style="width: 200px"><?php __("Login"); ?><sup>*</sup> <br /><i><small><?php __("3 characters or more"); ?></small></i></th>
<td><input type="text" name="login" id="login" value="<?php eher("login"); ?>" style="width: 200px" />@$domain</td></tr>
<tr><th><?php __("Password"); ?><sup>*</sup></th>
<td><input type="password" name="pass1" id="pass1" value="<?php eher("pass1"); ?>" style="width: 200px"/></td></tr>
<tr><th><?php __("Password (again)"); ?><sup>*</sup></th>
<td><input type="password" name="pass2" id="pass2" value="<?php eher("pass2"); ?>" style="width: 200px"/></td></tr>
<tr><th><?php __("Your email address"); ?></th>
<td><input type="text" name="email" id="email" value="<?php eher("email"); ?>" style="width: 300px"/></td></tr>
<tr><th><?php __("Enter this word to prove you are human"); ?><sup>*</sup></th>
<td>
<img src="cap.php">
<br />
<input type="text" name="cap" id="cap" value="" style="width: 200px"/>
</td></tr>
</table>
<div class="wichtig">
<?php __("Don't put anything in this field"); ?><input type="text" name="url" id="url" value="" style="width: 200px"/>
</div>
<input type="submit" name="go" value="<?php __("Create my account"); ?>" class="btn" id="go"/>
</form>
<p>&nbsp;</p>
<p><i><?php __("Please note that:"); ?></i>
<ul>
<li><?php __("Any account unused for 6 months will be disabled, and this login will not be allowed as registration for 6 more months. During that time, you will be allowed to recover that account if we have an email address for this account. After that, any disabled account will be permanently destroyed and the login will be available again for other users"); ?></li>
<li><?php __("We don't store your password or email in cleartext, but only a hashed version. We don't verify your email address, so write it down properly. We will only use it to send you a recover link if you lose your password."); ?></li>
</ul>
</p>
<?php
require_once("footer.php");
?>
</article> <!-- .et_pb_post --> </div> <!-- #left-area --> <div id="sidebar"> <div id="search-2" class="et_pb_widget widget_search"><form role="search" method="get" id="searchform" class="searchform" action="https://jabber.lqdn.fr/"> <div> <label class="screen-reader-text" for="s">Search for:</label> <input type="text" value="" name="s" id="s" /> <input type="submit" id="searchsubmit" value="Search" /> </div> </form></div> <!-- end .et_pb_widget --> <div id="recent-posts-2" class="et_pb_widget widget_recent_entries"> <h4 class="widgettitle">Recent Posts</h4> <ul> <li> <a href="https://jabber.lqdn.fr/?p=37">Bienvenue sur jabber.lqdn.fr</a> </li> </ul> </div> <!-- end .et_pb_widget --><div id="archives-2" class="et_pb_widget widget_archive"><h4 class="widgettitle">Archives</h4> <select name="archive-dropdown" onchange='document.location.href=this.options[this.selectedIndex].value;'> <option value="">Select Month</option> <option value='https://jabber.lqdn.fr/?m=201408'> August 2014 </option> </select></div> <!-- end .et_pb_widget --><div id="categories-2" class="et_pb_widget widget_categories"><h4 class="widgettitle">Categories</h4><select name='cat' id='cat' class='postform' > <option value='-1'>Select Category</option> <option class="level-0" value="4">fr&nbsp;&nbsp;(1)</option></select><script type='text/javascript'>/* <![CDATA[ */ var dropdown = document.getElementById("cat"); function onCatChange() { if ( dropdown.options[dropdown.selectedIndex].value > 0 ) { location.href = "https://jabber.lqdn.fr/?cat="+dropdown.options[dropdown.selectedIndex].value; } } dropdown.onchange = onCatChange;/* ]]> */</script></div> <!-- end .et_pb_widget --> </div> <!-- end #sidebar --> </div> <!-- #content-area --> </div> <!-- .container --> </div> <!-- #main-content --> <footer id="main-footer"> <div id="footer-bottom"> <div class="container clearfix"> <p id="footer-info"></p> </div> <!-- .container --> </div> </footer> <!-- #main-footer --> </div> <!-- #et-main-area --> </div> <!-- #page-container --> <script type='text/javascript' src='https://jabber.lqdn.fr/wp-includes/js/comment-reply.min.js?ver=3.9.2'></script><script type='text/javascript' src='https://jabber.lqdn.fr/wp-content/themes/Divi/js/jquery.fitvids.js?ver=2.1.2'></script><script type='text/javascript' src='https://jabber.lqdn.fr/wp-content/themes/Divi/js/waypoints.min.js?ver=2.1.2'></script><script type='text/javascript' src='https://jabber.lqdn.fr/wp-content/themes/Divi/js/jquery.magnific-popup.js?ver=2.1.2'></script><script type='text/javascript'>/* <![CDATA[ */var et_custom = {"ajaxurl":"https:\/\/jabber.lqdn.fr\/wp-admin\/admin-ajax.php","images_uri":"https:\/\/jabber.lqdn.fr\/wp-content\/themes\/Divi\/images","et_load_nonce":"ce86d314f9","subscription_failed":"Please, check the fields below to make sure you entered the correct information.","fill":"Fill","field":"field","invalid":"Invalid email","captcha":"Captcha","prev":"Prev","next":"Next"};/* ]]> */</script><script type='text/javascript' src='https://jabber.lqdn.fr/wp-content/themes/Divi/js/custom.js?ver=2.1.2'></script></body></html>
<?php
function __($str) { echo _($str); }
function ehe($str) { echo htmlentities($str); }
function eher($str) { if (isset($_REQUEST[$str])) ehe($_REQUEST[$str]); }
function csrf_gen() {
global $csrf_key;
$i=substr(md5(rand()),0,10);
return $i.md5($csrf_key."-".$i);
}
function csrf_check($str) {
global $csrf_key;
$str=strtolower($str);
if (!preg_match('#[0-9a-f]{42}#',$str)) {
return false;
}
return ( $str == substr($str,0,10).md5($csrf_key."-".substr($str,0,10)) );
}
function hashmail($mail,$salt="") {
if ($salt=="") $salt = '$5$rounds=5997$'.substr(md5(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)),0,10).'$';
return crypt($mail, $salt);
}
function fixlogin($str) {
// remove forbidden characters:
$remove=",'\"\\\n\r ".chr(9);
for($i=0;$i<strlen($remove);$i++) {
$str=str_replace(substr($remove,$i,1),"",$str);
}
return $str;
}
<!DOCTYPE html><!--[if IE 6]> <html id="ie6" lang="en-US"> <![endif]--><!--[if IE 7]> <html id="ie7" lang="en-US"> <![endif]--><!--[if IE 8]> <html id="ie8" lang="en-US"> <![endif]--><!--[if !(IE 6) | !(IE 7) | !(IE 8) ]><!--><html lang="en-US"><!--<![endif]--><head> <meta charset="UTF-8" /> <title>Jabber LQDN | Server Jabber de La Quadrature du Net</title> <link rel="pingback" href="https://jabber.lqdn.fr/xmlrpc.php" /> <!--[if lt IE 9]> <script src="https://jabber.lqdn.fr/wp-content/themes/Divi/js/html5.js" type="text/javascript"></script> <![endif]--> <script type="text/javascript"> document.documentElement.className = 'js'; </script> <link rel="alternate" type="application/rss+xml" title="Jabber LQDN &raquo; Feed" href="https://jabber.lqdn.fr/?feed=rss2" /><link rel="alternate" type="application/rss+xml" title="Jabber LQDN &raquo; Comments Feed" href="https://jabber.lqdn.fr/?feed=comments-rss2" /><link rel="alternate" type="application/rss+xml" title="Jabber LQDN &raquo; Welcome / Bienvenue Comments Feed" href="https://jabber.lqdn.fr/?feed=rss2&#038;page_id=57" /><meta content="Divi v.2.1.2" name="generator"/><link rel='stylesheet' id='divi-fonts-css' href='https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,700italic,800italic,400,300,700,800&#038;subset=latin,latin-ext' type='text/css' media='all' /><link rel='stylesheet' id='et-gf-droid-sans-css' href='https://fonts.googleapis.com/css?family=Droid+Sans:400,700&#038;subset=latin' type='text/css' media='all' /><link rel='stylesheet' id='divi-style-css' href='https://jabber.lqdn.fr/wp-content/themes/Divi/style.css?ver=2.1.2' type='text/css' media='all' /><link rel='stylesheet' id='et-shortcodes-css-css' href='https://jabber.lqdn.fr/wp-content/themes/Divi/epanel/shortcodes/css/shortcodes.css?ver=3.0' type='text/css' media='all' /><link rel='stylesheet' id='et-shortcodes-responsive-css-css' href='https://jabber.lqdn.fr/wp-content/themes/Divi/epanel/shortcodes/css/shortcodes_responsive.css?ver=3.0' type='text/css' media='all' /><script type='text/javascript' src='https://jabber.lqdn.fr/wp-includes/js/jquery/jquery.js?ver=1.11.0'></script><script type='text/javascript' src='https://jabber.lqdn.fr/wp-includes/js/jquery/jquery-migrate.min.js?ver=1.2.1'></script><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://jabber.lqdn.fr/xmlrpc.php?rsd" /><link rel="wlwmanifest" type="application/wlwmanifest+xml" href="https://jabber.lqdn.fr/wp-includes/wlwmanifest.xml" /> <link rel='prev' title='Comment utiliser ce service ?' href='https://jabber.lqdn.fr/?page_id=41' /><link rel='next' title='FAQ' href='https://jabber.lqdn.fr/?page_id=68' /><meta name="generator" content="WordPress 3.9.2" /><link rel='canonical' href='https://jabber.lqdn.fr/' /><link rel='shortlink' href='https://jabber.lqdn.fr/' /><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" /> <style> a { color: #2EA3F2; } body { color: #666666; } .et_pb_counter_amount, .et_pb_featured_table .et_pb_pricing_heading, .et_quote_content, .et_link_content, .et_audio_content { background-color: #2EA3F2; } #main-header, #main-header .nav li ul, .et-search-form, #main-header .et_mobile_menu { background-color: #ffffff; } #top-header, #et-secondary-nav li ul { background-color: #2EA3F2; } .woocommerce a.button.alt, .woocommerce-page a.button.alt, .woocommerce button.button.alt, .woocommerce-page button.button.alt, .woocommerce input.button.alt, .woocommerce-page input.button.alt, .woocommerce #respond input#submit.alt, .woocommerce-page #respond input#submit.alt, .woocommerce #content input.button.alt, .woocommerce-page #content input.button.alt, .woocommerce a.button, .woocommerce-page a.button, .woocommerce button.button, .woocommerce-page button.button, .woocommerce input.button, .woocommerce-page input.button, .woocommerce #respond input#submit, .woocommerce-page #respond input#submit, .woocommerce #content input.button, .woocommerce-page #content input.button, .woocommerce-message, .woocommerce-error, .woocommerce-info { background: #2EA3F2 !important; } #et_search_icon:hover, .mobile_menu_bar:before, .footer-widget h4, .et-social-icon a:hover, .comment-reply-link, .form-submit input, .et_pb_sum, .et_pb_pricing li a, .et_pb_pricing_table_button, .et_overlay:before, .entry-summary p.price ins, .woocommerce div.product span.price, .woocommerce-page div.product span.price, .woocommerce #content div.product span.price, .woocommerce-page #content div.product span.price, .woocommerce div.product p.price, .woocommerce-page div.product p.price, .woocommerce #content div.product p.price, .woocommerce-page #content div.product p.price, .et_pb_member_social_links a:hover { color: #2EA3F2 !important; } .woocommerce .star-rating span:before, .woocommerce-page .star-rating span:before, .et_pb_widget li a:hover, .et_pb_bg_layout_light .et_pb_promo_button, .et_pb_bg_layout_light .et_pb_more_button, .et_pb_filterable_portfolio .et_pb_portfolio_filters li a.active, .et_pb_filterable_portfolio .et_pb_portofolio_pagination ul li a.active, .et_pb_gallery .et_pb_gallery_pagination ul li a.active, .wp-pagenavi span.current, .wp-pagenavi a:hover, .et_pb_contact_submit, .et_pb_bg_layout_light .et_pb_newsletter_button, .nav-single a, .posted_in a { color: #2EA3F2 !important; } .et-search-form, .nav li ul, .et_mobile_menu, .footer-widget li:before, .et_pb_pricing li:before, blockquote { border-color: #2EA3F2; } #main-footer { background-color: #222222; } #top-menu a { color: #666666; } #top-menu li.current-menu-ancestor > a, #top-menu li.current-menu-item > a, .bottom-nav li.current-menu-item > a { color: #2EA3F2; } h1, h2, h3, h4, h5, h6 { font-family: 'Droid Sans', Helvetica, Arial, Lucida, sans-serif; }body, input, textarea, select { font-family: 'Droid Sans', Helvetica, Arial, Lucida, sans-serif; } </style></head><body class="home page page-id-57 page-template-default et_fixed_nav et_boxed_layout et_cover_background et_right_sidebar unknown et_includes_sidebar"> <div id="page-container"> <header id="main-header" class="et_nav_text_color_dark"> <div class="container clearfix"> <a href="https://jabber.lqdn.fr/"> <img src="https://jabber.lqdn.fr/wp-content/uploads/2014/08/logo_laquadrature-net_jabber_horiz_petit1.png" alt="Jabber LQDN" id="logo" /> </a> <div id="et-top-navigation"> <nav id="top-menu-nav"> <ul id="top-menu" class="nav"> <li class="page_item page-item-41"><a href="https://jabber.lqdn.fr/?page_id=41">Comment utiliser ce service ?</a></li><li class="page_item page-item-68"><a href="https://jabber.lqdn.fr/?page_id=68">FAQ</a></li> <li class="cat-item cat-item-4"><a href="https://jabber.lqdn.fr/?cat=4" title="français">fr</a></li> </ul> </nav> <div id="et_top_search"> <span id="et_search_icon"></span> <form role="search" method="get" class="et-search-form et-hidden" action="https://jabber.lqdn.fr/"> <input type="search" class="et-search-field" placeholder="Search &hellip;" value="" name="s" title="Search for:" /> </form> </div> <div id="et_mobile_nav_menu"> <a href="#" class="mobile_nav closed"> <span class="select_page">Select Page</span> <span class="mobile_menu_bar"></span> </a> </div> </div> <!-- #et-top-navigation --> </div> <!-- .container --> </header> <!-- #main-header --> <div id="et-main-area"><div id="main-content"> <div class="container"> <div id="content-area" class="clearfix"> <div id="left-area">
\ No newline at end of file
<?php
require_once("config.php");
session_start();
$debug=false;
if (isset($_POST["email"]) && isset($_POST["login"]) && isset($_POST["csrf"]) && isset($_POST["captcha"])
) {
if ($_SESSION["captcha"]!=$_POST["cap"]) {
$error[]=_("The captcha is incorrect, please try again");
}
if (!csrf_check($_POST["csrf"])) {
$error[]=_("The captcha is incorrect, please try again (2)");
}
$login=fixlogin($_POST["login"]);
if ($login!=$_POST["login"] || strlen($login)<3 || strlen($login)>80) {
$error[]=_("The login must be between 3 and 80 characters long, and must not contains special characters (unicode and accents authorized though)");
}
if (count($error)==0) {
sleep(5); // Let create some artificial waiting for the one who want to restore many accounts ...
// Try to create the account.
$already=@mysql_fetch_assoc(mysql_query("SELECT id FROM accounts WHERE jabberid='".addslashes($_POST["login"]."@jabber.lqdn.fr")."';"));
if (!$already) {
$error[]=_("This account doesn't exist, or have been permanently destroyed. You can't restore that login now. You'd better create a new account altogether");
}
if (count($error)==0) {
} // still no error ?
} // no error ?
} // isset ?
require_once("header.php");
?>
<style type="text/css">
.error {
color: #F00;
background-color: #FEE;
padding: 10px;
margin: 10px;
border: 2px solid #F00;
}
.info {
color: #090;
background-color: #EFE;
padding: 10px;
margin: 10px;
border: 2px solid #090;
}
sup {
color:red; font-size: 0.6em
}
.wichtig { display: none }
.btn {
padding: 6px 10px; background: #497ed5; color: white; font-weight: bold;
}
</style>
<p>
<b><?php __("Menu:"); ?></b>
<a href="create.php"><?php __("Create an account"); ?></a> -
<?php __("I lost my password"); ?> -
<a href="disabled.php"><?php __("My account is disabled"); ?></a>
</p>
<h1><?php __("I lost my password on this Jabber server"); ?></h1>
<?php
if (count($error)) {
echo "<div class=\"error\">";
foreach($error as $e) echo $e."<br>\n";
echo "</div>";
}
if (count($info)) {
echo "<div class=\"info\">";
foreach($info as $e) echo $e."<br>\n";
echo "</div>";
}
?>
<p><?php __("If you have lost your password in this Jabber server, and if you entered an email address when you created that account, please enter your login and the email you use at that time. You will receive an email with a link to reset your password for this account."); ?></p>
<form method="post" action="lost.php">
<input type="hidden" name="csrf" value="<?php echo csrf_gen(); ?>" />
<table style="width: 700px">
<tr><th style="width: 200px"><?php __("Login"); ?><sup>*</sup> <br /><i><small><?php __("3 characters or more"); ?></small></i></th>
<td><input type="text" name="login" id="login" value="<?php eher("login"); ?>" style="width: 200px" />@jabber.lqdn.fr</td></tr>
<tr><th><?php __("Your email address"); ?></th>
<td><input type="text" name="email" id="email" value="<?php eher("email"); ?>" style="width: 300px"/></td></tr>
<tr><th><?php __("Enter this word to prove you are human"); ?><sup>*</sup></th>
<td>
<img src="cap.php">
<br />
<input type="text" name="cap" id="cap" value="" style="width: 200px"/>
</td></tr>
</table>
<div class="wichtig">
<?php __("Don't put anything in this field"); ?><input type="text" name="url" id="url" value="" style="width: 200px"/>
</div>
<input type="submit" name="go" value="<?php __("Send me a password restore link by mail"); ?>" class="btn" id="go"/>
</form>
<p>&nbsp;</p>
<?php
require_once("footer.php");
?>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment