diff --git a/bundled-libs/create_release.sh b/bundled-libs/create_release.sh
index e159f0cd..a9578519 100755
--- a/bundled-libs/create_release.sh
+++ b/bundled-libs/create_release.sh
@@ -40,8 +40,20 @@ else
echo " serious harm! Only use it, if you are a developer and about"
echo " to bundle a new release version!"
echo ""
- echo "Hit [ENTER] to continue, or abort this script"
+ echo "Hit [ENTER] to continue, or abort this script (CTRL-C)"
read -n 1
+ gensums=0
+ which php > /dev/null
+ if [ $? -ne 0 ]
+ then
+ gensums=-1
+ echo "NOTICE: Checksums will not be generated because PHP is not available."
+ echo " Install PHP to generate checksums for file validation, or "
+ echo " run serendipity_generateFTPChecksums.php manually."
+ echo ""
+ echo "Hit [ENTER] to continue, or abort this script (CTRL-C)"
+ read -n 1
+ fi
echo "1. Operating on basedirectory ../../$2"
cd ../../
@@ -81,7 +93,21 @@ else
echo " [DONE]"
echo ""
- echo "6. Altering CVS to be useful for anonymous users..."
+ echo "6. Generating checksums..."
+ if [ $gensums -ne 0 ]
+ then
+ echo " [SKIP]"
+ else
+ if (echo "true" | php -B "define('IN_serendipity', true);" -F serendipity_generateFTPChecksums.php)
+ then
+ echo " [DONE]"
+ else
+ rm -rf checksums.inc.php
+ echo " [FAIL]"
+ fi
+ fi
+ echo ""
+ echo "7. Altering CVS to be useful for anonymous users..."
echo " - Removing CVS branch tag, so that a user can upgrade to latest CVS"
find "$2" -type f -name Tag -exec rm {} \;
echo " [DONE]"
@@ -93,12 +119,12 @@ else
echo " [DONE]"
echo ""
- echo "7. Creating .tgz file $1"
+ echo "8. Creating .tgz file $1"
tar --owner=$3 --group=$4 -czf "$1" "$2"
echo " [DONE]"
echo ""
- echo "8. All Done. Bybe-Bye."
+ echo "9. All Done. Bye-Bye."
else
echo "Basedirectory ../../$2 not found. Check parameters"
fi
diff --git a/bundled-libs/serendipity_generateFTPChecksums.php b/bundled-libs/serendipity_generateFTPChecksums.php
new file mode 100644
index 00000000..57cdfe13
--- /dev/null
+++ b/bundled-libs/serendipity_generateFTPChecksums.php
@@ -0,0 +1,59 @@
+ $sum) {
+ fwrite($file, "'$fname' => '$sum',\n");
+ }
+ fwrite($file, ');');
+ fclose($file);
+}
+/* vim: set sts=4 ts=4 sw=4 expandtab : */
+?>
diff --git a/include/admin/upgrader.inc.php b/include/admin/upgrader.inc.php
index 8ecf8ff8..30933287 100644
--- a/include/admin/upgrader.inc.php
+++ b/include/admin/upgrader.inc.php
@@ -264,6 +264,25 @@ if (($showAbort && $serendipity['GET']['action'] == 'ignore') || $serendipity['G
?>
+
+
+ |
+
+
+ $sum) {
+ echo serendipity_upgraderResultDiagnose(S9Y_U_ERROR, sprintf(CHECKSUM_FAILED, $rfile));
+ }
+ }
+ ?> |
+
+
|
diff --git a/include/functions_installer.inc.php b/include/functions_installer.inc.php
index 0edeb645..7fb100d4 100644
--- a/include/functions_installer.inc.php
+++ b/include/functions_installer.inc.php
@@ -688,6 +688,11 @@ function serendipity_checkInstallation() {
$errs = array();
+ $badsums = serendipity_verifyFTPChecksums();
+ foreach ($badsums as $rfile => $sum) {
+ $errs[] = sprintf(CHECKSUM_FAILED, $rfile);
+ }
+
serendipity_initPermalinks();
// Check dirs
@@ -1182,3 +1187,113 @@ global $serendipity;
}
}
+/**
+ * Retrieve an FTP-compatible checksum for a file.
+ *
+ * @access public
+ * @param string filename is the path to the file to checksum
+ * @param string type forces a particular interpretation of newlines. Mime
+ * types and strings starting with 'text' will cause newlines to be stripped
+ * before the checksum is calculated (default: null, determine from finfo
+ * and extension)
+ * @return string An MD5 checksum of the file, with newlines removed if it's
+ * an ASCII type; or false if the file cannot be read
+ */
+function serendipity_FTPChecksum($filename, $type = null) {
+ /** Only read the finfo database once */
+ static $debug_exts = array();
+
+ // Must be able to read the file
+ if (!is_readable($filename)) {
+ return false;
+ }
+
+ // Figure out whether it's binary or text by extension
+ if ($type == null) {
+ $parts = pathinfo($filename);
+ $ext = '';
+ // Some PHP versions throw a warning if the index doesn't exist
+ if (isset($parts['extension'])) {
+ $ext = $parts['extension'];
+ }
+ // If they're case-insensitive equal, strcasecmp() returns 0, or
+ // 'false'. So I use && to find if any of them are 0, in the
+ // most likely fail-fast order.
+ if (strcasecmp($ext, 'php') &&
+ strcasecmp($ext, 'tpl') &&
+ strcasecmp($ext, 'sql') &&
+ strcasecmp($ext, 'js') &&
+ strcasecmp($ext, 'txt') &&
+ strcasecmp($ext, 'htc') &&
+ strcasecmp($ext, 'css') &&
+ strcasecmp($ext, 'dist') &&
+ strcasecmp($ext, 'lib') &&
+ strcasecmp($ext, 'sh') &&
+ strcasecmp($ext, 'html') &&
+ strcasecmp($ext, 'htm') &&
+ !empty($ext)) {
+ if (!in_array($ext, array_keys($debug_exts))) {
+ $debug_exts[$ext] = $filename;
+ }
+ $type = 'bin';
+ } else {
+ $type = 'text';
+ }
+ }
+
+ // Calculate the checksum
+ $md5 = false;
+ if (stristr($type, 'text')) {
+ // This is a text-type file. We need to remove linefeeds before
+ // calculating a checksum, to account for possible FTP conversions
+ // that are inconvenient, but still valid. But we don't want to
+ // allow newlines anywhere; just different *kinds* of newlines.
+ $newlines = array("#\r\n#", "#\r#", "#\n#");
+ $file = file_get_contents($filename);
+ $file = preg_replace($newlines, ' ', $file);
+ $md5 = md5($file);
+ } else {
+ // Just get its md5sum
+ $md5 = md5_file($filename);
+ }
+
+ return $md5;
+}
+
+/**
+ * Validate checksums for all required files.
+ *
+ * @return A list of all files that failed checksum, where keys are the
+ * relative path of the file, and values are the bad checksum
+ */
+function serendipity_verifyFTPChecksums() {
+ // Load the checksums
+ require_once S9Y_INCLUDE_PATH . 'checksums.inc.php';
+ // Verify that every file in the checksum list was uploaded correctly
+ $badsums = array();
+ $basedir = realpath(dirname(__FILE__) . '/../');
+ foreach ($serendipity['checksums'] as $prel => $sum) {
+ $path = $basedir . '/' . $prel;
+ // Don't take checksums of directories
+ if (is_dir($path)) {
+ // Weird that it's even here.
+ continue;
+ }
+
+ // Can't checksum unreadable or nonexistent files
+ if (!is_readable($path)) {
+ $badsums[$prel] = 'missing';
+ continue;
+ }
+
+ // Validate checksum
+ $calcsum = serendipity_FTPChecksum($path);
+ if ($sum != $calcsum) {
+ $badsums[$prel] = $calcsum;
+ continue;
+ }
+ }
+
+ return $badsums;
+}
+/* vim: set sts=4 ts=4 sw=4 expandtab : */
diff --git a/lang/UTF-8/serendipity_lang_bg.inc.php b/lang/UTF-8/serendipity_lang_bg.inc.php
index f040ecec..4aa043e9 100644
--- a/lang/UTF-8/serendipity_lang_bg.inc.php
+++ b/lang/UTF-8/serendipity_lang_bg.inc.php
@@ -368,6 +368,7 @@ $i18n_filename_to = array('-', 'a', 'A', 'b', 'B', 'v', 'V', 'g', 'G', 'd', 'D
@define('SYNDICATION_PLUGIN_GENERIC_FEED', 'Емисия %s');
@define('PERMISSIONS', 'Права');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'Новите настройки са записани в %s');
diff --git a/lang/UTF-8/serendipity_lang_cn.inc.php b/lang/UTF-8/serendipity_lang_cn.inc.php
index 7c4238c1..e378cc2e 100644
--- a/lang/UTF-8/serendipity_lang_cn.inc.php
+++ b/lang/UTF-8/serendipity_lang_cn.inc.php
@@ -335,6 +335,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
@define('PERMISSIONS', '权限');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', '新设定已经被保存到 %s');
diff --git a/lang/UTF-8/serendipity_lang_cs.inc.php b/lang/UTF-8/serendipity_lang_cs.inc.php
index e83ae800..361d394d 100644
--- a/lang/UTF-8/serendipity_lang_cs.inc.php
+++ b/lang/UTF-8/serendipity_lang_cs.inc.php
@@ -326,6 +326,7 @@ $i18n_filename_to = array (
@define('FOUND_FILE', 'Založit nový/změnit soubor: %s.');
@define('PERMISSIONS', 'Oprávnění');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
diff --git a/lang/UTF-8/serendipity_lang_cz.inc.php b/lang/UTF-8/serendipity_lang_cz.inc.php
index b3b37468..000bf118 100644
--- a/lang/UTF-8/serendipity_lang_cz.inc.php
+++ b/lang/UTF-8/serendipity_lang_cz.inc.php
@@ -326,6 +326,7 @@ $i18n_filename_to = array (
@define('FOUND_FILE', 'Založit nový/změnit soubor: %s.');
@define('PERMISSIONS', 'Oprávnění');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
diff --git a/lang/UTF-8/serendipity_lang_da.inc.php b/lang/UTF-8/serendipity_lang_da.inc.php
index 14a0031a..e76e950e 100644
--- a/lang/UTF-8/serendipity_lang_da.inc.php
+++ b/lang/UTF-8/serendipity_lang_da.inc.php
@@ -295,6 +295,7 @@
@define('ENTRIES_PER_PAGE', 'artikler per side');
@define('PERMISSIONS', 'Rettigheder');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
diff --git a/lang/UTF-8/serendipity_lang_de.inc.php b/lang/UTF-8/serendipity_lang_de.inc.php
index f09364f7..1e00e658 100644
--- a/lang/UTF-8/serendipity_lang_de.inc.php
+++ b/lang/UTF-8/serendipity_lang_de.inc.php
@@ -320,6 +320,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s Feed');
@define('PERMISSIONS', 'Rechte');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('XML_IMAGE_TO_DISPLAY', 'XML-Button');
diff --git a/lang/UTF-8/serendipity_lang_en.inc.php b/lang/UTF-8/serendipity_lang_en.inc.php
index a072214c..2e942a38 100644
--- a/lang/UTF-8/serendipity_lang_en.inc.php
+++ b/lang/UTF-8/serendipity_lang_en.inc.php
@@ -333,6 +333,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
@define('PERMISSIONS', 'Permissions');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'The new settings have been saved at %s');
diff --git a/lang/UTF-8/serendipity_lang_es.inc.php b/lang/UTF-8/serendipity_lang_es.inc.php
index e4d5fefb..34f83a9b 100644
--- a/lang/UTF-8/serendipity_lang_es.inc.php
+++ b/lang/UTF-8/serendipity_lang_es.inc.php
@@ -320,6 +320,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
@define('PERMISSIONS', 'Permisos');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
diff --git a/lang/UTF-8/serendipity_lang_fa.inc.php b/lang/UTF-8/serendipity_lang_fa.inc.php
index 3bbf650d..c66a058e 100644
--- a/lang/UTF-8/serendipity_lang_fa.inc.php
+++ b/lang/UTF-8/serendipity_lang_fa.inc.php
@@ -334,6 +334,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s');
@define('PERMISSIONS', 'دسترسی ها');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'تنظیمات جدید در %s ثبت شد');
diff --git a/lang/UTF-8/serendipity_lang_fi.inc.php b/lang/UTF-8/serendipity_lang_fi.inc.php
index e552b7fa..85656aea 100644
--- a/lang/UTF-8/serendipity_lang_fi.inc.php
+++ b/lang/UTF-8/serendipity_lang_fi.inc.php
@@ -332,6 +332,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s');
@define('PERMISSIONS', 'Oikeudet');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'Uudet asetukset on tallettetu %s');
diff --git a/lang/UTF-8/serendipity_lang_fr.inc.php b/lang/UTF-8/serendipity_lang_fr.inc.php
index 797ebfdf..4c2f804a 100644
--- a/lang/UTF-8/serendipity_lang_fr.inc.php
+++ b/lang/UTF-8/serendipity_lang_fr.inc.php
@@ -427,6 +427,7 @@
@define('PERMISSIONS', 'Permissions');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('USERCONF_ALLOWPUBLISH', 'Publication de billets ?');
diff --git a/lang/UTF-8/serendipity_lang_hu.inc.php b/lang/UTF-8/serendipity_lang_hu.inc.php
index a3f5d1c7..5c4645b8 100644
--- a/lang/UTF-8/serendipity_lang_hu.inc.php
+++ b/lang/UTF-8/serendipity_lang_hu.inc.php
@@ -333,6 +333,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s hírcsatorna');
@define('PERMISSIONS', 'Jogosultságok');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'Az új beállításokat elmentettük ekkor: %s');
diff --git a/lang/UTF-8/serendipity_lang_is.inc.php b/lang/UTF-8/serendipity_lang_is.inc.php
index 60551d1b..0f8177d7 100644
--- a/lang/UTF-8/serendipity_lang_is.inc.php
+++ b/lang/UTF-8/serendipity_lang_is.inc.php
@@ -333,6 +333,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s straumur');
@define('PERMISSIONS', 'Réttindi');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'Nýju stillingarnar voru vistaðar klukkan %s');
diff --git a/lang/UTF-8/serendipity_lang_it.inc.php b/lang/UTF-8/serendipity_lang_it.inc.php
index 1477b80c..3df62556 100644
--- a/lang/UTF-8/serendipity_lang_it.inc.php
+++ b/lang/UTF-8/serendipity_lang_it.inc.php
@@ -322,6 +322,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', 'feed %s');
@define('PERMISSIONS', 'Permessi');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'Le nuove impostazioni sono state salvate in %s');
diff --git a/lang/UTF-8/serendipity_lang_ja.inc.php b/lang/UTF-8/serendipity_lang_ja.inc.php
index 7122a5e2..31e50ad0 100644
--- a/lang/UTF-8/serendipity_lang_ja.inc.php
+++ b/lang/UTF-8/serendipity_lang_ja.inc.php
@@ -333,6 +333,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s フィード');
@define('PERMISSIONS', '許可');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', '新しい設定は %s に保存されました。');
diff --git a/lang/UTF-8/serendipity_lang_ko.inc.php b/lang/UTF-8/serendipity_lang_ko.inc.php
index 176b9bc0..fedeba0d 100644
--- a/lang/UTF-8/serendipity_lang_ko.inc.php
+++ b/lang/UTF-8/serendipity_lang_ko.inc.php
@@ -335,6 +335,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s 피드');
@define('PERMISSIONS', '권한 설정');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', '새로운 설정이 %s에 저장되었습니다');
diff --git a/lang/UTF-8/serendipity_lang_nl.inc.php b/lang/UTF-8/serendipity_lang_nl.inc.php
index bd713552..0c74931c 100644
--- a/lang/UTF-8/serendipity_lang_nl.inc.php
+++ b/lang/UTF-8/serendipity_lang_nl.inc.php
@@ -335,6 +335,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s-toevoer');
@define('PERMISSIONS', 'Toegangsrechten');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'De instellingen zijn opgeslagen in %s');
diff --git a/lang/UTF-8/serendipity_lang_no.inc.php b/lang/UTF-8/serendipity_lang_no.inc.php
index f02c5fbb..80566881 100644
--- a/lang/UTF-8/serendipity_lang_no.inc.php
+++ b/lang/UTF-8/serendipity_lang_no.inc.php
@@ -295,6 +295,7 @@
/* TRANSLATE */
@define('PERMISSIONS', 'Rettigheter');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
diff --git a/lang/UTF-8/serendipity_lang_pl.inc.php b/lang/UTF-8/serendipity_lang_pl.inc.php
index 5b494746..15d3d63d 100644
--- a/lang/UTF-8/serendipity_lang_pl.inc.php
+++ b/lang/UTF-8/serendipity_lang_pl.inc.php
@@ -335,6 +335,7 @@ $i18n_filename_to = array('_', 'a', 'A', 'a', 'A', 'b', 'B', 'c', 'C', 'c', 'C
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
@define('PERMISSIONS', 'Uprawnienia');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'Ustawienia zostały zapisane o %s');
diff --git a/lang/UTF-8/serendipity_lang_pt.inc.php b/lang/UTF-8/serendipity_lang_pt.inc.php
index a7b61c79..296822ff 100644
--- a/lang/UTF-8/serendipity_lang_pt.inc.php
+++ b/lang/UTF-8/serendipity_lang_pt.inc.php
@@ -318,6 +318,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
@define('PERMISSIONS', 'Permissões');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
diff --git a/lang/UTF-8/serendipity_lang_pt_PT.inc.php b/lang/UTF-8/serendipity_lang_pt_PT.inc.php
index 7b3b9986..9308e6a0 100644
--- a/lang/UTF-8/serendipity_lang_pt_PT.inc.php
+++ b/lang/UTF-8/serendipity_lang_pt_PT.inc.php
@@ -324,6 +324,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
@define('PERMISSIONS', 'Permissões');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'As novas preferências foram guardadas em %s');
diff --git a/lang/UTF-8/serendipity_lang_ro.inc.php b/lang/UTF-8/serendipity_lang_ro.inc.php
index cff67104..817d25d1 100644
--- a/lang/UTF-8/serendipity_lang_ro.inc.php
+++ b/lang/UTF-8/serendipity_lang_ro.inc.php
@@ -333,6 +333,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
@define('PERMISSIONS', 'Permisiuni');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'Noile preferinţe au fost salvate în %s');
diff --git a/lang/UTF-8/serendipity_lang_ru.inc.php b/lang/UTF-8/serendipity_lang_ru.inc.php
index e1e29ccd..77b2946d 100644
--- a/lang/UTF-8/serendipity_lang_ru.inc.php
+++ b/lang/UTF-8/serendipity_lang_ru.inc.php
@@ -336,6 +336,7 @@ $i18n_filename_to = array('_', 'a', 'A', 'b', 'B', 'v', 'V', 'g', 'G', 'd', 'D
@define('SYNDICATION_PLUGIN_GENERIC_FEED', 'лента %s');
@define('PERMISSIONS', 'Права доступа');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'Новые настройки были сохранены в %s');
diff --git a/lang/UTF-8/serendipity_lang_sa.inc.php b/lang/UTF-8/serendipity_lang_sa.inc.php
index 4eea9b85..606f019b 100644
--- a/lang/UTF-8/serendipity_lang_sa.inc.php
+++ b/lang/UTF-8/serendipity_lang_sa.inc.php
@@ -334,6 +334,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
@define('PERMISSIONS', 'الصلاحيات');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'تم حفظ الاعدادات الجديدة في %s');
diff --git a/lang/UTF-8/serendipity_lang_se.inc.php b/lang/UTF-8/serendipity_lang_se.inc.php
index f839c1b0..6b851c6c 100644
--- a/lang/UTF-8/serendipity_lang_se.inc.php
+++ b/lang/UTF-8/serendipity_lang_se.inc.php
@@ -333,6 +333,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s matning');
@define('PERMISSIONS', 'Rättigheter');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'De nya inställningarna har sparats på %s');
diff --git a/lang/UTF-8/serendipity_lang_ta.inc.php b/lang/UTF-8/serendipity_lang_ta.inc.php
index 4a3b6e47..55b4ea38 100644
--- a/lang/UTF-8/serendipity_lang_ta.inc.php
+++ b/lang/UTF-8/serendipity_lang_ta.inc.php
@@ -331,6 +331,7 @@
@define('IN_REPLY_TO', 'இக்கருத்தைப் பற்றி');
@define('TOP_LEVEL', 'குறிப்பு பற்றி');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
diff --git a/lang/UTF-8/serendipity_lang_tn.inc.php b/lang/UTF-8/serendipity_lang_tn.inc.php
index becb4cad..76c63482 100644
--- a/lang/UTF-8/serendipity_lang_tn.inc.php
+++ b/lang/UTF-8/serendipity_lang_tn.inc.php
@@ -335,6 +335,7 @@ $i18n_unknown = 'tw';
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
@define('PERMISSIONS', '權限');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', '新設定已經儲存於 %s');
diff --git a/lang/UTF-8/serendipity_lang_tr.inc.php b/lang/UTF-8/serendipity_lang_tr.inc.php
index 7c32c56b..e556030f 100644
--- a/lang/UTF-8/serendipity_lang_tr.inc.php
+++ b/lang/UTF-8/serendipity_lang_tr.inc.php
@@ -335,6 +335,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s beslemesi');
@define('PERMISSIONS', 'izinler');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'Yeni ayarlarınız kaydedildi %s');
diff --git a/lang/UTF-8/serendipity_lang_tw.inc.php b/lang/UTF-8/serendipity_lang_tw.inc.php
index 5453ee45..6d3a1610 100644
--- a/lang/UTF-8/serendipity_lang_tw.inc.php
+++ b/lang/UTF-8/serendipity_lang_tw.inc.php
@@ -335,6 +335,7 @@ $i18n_unknown = 'tw';
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
@define('PERMISSIONS', '權限');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', '新設定已經儲存於 %s');
diff --git a/lang/UTF-8/serendipity_lang_zh.inc.php b/lang/UTF-8/serendipity_lang_zh.inc.php
index 624a536a..b87dbb37 100644
--- a/lang/UTF-8/serendipity_lang_zh.inc.php
+++ b/lang/UTF-8/serendipity_lang_zh.inc.php
@@ -334,6 +334,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
@define('PERMISSIONS', '权限');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', '新设定已经被保存到 %s');
diff --git a/lang/serendipity_lang_bg.inc.php b/lang/serendipity_lang_bg.inc.php
index b38d3a91..f8d74f5c 100644
--- a/lang/serendipity_lang_bg.inc.php
+++ b/lang/serendipity_lang_bg.inc.php
@@ -368,6 +368,7 @@ $i18n_filename_to = array('-', 'a', 'A', 'b', 'B', 'v', 'V', 'g', 'G', 'd', 'D
@define('SYNDICATION_PLUGIN_GENERIC_FEED', ' %s');
@define('PERMISSIONS', '');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', ' %s');
diff --git a/lang/serendipity_lang_cn.inc.php b/lang/serendipity_lang_cn.inc.php
index 7446844a..bf012b59 100644
--- a/lang/serendipity_lang_cn.inc.php
+++ b/lang/serendipity_lang_cn.inc.php
@@ -335,6 +335,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
@define('PERMISSIONS', '权限');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', '新设定已经被保存到 %s');
diff --git a/lang/serendipity_lang_cs.inc.php b/lang/serendipity_lang_cs.inc.php
index d58b4bec..2f6f638d 100644
--- a/lang/serendipity_lang_cs.inc.php
+++ b/lang/serendipity_lang_cs.inc.php
@@ -326,6 +326,7 @@ $i18n_filename_to = array (
@define('FOUND_FILE', 'Zaloit nov/zmnit soubor: %s.');
@define('PERMISSIONS', 'Oprvnn');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
diff --git a/lang/serendipity_lang_cz.inc.php b/lang/serendipity_lang_cz.inc.php
index b4016a7e..8da61692 100644
--- a/lang/serendipity_lang_cz.inc.php
+++ b/lang/serendipity_lang_cz.inc.php
@@ -326,6 +326,7 @@ $i18n_filename_to = array (
@define('FOUND_FILE', 'Zaloit nov/zmnit soubor: %s.');
@define('PERMISSIONS', 'Oprvnn');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
diff --git a/lang/serendipity_lang_da.inc.php b/lang/serendipity_lang_da.inc.php
index d7aac755..e83ac405 100644
--- a/lang/serendipity_lang_da.inc.php
+++ b/lang/serendipity_lang_da.inc.php
@@ -295,6 +295,7 @@
@define('ENTRIES_PER_PAGE', 'artikler per side');
@define('PERMISSIONS', 'Rettigheder');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
diff --git a/lang/serendipity_lang_de.inc.php b/lang/serendipity_lang_de.inc.php
index 7d352213..53672996 100644
--- a/lang/serendipity_lang_de.inc.php
+++ b/lang/serendipity_lang_de.inc.php
@@ -320,6 +320,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s Feed');
@define('PERMISSIONS', 'Rechte');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('XML_IMAGE_TO_DISPLAY', 'XML-Button');
diff --git a/lang/serendipity_lang_en.inc.php b/lang/serendipity_lang_en.inc.php
index 069d7468..acf02747 100644
--- a/lang/serendipity_lang_en.inc.php
+++ b/lang/serendipity_lang_en.inc.php
@@ -333,6 +333,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
@define('PERMISSIONS', 'Permissions');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'The new settings have been saved at %s');
diff --git a/lang/serendipity_lang_es.inc.php b/lang/serendipity_lang_es.inc.php
index c3c1085a..5ae1655d 100644
--- a/lang/serendipity_lang_es.inc.php
+++ b/lang/serendipity_lang_es.inc.php
@@ -320,6 +320,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
@define('PERMISSIONS', 'Permisos');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
diff --git a/lang/serendipity_lang_fa.inc.php b/lang/serendipity_lang_fa.inc.php
index aaa0872f..58002575 100644
--- a/lang/serendipity_lang_fa.inc.php
+++ b/lang/serendipity_lang_fa.inc.php
@@ -334,6 +334,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s');
@define('PERMISSIONS', 'دسترسی ها');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'تنظیمات جدید در %s ثبت شد');
diff --git a/lang/serendipity_lang_fi.inc.php b/lang/serendipity_lang_fi.inc.php
index 74610ae3..e0230e87 100644
--- a/lang/serendipity_lang_fi.inc.php
+++ b/lang/serendipity_lang_fi.inc.php
@@ -332,6 +332,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s');
@define('PERMISSIONS', 'Oikeudet');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'Uudet asetukset on tallettetu %s');
diff --git a/lang/serendipity_lang_fr.inc.php b/lang/serendipity_lang_fr.inc.php
index 380c2aa2..bf13059a 100644
--- a/lang/serendipity_lang_fr.inc.php
+++ b/lang/serendipity_lang_fr.inc.php
@@ -427,6 +427,7 @@
@define('PERMISSIONS', 'Permissions');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('USERCONF_ALLOWPUBLISH', 'Publication de billets ?');
diff --git a/lang/serendipity_lang_hu.inc.php b/lang/serendipity_lang_hu.inc.php
index 5a81d682..1b201397 100644
--- a/lang/serendipity_lang_hu.inc.php
+++ b/lang/serendipity_lang_hu.inc.php
@@ -333,6 +333,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s hrcsatorna');
@define('PERMISSIONS', 'Jogosultsgok');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'Az j belltsokat elmentettk ekkor: %s');
diff --git a/lang/serendipity_lang_is.inc.php b/lang/serendipity_lang_is.inc.php
index 653179db..9727efd3 100644
--- a/lang/serendipity_lang_is.inc.php
+++ b/lang/serendipity_lang_is.inc.php
@@ -333,6 +333,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s straumur');
@define('PERMISSIONS', 'Rttindi');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'Nju stillingarnar voru vistaar klukkan %s');
diff --git a/lang/serendipity_lang_it.inc.php b/lang/serendipity_lang_it.inc.php
index a883f0d7..159831fe 100644
--- a/lang/serendipity_lang_it.inc.php
+++ b/lang/serendipity_lang_it.inc.php
@@ -322,6 +322,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', 'feed %s');
@define('PERMISSIONS', 'Permessi');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'Le nuove impostazioni sono state salvate in %s');
diff --git a/lang/serendipity_lang_ja.inc.php b/lang/serendipity_lang_ja.inc.php
index 35a7bec1..5c3057c6 100644
--- a/lang/serendipity_lang_ja.inc.php
+++ b/lang/serendipity_lang_ja.inc.php
@@ -333,6 +333,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s フィード');
@define('PERMISSIONS', '許可');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', '新しい設定は %s に保存されました。');
diff --git a/lang/serendipity_lang_ko.inc.php b/lang/serendipity_lang_ko.inc.php
index 39efc97f..d6177b85 100644
--- a/lang/serendipity_lang_ko.inc.php
+++ b/lang/serendipity_lang_ko.inc.php
@@ -335,6 +335,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s 피드');
@define('PERMISSIONS', '권한 설정');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', '새로운 설정이 %s에 저장되었습니다');
diff --git a/lang/serendipity_lang_nl.inc.php b/lang/serendipity_lang_nl.inc.php
index d1cf6df2..b09921db 100644
--- a/lang/serendipity_lang_nl.inc.php
+++ b/lang/serendipity_lang_nl.inc.php
@@ -335,6 +335,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s-toevoer');
@define('PERMISSIONS', 'Toegangsrechten');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'De instellingen zijn opgeslagen in %s');
diff --git a/lang/serendipity_lang_no.inc.php b/lang/serendipity_lang_no.inc.php
index a9418cf9..dc9c4bbd 100644
--- a/lang/serendipity_lang_no.inc.php
+++ b/lang/serendipity_lang_no.inc.php
@@ -295,6 +295,7 @@
/* TRANSLATE */
@define('PERMISSIONS', 'Rettigheter');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
diff --git a/lang/serendipity_lang_pl.inc.php b/lang/serendipity_lang_pl.inc.php
index 426f9b70..2dc533eb 100644
--- a/lang/serendipity_lang_pl.inc.php
+++ b/lang/serendipity_lang_pl.inc.php
@@ -335,6 +335,7 @@ $i18n_filename_to = array('_', 'a', 'A', 'a', 'A', 'b', 'B', 'c', 'C', 'c', 'C
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
@define('PERMISSIONS', 'Uprawnienia');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'Ustawienia zostay zapisane o %s');
diff --git a/lang/serendipity_lang_pt.inc.php b/lang/serendipity_lang_pt.inc.php
index 85ea49b4..cbb41c46 100644
--- a/lang/serendipity_lang_pt.inc.php
+++ b/lang/serendipity_lang_pt.inc.php
@@ -318,6 +318,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
@define('PERMISSIONS', 'Permisses');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
diff --git a/lang/serendipity_lang_pt_PT.inc.php b/lang/serendipity_lang_pt_PT.inc.php
index 6fd8fab8..6da9430f 100644
--- a/lang/serendipity_lang_pt_PT.inc.php
+++ b/lang/serendipity_lang_pt_PT.inc.php
@@ -324,6 +324,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
@define('PERMISSIONS', 'Permisses');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'As novas preferncias foram guardadas em %s');
diff --git a/lang/serendipity_lang_ro.inc.php b/lang/serendipity_lang_ro.inc.php
index cff67104..817d25d1 100644
--- a/lang/serendipity_lang_ro.inc.php
+++ b/lang/serendipity_lang_ro.inc.php
@@ -333,6 +333,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
@define('PERMISSIONS', 'Permisiuni');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'Noile preferinţe au fost salvate în %s');
diff --git a/lang/serendipity_lang_ru.inc.php b/lang/serendipity_lang_ru.inc.php
index e625ea8d..6d57c0be 100644
--- a/lang/serendipity_lang_ru.inc.php
+++ b/lang/serendipity_lang_ru.inc.php
@@ -336,6 +336,7 @@ $i18n_filename_to = array('_', 'a', 'A', 'b', 'B', 'v', 'V', 'g', 'G', 'd', 'D
@define('SYNDICATION_PLUGIN_GENERIC_FEED', 'лента %s');
@define('PERMISSIONS', 'Права доступа');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'Новые настройки были сохранены в %s');
diff --git a/lang/serendipity_lang_sa.inc.php b/lang/serendipity_lang_sa.inc.php
index 175b3622..115a5d8e 100644
--- a/lang/serendipity_lang_sa.inc.php
+++ b/lang/serendipity_lang_sa.inc.php
@@ -334,6 +334,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
@define('PERMISSIONS', '');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', ' %s');
diff --git a/lang/serendipity_lang_se.inc.php b/lang/serendipity_lang_se.inc.php
index 67b84944..b7bfa1e0 100644
--- a/lang/serendipity_lang_se.inc.php
+++ b/lang/serendipity_lang_se.inc.php
@@ -333,6 +333,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s matning');
@define('PERMISSIONS', 'Rttigheter');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'De nya instllningarna har sparats p %s');
diff --git a/lang/serendipity_lang_ta.inc.php b/lang/serendipity_lang_ta.inc.php
index 4a3b6e47..55b4ea38 100644
--- a/lang/serendipity_lang_ta.inc.php
+++ b/lang/serendipity_lang_ta.inc.php
@@ -331,6 +331,7 @@
@define('IN_REPLY_TO', 'இக்கருத்தைப் பற்றி');
@define('TOP_LEVEL', 'குறிப்பு பற்றி');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
diff --git a/lang/serendipity_lang_tn.inc.php b/lang/serendipity_lang_tn.inc.php
index fd222539..6715b535 100644
--- a/lang/serendipity_lang_tn.inc.php
+++ b/lang/serendipity_lang_tn.inc.php
@@ -335,6 +335,7 @@ $i18n_unknown = 'tw';
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
@define('PERMISSIONS', '權限');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', '新設定已經儲存於 %s');
diff --git a/lang/serendipity_lang_tr.inc.php b/lang/serendipity_lang_tr.inc.php
index 7c32c56b..e556030f 100644
--- a/lang/serendipity_lang_tr.inc.php
+++ b/lang/serendipity_lang_tr.inc.php
@@ -335,6 +335,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s beslemesi');
@define('PERMISSIONS', 'izinler');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 'Yeni ayarlarınız kaydedildi %s');
diff --git a/lang/serendipity_lang_tw.inc.php b/lang/serendipity_lang_tw.inc.php
index ebe33aeb..4acf9b91 100644
--- a/lang/serendipity_lang_tw.inc.php
+++ b/lang/serendipity_lang_tw.inc.php
@@ -335,6 +335,7 @@ $i18n_unknown = 'tw';
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
@define('PERMISSIONS', 'v');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', 's]wwgxs %s');
diff --git a/lang/serendipity_lang_zh.inc.php b/lang/serendipity_lang_zh.inc.php
index aceefe83..a4499cda 100644
--- a/lang/serendipity_lang_zh.inc.php
+++ b/lang/serendipity_lang_zh.inc.php
@@ -334,6 +334,7 @@
@define('SYNDICATION_PLUGIN_GENERIC_FEED', '%s feed');
@define('PERMISSIONS', 'Ȩ');
@define('INTEGRITY', 'Verify Installation Integrity');
+@define('CHECKSUMS_NOT_FOUND', 'Unable to compare checksums! (No checksums.inc.php in main directory)');
@define('CHECKSUMS_PASS', 'All required files verified.');
@define('CHECKSUM_FAILED', '%s corrupt or modified: failed verification');
@define('SETTINGS_SAVED_AT', '趨Ѿ浽 %s');
diff --git a/serendipity_admin.php b/serendipity_admin.php
index 0408dddc..92e0f423 100644
--- a/serendipity_admin.php
+++ b/serendipity_admin.php
@@ -215,6 +215,25 @@ if (!$use_installer && $is_logged_in) {
echo LOGGEDOUT;
break;
+ case 'integrity':
+ echo '' . INTEGRITY . '
';
+ $badsums = array();
+ if (!is_readable(S9Y_INCLUDE_PATH . 'checksums.inc.php')) {
+ echo '' . CHECKSUMS_NOT_FOUND . '';
+ break;
+ }
+ $badsums = serendipity_verifyFTPChecksums();
+ if (count($badsums) == 0) {
+ echo '' . CHECKSUMS_PASS . '';
+ } else {
+ echo '';
+ foreach ($badsums as $rpath => $calcsum) {
+ echo '- ' . sprintf(CHECKSUM_FAILED, $rpath) . '
';
+ }
+ echo '
';
+ }
+ break;
+
default:
include S9Y_INCLUDE_PATH . 'include/admin/overview.inc.php';
break;
@@ -435,6 +454,9 @@ if ($use_installer) {
+
+
+
diff --git a/templates/default/admin/index.tpl b/templates/default/admin/index.tpl
index c9612230..4df828d4 100644
--- a/templates/default/admin/index.tpl
+++ b/templates/default/admin/index.tpl
@@ -207,6 +207,9 @@
{/if}
+ {if 'siteConfiguration'|checkPermission || 'blogConfiguration'|checkPermission}
+
+ {/if}
{if $admin_vars.no_create !== true} {serendipity_hookPlugin hook="backend_sidebar_admin" hookAll="true"}{/if}
@@ -244,4 +247,4 @@