* alle internen Links sinnvoll (und gleichartig!) encoden * Automatischer Upgrader für Drupal funktioniert jetzt
bernd

bernd commited on 2009-03-07 14:48:53
Zeige 14 geänderte Dateien mit 146 Einfügungen und 33 Löschungen.


git-svn-id: https://svn.schokokeks.org/repos/tools/webinterface/trunk@1301 87cf0b9e-d624-0410-a070-f6ee81989793
... ...
@@ -75,13 +75,11 @@ function random_string($nc, $a='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV
75 75
 
76 76
 function are_you_sure($query_string, $question)
77 77
 {
78
-  global $debugmode;
79
-  if ($debugmode)
80
-    $query_string = 'debug&'.$query_string;
78
+  $query_string = encode_querystring($query_string);
81 79
   $token = random_string(20);
82 80
   $_SESSION['are_you_sure_token'] = $token;
83 81
   output("<h3>Sicherheitsabfrage</h3>
84
-    <form action=\"?{$query_string}\" method=\"post\">
82
+    <form action=\"{$query_string}\" method=\"post\">
85 83
     <div class=\"confirmation\">
86 84
       <div class=\"question\">{$question}</div>
87 85
       <p class=\"buttons\">
... ...
@@ -145,31 +143,40 @@ function check_form_token($form_id, $formtoken = NULL)
145 143
 }
146 144
 
147 145
 
148
-
149
-function internal_link($file, $label, $querystring = '', $attribs = '')
146
+function encode_querystring($querystring)
150 147
 {
151
-  $debugstr = '';
152 148
   global $debugmode;
153 149
   if ($debugmode)
154
-    $debugstr = 'debug&amp;';
155
-  $querystring = str_replace('&', '&amp;', $querystring);
150
+    $querystring = 'debug&'.$querystring;
151
+  $query = explode('&', $querystring);
152
+  $new_query = array();
153
+  foreach ($query AS $item)
154
+    if ($item != '')
155
+    {
156
+      list($key, $val) = explode('=', $item, 2);
157
+      $new_query[] = $key.'='.($val);
158
+    }
159
+  $querystring = implode('&amp;', $new_query);
160
+  if ($querystring)
161
+    $querystring = '?'.$querystring;
162
+  
163
+  return $querystring;
164
+}
165
+
156 166
 
157
-  return "<a href=\"{$file}?{$debugstr}${querystring}\" {$attribs} >{$label}</a>";
167
+
168
+function internal_link($file, $label, $querystring = '', $attribs = '')
169
+{
170
+  $querystring = encode_querystring($querystring);
171
+  return "<a href=\"{$file}{$querystring}\" {$attribs} >{$label}</a>";
158 172
 }
159 173
 
160 174
 
161 175
 function html_form($form_id, $scriptname, $querystring, $content)
162 176
 {
163
-  $debugstr = '';
164
-  global $debugmode;
165
-  if ($debugmode)
166
-    $debugstr = 'debug&amp;';
167
-  $querystring = str_replace('&', '&amp;', $querystring);
168
-  $qmark = '?';
169
-  if ($debugstr == '' && $querystring == '')
170
-    $qmark = '';
177
+  $querystring = encode_querystring($querystring);
171 178
   $ret = '';
172
-  $ret .= '<form action="'.$scriptname.$qmark.$debugstr.$querystring.'" method="post">'."\n";
179
+  $ret .= '<form action="'.$scriptname.$querystring.'" method="post">'."\n";
173 180
   $ret .= '<p style="display: none;"><input type="hidden" name="formtoken" value="'.generate_form_token($form_id).'" /></p>'."\n";
174 181
   $ret .= $content;
175 182
   $ret .= '</form>';
... ...
@@ -144,6 +144,23 @@ function check_path( $input )
144 144
 }
145 145
 
146 146
 
147
+function in_homedir($path)
148
+{
149
+  DEBUG("Prüfe »{$path}«");
150
+  if (! check_path($path))
151
+  {
152
+    DEBUG('Kein Pfad');
153
+    return False;
154
+  }
155
+  if (! isset($_SESSION['userinfo']['homedir']))
156
+  {
157
+    DEBUG("Kann homedir nicht ermitteln");
158
+    return False;
159
+  }
160
+  return strncmp($_SESSION['userinfo']['homedir'], $path, count($_SESSION['userinfo']['homedir'])) == 0;
161
+}
162
+
163
+
147 164
 function check_emailaddr( $input )
148 165
 {
149 166
   return (bool) filter_var($input, FILTER_VALIDATE_EMAIL) == $input;
... ...
@@ -21,7 +21,7 @@ if ($_GET['type'] == 'dyndns') {
21 21
     $sure = user_is_sure();
22 22
     if ($sure === NULL)
23 23
     {
24
-      are_you_sure("type=dyndns&action=delete&amp;id={$id}", "Möchten Sie den DynDNS-Account wirklich löschen?");
24
+      are_you_sure("type=dyndns&action=delete&id={$id}", "Möchten Sie den DynDNS-Account wirklich löschen?");
25 25
     }
26 26
     elseif ($sure === true)
27 27
     {
... ...
@@ -114,7 +114,7 @@ elseif (isset($_GET['action']) && $_GET['action'] == 'delete' && $_GET['account'
114 114
     $_GET['account'] = (int) $_GET['account'];
115 115
     $account = get_mailaccount($_GET['account']);
116 116
     $enabled = ($account['enabled'] ? 'Ja' : 'Nein');
117
-    are_you_sure("action=delete&amp;account={$_GET['account']}", '
117
+    are_you_sure("action=delete&account={$_GET['account']}", '
118 118
     <p>Soll der folgende Account wirklich gelöscht werden?</p>
119 119
     <table style="margin-bottom: 1em;">
120 120
       <tr><td>Benutzername:</td>
... ...
@@ -78,7 +78,7 @@ elseif ($_GET['action'] == 'delete')
78 78
   $sure = user_is_sure();
79 79
   if ($sure === NULL)
80 80
   {
81
-    are_you_sure("action=delete&amp;id={$account['id']}", "Möchten Sie die E-Mail-Adresse »{$account_string}« wirklich löschen?");
81
+    are_you_sure("action=delete&id={$account['id']}", "Möchten Sie die E-Mail-Adresse »{$account_string}« wirklich löschen?");
82 82
   }
83 83
   elseif ($sure === true)
84 84
   {
... ...
@@ -11,7 +11,7 @@ if ($_GET['action'] == 'delete')
11 11
   $sure = user_is_sure();
12 12
   if ($sure === NULL)
13 13
   {
14
-    are_you_sure("action=delete&amp;id={$entry['id']}", "Möchten Sie die E-Mail-Adresse »{$entry['local']}@{$entry['domain']}« von der Ausnahmeliste entfernen?");
14
+    are_you_sure("action=delete&id={$entry['id']}", "Möchten Sie die E-Mail-Adresse »{$entry['local']}@{$entry['domain']}« von der Ausnahmeliste entfernen?");
15 15
   }
16 16
   elseif ($sure === true)
17 17
   {
... ...
@@ -29,7 +29,7 @@ elseif ($_GET['action'] == 'delete')
29 29
   $sure = user_is_sure();
30 30
   if ($sure === NULL)
31 31
   {
32
-    are_you_sure("action=delete&amp;id={$cert['id']}", "Möchten Sie das Zertifikat »{$cert['dn']}« wirklich löschen?");
32
+    are_you_sure("action=delete&id={$cert['id']}", "Möchten Sie das Zertifikat »{$cert['dn']}« wirklich löschen?");
33 33
   }
34 34
   elseif ($sure === true)
35 35
   {
... ...
@@ -56,7 +56,7 @@ elseif ($_GET['action'] == 'delete')
56 56
   $sure = user_is_sure();
57 57
   if ($sure === NULL)
58 58
   {
59
-    are_you_sure("action=delete&amp;account={$_GET['account']}", "Möchten Sie den Account »{$account_string}« wirklich löschen?");
59
+    are_you_sure("action=delete&account={$_GET['account']}", "Möchten Sie den Account »{$account_string}« wirklich löschen?");
60 60
   }
61 61
   elseif ($sure === true)
62 62
   {
... ...
@@ -19,7 +19,7 @@ if (isset($_GET['action']))
19 19
       $sure = user_is_sure();
20 20
       if ($sure === NULL)
21 21
       {
22
-        are_you_sure("action=delete_db&amp;db={$_GET['db']}", "Möchten Sie die Datenbank »{$_GET['db']}« wirklich löschen?");
22
+        are_you_sure("action=delete_db&db={$_GET['db']}", "Möchten Sie die Datenbank »{$_GET['db']}« wirklich löschen?");
23 23
         $output_something = false;
24 24
       }
25 25
       elseif ($sure === true)
... ...
@@ -40,7 +40,7 @@ if (isset($_GET['action']))
40 40
       $sure = user_is_sure();
41 41
       if ($sure === NULL)
42 42
       {
43
-        are_you_sure("action=delete_user&amp;user={$_GET['user']}", "Möchten Sie den Benutzer »{$_GET['user']}« wirklich löschen?");
43
+        are_you_sure("action=delete_user&user={$_GET['user']}", "Möchten Sie den Benutzer »{$_GET['user']}« wirklich löschen?");
44 44
         $output_something = false;
45 45
       }
46 46
       elseif ($sure === true)
... ...
@@ -69,7 +69,7 @@ elseif ($_GET['action'] == 'delete')
69 69
   $sure = user_is_sure();
70 70
   if ($sure === NULL)
71 71
   {
72
-    are_you_sure("action=delete&amp;account={$_GET['account']}", "Möchten Sie den Account »{$account_string}« wirklich löschen?");
72
+    are_you_sure("action=delete&account={$_GET['account']}", "Möchten Sie den Account »{$account_string}« wirklich löschen?");
73 73
   }
74 74
   elseif ($sure === true)
75 75
   {
... ...
@@ -211,7 +211,7 @@ elseif ($_GET['action'] == 'deletealias')
211 211
   $sure = user_is_sure();
212 212
   if ($sure === NULL)
213 213
   {
214
-    are_you_sure("action=deletealias&amp;alias={$_GET['alias']}", "Möchten Sie das Alias »{$alias_string}« für die Subdomain »{$vhost_string}« wirklich löschen?");
214
+    are_you_sure("action=deletealias&alias={$_GET['alias']}", "Möchten Sie das Alias »{$alias_string}« für die Subdomain »{$vhost_string}« wirklich löschen?");
215 215
   }
216 216
   elseif ($sure === true)
217 217
   {
... ...
@@ -236,7 +236,7 @@ elseif ($_GET['action'] == 'delete')
236 236
   $sure = user_is_sure();
237 237
   if ($sure === NULL)
238 238
   {
239
-    are_you_sure("action=delete&amp;vhost={$_GET['vhost']}", "Möchten Sie die Subdomain »{$vhost_string}« wirklich löschen?");
239
+    are_you_sure("action=delete&vhost={$_GET['vhost']}", "Möchten Sie die Subdomain »{$vhost_string}« wirklich löschen?");
240 240
   }
241 241
   elseif ($sure === true)
242 242
   {
... ...
@@ -3,6 +3,7 @@
3 3
 require_once('session/start.php');
4 4
 
5 5
 require_once('freewvs.php');
6
+require_once('webapp-installer.php');
6 7
 
7 8
 require_role(array(ROLE_SYSTEMUSER));
8 9
 
... ...
@@ -30,11 +31,12 @@ $results = load_results();
30 31
 output('<h3>Aktuell installierte Web-Anwendungen</h3>
31 32
 <p>Die folgenden Web-Anwendungen wurden beim letzten Programmdurchlauf gefunden. Diese Liste wird i.d.R. täglich aktualisiert.</p>');
32 33
 foreach ($results AS $app) {
34
+  $url = get_url_for_dir($app['directory']);
33 35
   output("<div class='freewvs freewvs-{$app['state']}'>\n");
34 36
   if ($app['state'] == 'ok') {
35 37
     output("<img src='{$prefix}images/ok.png' />\n");
36 38
     output("<p><strong>{$app['appname']} {$app['version']}</strong></p>\n");
37
-    output("<p>Gefunden in {$app['directory']}</p>\n");
39
+    output("<p>Gefunden in {$app['directory']} (<a href=\"{$url}\">{$url}</a>)</p>\n");
38 40
     output("<p>Diese Anwendung ist aktuell und hat keine allgemein bekannten Sicherheitsprobleme.</p>\n");
39 41
   }
40 42
   else {
... ...
@@ -45,7 +47,7 @@ foreach ($results AS $app) {
45 47
     }
46 48
     output("<img src='{$prefix}images/error.png' />\n");
47 49
     output("<p><strong>{$app['appname']} {$app['version']}</strong></p>\n");
48
-    output("<p>Gefunden in {$app['directory']}</p>\n");
50
+    output("<p>Gefunden in {$app['directory']} (<a href=\"{$url}\">{$url}</a>)</p>\n");
49 51
     if ($app['safeversion'] != '') {
50 52
       output("<p>Diese Anwendung ist von Sicherheits-Problemen betroffen. Ein <strong>Update auf Version {$app['safeversion']}</strong> wird dringend empfohlen. Prüfen Sie anhand der unten genannten Referenz welche Gefahren von dieser Anwendung momentan ausgehen.</p>\n");
51 53
     } else {
... ...
@@ -53,7 +55,12 @@ foreach ($results AS $app) {
53 55
     }
54 56
     output("<p><strong>Referenz zu diesem Sicherheitsproblem: <a href='{$vulnlink}'>{$app['vulninfo']}</a></strong></p>");
55 57
     if ($doclink != NULL)
56
-      output('<p><strong>Hinweis:</strong> Um Ihnen das Upgrade leichter zu machen, möchten wir Sie auf eine <a href="'.$doclink.'">deutschsprachige Upgrade-Anleitung</a> aufmerksam machen.</p>');
58
+      output('<p><strong>Hinweis:</strong> Um Ihnen das Upgrade leichter zu machen, möchten wir Sie auf eine <a href="'.$doclink.'">deutschsprachige Upgrade-Anleitung</a> aufmerksam machen.</p>'."\n");
59
+    $up = upgradeable($app['appname'], $app['version']);
60
+    if ($up)
61
+    {
62
+      output('<p>'.internal_link('requestupdate', 'Update automatisch durchführen', "dir={$app['directory']}&app={$up}")."</p>\n");
63
+    }
57 64
   }
58 65
   output("</div>\n");
59 66
   #output("<tr><td>{$app['appname']} ({$app['version']})</td><td>{$app['state']}</td></tr>");
... ...
@@ -13,6 +13,54 @@ function create_new_webapp($appname, $directory, $url, $data)
13 13
 }
14 14
 
15 15
 
16
+function request_update($appname, $directory, $url)
17
+{
18
+  $username = mysql_real_escape_string($_SESSION['userinfo']['username']);
19
+  $appname = mysql_real_escape_string($appname);
20
+  $directory = mysql_real_escape_string($directory);
21
+  $url = maybe_null(mysql_real_escape_string($url));
22
+  db_query("INSERT INTO vhosts.webapp_installer VALUES (NULL, '{$appname}', '{$directory}', {$url}, 'old', '{$username}', NULL)");
23
+}
24
+
25
+
26
+function upgradeable($appname, $version)
27
+{
28
+  DEBUG("Is {$appname}-{$version} upgradeable?");
29
+  if ($appname == 'Drupal')
30
+  {
31
+    DEBUG("found Drupal!");
32
+    if (substr($version, 0, 2) == '6.')
33
+    {
34
+      DEBUG("found Drupal-6.*!");
35
+      return 'drupal6';
36
+    }
37
+    DEBUG("Version: ".substr($version, 0, 2));
38
+  }
39
+  DEBUG("found no upgradeable webapp!");
40
+  return NULL;
41
+}
42
+
43
+
44
+function get_url_for_dir($docroot, $cutoff = '')
45
+{
46
+  if (substr($docroot, -1) == '/')
47
+    $docroot = substr($docroot, 0, -1);
48
+  $docroot = mysql_real_escape_string($docroot);
49
+  $result = db_query("SELECT `ssl`, IF(FIND_IN_SET('aliaswww', options), CONCAT('www.',fqdn), fqdn) AS fqdn FROM vhosts.v_vhost WHERE docroot IN ('{$docroot}', '{$docroot}/') LIMIT 1");
50
+  if (mysql_num_rows($result) < 1)
51
+  {
52
+    if (!strstr($docroot, '/'))
53
+      return NULL;
54
+    return get_url_for_dir(substr($docroot, 0, strrpos($docroot, '/')), substr($docroot, strrpos($docroot, '/')).$cutoff);
55
+  } 
56
+  $tmp = mysql_fetch_assoc($result);
57
+  $prefix = 'http://';
58
+  if ($tmp['ssl'] == 'forward' || $tmp['ssl'] == 'https')
59
+    $prefix = 'https://';
60
+  return $prefix.$tmp['fqdn'].$cutoff;
61
+}
62
+
63
+
16 64
 function create_webapp_mysqldb($handle)
17 65
 {
18 66
   // dependet auf das mysql-modul
... ...
@@ -0,0 +1,34 @@
1
+<?php
2
+require_once('session/start.php');
3
+require_once('webapp-installer.php');
4
+
5
+require_role(ROLE_SYSTEMUSER);
6
+
7
+
8
+$directory = $_GET['dir'];
9
+
10
+if (! in_homedir($directory))
11
+  system_failure('Pfad nicht im Homedir oder ungültige Zeichen im Pfad');
12
+
13
+$app = $_GET['app'];
14
+verify_input_general($app);
15
+
16
+
17
+$sure = user_is_sure();
18
+if ($sure === NULL)
19
+{
20
+  are_you_sure("dir={$directory}&app={$app}", "Möchten Sie ein Update der Anwendung »{$app}« im Verzeichnis »{$directory}« automatisch durchführen lassen?");
21
+}
22
+elseif ($sure === true)
23
+{
24
+  request_update($app, $directory, get_url_for_dir($directory));
25
+  if (! $debugmode)
26
+    header("Location: freewvs");
27
+}
28
+elseif ($sure === false)
29
+{
30
+  if (! $debugmode)
31
+    header("Location: freewvs");
32
+}
33
+
34
+
0 35