unified style and added error handling

This commit is contained in:
Patrick Di Fazio
2025-12-25 21:26:13 +01:00
parent 47a49b03be
commit 26273fdf4e
6 changed files with 553 additions and 430 deletions

View File

@@ -212,85 +212,99 @@ class Handler(BaseHTTPRequestHandler):
time.sleep(1) time.sleep(1)
self.send_response(200) try:
self.send_header('Content-type', 'text/html') self.send_response(200)
self.end_headers() self.send_header('Content-type', 'text/html')
self.wfile.write(html_templates.login_error().encode()) self.end_headers()
self.wfile.write(html_templates.login_error().encode())
except BrokenPipeError:
# Client disconnected before receiving response, ignore silently
pass
except Exception as e:
# Log other exceptions but don't crash
print(f"[ERROR] Failed to send response to {client_ip}: {str(e)}")
def serve_special_path(self, path: str) -> bool: def serve_special_path(self, path: str) -> bool:
"""Serve special paths like robots.txt, API endpoints, etc.""" """Serve special paths like robots.txt, API endpoints, etc."""
if path == '/robots.txt': try:
self.send_response(200) if path == '/robots.txt':
self.send_header('Content-type', 'text/plain') self.send_response(200)
self.end_headers() self.send_header('Content-type', 'text/plain')
self.wfile.write(html_templates.robots_txt().encode()) self.end_headers()
return True self.wfile.write(html_templates.robots_txt().encode())
return True
if path in ['/credentials.txt', '/passwords.txt', '/admin_notes.txt']:
self.send_response(200) if path in ['/credentials.txt', '/passwords.txt', '/admin_notes.txt']:
self.send_header('Content-type', 'text/plain') self.send_response(200)
self.end_headers() self.send_header('Content-type', 'text/plain')
if 'credentials' in path: self.end_headers()
self.wfile.write(credentials_txt().encode()) if 'credentials' in path:
else: self.wfile.write(credentials_txt().encode())
self.wfile.write(passwords_txt().encode()) else:
return True self.wfile.write(passwords_txt().encode())
return True
if path in ['/users.json', '/api_keys.json', '/config.json']:
self.send_response(200) if path in ['/users.json', '/api_keys.json', '/config.json']:
self.send_header('Content-type', 'application/json') self.send_response(200)
self.end_headers() self.send_header('Content-type', 'application/json')
if 'users' in path: self.end_headers()
self.wfile.write(users_json().encode()) if 'users' in path:
elif 'api_keys' in path: self.wfile.write(users_json().encode())
self.wfile.write(api_keys_json().encode()) elif 'api_keys' in path:
else: self.wfile.write(api_keys_json().encode())
self.wfile.write(api_response('/api/config').encode()) else:
return True self.wfile.write(api_response('/api/config').encode())
return True
if path in ['/admin', '/admin/', '/admin/login', '/login']:
self.send_response(200) if path in ['/admin', '/admin/', '/admin/login', '/login']:
self.send_header('Content-type', 'text/html') self.send_response(200)
self.end_headers() self.send_header('Content-type', 'text/html')
self.wfile.write(html_templates.login_form().encode()) self.end_headers()
return True self.wfile.write(html_templates.login_form().encode())
return True
# WordPress login page
if path in ['/wp-login.php', '/wp-login', '/wp-admin', '/wp-admin/']: # WordPress login page
self.send_response(200) if path in ['/wp-login.php', '/wp-login', '/wp-admin', '/wp-admin/']:
self.send_header('Content-type', 'text/html') self.send_response(200)
self.end_headers() self.send_header('Content-type', 'text/html')
self.wfile.write(html_templates.wp_login().encode()) self.end_headers()
return True self.wfile.write(html_templates.wp_login().encode())
return True
if path in ['/wp-content/', '/wp-includes/'] or 'wordpress' in path.lower():
self.send_response(200) if path in ['/wp-content/', '/wp-includes/'] or 'wordpress' in path.lower():
self.send_header('Content-type', 'text/html') self.send_response(200)
self.end_headers() self.send_header('Content-type', 'text/html')
self.wfile.write(html_templates.wordpress().encode()) self.end_headers()
return True self.wfile.write(html_templates.wordpress().encode())
return True
if 'phpmyadmin' in path.lower() or path in ['/pma/', '/phpMyAdmin/']:
self.send_response(200) if 'phpmyadmin' in path.lower() or path in ['/pma/', '/phpMyAdmin/']:
self.send_header('Content-type', 'text/html') self.send_response(200)
self.end_headers() self.send_header('Content-type', 'text/html')
self.wfile.write(html_templates.phpmyadmin().encode()) self.end_headers()
return True self.wfile.write(html_templates.phpmyadmin().encode())
return True
if path.startswith('/api/') or path.startswith('/api') or path in ['/.env']:
self.send_response(200) if path.startswith('/api/') or path.startswith('/api') or path in ['/.env']:
self.send_header('Content-type', 'application/json') self.send_response(200)
self.end_headers() self.send_header('Content-type', 'application/json')
self.wfile.write(api_response(path).encode()) self.end_headers()
return True self.wfile.write(api_response(path).encode())
return True
if path in ['/backup/', '/uploads/', '/private/', '/admin/', '/config/', '/database/']:
self.send_response(200) if path in ['/backup/', '/uploads/', '/private/', '/admin/', '/config/', '/database/']:
self.send_header('Content-type', 'text/html') self.send_response(200)
self.end_headers() self.send_header('Content-type', 'text/html')
self.wfile.write(directory_listing(path).encode()) self.end_headers()
return True self.wfile.write(directory_listing(path).encode())
return True
except BrokenPipeError:
# Client disconnected, ignore silently
pass
except Exception as e:
print(f"[ERROR] Failed to serve special path {path}: {str(e)}")
pass
return False return False
@@ -306,6 +320,8 @@ class Handler(BaseHTTPRequestHandler):
try: try:
stats = self.tracker.get_stats() stats = self.tracker.get_stats()
self.wfile.write(generate_dashboard(stats).encode()) self.wfile.write(generate_dashboard(stats).encode())
except BrokenPipeError:
pass
except Exception as e: except Exception as e:
print(f"Error generating dashboard: {e}") print(f"Error generating dashboard: {e}")
return return
@@ -337,6 +353,9 @@ class Handler(BaseHTTPRequestHandler):
if Handler.counter < 0: if Handler.counter < 0:
Handler.counter = self.config.canary_token_tries Handler.counter = self.config.canary_token_tries
except BrokenPipeError:
# Client disconnected, ignore silently
pass
except Exception as e: except Exception as e:
print(f"Error generating page: {e}") print(f"Error generating page: {e}")

View File

@@ -1,29 +1,108 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>Login Failed</title> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="robots" content="noindex, nofollow">
<title>Error</title>
<style> <style>
body {{ font-family: Arial, sans-serif; background: #f0f0f0; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; }} * {
.login-box {{ background: white; padding: 40px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); width: 300px; }} margin: 0;
h2 {{ margin-top: 0; color: #333; }} padding: 0;
.error {{ color: #d63301; background: #ffebe8; border: 1px solid #d63301; padding: 12px; margin-bottom: 20px; border-radius: 4px; }} box-sizing: border-box;
input {{ width: 100%; padding: 10px; margin: 10px 0; border: 1px solid #ddd; border-radius: 4px; box-sizing: border-box; }} }
button {{ width: 100%; padding: 10px; background: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; }}
button:hover {{ background: #0056b3; }} body {
a {{ color: #007bff; font-size: 14px; }} font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
background: #f5f5f5;
display: flex;
align-items: center;
justify-content: center;
min-height: 100vh;
padding: 20px;
}
.container {
background: white;
padding: 40px;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
width: 100%;
max-width: 400px;
text-align: center;
}
h1 {
font-size: 32px;
margin-bottom: 10px;
color: #d32f2f;
}
.error-message {
background: #ffebee;
border-left: 4px solid #d32f2f;
padding: 15px;
margin: 20px 0;
border-radius: 4px;
color: #c62828;
font-size: 14px;
line-height: 1.5;
}
p {
color: #666;
font-size: 14px;
margin: 15px 0;
line-height: 1.6;
}
.links-section {
margin-top: 20px;
font-size: 13px;
}
.links-section a {
color: #2196f3;
text-decoration: none;
margin: 0 10px;
}
.links-section a:hover {
text-decoration: underline;
}
.back-btn {
display: inline-block;
margin-top: 20px;
padding: 10px 20px;
background: #2196f3;
color: white;
text-decoration: none;
border-radius: 4px;
font-size: 14px;
font-weight: 500;
}
.back-btn:hover {
background: #1976d2;
}
</style> </style>
</head> </head>
<body> <body>
<div class="login-box"> <div class="container">
<h2>Admin Login</h2> <h1>⚠ Error</h1>
<div class="error"><strong>ERROR:</strong> Invalid username or password.</div>
<form action="/admin/login" method="post"> <div class="error-message">
<input type="text" name="username" placeholder="Username" required> Login Failed. Please try again.
<input type="password" name="password" placeholder="Password" required> </div>
<button type="submit">Login</button>
</form> <p>If the problem persists, please contact support.</p>
<p style="margin-top: 20px; text-align: center;"><a href="/forgot-password">Forgot your password?</a></p>
<div class="links-section">
<a href="/forgot-password">Forgot password?</a>
</div>
<a href="/" class="back-btn">← Back to Home</a>
</div> </div>
</body> </body>
</html> </html>

View File

@@ -1,25 +1,156 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="robots" content="noindex, nofollow">
<title>Admin Login</title> <title>Admin Login</title>
<style> <style>
body {{ font-family: Arial, sans-serif; background: #f0f0f0; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; }} * {
.login-box {{ background: white; padding: 40px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); width: 300px; }} margin: 0;
h2 {{ margin-top: 0; color: #333; }} padding: 0;
input {{ width: 100%; padding: 10px; margin: 10px 0; border: 1px solid #ddd; border-radius: 4px; box-sizing: border-box; }} box-sizing: border-box;
button {{ width: 100%; padding: 10px; background: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; }} }
button:hover {{ background: #0056b3; }}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
background: #f5f5f5;
display: flex;
align-items: center;
justify-content: center;
min-height: 100vh;
padding: 20px;
}
.container {
background: white;
padding: 40px;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
width: 100%;
max-width: 400px;
}
h1 {
font-size: 28px;
margin-bottom: 10px;
color: #333;
text-align: center;
}
.subtitle {
text-align: center;
color: #666;
font-size: 14px;
margin-bottom: 30px;
}
label {
display: block;
margin: 15px 0 5px 0;
font-weight: 500;
color: #333;
font-size: 14px;
}
input[type="text"],
input[type="password"],
input[type="email"] {
width: 100%;
padding: 10px;
margin: 5px 0 15px 0;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 14px;
transition: border-color 0.3s;
}
input[type="text"]:focus,
input[type="password"]:focus,
input[type="email"]:focus {
outline: none;
border-color: #2196f3;
box-shadow: 0 0 0 2px rgba(33, 150, 243, 0.1);
}
.remember-me {
display: flex;
align-items: center;
margin: 15px 0;
font-size: 13px;
}
.remember-me input {
margin: 0 8px 0 0;
width: auto;
}
button {
width: 100%;
padding: 10px;
background: #2196f3;
color: white;
border: none;
border-radius: 4px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: background 0.3s;
margin-top: 10px;
}
button:hover {
background: #1976d2;
}
button:active {
background: #1565c0;
}
.links {
text-align: center;
margin-top: 20px;
padding-top: 20px;
border-top: 1px solid #eee;
font-size: 13px;
}
.links a {
color: #2196f3;
text-decoration: none;
display: block;
margin: 8px 0;
}
.links a:hover {
text-decoration: underline;
}
</style> </style>
</head> </head>
<body> <body>
<div class="login-box"> <div class="container">
<h2>Admin Login</h2> <h1>Admin Panel</h1>
<p class="subtitle">Please log in to continue</p>
<form action="/admin/login" method="post"> <form action="/admin/login" method="post">
<input type="text" name="username" placeholder="Username" required> <label for="username">Username</label>
<input type="password" name="password" placeholder="Password" required> <input type="text" id="username" name="username" placeholder="Enter your username" autocomplete="username" autofocus required>
<button type="submit">Login</button>
<label for="password">Password</label>
<input type="password" id="password" name="password" placeholder="Enter your password" autocomplete="current-password" required>
<div class="remember-me">
<input type="checkbox" id="remember" name="remember" value="1">
<label for="remember" style="margin: 0;">Remember me</label>
</div>
<button type="submit">Sign In</button>
</form> </form>
<div class="links">
<a href="/forgot-password">Forgot your password?</a>
<a href="/">← Back to Home</a>
</div>
</div> </div>
</body> </body>
</html> </html>

View File

@@ -1,285 +1,166 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" dir="ltr"> <html>
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="noindex,nofollow"> <meta name="robots" content="noindex,nofollow">
<title>phpMyAdmin</title> <title>phpMyAdmin</title>
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><rect fill='%236c78af' width='32' height='32' rx='4'/><text x='16' y='22' font-size='18' fill='white' text-anchor='middle' font-family='sans-serif' font-weight='bold'>pma</text></svg>">
<style> <style>
* {{ body {
box-sizing: border-box; font-family: 'Segoe UI', Tahoma, sans-serif;
}} margin: 0;
body {{ background: #f0f0f0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; }
font-size: 14px; .header {
background: #fffffc; background: #2979ff;
color: white;
padding: 10px 20px;
}
.header h1 {
margin: 0; margin: 0;
padding: 0;
color: #444;
}}
#page_content {{
margin: 0 auto;
max-width: 960px;
padding: 20px;
}}
.container-fluid {{
display: flex;
min-height: 100vh;
}}
#pma_navigation {{
width: 240px;
background: #f3f3f3;
border-right: 1px solid #ddd;
padding: 10px;
}}
#pma_navigation_header {{
text-align: center;
padding: 15px 10px;
border-bottom: 1px solid #ddd;
margin-bottom: 10px;
}}
#pma_navigation_header img {{
max-width: 160px;
}}
.logo-text {{
font-size: 24px; font-size: 24px;
font-weight: bold; }
color: #6c78af; .login {
}} background: white;
.logo-text span {{ width: 400px;
color: #f89c0e; margin: 100px auto;
}} padding: 30px;
#pma_main {{ border-radius: 4px;
flex: 1; box-shadow: 0 2px 4px rgba(0,0,0,0.1);
padding: 20px; }
background: #fff; .login h2 {
}} margin-top: 0;
.login_form {{ color: #333;
max-width: 500px; font-size: 18px;
margin: 40px auto; }
background: #fff; input[type="text"],
input[type="password"],
select {
width: 100%;
padding: 8px;
margin: 8px 0;
border: 1px solid #ddd; border: 1px solid #ddd;
border-radius: 4px; border-radius: 4px;
box-shadow: 0 1px 3px rgba(0,0,0,0.08); box-sizing: border-box;
}}
.login_form h1 {{
background: #f3f3f3;
margin: 0;
padding: 15px 20px;
font-size: 16px;
font-weight: normal;
border-bottom: 1px solid #ddd;
color: #333;
}}
.login_form h1 img {{
vertical-align: middle;
margin-right: 8px;
}}
.login_form form {{
padding: 20px;
}}
.item {{
margin-bottom: 15px;
}}
.item label {{
display: block;
margin-bottom: 5px;
font-weight: 500;
color: #333;
}}
.item input[type="text"],
.item input[type="password"],
.item select {{
width: 100%;
padding: 8px 10px;
border: 1px solid #aaa;
border-radius: 2px;
font-size: 14px; font-size: 14px;
background: #fff; }
}} input[type="text"]:focus,
.item input:focus, input[type="password"]:focus,
.item select:focus {{ select:focus {
border-color: #6c78af; border-color: #2979ff;
outline: none; outline: none;
box-shadow: 0 0 0 2px rgba(108, 120, 175, 0.2); box-shadow: 0 0 0 2px rgba(41, 121, 255, 0.1);
}} }
.item select {{ label {
cursor: pointer; display: block;
}} margin: 12px 0 5px 0;
.checkbox-item {{
display: flex;
align-items: center;
gap: 8px;
}}
.checkbox-item input {{
margin: 0;
}}
fieldset {{
border: 1px solid #ddd;
border-radius: 2px;
padding: 15px;
margin: 0 0 15px 0;
}}
legend {{
font-weight: 500; font-weight: 500;
padding: 0 8px;
color: #333; color: #333;
}} font-size: 13px;
.btn {{ }
display: inline-block; button {
padding: 8px 20px; width: 100%;
background: #6c78af; padding: 10px 20px;
color: #fff; background: #2979ff;
color: white;
border: none; border: none;
border-radius: 2px; border-radius: 4px;
cursor: pointer; cursor: pointer;
font-size: 14px; font-size: 14px;
font-weight: 500; font-weight: 500;
}} margin-top: 15px;
.btn:hover {{ }
background: #5a6699; button:hover {
}} background: #1565c0;
.server-choice {{ }
display: flex; button:active {
gap: 10px; background: #0d47a1;
margin-bottom: 15px; }
}} .lang-select {
.server-choice label {{
display: flex;
align-items: center;
gap: 5px;
cursor: pointer;
}}
.footer {{
text-align: center;
margin-top: 20px;
padding-top: 15px;
border-top: 1px solid #ddd;
font-size: 12px;
color: #888;
}}
.footer a {{
color: #6c78af;
text-decoration: none;
}}
.footer a:hover {{
text-decoration: underline;
}}
.lang-select {{
margin-top: 15px; margin-top: 15px;
padding-top: 15px; padding-top: 15px;
border-top: 1px solid #eee; border-top: 1px solid #eee;
}} }
.lang-select label {{ .lang-select label {
display: inline; display: inline;
margin-right: 10px; margin-right: 10px;
}} margin: 0 10px 0 0;
.lang-select select {{ }
.lang-select select {
width: auto; width: auto;
padding: 5px 10px; padding: 5px 10px;
}} margin: 8px 0;
.nav-item {{ }
padding: 8px 12px; .footer {
color: #333; text-align: center;
margin-top: 20px;
padding-top: 15px;
border-top: 1px solid #eee;
font-size: 12px;
color: #888;
}
.footer a {
color: #2979ff;
text-decoration: none; text-decoration: none;
display: block; }
border-radius: 2px; .footer a:hover {
}} text-decoration: underline;
.nav-item:hover {{ }
background: #e8e8e8; @media (max-width: 480px) {
}} .login {
.error-message {{ width: 90%;
display: none; margin: 50px auto;
}} padding: 20px;
@media (max-width: 768px) {{ }
.container-fluid {{ .login h2 {
flex-direction: column; font-size: 16px;
}} }
#pma_navigation {{ }
width: 100%;
border-right: none;
border-bottom: 1px solid #ddd;
}}
.login_form {{
margin: 20px;
}}
}}
</style> </style>
</head> </head>
<body> <body>
<div class="container-fluid"> <div class="header">
<div id="pma_navigation"> <h1>phpMyAdmin</h1>
<div id="pma_navigation_header"> </div>
<div class="logo-text">php<span>My</span>Admin</div> <div class="login">
</div> <h2>MySQL Server Login</h2>
<nav> <form action="/phpmyadmin/index.php" method="post" autocomplete="off">
<a href="#" class="nav-item">Databases</a> <label for="username">Username:</label>
<a href="#" class="nav-item">SQL</a> <input type="text" name="pma_username" id="username" placeholder="Username" autocomplete="username" autofocus>
<a href="#" class="nav-item">Status</a>
<a href="#" class="nav-item">User accounts</a> <label for="password">Password:</label>
<a href="#" class="nav-item">Export</a> <input type="password" name="pma_password" id="password" placeholder="Password" autocomplete="current-password">
<a href="#" class="nav-item">Import</a>
<a href="#" class="nav-item">Settings</a> <button type="submit">Go</button>
</nav>
</div> <div class="lang-select">
<div id="pma_main"> <label for="lang">Language:</label>
<div class="login_form"> <select name="lang" id="lang">
<h1> <option value="en" selected>English</option>
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#6c78af" stroke-width="2" style="vertical-align: middle; margin-right: 8px;"> <option value="de">Deutsch</option>
<rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect> <option value="es">Español</option>
<path d="M7 11V7a5 5 0 0 1 10 0v4"></path> <option value="fr">Français</option>
</svg> <option value="it">Italiano</option>
Log in <option value="ja">日本語</option>
</h1> <option value="ko">한국어</option>
<form method="post" action="/phpmyadmin/index.php" name="login_form" autocomplete="off"> <option value="nl">Nederlands</option>
<fieldset> <option value="pl">Polski</option>
<legend>Log in</legend> <option value="pt">Português</option>
<div class="item"> <option value="ru">Русский</option>
<label for="input_servername">Server Choice:</label> <option value="zh">中文</option>
<select name="server" id="input_servername"> </select>
<option value="1">127.0.0.1</option>
<option value="2">localhost</option>
</select>
</div>
<div class="item">
<label for="input_username">Username:</label>
<input type="text" name="pma_username" id="input_username" value="" autocomplete="username" autofocus>
</div>
<div class="item">
<label for="input_password">Password:</label>
<input type="password" name="pma_password" id="input_password" value="" autocomplete="current-password">
</div>
</fieldset>
<input type="hidden" name="token" value="a1b2c3d4e5f6g7h8i9j0">
<input type="hidden" name="set_session" value="1">
<button type="submit" class="btn" id="input_go" value="Log in">Log in</button>
<div class="lang-select">
<label for="lang_select">Language:</label>
<select name="lang" id="lang_select">
<option value="en" selected>English</option>
<option value="de">Deutsch</option>
<option value="es">Español</option>
<option value="fr">Français</option>
<option value="it">Italiano</option>
<option value="ja">日本語</option>
<option value="ko">한국어</option>
<option value="nl">Nederlands</option>
<option value="pl">Polski</option>
<option value="pt">Português</option>
<option value="ru">Русский</option>
<option value="zh">中文</option>
</select>
</div>
</form>
<div class="footer">
<a href="https://www.phpmyadmin.net/docs/" target="_blank">Documentation</a> |
<a href="https://www.phpmyadmin.net/" target="_blank">Official Homepage</a> |
<a href="https://github.com/phpmyadmin/phpmyadmin" target="_blank">Contribute</a>
<br><br>
phpMyAdmin 5.2.1
</div>
</div> </div>
<input type="hidden" name="token" value="a1b2c3d4e5f6g7h8i9j0">
<input type="hidden" name="set_session" value="1">
</form>
<div class="footer">
<a href="https://www.phpmyadmin.net/docs/" target="_blank">Documentation</a> |
<a href="https://www.phpmyadmin.net/" target="_blank">Official Homepage</a> |
<a href="https://github.com/phpmyadmin/phpmyadmin" target="_blank">Contribute</a>
<br><br>
phpMyAdmin 5.2.1
</div> </div>
</div> </div>
</body> </body>

View File

@@ -7,6 +7,8 @@ Disallow: /database/
Disallow: /private/ Disallow: /private/
Disallow: /uploads/ Disallow: /uploads/
Disallow: /wp-admin/ Disallow: /wp-admin/
Disallow: /login/
Disallow: /admin/login
Disallow: /phpMyAdmin/ Disallow: /phpMyAdmin/
Disallow: /admin/login.php Disallow: /admin/login.php
Disallow: /api/v1/users Disallow: /api/v1/users

View File

@@ -5,12 +5,12 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="robots" content="max-image-preview:large, noindex, noarchive"> <meta name="robots" content="max-image-preview:large, noindex, noarchive">
<title>Log In &lsaquo; WordPress &mdash; WordPress</title> <title>Log In &lsaquo; WordPress &mdash; WordPress</title>
<style> <style type="text/css">
html {{ html {
background: #f0f0f1; background: #f0f0f1;
min-height: 100%; min-height: 100%;
}} }
body {{ body {
background: #f0f0f1; background: #f0f0f1;
min-height: 100%; min-height: 100%;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
@@ -19,34 +19,45 @@
color: #3c434a; color: #3c434a;
margin: 0; margin: 0;
padding: 0; padding: 0;
}} }
a {{ a {
color: #2271b1; color: #2271b1;
text-decoration: none; text-decoration: none;
}} }
a:hover, a:active {{ a:hover, a:active {
color: #135e96; color: #135e96;
}} }
#login {{ #login {
width: 320px; width: 320px;
padding: 8% 0 0; padding: 8% 0 0;
margin: auto; margin: auto;
}} }
#login h1 {{ #login h1 {
text-align: center; text-align: center;
}} margin: 0 0 20px;
#login h1 a {{ }
background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA4NCA4NCI+PHBhdGggZD0iTTQyIDBDMTguOCAwIDAgMTguOCAwIDQyczE4LjggNDIgNDIgNDIgNDItMTguOCA0Mi00MlM2NS4yIDAgNDIgMHptMCA3OC40QzIxLjggNzguNCA1LjYgNjIuMiA1LjYgNDJTMjEuOCA1LjYgNDIgNS42IDc4LjQgMjEuOCA3OC40IDQyIDYyLjIgNzguNCA0MiA3OC40ek0yMC4xIDQyYzAgNy42IDQuNSAxNC4yIDEwLjkgMTcuM2wtOS4yLTI1LjJjLTEuMSAyLjUtMS43IDUuMi0xLjcgNy45em0zNi44LTEuMWMwLTIuNC0uOS01LjYtMi40LTcuMi0xLjUtMi0zLTMuNC0zLTUuMiAwLTIgMS41LTMuOSAzLjctMy45aC4zYy00LjktNC42LTExLjQtNy40LTE4LjUtNy40LTkuNiAwLTE4IDQuOS0yMi45IDEyLjMuNiAwIDEuMiAwIDEuNyAwIDIuOCAwIDcuMi0uMyA3LjItLjNzLjItLjEuMi0uMi0xLjUtLjEtMS41LS4xYy45LTEuMSAxLjYtMy4xIDEuNi0zLjEuMiAwIDEuOS41IDIuNS41cy42LjEuNi4xYy0xLjMuOC0xLjUgMy4xLTEuNSAzLjFzMCAuNC40LjRjLjMgMCAuOC0uMy44LS4zLjguNCAxLjcgMi4xIDEuNyAyLjF2LS4yYy42IDEuNCAyLjMgNS4yIDIuMyA1LjIgMS4xIDMuMiAyLjggNS41IDQuMSA3LjIgMS4zIDEuNyAyLjggMy4xIDQuNCAzLjggNC4yLTEuMSA3LjItNC4zIDguNS03LjZsLjItLjVjLjEtLjMuMi0uNi40LTFsLTYuNi0xOGMtLjYtMS42LTEtMi43LTEuNC0zLjhoLS41Yy0uNCAwLS43LjEtLjcuMS0uMS4xLjIuMi4yLjJzMS40LjEgMi4yLjRjLjkuMiAyIC43IDIgLjcuMy4xLjcuMy43LjNzLjEgMCAuMS0uMWMwIDAgLjEtLjItLjQtLjQtLjMtLjEtMS0uMy0xLjYtLjUtLjUtLjEtLjktLjItMS0uMi0uMSAwLS4xLS4xLS4xLS4xdi0uMWMwIC4xLjEuMS4xLjFzMCAuMS0uMS4xYy0uMi4xLjEuMy41LjVzLjkuNSAxLjQuN2MuNi4zIDEuMS43IDEuNC45LjMuMy42LjkuOSAxLjIuMy40LjYgMS4xLjggMS43bDQuMSAxMy44YzIuNy0xLjEgNC42LTMuNyA0LjYtNi43eiIgZmlsbD0iIzMzMzMzMyIvPjwvc3ZnPg=='); #login h1 {
background-size: 84px; text-align: center;
background-position: center top; margin: 0 0 30px;
background-repeat: no-repeat; font-size: 28px;
font-weight: 400;
color: #3c434a; color: #3c434a;
height: 84px; }
font-size: 0;
#login h1 a {
color: #2271b1;
text-decoration: none;
font-weight: 600;
font-size: 28px;
display: block; display: block;
outline: 0; background: none;
}} height: auto;
.login form {{ }
#login h1 a:hover {
color: #135e96;
}
.login form {
margin-top: 20px; margin-top: 20px;
margin-left: 0; margin-left: 0;
padding: 26px 24px 34px; padding: 26px 24px 34px;
@@ -55,8 +66,8 @@
background: #fff; background: #fff;
border: 1px solid #c3c4c7; border: 1px solid #c3c4c7;
box-shadow: 0 1px 3px rgba(0, 0, 0, .04); box-shadow: 0 1px 3px rgba(0, 0, 0, .04);
}} }
.login form .input, .login input[type="text"], .login input[type="password"] {{ .login form .input, .login input[type="text"], .login input[type="password"] {
font-size: 24px; font-size: 24px;
width: 100%; width: 100%;
padding: 3px; padding: 3px;
@@ -66,29 +77,29 @@
box-shadow: none; box-shadow: none;
color: #2c3338; color: #2c3338;
outline: none; outline: none;
}} }
.login form .input:focus {{ .login form .input:focus {
border-color: #2271b1; border-color: #2271b1;
box-shadow: 0 0 0 1px #2271b1; box-shadow: 0 0 0 1px #2271b1;
}} }
.login label {{ .login label {
font-size: 14px; font-size: 14px;
line-height: 1.5; line-height: 1.5;
display: inline-block; display: block;
margin-bottom: 3px; margin-bottom: 8px;
}} }
.login .forgetmenot {{ .login .forgetmenot {
margin: 2px 0 24px; margin: 2px 0 24px;
}} }
.login .forgetmenot label {{ .login .forgetmenot label {
font-size: 12px; font-size: 12px;
display: flex; display: flex;
align-items: center; align-items: center;
}} }
.login .forgetmenot input {{ .login .forgetmenot input {
margin: 0 4px 0 0; margin: 0 4px 0 0;
}} }
.wp-hide-pw {{ .wp-hide-pw {
position: absolute; position: absolute;
right: 0; right: 0;
top: 0; top: 0;
@@ -98,17 +109,17 @@
border: none; border: none;
color: #2271b1; color: #2271b1;
cursor: pointer; cursor: pointer;
}} }
.wp-hide-pw:hover {{ .wp-hide-pw:hover {
color: #135e96; color: #135e96;
}} }
.user-pass-wrap {{ .user-pass-wrap {
position: relative; position: relative;
}} }
.wp-pwd {{ .wp-pwd {
position: relative; position: relative;
}} }
#wp-submit {{ #wp-submit {
float: right; float: right;
text-decoration: none; text-decoration: none;
font-size: 13px; font-size: 13px;
@@ -123,57 +134,57 @@
box-sizing: border-box; box-sizing: border-box;
background: #2271b1; background: #2271b1;
color: #fff; color: #fff;
}} }
#wp-submit:hover {{ #wp-submit:hover {
background: #135e96; background: #135e96;
border-color: #135e96; border-color: #135e96;
color: #fff; color: #fff;
}} }
p.submit {{ p.submit {
margin-bottom: 0; margin-bottom: 0;
}} }
#nav {{ #nav {
margin: 24px 0 0 0; margin: 24px 0 0 0;
padding: 0; padding: 0;
text-align: center; text-align: center;
}} }
#nav a {{ #nav a {
color: #50575e; color: #50575e;
}} }
#nav a:hover {{ #nav a:hover {
color: #135e96; color: #135e96;
}} }
#backtoblog {{ #backtoblog {
margin: 16px 0 0 0; margin: 16px 0 0 0;
padding: 0; padding: 0;
text-align: center; text-align: center;
}} }
#backtoblog a {{ #backtoblog a {
color: #50575e; color: #50575e;
}} }
#backtoblog a:hover {{ #backtoblog a:hover {
color: #135e96; color: #135e96;
}} }
.privacy-policy-page-link {{ .privacy-policy-page-link {
text-align: center; text-align: center;
margin-top: 16px; margin-top: 16px;
}} }
.privacy-policy-page-link a {{ .privacy-policy-page-link a {
color: #50575e; color: #50575e;
font-size: 12px; font-size: 12px;
}} }
@media screen and (max-width: 400px) {{ @media screen and (max-width: 400px) {
#login {{ #login {
width: 100%; width: 100%;
padding: 20px; padding: 20px;
box-sizing: border-box; box-sizing: border-box;
}} }
}} }
</style> </style>
</head> </head>
<body class="login js login-action-login wp-core-ui locale-en-us"> <body class="login js login-action-login wp-core-ui locale-en-us">
<div id="login"> <div id="login">
<h1><a href="https://wordpress.org/">Powered by WordPress</a></h1> <h1><a href="https://wordpress.org/">WordPress Login</a></h1>
<form name="loginform" id="loginform" action="/wp-login.php" method="post"> <form name="loginform" id="loginform" action="/wp-login.php" method="post">
<p> <p>
<label for="user_login">Username or Email Address</label> <label for="user_login">Username or Email Address</label>