diff options
| author | Remko Tronçon <git@el-tramo.be> | 2011-08-28 11:15:51 (GMT) | 
|---|---|---|
| committer | Remko Tronçon <git@el-tramo.be> | 2011-08-28 11:57:00 (GMT) | 
| commit | 33af107d8d4ffdeada9ea964fe696af4a23c5b95 (patch) | |
| tree | 8b471b7626dec86888fc9237a37c752714a75692 | |
| parent | 2faca4242e4de2568eb917df83fd1b9c21f33897 (diff) | |
| download | swift-33af107d8d4ffdeada9ea964fe696af4a23c5b95.zip swift-33af107d8d4ffdeada9ea964fe696af4a23c5b95.tar.bz2 | |
Catch boost file system errors when reading VCards.
Release-Notes: Catch errors when writing VCards to disk.
Resolves: #897
| -rw-r--r-- | Swiften/QA/StorageTest/VCardFileStorageTest.cpp | 37 | ||||
| -rw-r--r-- | Swiften/VCards/VCardFileStorage.cpp | 56 | 
2 files changed, 71 insertions, 22 deletions
| diff --git a/Swiften/QA/StorageTest/VCardFileStorageTest.cpp b/Swiften/QA/StorageTest/VCardFileStorageTest.cpp index 992ee50..fb51568 100644 --- a/Swiften/QA/StorageTest/VCardFileStorageTest.cpp +++ b/Swiften/QA/StorageTest/VCardFileStorageTest.cpp @@ -7,6 +7,7 @@  #include <cppunit/extensions/HelperMacros.h>  #include <cppunit/extensions/TestFactoryRegistry.h>  #include <boost/algorithm/string.hpp> +#include <sstream>  #include "Swiften/VCards/VCardFileStorage.h"  #include "Swiften/JID/JID.h" @@ -18,8 +19,12 @@ using namespace Swift;  class VCardFileStorageTest : public CppUnit::TestFixture {  		CPPUNIT_TEST_SUITE(VCardFileStorageTest);  		CPPUNIT_TEST(testSetVCard); +		// Temporarily disabling this, because it generates error messages on console. Need to figure +		// out something for not showing error messages during tests. +		//CPPUNIT_TEST(testSetVCard_LargeFilename);  		CPPUNIT_TEST(testGetVCard);  		CPPUNIT_TEST(testGetVCard_FileDoesNotExist); +		//CPPUNIT_TEST(testGetVCard_LargeFilename);  		CPPUNIT_TEST_SUITE_END();  	public: @@ -48,6 +53,22 @@ class VCardFileStorageTest : public CppUnit::TestFixture {  			CPPUNIT_ASSERT(boost::starts_with(data.toString(), "<vCard xmlns=\"vcard-temp\">"));  		} +		void testSetVCard_LargeFilename() { +			std::auto_ptr<VCardFileStorage> testling(createTestling()); +			VCard::ref vcard(new VCard()); +			vcard->setFullName("Alice In Wonderland"); + +			std::ostringstream s; +			for (int i = 0; i < 1000; ++i) { +				s << "_"; +			} + +			JID jid("alice@wonderland.lit/" + s.str()); +			testling->setVCard(jid, vcard); + +			// Just check whether we don't crash +		} +  		void testGetVCard() {  			std::auto_ptr<VCardFileStorage> testling(createTestling());  			VCard::ref vcard(new VCard()); @@ -58,6 +79,22 @@ class VCardFileStorageTest : public CppUnit::TestFixture {  			CPPUNIT_ASSERT_EQUAL(std::string("Alice In Wonderland"), result->getFullName());  		} +		void testGetVCard_LargeFilename() { +			std::auto_ptr<VCardFileStorage> testling(createTestling()); +			VCard::ref vcard(new VCard()); +			vcard->setFullName("Alice In Wonderland"); + +			std::ostringstream s; +			for (int i = 0; i < 1000; ++i) { +				s << "_"; +			} +			JID jid("alice@wonderland.lit/" + s.str()); + +			VCard::ref result = testling->getVCard(jid); + +			// Just check that we don't have an exception +		} +  		void testGetVCard_FileDoesNotExist() {  			std::auto_ptr<VCardFileStorage> testling(createTestling());  			VCard::ref result = testling->getVCard(JID("alice@wonderland.lit")); diff --git a/Swiften/VCards/VCardFileStorage.cpp b/Swiften/VCards/VCardFileStorage.cpp index a246838..cd5cc9c 100644 --- a/Swiften/VCards/VCardFileStorage.cpp +++ b/Swiften/VCards/VCardFileStorage.cpp @@ -48,41 +48,53 @@ VCardFileStorage::VCardFileStorage(boost::filesystem::path dir) : vcardsPath(dir  }  boost::shared_ptr<VCard> VCardFileStorage::getVCard(const JID& jid) const { -	boost::filesystem::path vcardPath(getVCardPath(jid)); -	if (boost::filesystem::exists(vcardPath)) { -		ByteArray data; -		data.readFromFile(vcardPath.string()); +	try { +		boost::filesystem::path vcardPath(getVCardPath(jid)); +		if (boost::filesystem::exists(vcardPath)) { +			ByteArray data; +			data.readFromFile(vcardPath.string()); -		VCardParser parser; -		PayloadParserTester tester(&parser); -		tester.parse(data.toString()); -		return boost::dynamic_pointer_cast<VCard>(parser.getPayload()); +			VCardParser parser; +			PayloadParserTester tester(&parser); +			tester.parse(data.toString()); +			return boost::dynamic_pointer_cast<VCard>(parser.getPayload()); +		} +		else { +			return boost::shared_ptr<VCard>(); +		}  	} -	else { +	catch (const boost::filesystem::filesystem_error& e) { +		std::cerr << "ERROR: " << e.what() << std::endl;  		return boost::shared_ptr<VCard>();  	}  }  void VCardFileStorage::setVCard(const JID& jid, VCard::ref v) { -	boost::filesystem::path vcardPath(getVCardPath(jid)); -	if (!boost::filesystem::exists(vcardPath.parent_path())) { -		try { +	try { +		boost::filesystem::path vcardPath(getVCardPath(jid)); +		if (!boost::filesystem::exists(vcardPath.parent_path())) {  			boost::filesystem::create_directories(vcardPath.parent_path());  		} -		catch (const boost::filesystem::filesystem_error& e) { -			std::cerr << "ERROR: " << e.what() << std::endl; -		} +		boost::filesystem::ofstream file(getVCardPath(jid)); +		file << VCardSerializer().serializePayload(v); +		file.close(); +		getAndUpdatePhotoHash(jid, v); +	} +	catch (const boost::filesystem::filesystem_error& e) { +		std::cerr << "ERROR: " << e.what() << std::endl;  	} -	boost::filesystem::ofstream file(getVCardPath(jid)); -	file << VCardSerializer().serializePayload(v); -	file.close(); -	getAndUpdatePhotoHash(jid, v);  }  boost::filesystem::path VCardFileStorage::getVCardPath(const JID& jid) const { -	std::string file(jid.toString()); -	String::replaceAll(file, '/', "%2f"); -	return boost::filesystem::path(vcardsPath / (file + ".xml")); +	try { +		std::string file(jid.toString()); +		String::replaceAll(file, '/', "%2f"); +		return boost::filesystem::path(vcardsPath / (file + ".xml")); +	} +	catch (const boost::filesystem::filesystem_error& e) { +		std::cerr << "ERROR: " << e.what() << std::endl; +		return boost::filesystem::path(); +	}  }  std::string VCardFileStorage::getPhotoHash(const JID& jid) const { | 
 Swift
 Swift