diff options
author | Evan Prodromou <evan@status.net> | 2010-09-02 16:56:52 -0400 |
---|---|---|
committer | Evan Prodromou <evan@status.net> | 2010-09-02 16:56:52 -0400 |
commit | 7517409bf16137a9d8a420b7358f30fa55945ba0 (patch) | |
tree | 56fe423029a2efa872ca8f30423ec8b4e5672627 /lib | |
parent | 468a15db004ff0e02d15c7ef515aee2c96f441cc (diff) | |
parent | 11f7fce3bb59af46dd76c1e219f8df04de9e03af (diff) |
Merge branch 'testing' into 0.9.x
Diffstat (limited to 'lib')
-rw-r--r-- | lib/themeuploader.php | 34 | ||||
-rw-r--r-- | lib/util.php | 3 |
2 files changed, 23 insertions, 14 deletions
diff --git a/lib/themeuploader.php b/lib/themeuploader.php index 370965db0..abf0658d3 100644 --- a/lib/themeuploader.php +++ b/lib/themeuploader.php @@ -128,8 +128,16 @@ class ThemeUploader continue; } - // Check the directory structure... + // Is this a safe or skippable file? $path = pathinfo($name); + if ($this->skippable($path['filename'], $path['extension'])) { + // Documentation and such... booooring + continue; + } else { + $this->validateFile($path['filename'], $path['extension']); + } + + // Check the directory structure... $dirs = explode('/', $path['dirname']); $baseDir = array_shift($dirs); if ($commonBaseDir === false) { @@ -144,14 +152,6 @@ class ThemeUploader $this->validateFileOrFolder($dir); } - // Is this a safe or skippable file? - if ($this->skippable($path['filename'], $path['extension'])) { - // Documentation and such... booooring - continue; - } else { - $this->validateFile($path['filename'], $path['extension']); - } - $fullPath = $dirs; $fullPath[] = $path['basename']; $localFile = implode('/', $fullPath); @@ -180,9 +180,12 @@ class ThemeUploader } } + /** + * @fixme Probably most unrecognized files should just be skipped... + */ protected function skippable($filename, $ext) { - $skip = array('txt', 'rtf', 'doc', 'docx', 'odt'); + $skip = array('txt', 'html', 'rtf', 'doc', 'docx', 'odt', 'xcf'); if (strtolower($filename) == 'readme') { return true; } @@ -201,17 +204,24 @@ class ThemeUploader protected function validateFileOrFolder($name) { - if (!preg_match('/^[a-z0-9_-]+$/i', $name)) { + if (!preg_match('/^[a-z0-9_\.-]+$/i', $name)) { $msg = _("Theme contains invalid file or folder name. " . "Stick with ASCII letters, digits, underscore, and minus sign."); throw new ClientException($msg); } + if (preg_match('/\.(php|cgi|asp|aspx|js|vb)\w/i', $name)) { + $msg = _("Theme contains unsafe file extension names; may be unsafe."); + throw new ClientException($msg); + } return true; } protected function validateExtension($ext) { - $allowed = array('css', 'png', 'gif', 'jpg', 'jpeg'); + $allowed = array('css', // CSS may need validation + 'png', 'gif', 'jpg', 'jpeg', + 'svg', // SVG images/fonts may need validation + 'ttf', 'eot', 'woff'); if (!in_array(strtolower($ext), $allowed)) { $msg = sprintf(_("Theme contains file of type '.%s', " . "which is not allowed."), diff --git a/lib/util.php b/lib/util.php index 66600c766..f63e152e3 100644 --- a/lib/util.php +++ b/lib/util.php @@ -1018,8 +1018,7 @@ function common_local_url($action, $args=null, $params=null, $fragment=null, $ad function common_is_sensitive($action) { - static $sensitive = array('login', 'register', 'passwordsettings', - 'twittersettings', 'api'); + static $sensitive = array('login', 'register', 'passwordsettings', 'api'); $ssl = null; if (Event::handle('SensitiveAction', array($action, &$ssl))) { |