From 5f7d7a9ddb5b64dbe7dc0290801c710b5a64bec2 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Thu, 28 Nov 2013 14:15:17 +0100 Subject: [PATCH] Prevent duplicate URI. Fix #263 --- lib/backend/database.php | 34 ++++++++++++++++++++++++++++++---- lib/utils/properties.php | 2 +- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/lib/backend/database.php b/lib/backend/database.php index 7ad7f892..ac894daa 100644 --- a/lib/backend/database.php +++ b/lib/backend/database.php @@ -22,9 +22,10 @@ namespace OCA\Contacts\Backend; -use OCA\Contacts\Contact; -use OCA\Contacts\VObject\VCard; -use Sabre\VObject\Reader; +use OCA\Contacts\Contact, + OCA\Contacts\VObject\VCard, + OCA\Contacts\Utils\Properties, + Sabre\VObject\Reader; /** * Subclass this class for Cantacts backends @@ -516,7 +517,7 @@ class Database extends AbstractBackend { return false; } - $uri = is_null($uri) ? $contact->UID . '.vcf' : $uri; + $uri = is_null($uri) ? $this->uniqueURI($addressbookid, $contact->UID . '.vcf') : $uri; $now = new \DateTime; $contact->REV = $now->format(\DateTime::W3C); @@ -782,4 +783,29 @@ class Database extends AbstractBackend { return $newname; } + /** + * @brief Checks if a contact with the same URI already exist in the address book. + * @param string $addressBookId Address book ID. + * @param string $uri + * @returns string Unique URI + */ + protected function uniqueURI($addressBookId, $uri) { + $stmt = \OCP\DB::prepare( 'SELECT * FROM `' . $this->cardsTableName . '` WHERE `addressbookid` = ? AND `uri` = ?' ); + + $result = $stmt->execute(array($addressBookId, $uri)); + + if($result->numRows() > 0) { + while(true) { + $uri = Properties::generateUID() . '.vcf'; + $result = $stmt->execute(array($addressBookId, $uri)); + if($result->numRows() > 0) { + continue; + } else { + return $uri; + } + } + } else { + return $uri; + } + } } diff --git a/lib/utils/properties.php b/lib/utils/properties.php index 09402ab9..cdf42d50 100644 --- a/lib/utils/properties.php +++ b/lib/utils/properties.php @@ -197,7 +197,7 @@ Class Properties { } public static function generateUID($app = 'contacts') { - return date('Ymd\\THis') . '.' . time(). '@' . \OCP\Util::getServerHostName(); + return date('Ymd\\THis') . '.' . substr(md5(rand().time()), 0, 10). '@' . \OCP\Util::getServerHostName(); } /**