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); |