AuthDboTest.C 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. /*
  2. * Copyright (C) 2009 Emweb bvba, Kessel-Lo, Belgium.
  3. *
  4. * See the LICENSE file for terms of use.
  5. */
  6. #include <boost/test/unit_test.hpp>
  7. #include <Wt/Dbo/Dbo>
  8. #include "Wt/Auth/AuthService"
  9. #include "Wt/Auth/HashFunction"
  10. #include "Wt/Auth/Login"
  11. #include "Wt/Auth/Identity"
  12. #include "Wt/Auth/PasswordService"
  13. #include "Wt/Auth/PasswordVerifier"
  14. #include "Wt/Auth/Dbo/AuthInfo"
  15. #include "Wt/Auth/Dbo/UserDatabase"
  16. #include "DboFixture.h"
  17. namespace dbo = Wt::Dbo;
  18. using namespace Wt;
  19. class TestUser;
  20. typedef Auth::Dbo::AuthInfo<TestUser> AuthInfo;
  21. typedef dbo::collection< dbo::ptr<TestUser> > TestUsers;
  22. class TestUser : public dbo::Dbo<TestUser>
  23. {
  24. public:
  25. TestUser() { }
  26. std::string nickname;
  27. dbo::collection< dbo::ptr<AuthInfo> > authInfos;
  28. template<class Action>
  29. void persist(Action& a)
  30. {
  31. dbo::field(a, nickname, "nickname");
  32. dbo::hasMany(a, authInfos, dbo::ManyToOne, "user");
  33. }
  34. };
  35. typedef Auth::Dbo::UserDatabase<AuthInfo> UserDatabase;
  36. struct AuthDboFixture : DboFixtureBase
  37. {
  38. AuthDboFixture(const char* tablenames[], const char* schema = "") :
  39. DboFixtureBase(), schema_(schema)
  40. {
  41. myAuthService_ = new Auth::AuthService();
  42. myPasswordService_ = new Auth::PasswordService(*myAuthService_);
  43. Auth::PasswordVerifier *verifier = new Auth::PasswordVerifier();
  44. verifier->addHashFunction(new Auth::BCryptHashFunction(7));
  45. myPasswordService_->setVerifier(verifier);
  46. session_->mapClass<TestUser>(tablenames[0]);
  47. session_->mapClass<AuthInfo>(tablenames[1]);
  48. session_->mapClass<AuthInfo::AuthIdentityType>(tablenames[2]);
  49. session_->mapClass<AuthInfo::AuthTokenType>(tablenames[3]);
  50. users_ = new UserDatabase(*session_);
  51. try {
  52. dbo::Transaction transaction(*session_);
  53. if (!schema_.empty())
  54. session_->execute("drop schema \"" + schema_ + "\" cascade");
  55. else {
  56. session_->dropTables(); //todo:remove
  57. }
  58. } catch (...) {
  59. }
  60. std::cout << "-------------------------- end of drop ----------------------*********" << std::endl;
  61. dbo::Transaction transaction(*session_);
  62. if (!schema_.empty())
  63. session_->execute("create schema \"" + schema_ + "\"");
  64. session_->createTables();
  65. transaction.commit();
  66. }
  67. ~AuthDboFixture() {
  68. try {
  69. dbo::Transaction transaction(*session_);
  70. if (!schema_.empty())
  71. session_->execute("drop schema \"" + schema_ + "\" cascade");
  72. } catch (...) {
  73. }
  74. delete users_;
  75. delete myPasswordService_;
  76. delete myAuthService_;
  77. }
  78. Auth::AbstractUserDatabase& users() { return *users_; }
  79. Auth::Login& login() { return login_; }
  80. const Auth::AuthService& auth() { return *myAuthService_; }
  81. const Auth::AbstractPasswordService& passwordAuth() { return *myPasswordService_; }
  82. const std::vector<const Auth::OAuthService *>& oAuth() { return myOAuthServices; }
  83. dbo::ptr<TestUser> testUser() const
  84. {
  85. if (login_.loggedIn()) {
  86. dbo::ptr<AuthInfo> authInfo = users_->find(login_.user());
  87. dbo::ptr<TestUser> testUser = authInfo->user();
  88. if (!testUser) {
  89. testUser = session_->add(new TestUser());
  90. authInfo.modify()->setUser(testUser);
  91. }
  92. return testUser;
  93. } else
  94. return dbo::ptr<TestUser>();
  95. }
  96. Auth::AuthService *myAuthService_;
  97. Auth::PasswordService *myPasswordService_;
  98. std::vector<const Auth::OAuthService *> myOAuthServices;
  99. UserDatabase *users_;
  100. Auth::Login login_;
  101. std::string schema_;
  102. };
  103. BOOST_AUTO_TEST_CASE( auth_dbo_test1 )
  104. {
  105. const char* tablenames[] = {"test_user", "auth_info", "auth_identity", "auth_token"};
  106. AuthDboFixture f(tablenames);
  107. dbo::Session& session = *f.session_;
  108. {
  109. dbo::Transaction transaction(session);
  110. Auth::User guestUser = f.users().registerNew();
  111. guestUser.addIdentity(Auth::Identity::LoginName, "guest");
  112. f.passwordAuth().updatePassword(guestUser, "guest");
  113. f.login().login(guestUser);
  114. f.testUser().modify()->nickname = "anonymous";
  115. transaction.commit();
  116. }
  117. {
  118. dbo::Transaction transaction(session);
  119. session.rereadAll();
  120. BOOST_REQUIRE (f.login().user().identity(Auth::Identity::LoginName).toUTF8() == "guest");
  121. BOOST_REQUIRE (f.testUser()->nickname == "anonymous");
  122. transaction.commit();
  123. }
  124. }
  125. BOOST_AUTO_TEST_CASE( auth_dbo_test2 )
  126. {
  127. #ifdef POSTGRES
  128. const char* tablenames[] = {"test_schema.test_user", "test_schema.auth_info",
  129. "test_schema.auth_identity", "test_schema.auth_token"};
  130. AuthDboFixture f(tablenames, "test_schema");
  131. dbo::Session& session = *f.session_;
  132. {
  133. dbo::Transaction transaction(session);
  134. Auth::User guestUser = f.users().registerNew();
  135. guestUser.addIdentity(Auth::Identity::LoginName, "guest");
  136. f.passwordAuth().updatePassword(guestUser, "guest");
  137. f.login().login(guestUser);
  138. f.testUser().modify()->nickname = "anonymous";
  139. transaction.commit();
  140. }
  141. {
  142. dbo::Transaction transaction(session);
  143. session.rereadAll();
  144. BOOST_REQUIRE (f.login().user().identity(Auth::Identity::LoginName).toUTF8() == "guest");
  145. BOOST_REQUIRE (f.testUser()->nickname == "anonymous");
  146. transaction.commit();
  147. }
  148. #endif //POSTGRES
  149. }