bernd commited on 2012-02-29 13:26:13
Zeige 9 geänderte Dateien mit 166 Einfügungen und 14 Löschungen.
git-svn-id: https://svn.schokokeks.org/repos/tools/webinterface/trunk@2214 87cf0b9e-d624-0410-a070-f6ee81989793
| ... | ... |
@@ -6,7 +6,7 @@ require_once('inc/security.php');
|
| 6 | 6 |
require_once('vmail.php');
|
| 7 | 7 |
|
| 8 | 8 |
$section = 'email_vmail'; |
| 9 |
-require_role(ROLE_SYSTEMUSER); |
|
| 9 |
+require_role(array(ROLE_SYSTEMUSER, ROLE_VMAIL_ACCOUNT)); |
|
| 10 | 10 |
|
| 11 | 11 |
$account = empty_account(); |
| 12 | 12 |
$id = (isset($_GET['id']) ? (int) $_GET['id'] : 0); |
| ... | ... |
@@ -14,13 +14,26 @@ $id = (isset($_GET['id']) ? (int) $_GET['id'] : 0); |
| 14 | 14 |
if ($id != 0) |
| 15 | 15 |
$account = get_account_details($id); |
| 16 | 16 |
|
| 17 |
+$accountlogin = false; |
|
| 18 |
+if ($_SESSION['role'] == ROLE_VMAIL_ACCOUNT) {
|
|
| 19 |
+ $id = get_vmail_id_by_emailaddr($_SESSION['mailaccount']); |
|
| 20 |
+ $account = get_account_details($id, false); |
|
| 21 |
+ $accountlogin = true; |
|
| 22 |
+ $accountname = filter_input_general($_SESSION['mailaccount']); |
|
| 23 |
+} |
|
| 24 |
+ |
|
| 25 |
+ |
|
| 17 | 26 |
DEBUG($account); |
| 18 | 27 |
if ($id == 0) {
|
| 19 | 28 |
title("E-Mail-Adresse anlegen");
|
| 20 | 29 |
} |
| 21 | 30 |
else {
|
| 31 |
+ if ($accountlogin) {
|
|
| 32 |
+ title("Einstellungen für {$accountname}");
|
|
| 33 |
+ } else {
|
|
| 22 | 34 |
title("E-Mail-Adresse bearbeiten");
|
| 23 | 35 |
} |
| 36 |
+} |
|
| 24 | 37 |
|
| 25 | 38 |
|
| 26 | 39 |
$is_autoresponder = is_array($account['autoresponder']) && $account['autoresponder']['valid_from'] != NULL; |
| ... | ... |
@@ -84,7 +97,12 @@ output("<script type=\"text/javascript\">
|
| 84 | 97 |
</script> |
| 85 | 98 |
"); |
| 86 | 99 |
|
| 87 |
-$form = " |
|
| 100 |
+$form = ''; |
|
| 101 |
+ |
|
| 102 |
+if ($accountlogin) {
|
|
| 103 |
+ $form.= "<p class=\"spamfilter_options\">Unerwünschte E-Mails (Spam, Viren) in diesem Postfach ".html_select('spamfilter_action', array("none" => 'nicht filtern', "folder" => 'in Unterordner »Spam« ablegen', "tag" => 'markieren und zustellen', "delete" => 'nicht zustellen (löschen)'), $account['spamfilter'])."</p>";
|
|
| 104 |
+} else {
|
|
| 105 |
+ $form .= " |
|
| 88 | 106 |
<p><strong>E-Mail-Adresse:</strong> <input type=\"text\" name=\"local\" id=\"local\" size=\"10\" value=\"{$account['local']}\" /><strong style=\"font-size: 1.5em;\"> @ </strong>".domainselect($account['domain'])."</p>";
|
| 89 | 107 |
|
| 90 | 108 |
$password_message = ''; |
| ... | ... |
@@ -114,7 +131,7 @@ $quota_threshold = ($account['quota_threshold'] >= 0) ? $account['quota_threshol |
| 114 | 131 |
$form .= "<p class=\"quota_options\"><input type=\"checkbox\" id=\"quota_notify\" name=\"quota_notify\" value=\"1\" {$quota_notify} /><label for=\"quota_notify\">Benachrichtigung wenn weniger als</label> <input type=\"text\" name=\"quota_threshold\" id=\"quota_threshold\" value=\"{$quota_threshold}\" /> MB Speicherplatz zur Verfügung stehen.</p>";
|
| 115 | 132 |
|
| 116 | 133 |
$form .= "</div>"; |
| 117 |
- |
|
| 134 |
+} |
|
| 118 | 135 |
|
| 119 | 136 |
|
| 120 | 137 |
|
| ... | ... |
@@ -41,11 +41,23 @@ Ihre E-Mail wird nicht weitergeleitet.', |
| 41 | 41 |
} |
| 42 | 42 |
|
| 43 | 43 |
|
| 44 |
+function get_vmail_id_by_emailaddr($emailaddr) |
|
| 45 |
+{
|
|
| 46 |
+ $emailaddr = mysql_real_escape_string( $emailaddr ); |
|
| 47 |
+ $result = db_query("SELECT id FROM mail.v_vmail_accounts WHERE CONCAT(local, '@', domainname) = '{$emailaddr}'");
|
|
| 48 |
+ $entry = mysql_fetch_assoc($result); |
|
| 49 |
+ return (int) $entry['id']; |
|
| 50 |
+} |
|
| 51 |
+ |
|
| 44 | 52 |
function get_account_details($id, $checkuid = true) |
| 45 | 53 |
{
|
| 46 | 54 |
$id = (int) $id; |
| 55 |
+ $uid_check = ''; |
|
| 56 |
+ DEBUG("checkuid: ".$checkuid);
|
|
| 57 |
+ if ($checkuid) {
|
|
| 47 | 58 |
$uid = (int) $_SESSION['userinfo']['uid']; |
| 48 |
- $uid_check = ($checkuid ? "useraccount='{$uid}' AND " : "");
|
|
| 59 |
+ $uid_check = "useraccount='{$uid}' AND ";
|
|
| 60 |
+ } |
|
| 49 | 61 |
$result = db_query("SELECT id, local, domain, password, spamfilter, forwards, autoresponder, server, quota, COALESCE(quota_used, 0) AS quota_used, quota_threshold from mail.v_vmail_accounts WHERE {$uid_check}id={$id} LIMIT 1");
|
| 50 | 62 |
if (mysql_num_rows($result) == 0) |
| 51 | 63 |
system_failure('Ungültige ID oder kein eigener Account');
|
| ... | ... |
@@ -160,12 +172,12 @@ function get_max_mailboxquota($server, $oldquota) {
|
| 160 | 172 |
|
| 161 | 173 |
function save_vmail_account($account) |
| 162 | 174 |
{
|
| 163 |
- $uid = (int) $_SESSION['userinfo']['uid']; |
|
| 175 |
+ $accountlogin = ($_SESSION['role'] == ROLE_VMAIL_ACCOUNT); |
|
| 164 | 176 |
$id = $account['id']; |
| 165 | 177 |
if ($id != NULL) |
| 166 | 178 |
{
|
| 167 | 179 |
$id = (int) $id; |
| 168 |
- $oldaccount = get_account_details($id); |
|
| 180 |
+ $oldaccount = get_account_details($id, !$accountlogin); |
|
| 169 | 181 |
// Erzeugt einen system_error() wenn ID ungültig |
| 170 | 182 |
} |
| 171 | 183 |
// Ab hier ist $id sicher, entweder NULL oder eine gültige ID des aktuellen users |
| ... | ... |
@@ -174,6 +186,16 @@ function save_vmail_account($account) |
| 174 | 186 |
if ($id === NULL) {
|
| 175 | 187 |
$newaccount = true; |
| 176 | 188 |
} |
| 189 |
+ |
|
| 190 |
+ if ($accountlogin) {
|
|
| 191 |
+ if ($account['domain'] != $oldaccount['domain']) |
|
| 192 |
+ system_failure('Sie können die E-Mail-Adresse nicht ändern!');
|
|
| 193 |
+ if ($account['local'] != $oldaccount['local']) |
|
| 194 |
+ system_failure('Sie können die E-Mail-Adresse nicht ändern!');
|
|
| 195 |
+ if ($account['quota'] != $oldaccount['quota']) |
|
| 196 |
+ system_failure('Sie können Ihren eigenen Speicherplatz nicht verändern.');
|
|
| 197 |
+ } else {
|
|
| 198 |
+ |
|
| 177 | 199 |
$account['local'] = filter_input_username($account['local']); |
| 178 | 200 |
if ($account['local'] == '') |
| 179 | 201 |
{
|
| ... | ... |
@@ -200,6 +222,7 @@ function save_vmail_account($account) |
| 200 | 222 |
system_failure('Bitte wählen Sie eine Ihrer Domains aus!');
|
| 201 | 223 |
return false; |
| 202 | 224 |
} |
| 225 |
+ } |
|
| 203 | 226 |
|
| 204 | 227 |
$forwards = array(); |
| 205 | 228 |
if (count($account['forwards']) > 0) |
| ... | ... |
@@ -214,6 +237,10 @@ function save_vmail_account($account) |
| 214 | 237 |
} |
| 215 | 238 |
} |
| 216 | 239 |
|
| 240 |
+ if ($accountlogin) {
|
|
| 241 |
+ $password = NULL; |
|
| 242 |
+ $set_password = false; |
|
| 243 |
+ } else {
|
|
| 217 | 244 |
$password='NULL'; |
| 218 | 245 |
if ($account['password'] != '') |
| 219 | 246 |
{
|
| ... | ... |
@@ -229,6 +256,7 @@ function save_vmail_account($account) |
| 229 | 256 |
$set_password = ($id == NULL || $password != 'NULL'); |
| 230 | 257 |
if ($account['password'] === NULL) |
| 231 | 258 |
$set_password=true; |
| 259 |
+ } |
|
| 232 | 260 |
|
| 233 | 261 |
$spam = 'NULL'; |
| 234 | 262 |
switch ($account['spamfilter']) |
| ... | ... |
@@ -244,6 +272,7 @@ function save_vmail_account($account) |
| 244 | 272 |
break; |
| 245 | 273 |
} |
| 246 | 274 |
|
| 275 |
+ if (!$accountlogin) {
|
|
| 247 | 276 |
$free = config('vmail_basequota');
|
| 248 | 277 |
if ($newaccount) {
|
| 249 | 278 |
// Neues Postfach |
| ... | ... |
@@ -259,6 +288,7 @@ function save_vmail_account($account) |
| 259 | 288 |
} |
| 260 | 289 |
|
| 261 | 290 |
$account['quota'] = $newquota; |
| 291 |
+ } |
|
| 262 | 292 |
|
| 263 | 293 |
if ($account['quota_threshold'] == -1) {
|
| 264 | 294 |
$account['quota_threshold'] = 'NULL'; |
| ... | ... |
@@ -361,12 +391,15 @@ Wussten Sie schon, dass Sie auf mehrere Arten Ihre E-Mails abrufen können? |
| 361 | 391 |
} |
| 362 | 392 |
|
| 363 | 393 |
// Update Mail-Quota-Cache |
| 394 |
+ if ($_SESSION['role'] == ROLE_SYSTEMUSER) {
|
|
| 395 |
+ $uid = (int) $_SESSION['userinfo']['uid']; |
|
| 364 | 396 |
$result = db_query("SELECT useraccount, server, SUM(quota-(SELECT value FROM misc.config WHERE `key`='vmail_basequota')) AS quota, SUM(GREATEST(quota_used-(SELECT value FROM misc.config WHERE `key`='vmail_basequota'), 0)) AS used FROM mail.v_vmail_accounts WHERE useraccount=".$uid." GROUP BY useraccount, server");
|
| 365 | 397 |
while ($line = mysql_fetch_assoc($result)) {
|
| 366 | 398 |
if ($line['quota'] !== NULL) {
|
| 367 | 399 |
db_query("REPLACE INTO mail.vmailquota (uid, server, quota, used) VALUES ('{$line['useraccount']}', '{$line['server']}', '{$line['quota']}', '{$line['used']}')");
|
| 368 | 400 |
} |
| 369 | 401 |
} |
| 402 |
+ } |
|
| 370 | 403 |
|
| 371 | 404 |
return true; |
| 372 | 405 |
} |
| ... | ... |
@@ -8,6 +8,10 @@ require_once('include/hasaccount.php');
|
| 8 | 8 |
if ($role & ROLE_SYSTEMUSER) {
|
| 9 | 9 |
$menu["email_vmail"] = array("label" => "E-Mail", "file" => "vmail", "weight" => 3);
|
| 10 | 10 |
} |
| 11 |
+if ($role & ROLE_VMAIL_ACCOUNT) |
|
| 12 |
+{
|
|
| 13 |
+ $menu['email_edit'] = array("label" => "Einstellungen", "file" => "edit", "weight" => 10);
|
|
| 14 |
+} |
|
| 11 | 15 |
if ($role & (ROLE_VMAIL_ACCOUNT | ROLE_MAILACCOUNT)) |
| 12 | 16 |
{
|
| 13 | 17 |
$menu['email_chpass'] = array("label" => "Passwort ändern", "file" => "chpass", "weight" => 15);
|
| ... | ... |
@@ -4,7 +4,7 @@ require_once('session/start.php');
|
| 4 | 4 |
|
| 5 | 5 |
require_once('vmail.php');
|
| 6 | 6 |
|
| 7 |
-require_role(ROLE_SYSTEMUSER); |
|
| 7 |
+require_role(array(ROLE_SYSTEMUSER, ROLE_VMAIL_ACCOUNT)); |
|
| 8 | 8 |
|
| 9 | 9 |
require_once("inc/debug.php");
|
| 10 | 10 |
global $debugmode; |
| ... | ... |
@@ -13,6 +13,14 @@ global $debugmode; |
| 13 | 13 |
if ($_GET['action'] == 'edit') |
| 14 | 14 |
{
|
| 15 | 15 |
check_form_token('vmail_edit_mailbox');
|
| 16 |
+ $accountlogin = ($_SESSION['role'] == ROLE_VMAIL_ACCOUNT); |
|
| 17 |
+ |
|
| 18 |
+ if ($accountlogin) {
|
|
| 19 |
+ $id = get_vmail_id_by_emailaddr($_SESSION['mailaccount']); |
|
| 20 |
+ $account = get_account_details($id, false); |
|
| 21 |
+ // Leere das, sonst werden die vervielfacht |
|
| 22 |
+ $account['forwards'] = array(); |
|
| 23 |
+ } else {
|
|
| 16 | 24 |
$id = (int) $_GET['id']; |
| 17 | 25 |
|
| 18 | 26 |
$account = empty_account(); |
| ... | ... |
@@ -21,7 +29,6 @@ if ($_GET['action'] == 'edit') |
| 21 | 29 |
$account['id'] = $id; |
| 22 | 30 |
$account['local'] = $_POST['local']; |
| 23 | 31 |
$account['domain'] = (int) $_POST['domain']; |
| 24 |
- $account['spamfilter'] = $_POST['spamfilter_action']; |
|
| 25 | 32 |
$account['password'] = $_POST['password']; |
| 26 | 33 |
if (($account['password'] == '') && ($_POST['mailbox'] == 'yes')) |
| 27 | 34 |
system_failure("Sie haben ein leeres Passwort eingegeben!");
|
| ... | ... |
@@ -41,6 +48,8 @@ if ($_GET['action'] == 'edit') |
| 41 | 48 |
$account['quota_threshold'] = $_POST['quota_threshold']; |
| 42 | 49 |
} |
| 43 | 50 |
|
| 51 |
+ } |
|
| 52 |
+ $account['spamfilter'] = $_POST['spamfilter_action']; |
|
| 44 | 53 |
|
| 45 | 54 |
|
| 46 | 55 |
$ar = empty_autoresponder_config(); |
| ... | ... |
@@ -113,8 +122,12 @@ if ($_GET['action'] == 'edit') |
| 113 | 122 |
save_vmail_account($account); |
| 114 | 123 |
|
| 115 | 124 |
if (! ($debugmode || we_have_an_error())) |
| 125 |
+ if ($accountlogin) {
|
|
| 126 |
+ header('Location: ../index/index');
|
|
| 127 |
+ } else {
|
|
| 116 | 128 |
header('Location: vmail');
|
| 117 | 129 |
} |
| 130 |
+} |
|
| 118 | 131 |
elseif ($_GET['action'] == 'delete') |
| 119 | 132 |
{
|
| 120 | 133 |
$title = "E-mail-Adresse löschen"; |
| ... | ... |
@@ -0,0 +1,70 @@ |
| 1 |
+<?php |
|
| 2 |
+ |
|
| 3 |
+require_once('inc/base.php');
|
|
| 4 |
+require_once('inc/icons.php');
|
|
| 5 |
+require_once('inc/security.php');
|
|
| 6 |
+require_role(ROLE_VMAIL_ACCOUNT); |
|
| 7 |
+ |
|
| 8 |
+require_once('include/vmail.php');
|
|
| 9 |
+ |
|
| 10 |
+$id = get_vmail_id_by_emailaddr($_SESSION['mailaccount']); |
|
| 11 |
+$acc = get_account_details($id, false); |
|
| 12 |
+$actions = array(); |
|
| 13 |
+DEBUG($acc); |
|
| 14 |
+ |
|
| 15 |
+$content = '<h3>Aktueller Speicherplatzverbrauch</h3>'; |
|
| 16 |
+ |
|
| 17 |
+$percent = round(( $acc["quota_used"] / $acc["quota"] ) * 100 ); |
|
| 18 |
+$color = ( $percent > 95 ? 'red' : ($percent > 75 ? "yellow" : "green" )); |
|
| 19 |
+$width = 2 * min($percent, 100); |
|
| 20 |
+$content .= "<div><div style=\"margin: 2px 0; padding: 0; width: 200px; border: 1px solid black;\"><div style=\"font-size: 1px; background-color: {$color}; height: 10px; width: {$width}px; margin: 0; padding: 0;\"> </div></div> {$acc['quota_used']} MB von {$acc['quota']} MB belegt</div>";
|
|
| 21 |
+ |
|
| 22 |
+$content .= '<h3>Einstellungen</h3> |
|
| 23 |
+<p>Eingehende E-Mails für Ihre Adresse werden wie folgt verarbeitet:</p>'; |
|
| 24 |
+ |
|
| 25 |
+$spam = 'ohne Spamfilter'; |
|
| 26 |
+switch ($acc['spamfilter']) |
|
| 27 |
+{
|
|
| 28 |
+ case 'folder': $spam = 'Spam in Unterordner'; |
|
| 29 |
+ break; |
|
| 30 |
+ case 'tag': $spam = 'Spam markieren'; |
|
| 31 |
+ break; |
|
| 32 |
+ case 'delete': $spam = 'Spam nicht zustellen'; |
|
| 33 |
+ break; |
|
| 34 |
+} |
|
| 35 |
+$content .= '<p>'.other_icon('go.png')." Ablegen in Ihrer Mailbox ({$spam})</p>";
|
|
| 36 |
+ |
|
| 37 |
+ |
|
| 38 |
+if ($acc['autoresponder']) {
|
|
| 39 |
+ $now = date( 'Y-m-d H:i:s' ); |
|
| 40 |
+ $valid_from = $acc['autoresponder']['valid_from']; |
|
| 41 |
+ $valid_until = $acc['autoresponder']['valid_until']; |
|
| 42 |
+ if ($valid_from == NULL) {
|
|
| 43 |
+ // Autoresponder abgeschaltet |
|
| 44 |
+ //$content .= '<p>'.other_icon('go.png')." Es wird keine automatische Antwort versendet</p>";
|
|
| 45 |
+ } elseif ($valid_from > $now) {
|
|
| 46 |
+ $content .= '<p>'.other_icon('go.png')." Es wird ab dem {$valid_from} eine automatische Antwort versendet</p>";
|
|
| 47 |
+ } elseif ($valid_until == NULL) {
|
|
| 48 |
+ $content .= '<p>'.other_icon('go.png')." Es wird eine automatische Antwort versendet</p>";
|
|
| 49 |
+ } elseif ($valid_until > $now) {
|
|
| 50 |
+ $content .= '<p>'.other_icon('go.png')." Es wird eine automatische Antwort versendet, jedoch nicht mehr ab dem {$valid_until}</p>";
|
|
| 51 |
+ } elseif ($valid_until < $now) {
|
|
| 52 |
+ $content .= '<p>'.other_icon('go.png')." Es wird seit dem {$valid_until} keine automatische Antwort mehr versendet</p>";
|
|
| 53 |
+ } |
|
| 54 |
+} |
|
| 55 |
+ |
|
| 56 |
+foreach ($acc['forwards'] AS $fwd) |
|
| 57 |
+{
|
|
| 58 |
+ $spam = 'ohne Spamfilter'; |
|
| 59 |
+ switch ($fwd['spamfilter']) |
|
| 60 |
+ {
|
|
| 61 |
+ case 'tag': $spam = 'Spam markieren'; |
|
| 62 |
+ break; |
|
| 63 |
+ case 'delete': $spam = 'Spam nicht zustellen'; |
|
| 64 |
+ break; |
|
| 65 |
+ } |
|
| 66 |
+ $fwd['destination'] = filter_input_general($fwd['destination']); |
|
| 67 |
+ $content .= '<p>'.other_icon('go.png')." Weiterleitung an <strong>{$fwd['destination']}</strong> ({$spam})</p>";
|
|
| 68 |
+} |
|
| 69 |
+ |
|
| 70 |
+?> |
| ... | ... |
@@ -60,6 +60,10 @@ if (have_module('email') && ($_SESSION['role'] & ROLE_MAILACCOUNT || $_SESSION['
|
| 60 | 60 |
output("<div class=\"block\">".internal_link("../email/chpass", "<img src=\"{$prefix}images/pwchange.png\" alt=\"\" /> Passwort ändern ")."</div>");
|
| 61 | 61 |
} |
| 62 | 62 |
|
| 63 |
+if (have_module('email') && ($_SESSION['role'] & ROLE_VMAIL_ACCOUNT)) {
|
|
| 64 |
+ output("<div class=\"block\">".internal_link("../email/edit", "<img src=\"{$prefix}images/cog.png\" alt=\"\" /> E-Mail-Einstellungen ")."</div>");
|
|
| 65 |
+} |
|
| 66 |
+ |
|
| 63 | 67 |
if ($_SESSION['role'] & ROLE_CUSTOMER || $_SESSION['role'] & ROLE_SYSTEMUSER) {
|
| 64 | 68 |
output("<div class=\"block\">".internal_link("chpass", "<img src=\"{$prefix}images/pwchange.png\" alt=\"\" /> Passwort ändern ")."</div>");
|
| 65 | 69 |
} |
| ... | ... |
@@ -93,4 +97,10 @@ if (have_module('jabber') && $_SESSION['role'] & ROLE_CUSTOMER) {
|
| 93 | 97 |
|
| 94 | 98 |
output("</div>");
|
| 95 | 99 |
|
| 100 |
+if (have_module('email') && $_SESSION['role'] & ROLE_VMAIL_ACCOUNT) {
|
|
| 101 |
+ include('modules/email/vmailoverview.php');
|
|
| 102 |
+ output("<div class=\"vmailoverview\">".$content."</div>");
|
|
| 103 |
+} |
|
| 104 |
+ |
|
| 105 |
+ |
|
| 96 | 106 |
?> |
| ... | ... |
@@ -228,12 +228,16 @@ div.content {
|
| 228 | 228 |
} |
| 229 | 229 |
/* overflow: hidden; */ |
| 230 | 230 |
|
| 231 |
-div.overview {
|
|
| 231 |
+div.vmailoverview {
|
|
| 232 |
+} |
|
| 233 |
+ |
|
| 234 |
+.overview {
|
|
| 232 | 235 |
margin: 2em; |
| 236 |
+ overflow: auto; |
|
| 237 |
+ width: 100%; |
|
| 233 | 238 |
max-width: 50em; |
| 234 | 239 |
} |
| 235 |
- |
|
| 236 |
-div.overview div.block {
|
|
| 240 |
+.overview div.block {
|
|
| 237 | 241 |
float: left; |
| 238 | 242 |
margin: 1em; |
| 239 | 243 |
padding: 1em; |
| ... | ... |
@@ -244,7 +248,7 @@ div.overview div.block {
|
| 244 | 248 |
background-color: #eee; |
| 245 | 249 |
} |
| 246 | 250 |
|
| 247 |
-div.overview div.block img {
|
|
| 251 |
+.overview div.block img {
|
|
| 248 | 252 |
display: block; |
| 249 | 253 |
margin: 0 auto; |
| 250 | 254 |
margin-bottom: 1em; |
| ... | ... |
@@ -252,7 +256,7 @@ div.overview div.block img {
|
| 252 | 256 |
} |
| 253 | 257 |
|
| 254 | 258 |
/* |
| 255 |
-div.overview div.block a {
|
|
| 259 |
+.overview div.block a {
|
|
| 256 | 260 |
color: #000; |
| 257 | 261 |
} |
| 258 | 262 |
*/ |
| 259 | 263 |