remove mailmn module
Bernd Wurst

Bernd Wurst commited on 2023-04-28 14:01:53
Zeige 8 geänderte Dateien mit 0 Einfügungen und 503 Löschungen.

... ...
@@ -1,161 +0,0 @@
1
-<?php
2
-/*
3
-This file belongs to the Webinterface of schokokeks.org Hosting
4
-
5
-Written by schokokeks.org Hosting, namely
6
-  Bernd Wurst <bernd@schokokeks.org>
7
-  Hanno Böck <hanno@schokokeks.org>
8
-
9
-This code is published under a 0BSD license.
10
-
11
-Nevertheless, in case you use a significant part of this code, we ask (but not require, see the license) that you keep the authors' names in place and return your changes to the public. We would be especially happy if you tell us what you're going to do with this code.
12
-*/
13
-
14
-require_once('inc/base.php');
15
-require_once('inc/debug.php');
16
-require_once('inc/security.php');
17
-
18
-
19
-function get_lists($filter)
20
-{
21
-    if (! isset($_SESSION['userinfo'])) {
22
-        return [];
23
-    }
24
-    $uid = (int) $_SESSION['userinfo']['uid'];
25
-    $result = null;
26
-    if ($filter) {
27
-        $filter = '%'.$filter.'%';
28
-        $result = db_query("SELECT id, created, status, listname, fqdn, urlhost, admin, archivesize, subscribers, lastactivity, backend FROM mail.v_mailman_lists WHERE status!='deleted' AND owner=:uid AND (listname LIKE :filter OR fqdn LIKE :filter OR admin LIKE :filter) ORDER BY listname", ['uid' => $uid, 'filter' => $filter]);
29
-    } else {
30
-        $result = db_query("SELECT id, created, status, listname, fqdn, urlhost, admin, archivesize, subscribers, lastactivity, backend FROM mail.v_mailman_lists WHERE status!='deleted' AND owner=:uid ORDER BY listname", ['uid' => $uid]);
31
-    }
32
-    $ret = [];
33
-    while ($list = $result->fetch()) {
34
-        $ret[] = $list;
35
-    }
36
-    DEBUG($ret);
37
-    return $ret;
38
-}
39
-
40
-
41
-function get_list($id)
42
-{
43
-    $args = [":id" => $id,
44
-                ":uid" => $_SESSION['userinfo']['uid'], ];
45
-    $result = db_query("SELECT id, created, status, listname, fqdn, urlhost, admin, archivesize, subscribers, lastactivity, backend FROM mail.v_mailman_lists WHERE owner=:uid AND id=:id", $args);
46
-    if ($result->rowCount() < 1) {
47
-        system_failure('Die gewünschte Mailingliste konnte nicht gefunden werden');
48
-    }
49
-    $list = $result->fetch();
50
-    DEBUG($list);
51
-
52
-    return $list;
53
-}
54
-
55
-
56
-function delete_list($id)
57
-{
58
-    $args = [":id" => $id,
59
-                ":uid" => $_SESSION['userinfo']['uid'], ];
60
-    db_query("UPDATE mail.mailman_lists SET status='delete' WHERE owner=:uid AND id=:id", $args);
61
-}
62
-
63
-function request_new_password($id)
64
-{
65
-    $args = [":id" => $id,
66
-                ":uid" => $_SESSION['userinfo']['uid'], ];
67
-    db_query("UPDATE mail.mailman_lists SET status='newpw' WHERE owner=:uid AND id=:id", $args);
68
-}
69
-
70
-function create_list($listname, $maildomain, $admin)
71
-{
72
-    $listname = strtolower($listname);
73
-    verify_input_username($listname);
74
-    if (in_array($listname, ["admin", "administrator", "webmaster", "hostmaster", "postmaster"])) {
75
-        system_failure('Der Mailinglistenname '.$listname.' ist unzulässig.');
76
-    }
77
-    if (! check_emailaddr($admin)) {
78
-        system_failure('Der Verwalter muss eine gültige E-Mail-Adresse sein ('.$admin.').');
79
-    }
80
-    # FIXME: Zukünftig soll diese Beschränkung weg fallen!
81
-    $result = db_query("SELECT id FROM mail.mailman_lists WHERE listname LIKE ?", [$listname]);
82
-    if ($result->rowCount() > 0) {
83
-        system_failure('Eine Liste mit diesem Namen existiert bereits auf unserem Mailinglisten-Server (unter einer Ihrer Domains oder unter einer Domain eines anderen Kunden). Jeder Listenname kann auf dem gesamten Server nur einmal verwendet werden.');
84
-    }
85
-
86
-    $args = [":listname" => $listname,
87
-                ":maildomain" => $maildomain,
88
-                ":owner" => $_SESSION['userinfo']['uid'],
89
-                ":admin" => $admin, ];
90
-
91
-    db_query("INSERT INTO mail.mailman_lists (status, listname, maildomain, owner, admin) VALUES ('pending', :listname, :maildomain, :owner, :admin)", $args);
92
-    DEBUG('Neue ID: '.db_insert_id());
93
-}
94
-
95
-function get_possible_mailmandomains()
96
-{
97
-    DEBUG('get_possible_mailmandomains()');
98
-    $uid = (int) $_SESSION['userinfo']['uid'];
99
-    $result = db_query("SELECT d.id, CONCAT_WS('.',d.domainname,d.tld) AS fqdn, m.backend AS backend FROM kundendaten.domains AS d LEFT JOIN mail.mailman_domains AS m ON (m.domain=d.id) WHERE d.useraccount=:uid AND m.id IS NULL ORDER BY CONCAT_WS('.',d.domainname,d.tld)", [":uid" => $uid]);
100
-    $ret = [];
101
-    while ($dom = $result->fetch()) {
102
-        $ret[] = $dom;
103
-    }
104
-    DEBUG($ret);
105
-    return $ret;
106
-}
107
-
108
-
109
-function insert_mailman_domain($subdomain, $domainid, $backend = 'mailman')
110
-{
111
-    DEBUG("insert_mailman_domain($subdomain, $domainid, $backend)");
112
-    $possible = get_possible_mailmandomains();
113
-    $found = false;
114
-    foreach ($possible as $dom) {
115
-        if ($domainid == $dom['id']) {
116
-            $found = true;
117
-        }
118
-    }
119
-    if (! $found) {
120
-        system_failue('invalid domain id');
121
-    }
122
-    db_query("INSERT INTO mail.mailman_domains (hostname, domain, backend) VALUES (:hostname, :domain, :backend)", [":hostname" => $subdomain, ":domain" => $domainid, ":backend" => $backend]);
123
-    return db_insert_id();
124
-}
125
-
126
-
127
-function lists_on_domain($domainid)
128
-{
129
-    DEBUG("lists_on_domain()");
130
-    $result = db_query("SELECT id, listname FROM mail.mailman_lists WHERE status != 'delete' AND status != 'deleted' AND maildomain=(SELECT id FROM mail.mailman_domains WHERE domain=?)", [$domainid]);
131
-    $ret = [];
132
-    while ($l = $result->fetch()) {
133
-        $ret[] = $l;
134
-    }
135
-    return $ret;
136
-}
137
-
138
-
139
-function delete_mailman_domain($domainid)
140
-{
141
-    DEBUG("delete_mailman_domain()");
142
-    $lists = lists_on_domain($domainid);
143
-    if (count($lists) > 0) {
144
-        system_failure("Es gibt noch Mailinglisten unter diesem Domainnamen, er kann daher nicht gelöscht werden");
145
-    } else {
146
-        db_query("DELETE FROM mail.mailman_domains WHERE domain=? AND (SELECT COUNT(*) FROM mail.mailman_lists WHERE maildomain=mail.mailman_domains.id)=0;", [$domainid]);
147
-    }
148
-}
149
-
150
-function get_mailman_domains()
151
-{
152
-    DEBUG('get_mailman_domains()');
153
-    $uid = (int) $_SESSION['userinfo']['uid'];
154
-    $result = db_query("SELECT md.id, md.fqdn, md.is_webhost, md.backend FROM mail.v_mailman_domains AS md left join mail.v_domains AS d on (d.id=md.domain) where d.user=?", [$uid]);
155
-    $ret = [];
156
-    while ($dom = $result->fetch()) {
157
-        $ret[] = $dom;
158
-    }
159
-    DEBUG($ret);
160
-    return $ret;
161
-}
... ...
@@ -1,7 +0,0 @@
1
-
2
-$(function() {
3
-    $('#clear').click( function() { 
4
-        $('#filter').val('');
5
-        $('#mailman_filter').submit();
6
-    });
7
-});
... ...
@@ -1,114 +0,0 @@
1
-<?php
2
-/*
3
-This file belongs to the Webinterface of schokokeks.org Hosting
4
-
5
-Written by schokokeks.org Hosting, namely
6
-  Bernd Wurst <bernd@schokokeks.org>
7
-  Hanno Böck <hanno@schokokeks.org>
8
-
9
-This code is published under a 0BSD license.
10
-
11
-Nevertheless, in case you use a significant part of this code, we ask (but not require, see the license) that you keep the authors' names in place and return your changes to the public. We would be especially happy if you tell us what you're going to do with this code.
12
-*/
13
-
14
-require_once('inc/jquery.php');
15
-require_once('inc/icons.php');
16
-require_once('mailman.php');
17
-
18
-require_role(ROLE_SYSTEMUSER);
19
-
20
-title('Mailinglisten');
21
-
22
-output('<div class="warning">
23
-    <p><strong>Bitte beachten Sie: Der Mailinglisten-Dienst wird zum Jahresende 2022 eingestellt. Das Anlegen neuer Listen ist nicht mehr möglich.<br>
24
-    Wenden Sie sich bitte frühzeitig an den Support, wenn Sie Unterstützung beim Umzug zu einem anderen Dienstleister benötigen.</strong></p>
25
-    </div>');
26
-
27
-output('<p>Mit <a href="https://www.gnu.org/software/mailman/index.html">Mailman</a> bieten wir Ihnen eine umfangreiche Lösung für E-Mail-Verteilerlisten an.</p>
28
-<p>Auf dieser Seite können Sie Ihre Mailinglisten verwalten.</p>
29
-');
30
-
31
-$filter = "";
32
-if (isset($_REQUEST['filter']) && $_REQUEST['filter'] != '') {
33
-    $filter = $_REQUEST['filter'];
34
-}
35
-$lists = get_lists($filter);
36
-
37
-
38
-// Filter-Funktion
39
-if (count($lists) > 10 || $filter) {
40
-    javascript();
41
-    $form = '<p><label for="filter">Filter für die Anzeige:</label> <input type="text" name="filter" id="filter" value="'.filter_output_html($filter).'"><button type="button" id="clear" title="Filter leeren">&times;</button><input type="submit" value="Filtern!"></p>';
42
-    output(html_form('mailman_filter', 'lists', '', $form));
43
-}
44
-
45
-
46
-if (! empty($lists)) {
47
-    #addnew('newlist', 'Neue Mailingliste anlegen');
48
-    output('<div id="mailman_lists_container">');
49
-    foreach ($lists as $list) {
50
-        $size = $list['archivesize'];
51
-        $sizestr = $size.' Bytes';
52
-        if (! $size) {
53
-            $sizestr = '<em>Kein Archiv</em>';
54
-        } else {
55
-            $sizestr = sprintf('%.2f', $size/(1024*1024)).' MB';
56
-        }
57
-
58
-
59
-        $class = 'regular';
60
-        $status = 'In Betrieb (erstellt am '.strftime('%d.%m.%Y', strtotime($list['created'])).')';
61
-        if ($list['status'] == 'delete') {
62
-            $class = 'deleted';
63
-            $status = 'Wird gelöscht';
64
-        } elseif ($list['status'] == 'deleted') {
65
-            # liste ist schon gelöscht
66
-            continue;
67
-        } elseif ($list['status'] == 'pending') {
68
-            $class = 'new';
69
-            $status = 'Wird angelegt';
70
-        } elseif ($list['status'] == 'newpw') {
71
-            $class = 'edited';
72
-            $status = 'Neues Passwort angefordert';
73
-        } elseif ($list['status'] == 'failure') {
74
-            $class = 'error';
75
-            $status = 'Fehler bei der Erstellung';
76
-        }
77
-
78
-        $admin = str_replace(',', ', ', $list['admin']);
79
-
80
-        $lastactivity = $list['lastactivity'];
81
-        if (! $lastactivity || $lastactivity < '2000') {
82
-            $lastactivity = '<em>nie</em>';
83
-        }
84
-
85
-        output("<div class=\"mailman_list $class\"><p class=\"listname\"><span class=\"listname\">{$list['listname']}</span>@{$list['fqdn']}</p>
86
-        <p class=\"listadmin\">Verwalter: {$admin}</p><p class=\"status\">Status: {$status}<br/>Anzahl Mitglieder: {$list['subscribers']}<br/>Letzte Nutzung: {$lastactivity}</p><p class=\"archivesize\">Archivgröße: {$sizestr}</p>");
87
-        if ($list['status'] == 'running') {
88
-            if ($list['backend'] == 'mailman' || $list['backend'] === null) {
89
-                output("<p class=\"operations\">".
90
-                    internal_link('save', other_icon("lock.png", "Neues Passwort anfordern").' Neues Passwort anfordern', "action=newpw&id={$list['id']}")."<br>".
91
-                    internal_link('save', icon_delete("Mailingliste löschen").' Liste löschen', "action=delete&id={$list['id']}")."<br>".
92
-                    "<a href=\"https://".config('mailman_host')."/mailman/admin.cgi/{$list['listname']}\">".other_icon("database_go.png", "Listen-Verwaltung aufrufen")." Verwaltung aufrufen</a>".
93
-                    "</p>\n");
94
-            } elseif ($list['backend'] == 'mailman3') {
95
-                output("<p class=\"operations\">".
96
-                    internal_link('save', icon_delete("Mailingliste löschen").' Liste löschen', "action=delete&id={$list['id']}")."<br>".
97
-                    "<a href=\"https://".$list['urlhost']."/postorius/lists/{$list['listname']}.{$list['fqdn']}\">".other_icon("database_go.png", "Listen-Verwaltung aufrufen")." Verwaltung aufrufen</a>".
98
-                    "</p>\n");
99
-            }
100
-        }
101
-        output("</div>\n");
102
-    }
103
-    output("</div>");
104
-} else {
105
-    // keine Listen
106
-    output('<p><em>Sie betreiben bisher keine Mailinglisten.</em></p>');
107
-}
108
-
109
-# 2021-11-13, Ab sofort keine neuen Mailinglisten mehr
110
-#addnew('newlist', 'Neue Mailingliste anlegen');
111
-output("
112
-<p><strong>Hinweise:</strong><br />
113
-<sup>1</sup>) Sie können später im Webinterface von Mailman einen abweichenden oder auch mehrere Verwalter eintragen. Die Information auf dieser Seite wird zyklisch synchronisiert.<br />
114
-<sup>2</sup>) Die Größe der Archive wird in regelmäßigen Abständen eingelesen. Der hier angezeigte Wert ist möglicherweise nicht mehr aktuell.</p>\n");
... ...
@@ -1,21 +0,0 @@
1
-<?php
2
-/*
3
-This file belongs to the Webinterface of schokokeks.org Hosting
4
-
5
-Written by schokokeks.org Hosting, namely
6
-  Bernd Wurst <bernd@schokokeks.org>
7
-  Hanno Böck <hanno@schokokeks.org>
8
-
9
-This code is published under a 0BSD license.
10
-
11
-Nevertheless, in case you use a significant part of this code, we ask (but not require, see the license) that you keep the authors' names in place and return your changes to the public. We would be especially happy if you tell us what you're going to do with this code.
12
-*/
13
-
14
-require_once('include/mailman.php');
15
-$role = $_SESSION['role'];
16
-
17
-$lists = get_lists('');
18
-
19
-if ($role & ROLE_SYSTEMUSER && count($lists) > 0) {
20
-    $menu['mailman_lists'] = ["label" => "Mailinglisten", "file" => "lists", "weight" => 5, 'submenu' => 'email_vmail'];
21
-}
... ...
@@ -1,3 +0,0 @@
1
-name = mailman
2
-description = Mailman-Verwaltung
3
-permission = Mailinglisten erstellen
... ...
@@ -1,49 +0,0 @@
1
-<?php
2
-/*
3
-This file belongs to the Webinterface of schokokeks.org Hosting
4
-
5
-Written by schokokeks.org Hosting, namely
6
-  Bernd Wurst <bernd@schokokeks.org>
7
-  Hanno Böck <hanno@schokokeks.org>
8
-
9
-This code is published under a 0BSD license.
10
-
11
-Nevertheless, in case you use a significant part of this code, we ask (but not require, see the license) that you keep the authors' names in place and return your changes to the public. We would be especially happy if you tell us what you're going to do with this code.
12
-*/
13
-
14
-require_once('mailman.php');
15
-require_role(ROLE_SYSTEMUSER);
16
-
17
-title("Neue Mailingliste erstellen");
18
-$section = 'mailman_lists';
19
-$domains = get_mailman_domains();
20
-
21
-$maildomains = ['0' => config('mailman_host')];
22
-foreach ($domains as $domain) {
23
-    $maildomains[$domain['id']] = $domain['fqdn'];
24
-}
25
-
26
-$newdomains = get_possible_mailmandomains();
27
-if ($newdomains) {
28
-    $maildomains[null] = '--------------------------';
29
-    foreach ($newdomains as $domain) {
30
-        $maildomains['d'.$domain['id']] = 'lists.'.$domain['fqdn'];
31
-    }
32
-}
33
-output(
34
-    '<p>Erstellen Sie hier eine neue Mailingliste auf unserem zentralen Mailinglisten-Manager (Mailman). Die Liste wird <strong>mit etwas Zeitverzögerung</strong> angelegt, Sie erhalten dann eine E-Mail an die unten angegebene Adresse des Listen-Verwalters.</p>
35
-    <p><strong>Hinweis zum Listen-Verwalter:</strong> Der Listen-Verwalter bzw. Moderator erhält später im Betrieb auch die Nachrichten, die Mailman nicht zur Liste sendet mit der Bitte um Moderation/Freigabe. Bitte geben Sie hier eine E-Mail-Adresse an, die über keinen besonders aggressiven Spamfilter verfügt und auf der keine Autoresponder aktiviert werden.</p>
36
-
37
-'.html_form('mailman_newlist', 'save', 'action=new', '
38
-<table>
39
-<tr><td>Listenname:</td><td><input type="text" name="listname" value="" />&#160;@&#160;'.html_select('maildomain', $maildomains, '0').'</td></tr>
40
-<tr><td>E-Mail-Adresse des Listen-Verwalters:</td><td><input type="text" name="admin" value="'.$_SESSION['userinfo']['username'].'@'.config('masterdomain').'" /></td></tr>
41
-</table>
42
-<br />
43
-<input type="submit" name="submit" value="Anlegen" />
44
-').'
45
-
46
-<h4>Hinweis zu Domains:</h4>
47
-<p>Die Angabe der Listen-Domain ist bei Mailman eher kosmetischer Natur. Auch wenn Sie eine eigene Domain benutzen, muss der Listennamen dennoch eindeutig auf dem gesamten Server sein.</p>
48
-<p>Aufgrund der Architektur von Mailman ist es zudem notwendig, für einen Hostname jeweils die Mail-Zustellung fest auf Mailman zu konfigurieren. Unter diesen Subdomains kann keine anderweitige E-Mail-Adresse benutzt werden. Sofern Sie erstmalig eine Ihrer eigenen Domains für eine Mailingliste wählen (im Auswahlfeld unter der Linie) wird eine entsprechende Konfiguration erstellt. Die Liste ist in dem Fall erst nach einigen Minuten (bis zu maximal einer Stunde) für eingehende E-Mails erreichbar.</p>'
49
-);
... ...
@@ -1,81 +0,0 @@
1
-<?php
2
-/*
3
-This file belongs to the Webinterface of schokokeks.org Hosting
4
-
5
-Written by schokokeks.org Hosting, namely
6
-  Bernd Wurst <bernd@schokokeks.org>
7
-  Hanno Böck <hanno@schokokeks.org>
8
-
9
-This code is published under a 0BSD license.
10
-
11
-Nevertheless, in case you use a significant part of this code, we ask (but not require, see the license) that you keep the authors' names in place and return your changes to the public. We would be especially happy if you tell us what you're going to do with this code.
12
-*/
13
-
14
-require_once('mailman.php');
15
-require_role(ROLE_SYSTEMUSER);
16
-
17
-$title = "Neue Mailingliste erstellen";
18
-$domains = get_mailman_domains();
19
-
20
-$maildomains = ['0' => config('mailman_host')];
21
-foreach ($domains as $domain) {
22
-    $maildomains[$domain['id']] = $domain['fqdn'];
23
-}
24
-DEBUG("maildomains");
25
-DEBUG($maildomains);
26
-
27
-if ($_GET['action'] == 'new') {
28
-    $maildomain = $_POST['maildomain'];
29
-    DEBUG("maildomain: ".$maildomain);
30
-    if ($maildomain == null) {
31
-        system_failure('Ihre Domain-Auswahl scheint ungültig zu sein');
32
-    } elseif ('0' === (string) $maildomain) {
33
-        DEBUG("maildomain == 0");
34
-        $maildomain = null;
35
-    } elseif (isset($maildomains[$maildomain])) {
36
-        // regular, OK
37
-        DEBUG("maildomain in \$maildomains");
38
-    } else {
39
-        DEBUG("possible new maildomain");
40
-        $possible = get_possible_mailmandomains();
41
-        $found = false;
42
-        foreach ($possible as $domain) {
43
-            if ($maildomain == 'd'.$domain['id']) {
44
-                // lege Mailman-Domain neu an
45
-                $found = true;
46
-                $maildomain = insert_mailman_domain('lists', $domain['id']);
47
-                warning('Die Domain '.$domain['fqdn'].' wurde erstmals für eine Mailingliste benutzt. Aufgrund der dafür nötigen Änderungen kann es bis zu 1 Stunde dauern, bis Mails an diese Adresse korrekt zugestellt werden.');
48
-            }
49
-        }
50
-        if (! $found) {
51
-            system_failure('Ihre Domain-Auswahl scheint ungültig zu sein');
52
-        }
53
-    }
54
-
55
-    create_list($_POST['listname'], $maildomain, $_POST['admin']);
56
-    redirect('lists');
57
-} elseif ($_GET['action'] == 'newpw') {
58
-    $list = get_list($_GET['id']);
59
-    $sure = user_is_sure();
60
-    if ($sure === null) {
61
-        are_you_sure('action=newpw&id='.$list['id'], 'Möchten Sie für die Mailingliste »<strong>'.$list['listname'].'</strong>@'.$list['fqdn'].'« ein neues Passwort anfordern? (Das neue Passwort wird dem Listenverwalter zugeschickt.)');
62
-    } elseif ($sure === true) {
63
-        request_new_password($list['id']);
64
-        redirect('lists');
65
-    } elseif ($sure === false) {
66
-        redirect('lists');
67
-    }
68
-} elseif ($_GET['action'] == 'delete') {
69
-    $list = get_list($_GET['id']);
70
-    $sure = user_is_sure();
71
-    if ($sure === null) {
72
-        are_you_sure('action=delete&id='.$list['id'], 'Möchten Sie die Mailingliste »<strong>'.$list['listname'].'</strong>@'.$list['fqdn'].'« wirklich löschen?');
73
-    } elseif ($sure === true) {
74
-        delete_list($list['id']);
75
-        redirect('lists');
76
-    } elseif ($sure === false) {
77
-        redirect('lists');
78
-    }
79
-} else {
80
-    system_failure('Function not implemented');
81
-}
... ...
@@ -1,67 +0,0 @@
1
-#mailman_lists_container {
2
-    display: flex;
3
-    flex-direction: row;
4
-    flex-wrap: wrap;
5
-}
6
-
7
-.mailman_list {
8
-    width: 350px;
9
-    border: none;
10
-    border-left: 5px solid black;
11
-    background-color: #f5f5f5;
12
-    margin: 10px;
13
-    padding: 4px;
14
-}
15
-
16
-.mailman_list.regular {
17
-    border-color: #0a0;
18
-    background-color: #dfd;
19
-}
20
-.mailman_list.deleted {
21
-    border-color: red;
22
-    background-color: #fdd;
23
-}
24
-.mailman_list.new {
25
-    border-color: #ff0;
26
-    background-color: #ffd;
27
-}
28
-.mailman_list.edited {
29
-    border-color: #00a;
30
-    background-color: #ddf;
31
-}
32
-.mailman_list.error {
33
-    /* nutzt den default */
34
-}
35
-
36
-p.listname {
37
-    margin: 0;
38
-    padding: 0;
39
-    font-size: 100%;
40
-    font-weight: normal;
41
-    word-wrap: break-word;
42
-}
43
-p.listname span.listname {
44
-    font-weight: bold;
45
-    font-size: 130%;
46
-}
47
-
48
-p.listadmin {
49
-    font-size: 90%;
50
-    margin-bottom: 0;
51
-}
52
-p.status, p.archivesize {
53
-    margin-top: 0;
54
-    margin-bottom: 0;
55
-    font-size: 90%;
56
-}
57
-input#filter {
58
-    padding-right: 25px;
59
-}
60
-button#clear {
61
-    width: 20px;
62
-    margin-left: -22px;
63
-    margin-right: 1em;
64
-    padding: 0 5px;
65
-    background-color: #fff;
66
-    border: 0;
67
-}
68 0