diff options
| -rw-r--r-- | gentoobrowse-api/api/users.ice | 1 | ||||
| -rw-r--r-- | gentoobrowse-api/service/sql/users/get.sql | 1 | ||||
| -rw-r--r-- | gentoobrowse-api/service/sql/users/getNew.sql | 6 | ||||
| -rw-r--r-- | gentoobrowse-api/service/usersimpl.cpp | 26 | ||||
| -rw-r--r-- | gentoobrowse-api/service/usersimpl.h | 4 | ||||
| -rw-r--r-- | gentoobrowse-api/unittests/testUsers.cpp | 61 | 
6 files changed, 91 insertions, 8 deletions
| diff --git a/gentoobrowse-api/api/users.ice b/gentoobrowse-api/api/users.ice index f9d66df..ef9de92 100644 --- a/gentoobrowse-api/api/users.ice +++ b/gentoobrowse-api/api/users.ice @@ -12,6 +12,7 @@ module Gentoo {  		User verify(string username, string verifyguid) throws Slicer::NoRowsReturned;  		User get(int id) throws Slicer::NoRowsReturned; +		NewUser getNew(string username, string password) throws Slicer::NoRowsReturned;  		User find(string username) throws Slicer::NoRowsReturned;  		NewUser create(string username, string password, string realname, string email) throws DuplicateDetails;  		void mailshotsent(int id); diff --git a/gentoobrowse-api/service/sql/users/get.sql b/gentoobrowse-api/service/sql/users/get.sql index c6a66a1..32f1d1a 100644 --- a/gentoobrowse-api/service/sql/users/get.sql +++ b/gentoobrowse-api/service/sql/users/get.sql @@ -2,3 +2,4 @@  SELECT userid, username, userrealname, useremail, signedup, lastmailshot  FROM gentoobrowse.users  WHERE userid = ? +AND verifyguid IS NULL diff --git a/gentoobrowse-api/service/sql/users/getNew.sql b/gentoobrowse-api/service/sql/users/getNew.sql new file mode 100644 index 0000000..375b4f3 --- /dev/null +++ b/gentoobrowse-api/service/sql/users/getNew.sql @@ -0,0 +1,6 @@ +-- libdbpp:no-cursor +SELECT userid, username, userrealname, useremail, signedup, lastmailshot, verifyguid +FROM gentoobrowse.users +WHERE username = ? +AND userpassword = ? +AND verifyguid IS NOT NULL diff --git a/gentoobrowse-api/service/usersimpl.cpp b/gentoobrowse-api/service/usersimpl.cpp index f5fb111..8071bf9 100644 --- a/gentoobrowse-api/service/usersimpl.cpp +++ b/gentoobrowse-api/service/usersimpl.cpp @@ -6,6 +6,7 @@  #include <sql/users/verify.sql.h>  #include <sql/users/create.sql.h>  #include <sql/users/get.sql.h> +#include <sql/users/getNew.sql.h>  #include <sql/users/find.sql.h>  #include <sql/users/safeDelete.sql.h>  #include <sql/users/track.sql.h> @@ -39,6 +40,12 @@ Users::get(Ice::Int id, const Ice::Current &)  	return fetch<Gentoo::UserPtr>(sql::users::get, id);  } +Gentoo::NewUserPtr +Users::getNew(const std::string & username, const std::string & password, const Ice::Current &) +{ +	return fetch<Gentoo::NewUserPtr>(sql::users::getNew, username, password); +} +  Gentoo::UserPtr  Users::find(const std::string & username, const Ice::Current &)  { @@ -46,16 +53,29 @@ Users::find(const std::string & username, const Ice::Current &)  }  Gentoo::NewUserPtr +Users::authOrCreate(const std::string & username, const std::string & password, const std::string & realname, const std::string & email) +{ +	auto existing = fetch<IceUtil::Optional<Gentoo::NewUserPtr>>(sql::users::getNew, username, password); +	if (existing && *existing) { +		return *existing; +	} +	return fetch<Gentoo::NewUserPtr>(sql::users::create, username, password, realname, email); +} + +Gentoo::NewUserPtr  Users::create(const std::string & username, const std::string & password, const std::string & realname, const std::string & email, const Ice::Current & current)  {  	auto notifications = NotificationsPrx::checkedCast(current.adapter->getCommunicator()->stringToProxy("notifications")); -	notifications->ice_ping(); +	BOOST_ASSERT(notifications); +	BOOST_ASSERT((notifications->ice_ping(), true));  	auto mailServer = MailServerPrx::checkedCast(current.adapter->getCommunicator()->stringToProxy("mailserver")); -	mailServer->ice_ping(); +	BOOST_ASSERT(mailServer); +	BOOST_ASSERT((mailServer->ice_ping(), true));  	auto dbc = db->get();  	DB::TransactionScope tx(dbc.get()); -	auto newUser = fetch<Gentoo::NewUserPtr>(sql::users::create, username, password, realname, email); + +	auto newUser = authOrCreate(username, password, realname, email);  	auto mail = notifications->getSignup(newUser);  	mailServer->sendEmail(mail); diff --git a/gentoobrowse-api/service/usersimpl.h b/gentoobrowse-api/service/usersimpl.h index 84cf970..ac2a62b 100644 --- a/gentoobrowse-api/service/usersimpl.h +++ b/gentoobrowse-api/service/usersimpl.h @@ -15,6 +15,7 @@ class DLL_PUBLIC Users : public Gentoo::Users, IceTray::AbstractCachingDatabaseC  		Gentoo::UserPtr verify(const std::string &, const std::string &, const Ice::Current &) override;  		Gentoo::UserPtr get(Ice::Int id, const Ice::Current &) override; +		Gentoo::NewUserPtr getNew(const std::string &, const std::string &, const Ice::Current &) override;  		Gentoo::UserPtr find(const std::string & username, const Ice::Current &) override;  		Gentoo::NewUserPtr create(const std::string &, const std::string &, const std::string &, const std::string &, const Ice::Current &) override;  		void mailshotsent(Ice::Int id, const Ice::Current &) override; @@ -23,6 +24,9 @@ class DLL_PUBLIC Users : public Gentoo::Users, IceTray::AbstractCachingDatabaseC  		void track(Ice::Int, Ice::Int, const Ice::Current &) override;  		void untrack(Ice::Int, Ice::Int, const Ice::Current &) override;  		Gentoo::PackageIds tracked(Ice::Int, const Ice::Current &) override; + +	private: +		DLL_PRIVATE Gentoo::NewUserPtr authOrCreate(const std::string &, const std::string &, const std::string &, const std::string &);  };  }  } diff --git a/gentoobrowse-api/unittests/testUsers.cpp b/gentoobrowse-api/unittests/testUsers.cpp index 7f9eaee..a894e95 100644 --- a/gentoobrowse-api/unittests/testUsers.cpp +++ b/gentoobrowse-api/unittests/testUsers.cpp @@ -54,24 +54,75 @@ BOOST_AUTO_TEST_CASE( create )  	BOOST_REQUIRE_EQUAL("testuser", user->username);  	BOOST_REQUIRE_EQUAL("Test User", user->userrealname);  	BOOST_REQUIRE_EQUAL("test@user.com", user->useremail); -	BOOST_REQUIRE(user->signedup.length() > 19); +	BOOST_REQUIRE_GE(user->signedup.length(), 19);  	BOOST_REQUIRE(!user->lastmailshot);  	BOOST_REQUIRE_EQUAL(36, user->verifyguid.length()); -	auto verified = u->verify(user->username, user->verifyguid); -	BOOST_REQUIRE(verified);  }  BOOST_AUTO_TEST_CASE( get )  { -	auto user = u->get(3); +	auto user = u->get(1); +	BOOST_REQUIRE(user); +	BOOST_REQUIRE_EQUAL(1, user->userid); +	BOOST_REQUIRE_EQUAL("randomdan", user->username); +	BOOST_REQUIRE_EQUAL("Dan Goodliffe", user->userrealname); +	BOOST_REQUIRE_EQUAL("dan@randomdan.homeip.net", user->useremail); +	BOOST_REQUIRE_EQUAL("2015-10-01T12:13:14", user->signedup); +	BOOST_REQUIRE(!user->lastmailshot); +} + +BOOST_AUTO_TEST_CASE( getNotVerified ) +{ +	// Is not verified, doesn't exist +	BOOST_REQUIRE_THROW(u->get(3), Slicer::NoRowsReturned); +} + +BOOST_AUTO_TEST_CASE( getNew ) +{ +	auto user = u->getNew("testuser", "testpass"); +	BOOST_REQUIRE(user);  	BOOST_REQUIRE_EQUAL(3, user->userid);  	BOOST_REQUIRE_EQUAL("testuser", user->username);  	BOOST_REQUIRE_EQUAL("Test User", user->userrealname);  	BOOST_REQUIRE_EQUAL("test@user.com", user->useremail); -	BOOST_REQUIRE(user->signedup.length() > 19); +	BOOST_REQUIRE_GE(user->signedup.length(), 19); +	BOOST_REQUIRE_EQUAL(36, user->verifyguid.length());  	BOOST_REQUIRE(!user->lastmailshot);  } +BOOST_AUTO_TEST_CASE( getNewVerified ) +{ +	// Is verified, not new +	BOOST_REQUIRE_THROW(u->getNew("randomdan", "p@55w0rd"), Slicer::NoRowsReturned); +} + +BOOST_AUTO_TEST_CASE( createAgain ) +{ +	/* +	 * Should (unverified): +	 * * return original user +	 * * resend verification +	 */ +	auto ms = getProxy<Gentoo::MockMailServerPrx>("mailserver"); +	BOOST_REQUIRE(ms); +	auto user = u->create("testuser", "testpass", "Test User", "recreate@user.com"); +	BOOST_REQUIRE_EQUAL(2, ms->getSentEmails().size()); +	BOOST_REQUIRE_EQUAL("Gentoo Browse: Welcome", ms->getSentEmails()[1]->subject); +	BOOST_REQUIRE_EQUAL("test@user.com", ms->getSentEmails()[1]->to.address); +	BOOST_REQUIRE_EQUAL(3, user->userid); +	BOOST_REQUIRE_EQUAL(36, user->verifyguid.length()); +} + +BOOST_AUTO_TEST_CASE( verify ) +{ +	auto user = u->getNew("testuser", "testpass"); +	BOOST_REQUIRE(user); +	auto verified = u->verify(user->username, user->verifyguid); +	BOOST_REQUIRE(verified); +	BOOST_REQUIRE_THROW(u->getNew("testuser", "testpass"), Slicer::NoRowsReturned); +	BOOST_REQUIRE(u->get(3)); +} +  BOOST_AUTO_TEST_CASE( sendmailshot )  {  	auto user = u->get(3); | 
