From b6518bd0e8570c23b2f7787246ce9b95d70692d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20HERVIER?= Date: Thu, 3 May 2012 19:48:46 +0200 Subject: [PATCH 1/3] Add time delta in synchronization to avoid sync data loss due to unaccurate datetime. --- README.txt | 14 ---------- cache.manifest.php | 6 ++-- html5-notepad-app-chrome.zip | Bin 5901 -> 0 bytes index.html | 5 ++-- js/coreyti-showdown/.gitignore | 0 js/coreyti-showdown/license.txt | 0 js/coreyti-showdown/showdown.js | 0 sync.php | 47 ++++++++++++++++++++++++++++---- 8 files changed, 47 insertions(+), 25 deletions(-) delete mode 100644 README.txt delete mode 100644 html5-notepad-app-chrome.zip mode change 100755 => 100644 js/coreyti-showdown/.gitignore mode change 100755 => 100644 js/coreyti-showdown/license.txt mode change 100755 => 100644 js/coreyti-showdown/showdown.js diff --git a/README.txt b/README.txt deleted file mode 100644 index c731c8a..0000000 --- a/README.txt +++ /dev/null @@ -1,14 +0,0 @@ -HTML5 Notepad App -by Kaspars Dambis -http://konstruktors.com - -Installation -============ - -1. Upload files to your server -2. Rename 'entries' folder to something random and harder to guess -3. Make that folder writable (CHMOD 0777) -4. Edit sync.php and specify your new DATA_DIR (the one you just renamed) -5. In sync.php change username and password to something unique -6. Done! - diff --git a/cache.manifest.php b/cache.manifest.php index ccfcb97..8aebf92 100644 --- a/cache.manifest.php +++ b/cache.manifest.php @@ -1,9 +1,8 @@ CACHE MANIFEST -# v20121 +# v20122 CACHE: -index.html images/icon-doc.png js/jquery.min.js js/wysiwym/wysiwym.js @@ -14,4 +13,5 @@ NETWORK: sync.php -logout.php \ No newline at end of file +logout.php +index.html diff --git a/html5-notepad-app-chrome.zip b/html5-notepad-app-chrome.zip deleted file mode 100644 index 955fa15a5ddfc2dddef314c32318d1f372e396da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5901 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 diff --git a/index.html b/index.html index 4666288..42417b4 100644 --- a/index.html +++ b/index.html @@ -228,6 +228,7 @@ function sync() { if (navigator.onLine) { + localStorage.setItem('clientime', (new Date().getTime() + '')); $.post('sync.php', localStorage, function(data) { console.log(data); localStorage.setItem('index', JSON.stringify(data.index)); @@ -276,7 +277,7 @@ if (title === '') title = 'Untitled'; if (val['timestamp'] !== 0) - $items.push('
  • ' + title + ' -
  • '); + $items.push('
  • ' + title + ' -
  • '); }); $('#entries ul').hide().html($items.reverse().join('')).show(); } @@ -306,4 +307,4 @@ - \ No newline at end of file + diff --git a/js/coreyti-showdown/.gitignore b/js/coreyti-showdown/.gitignore old mode 100755 new mode 100644 diff --git a/js/coreyti-showdown/license.txt b/js/coreyti-showdown/license.txt old mode 100755 new mode 100644 diff --git a/js/coreyti-showdown/showdown.js b/js/coreyti-showdown/showdown.js old mode 100755 new mode 100644 diff --git a/sync.php b/sync.php index 5b76116..24f8c3a 100644 --- a/sync.php +++ b/sync.php @@ -3,9 +3,29 @@ error_reporting(E_ERROR); define('DATA_DIR', 'entries'); // use this to protect files from being publicly viewable -define("USERNAME", 'demo'); +define('USERNAME', 'demo'); define('PASSWORD', 'demo'); +// Parse incoming data +if (isset($_POST['clientTime'])) { + $time_delta = time() - bigintval($_POST['clientTime']); + unset($_POST['clientTime']);} +else { + $time_delta = 0;} + +if (isset($_SERVER['HTTP_AUTHORIZATION']) && preg_match('/Basic\s+(.*)$/i', $_SERVER['HTTP_AUTHORIZATION'], $matches)) { + list($name, $password) = explode(':', base64_decode($matches[1])); + $_SERVER['PHP_AUTH_USER'] = strip_tags($name); + $_SERVER['PHP_AUTH_PW'] = strip_tags($password); +} + +//set http auth headers for apache+php-cgi work around if variable gets renamed by apache +if (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION']) && preg_match('/Basic\s+(.*)$/i', $_SERVER['REDIRECT_HTTP_AUTHORIZATION'], $matches)) { + list($name, $password) = explode(':', base64_decode($matches[1])); + $_SERVER['PHP_AUTH_USER'] = strip_tags($name); + $_SERVER['PHP_AUTH_PW'] = strip_tags($password); +} + if (($_SERVER['PHP_AUTH_USER'] !== USERNAME) || ($_SERVER['PHP_AUTH_PW'] !== PASSWORD)) { header('WWW-Authenticate: Basic realm="Cloud Notes"'); header('HTTP/1.0 401 Unauthorized'); @@ -14,8 +34,6 @@ header('Content-type: application/json; charset=utf-8'); -// Parse incoming data - $remote_index = (array)json_decode(stripslashes($_POST['index']), true); unset($_POST['index']); $remote_entries = $_POST; @@ -46,23 +64,27 @@ delete_entry($id); unset($remote_index[$id]); unset($remote_entries[$id]); - } elseif ($item['timestamp'] > $local_index[$id]['timestamp']) { + } elseif (strval(bigintval($item['timestamp'])) - $time_delta > $local_index[$id]['timestamp']) { // Remote entry is newer, replace it and don't send it back $local_index[$id] = $item; + $local_index[$id]['timestamp'] = strval(bigintval($local_index[$id]['timestamp']) - $time_delta); store_entry($id, $_POST[$id]); unset($remote_entries[$id]); unset($local_entries[$id]); - } elseif ($item['timestamp'] == $local_index[$id]['timestamp']) { + } elseif (strval(bigintval($item['timestamp'])) - $time_delta == $local_index[$id]['timestamp']) { // Local entry is already the latest, don't send it back unset($remote_entries[$id]); unset($local_entries[$id]); } else { // Local entry is newer, send it back $remote_index[$id] = $local_index[$id]; + $remote_index[$id]['timestamp'] = strval(bigintval($remote_index[$id]['timestamp']) + $time_delta); $remote_entries[$id] = get_entry($id); + } } else { $local_index[$id] = $remote_index[$id]; + $local_index[$id]['timestamp'] = strval(bigintval($local_index[$id]['timestamp']) - $time_delta); store_entry($id, $_POST[$id]); unset($remote_entries[$id]); } @@ -73,6 +95,7 @@ if ($local_index[$id]['timestamp'] !== 0) { $remote_entries[$id] = get_entry($id); $remote_index[$id] = $local_index[$id]; + $remote_index[$id]['timestamp'] = strval(bigintval($remote_index[$id]['timestamp']) + $time_delta); } else { unset($remote_entries[$id]); unset($remote_index[$id]); @@ -87,6 +110,18 @@ // Helpers +function bigintval($value) { + $value = trim($value); + if (ctype_digit($value)) { + return $value; + } + $value = preg_replace("/[^0-9](.*)$/", '', $value); + if (ctype_digit($value)) { + return $value; + } + return 0; +} + function get_entry($id) { $file = DATA_DIR . '/' . $id; if (file_exists($file)) { @@ -136,4 +171,4 @@ function get_entries() { return json_encode($entries); } -?> \ No newline at end of file +?> From 50d745efb911d641789a9810b5e043ebf645d908 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20HERVIER?= Date: Thu, 3 May 2012 19:48:58 +0200 Subject: [PATCH 2/3] Add time delta in synchronization to avoid sync data loss due to unaccurate datetime. --- README.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..5cc82be --- /dev/null +++ b/README.md @@ -0,0 +1,24 @@ +HTML5 Notepad App +by Kaspars Dambis (http://konstruktors.com) +Fork by BenoĆ®t HERVIER (http://khertan.net) + +Fork addition : +============ +* Added support for devices without accurate time set, by adding a time delta to +the synchronization process. +* Created a QML Harmattan client for use on Nokia n950 and Nokia n9 + +Planned feature : +============ +* Multi account support + +Installation +============ + +1. Upload files to your server +2. Rename 'entries' folder to something random and harder to guess +3. Make that folder writable (CHMOD 0777) +4. Edit sync.php and specify your new DATA_DIR (the one you just renamed) +5. In sync.php change username and password to something unique +6. Done! + From 897a7d5a4f3fcb09a80349ae5716d084bc7e54f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20HERVIER?= Date: Thu, 3 May 2012 19:49:34 +0200 Subject: [PATCH 3/3] Put the index.html at the right place in the cache manifest --- cache.manifest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cache.manifest.php b/cache.manifest.php index 8aebf92..582828f 100644 --- a/cache.manifest.php +++ b/cache.manifest.php @@ -3,6 +3,7 @@ # v20122 CACHE: +index.html images/icon-doc.png js/jquery.min.js js/wysiwym/wysiwym.js @@ -14,4 +15,3 @@ NETWORK: sync.php logout.php -index.html