[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
New update: User authentication, DB connection pool functionalities.
Attached trunk0406.diff.
This application allows user login/logout/register, browse not-logged-in
and logged-in versions of Home page. Account page is accessable only for
logged-in users: if not-logged-in user gets redirected to login page(when
manually pasting url if session doesn't have valid user).
UuServlet has all authentication/DB pool related functions implemented.
Some get*() methods will be added to User class once they needed.
I wasn't able to make CWaiter::broadcastSignalNoLock() work, hopefully you
guys can give me some hints with what I'm doing wrong.
In UuDbPool I implemented getConnection() with authentication parameters
only, if connection needed before authentication possible(like in Register
servlet), I pass default user credentials to the pool(currently it's empty
login).
Please comment.
Index: libui/UuServlet.h
===================================================================
--- libui/UuServlet.h (revision 0)
+++ libui/UuServlet.h (revision 0)
@@ -0,0 +1,67 @@
+#ifndef UUSERVLET_H
+#define UUSERVLET_H
+
+#include <servlet/ServletConfig.h>
+#include <servlet/HttpServlet.h>
+#include <servlet/HttpServletRequest.h>
+#include <servlet/HttpServletResponse.h>
+#include <servlet/RequestDispatcher.h>
+#include <servlet/GenericServlet.h>
+
+#include <string>
+#include <boost/shared_ptr.hpp>
+#include <boost/lexical_cast.hpp>
+#include <stdexcept>
+
+#include "../libdm/User.h"
+
+/**
+ * class UuServlet
+ * This is base class of all UU servlets (both CSP and standard servlets). It
+ * imlements request handling functions (doGet, doPost, etc), which derived
+ * servlets should not touch,
+ * and provides basic login & ACL management.
+ */
+
+class UuServlet : public servlet::HttpServlet
+{
+public:
+ UuServlet();
+ virtual ~UuServlet ( );
+
+ typedef boost::shared_ptr<void> setAttribute_t;
+ typedef boost::shared_ptr<void> getAttribute_t;
+ typedef boost::shared_ptr<User> user_t;
+
+ public:
+ /**
+ * Returns true if the request already has valid associated session, and that
+ * session contains valid User object
+ * @return bool
+ * @param req Request to check
+ */
+ bool isUserLoggedIn (servlet::HttpServletRequest& req) const;
+
+ /**
+ * Redirects browser to login page
+ * @param resp send redirect through this response object
+ */
+ void redirectToLogin (servlet::HttpServletResponse& resp);
+
+ /**
+ * @return User
+ * @param req
+ */
+ User getCurrentUser (servlet::HttpServletRequest& req);
+
+ /**
+ * @return UuDbPool
+ */
+
+ UuDbPool* getDbPool ();
+
+ void init();
+ void destroy();
+};
+
+#endif // UUSERVLET_H
Index: libui/UuServlet.cpp
===================================================================
--- libui/UuServlet.cpp (revision 0)
+++ libui/UuServlet.cpp (revision 0)
@@ -0,0 +1,115 @@
+#include "UuServlet.h"
+
+using namespace std;
+using namespace servlet;
+using boost::lexical_cast;
+
+UuServlet::UuServlet () { }
+UuServlet::~UuServlet ( ) { }
+
+/**
+ * Returns true if the request already has valid associated session, and that
+ * session contains valid User object
+ * @return bool
+ * @param req Request to check
+ */
+
+void UuServlet::init()
+{
+
+ string strDsn = getServletConfig().getInitParameter("DSN");
+ string strUid = getServletConfig().getInitParameter("UID");
+ string strPwd = getServletConfig().getInitParameter("PWD");
+ string strDb = getServletConfig().getInitParameter("DB");
+ string strNumCon = getServletConfig().getInitParameter("num_connections");
+ string strTimeout = getServletConfig().getInitParameter("timeout");
+ if(strDsn.empty())
+ strDsn="PostgreSQL";
+ if(strUid.empty())
+ strUid="sergey";
+ if(strPwd.empty())
+ strPwd="";
+ if(strDb.empty())
+ strDb="uu";
+ if(strNumCon.empty())
+ strNumCon="5";
+ if(strTimeout.empty())
+ strTimeout="10000";
+ int numCon = lexical_cast<int>(strNumCon);
+ int timeout = lexical_cast<int>(strTimeout);
+ ServletContext& ctx = getServletConfig().getServletContext();
+ if(!ctx.hasAttribute("dbpool_attr")){
+ UuDbPool* pool = new UuDbPool(strDsn, strUid, strPwd, strDb, numCon, timeout);
+ ctx.setAttribute("dbpool_attr", setAttribute_t(new UuDbPool(*pool)));
+ }
+}
+
+void UuServlet::destroy()
+{
+
+ ServletContext& ctx = getServletConfig().getServletContext();
+ if(ctx.hasAttribute("dbpool_attr")){
+ getDbPool()->shutdown();
+ ctx.removeAttribute("dbpool_attr");
+ delete getDbPool();
+ }
+
+}
+
+bool UuServlet::isUserLoggedIn (HttpServletRequest& req) const
+{
+
+ HttpSession* session = req.getSession(true);
+ if(!session) throw runtime_error("No session exist for this request");
+ if(session->hasAttribute("user_attr")){
+ return true;
+ }
+ return false;
+
+}
+
+
+/**
+ * Redirects browser to login page
+ * @param resp send redirect through this response object
+ */
+void UuServlet::redirectToLogin (HttpServletResponse& resp)
+{
+
+ resp.sendRedirect("LoginServlet?new=Y");
+
+}
+
+
+/**
+ * @return User
+ * @param req
+ */
+
+User UuServlet::getCurrentUser (HttpServletRequest& req)
+{
+
+ HttpSession* session = req.getSession(true);
+ if(!session) throw runtime_error("No session exist for this request");
+ user_t user;
+ user = boost::static_pointer_cast<User>((session->getAttribute("user_attr")));
+ return *user;
+
+}
+
+/**
+ * @return UuDbPool*
+ */
+
+UuDbPool* UuServlet::getDbPool ()
+{
+
+ ServletContext& ctx = getServletConfig().getServletContext();
+ UuDbPool* pool = ctx.getAttribute<UuDbPool*>("dbpool_attr");
+ return pool;
+
+}
+
+
+EXPORT_SERVLET(UuServlet);
+
Index: libui/RegisterServlet.h
===================================================================
--- libui/RegisterServlet.h (revision 0)
+++ libui/RegisterServlet.h (revision 0)
@@ -0,0 +1,24 @@
+#ifndef REGISTERSERVLET_H
+#define REGISTERSERVLET_H
+
+#include <boost/lexical_cast.hpp>
+#include "UuServlet.h"
+
+/**
+ * This servlet:
+ * Receives registration request.
+ * Accesses User model object.
+ * Stores results in request context.
+ * Determines the language to render page in based on user preferences.
+ * Forwards the request to the view object RegistrationView.csp.
+ */
+
+class RegisterServlet : public UuServlet
+{
+public:
+ void service(servlet::HttpServletRequest& request, servlet::HttpServletResponse &response);
+
+};
+
+#endif//REGISTERSERVLET_H
+
Index: libui/RegisterServlet.cpp
===================================================================
--- libui/RegisterServlet.cpp (revision 0)
+++ libui/RegisterServlet.cpp (revision 0)
@@ -0,0 +1,66 @@
+#include "RegisterServlet.h"
+
+using boost::lexical_cast;
+using namespace std;
+using namespace servlet;
+
+void RegisterServlet::service(HttpServletRequest& request, HttpServletResponse &response)
+{
+
+ bool isValidUser;
+ string csp = "RegistrationView.csp";
+ try{
+ isValidUser = isUserLoggedIn(request);
+ string newVisit = request.getParameter("new");
+ if(newVisit != "Y"){
+ string login = request.getParameter("login");
+ string password = request.getParameter("passwd");
+ string passwordc = request.getParameter("passwdc");
+ int language = boost::lexical_cast<int>(request.getParameter("lang"));
+ string firstName = request.getParameter("name1");
+ string lastName = request.getParameter("name2");
+ string street = request.getParameter("street");
+ string city = request.getParameter("city");
+ string state = request.getParameter("state");
+ string zip = request.getParameter("zipcode");
+ string country = request.getParameter("country");
+ string email = request.getParameter("email");
+ string phone = request.getParameter("phone");
+ int server = boost::lexical_cast<int>(request.getParameter("server"));
+ string message;
+ string defaultLogin="";
+ string defaultPassword="";
+ int defaultServer=1;
+ UuDbPool::Connection* con = getDbPool()->getConnection(defaultLogin, defaultPassword, defaultServer);
+ if(con == NULL)
+ throw std::logic_error("No DB connection exist for this request");
+ User* user = new User(*con, login);
+ bool isSuccess = user->setUserInfo(login, password, language, firstName, lastName, street, city, state, zip, country, email, phone);
+ delete user;
+ User* userLoggedIn = new User(*con, login);
+ if(isSuccess){
+ HttpSession* session = request.getSession(true);
+ if(!session)
+ throw logic_error("No session exist for this request");
+ if(session->hasAttribute("user_attr"))
+ session->removeAttribute("user_attr");
+ session->setAttribute("user_attr", setAttribute_t(new User(*userLoggedIn)));
+ session->setAttribute("server_attr", setAttribute_t(new int(server)));
+ message="Welcome new customer "+firstName+" "+lastName+"!";
+ csp = "HomeView.csp";
+ } else {
+ message = "Login name already exist";
+ }
+ request.setAttribute("Message", setAttribute_t(new string(message)));
+ getDbPool()->releaseConnection(con);
+ }
+ }catch(const exception& ex) {
+ request.setAttribute("error", setAttribute_t(new string(ex.what())));
+ cerr<<__PRETTY_FUNCTION__<<": "<<ex.what()<<std::endl;
+ }
+ request.getRequestDispatcher(csp)->forward(request,response);
+
+}
+
+EXPORT_SERVLET(RegisterServlet);
+
Index: themes/default/RegistrationView.csp
===================================================================
--- themes/default/RegistrationView.csp (revision 0)
+++ themes/default/RegistrationView.csp (revision 0)
@@ -0,0 +1,137 @@
+<!-- Registration form view CSP -->
+
+<%@ include file="Header.csp" %>
+<%@ include file="Sidebar.csp" %>
+
+
+ <FORM ACTION="RegisterServlet" METHOD="GET">
+
+ <TD ALIGN="center" valign="top" BGCOLOR="#DDEEFF" width="83%">
+
+<% if(request.hasAttribute("Message")) { %>
+<br>
+<font face=Courier size=2 color="#FF0033""><i><%= request.getAttribute<std::string>("Message") %></i></font>
+<% } %>
+
+
+<!-- Content -->
+
+<table width=100% cellpadding=4 cellspacing=4 border=0>
+<tr><td COLSPAN="2"></td></tr>
+<TR>
+<TD ALIGN="center" COLSPAN="2">
+<font face=Courier size=3 color="#003399"><b>New Membership</B>
+</TD>
+</TR>
+<tr><td COLSPAN="2"></td></tr>
+<tr><td COLSPAN="2"></td></tr>
+ <TR>
+ <TD COLSPAN="2" BGCOLOR="#DDEEFF" ALIGN="center">
+ <font face=Courier size=2>*Membership name:</FONT><BR>
+ <INPUT NAME="login" VALUE="" SIZE=40 MAXLENGTH=40>
+ </TD>
+ </TR>
+ <TR>
+ <TD BGCOLOR="#DDEEFF" ALIGN="center">
+ <font face=Courier size=2>*Password: </FONT><br>
+ <INPUT TYPE=PASSWORD NAME="passwd" SIZE=30>
+ </FONT></TD>
+ <TD BGCOLOR="#DDEEFF" ALIGN="center"><font face=Courier size=2>
+ <font face=Courier size=2>*Password confirmation: </FONT><BR>
+ <INPUT TYPE=PASSWORD NAME="passwdc" SIZE=30>
+ </TD>
+ </TR>
+<tr><td COLSPAN="2"></td></tr>
+ <TR>
+ <TD BGCOLOR="#DDEEFF" ALIGN="center"><font face=Courier size=2>
+ *First Name:<br>
+ <INPUT NAME="name1" VALUE="" SIZE=28 MAXLENGTH=30>
+ </FONT></TD>
+ <TD COLSPAN="2" BGCOLOR="#DDEEFF" ALIGN="center"><font face=Courier size=2>
+ *Last Name:<br>
+ <INPUT NAME="name2" VALUE="" SIZE=28 MAXLENGTH=30>
+ </FONT></TD>
+ </TR>
+ <TR>
+ <TD BGCOLOR="#DDEEFF" ALIGN="center" colspan=2><font face=Courier size=2>
+ *Street:<br>
+ <INPUT NAME="street" VALUE="" SIZE=62 MAXLENGTH=50>
+ </FONT></TD>
+ </TR>
+ <TR>
+ <TD COLSPAN="2" BGCOLOR="#DDEEFF" ALIGN="center">
+ <TABLE CELLPADDING=5 CELLSPACING=1 BORDER="0">
+ <TR>
+ <TD BGCOLOR="#DDEEFF" ALIGN="center"><font face=Courier size=2>
+ *City:<BR>
+ <INPUT NAME="city" VALUE="" SIZE=18 MAXLENGTH=60>
+ </FONT></TD>
+ <TD BGCOLOR="#DDEEFF" ALIGN="center"><font face=Courier size=2>
+ *State:<BR>
+ <SELECT name="state">
+ <OPTION value="" selected >Select a State</OPTION><OPTION value="AA">Armed Forces the Americas</OPTION><OPTION value="AE">Armed Forces Europe</OPTION><OPTION value="AK">Alaska</OPTION><OPTION value="AL">Alabama</OPTION><OPTION value="AP">Armed Forces Pacific</OPTION><OPTION value="AR">Arkansas</OPTION><OPTION value="AZ">Arizona</OPTION><OPTION value="CA">California</OPTION><OPTION value="CO">Colorado</OPTION><OPTION value="CT">Connecticut</OPTION><OPTION value="DC">District of Columbia</OPTION><OPTION value="DE">Delaware</OPTION><OPTION value="FL">Florida</OPTION><OPTION value="GA">Georgia</OPTION><OPTION value="GU">Guam</OPTION><OPTION value="HI">Hawaii</OPTION><OPTION value="IA">Iowa</OPTION><OPTION value="ID">Idaho</OPTION><OPTION value="IL">Illinois</OPTION><OPTION value="IN">Indiana</OPTION><OPTION value="KS">Kansas</OPTION><OPTION value="KY">Kentucky</OPTION><OPTION value="LA">Louisiana</OPTION><OPTION value="MA">Massachusettes</OPTION><OPTION value="MD">Maryland</OPTION><OPTION value="ME">Maine</OPTION><OPTION value="MI">Michigan</OPTION><OPTION value="MN">Minnesota</OPTION><OPTION value="MO">Missouri</OPTION><OPTION value="MS">Mississippi</OPTION><OPTION value="MT">Montana</OPTION><OPTION value="NC">North Carolina</OPTION><OPTION value="ND">North Dakota</OPTION><OPTION value="NE">Nebraska</OPTION><OPTION value="NH">New Hampshire</OPTION><OPTION value="NJ">New Jersey</OPTION><OPTION value="NM">New Mexico</OPTION><OPTION value="NV">Nevada</OPTION><OPTION value="NY">New York</OPTION><OPTION value="OH">Ohio</OPTION><OPTION value="OK">Oklahoma</OPTION><OPTION value="OR">Oregon</OPTION><OPTION value="PA">Pennsylvania</OPTION><OPTION value="PR">Puerto Rico</OPTION><OPTION value="RI">Rhode Island</OPTION><OPTION value="SC">South Carolina</OPTION><OPTION value="SD">South Dakota</OPTION><OPTION value="TN">Tennessee</OPTION><OPTION value="TX">Texas</OPTION><OPTION value="UT">Utah</OPTION><OPTION value="VA">Virginia</OPTION><OPTION value="VI">Virgin Islands</OPTION><OPTION value="VT">Vermont</OPTION><OPTION value="WA">Washington</OPTION><OPTION value="WI">Wisconsin</OPTION><OPTION value="WV">West Virginia</OPTION><OPTION value="WY">Wyoming</OPTION><OPTION value="MP">Micropolynesia</OPTION><OPTION value="FM">Federated States of Micronesia</OPTION>
+ </SELECT>
+ </FONT></TD>
+ <TD BGCOLOR="#DDEEFF" ALIGN="center"><font face=Courier size=2>
+ *Zip Code:<BR>
+ <INPUT NAME="zipcode" VALUE="" SIZE=12 MAXLENGTH=200>
+ </FONT></TD>
+ </TR>
+ </TABLE>
+ </TD>
+ </TR>
+ <TR>
+ <TD BGCOLOR="#DDEEFF" ALIGN="center"><font face=Courier size=2>
+ Country:<BR>
+
+<SELECT name="country">
+ <OPTION value="">Select a Country</OPTION><OPTION value="US" selected >United States</OPTION><OPTION value="AF">Afghanistan</OPTION><OPTION value="AL">Albania</OPTION><OPTION value="DZ">Algeria</OPTION><OPTION value="AS">American Samoa</OPTION><OPTION value="AD">Andorra</OPTION><OPTION value="AO">Angola</OPTION><OPTION value="AV">Anguila</OPTION><OPTION value="AI">Anguilla</OPTION><OPTION value="AQ">Antarctica</OPTION><OPTION value="AG">Antigua</OPTION><OPTION value="AR">Argentina</OPTION><OPTION value="AM">Armenia</OPTION><OPTION value="AW">Aruba</OPTION><OPTION value="AU">Australia</OPTION><OPTION value="AT">Austria</OPTION><OPTION value="AZ">Azerbaidjan</OPTION><OPTION value="BS">Bahamas</OPTION><OPTION value="BH">Bahrain</OPTION><OPTION value="BD">Bangladesh</OPTION><OPTION value="BB">Barbados</OPTION><OPTION value="BY">Belarus</OPTION><OPTION value="BE">Belgium</OPTION><OPTION value="BZ">Belize</OPTION><OPTION value="BJ">Benin</OPTION><OPTION value="BM">Bermuda</OPTION><OPTION value="BT">Bhutan</OPTION><OPTION value="BO">Bolivia</OPTION><OPTION value="BA">Bosnia and Herzegovina</OPTION><OPTION value="BW">Botswnan</OPTION><OPTION value="BV">Bouvet Island</OPTION><OPTION value="BR">Brazil</OPTION><OPTION value="IO">British Indian Ocean Territory</OPTION><OPTION value="BN">Brunei Darussalam</OPTION><OPTION value="BG">Bulgaria</OPTION><OPTION value="BF">Burkina Faso</OPTION><OPTION value="BI">Burundi</OPTION><OPTION value="KH">Cambodia</OPTION><OPTION value="CM">Cameroon</OPTION><OPTION value="CA">Canada</OPTION><OPTION value="CV">Cape Verde</OPTION><OPTION value="KY">Cayman Islands</OPTION><OPTION value="CF">Central African Republic</OPTION><OPTION value="TD">Chad</OPTION><OPTION value="CL">Chile</OPTION><OPTION value="CN">China</OPTION><OPTION value="CX">Christmas Island</OPTION><OPTION value="CC">Cocos</OPTION><OPTION value="CO">Columbia</OPTION><OPTION value="KM">Comoros</OPTION><OPTION value="CG">Congo</OPTION><OPTION value="CD">Congo, Domocratic Republic</OPTION><OPTION value="CK">Cook Islands</OPTION><OPTION value="CR">Costa Rica</OPTION><OPTION value="CI">Cote D'lvoire/Ivory Coast</OPTION><OPTION value="HR">Croatia</OPTION><OPTION value="CU">Cuba</OPTION><OPTION value="CY">Cyprus</OPTION><OPTION value="CZ">Czech Republic</OPTION><OPTION value="DK">Denmark</OPTION><OPTION value="DJ">Djibouti</OPTION><OPTION value="DO">Dominican Republic</OPTION><OPTION value="DM">Domonica</OPTION><OPTION value="TP">East Timor</OPTION><OPTION value="EC">Ecuador</OPTION><OPTION value="EG">Egypt</OPTION><OPTION value="SV">EL Salvador</OPTION><OPTION value="GQ">Equatorial Guinea</OPTION><OPTION value="ER">Eritrea</OPTION><OPTION value="EE">Estonia</OPTION><OPTION value="ET">Ethiopia</OPTION><OPTION value="FK">Falkland Islands (Malvinas)</OPTION><OPTION value="FO">Faroe Islands</OPTION><OPTION value="FJ">Fiji</OPTION><OPTION value="FI">Finland</OPTION><OPTION value="FR">France</OPTION><OPTION value="GF">French Guiana</OPTION><OPTION value="PF">French Polynesia</OPTION><OPTION value="TF">French Southern Territories</OPTION><OPTION value="GA">Gabon</OPTION><OPTION value="GM">Gambia</OPTION><OPTION value="GE">Georgia</OPTION><OPTION value="DE">Germany</OPTION><OPTION value="GH">Ghana</OPTION><OPTION value="GI">Gibraltar</OPTION><OPTION value="GB">Great Britian</OPTION><OPTION value="GR">Greece</OPTION><OPTION value="GL">Greenland</OPTION><OPTION value="GD">Grenada</OPTION><OPTION value="GP">Guadelopue</OPTION><OPTION value="GT">Guatemala</OPTION><OPTION value="GN">Guinea</OPTION><OPTION value="GW">Guinea-Bissau</OPTION><OPTION value="GY">Guyana</OPTION><OPTION value="HT">Haiti</OPTION><OPTION value="HM">Heard & McDonald Islands</OPTION><OPTION value="HN">Honduras</OPTION><OPTION value="HK">Hong Kong</OPTION><OPTION value="HU">Hungary</OPTION><OPTION value="IS">Iceland</OPTION><OPTION value="IN">India</OPTION><OPTION value="ID">Indonesia</OPTION><OPTION value="IR">Iran</OPTION><OPTION value="IQ">Iraq</OPTION><OPTION value="IE">Ireland</OPTION><OPTION value="IL">Israel</OPTION><OPTION value="IT">Italy</OPTION><OPTION value="JM">Jamaica</OPTION><OPTION value="JP">Japan</OPTION><OPTION value="JO">Jordan</OPTION><OPTION value="KZ">Kazakhstan</OPTION><OPTION value="KE">Kenya</OPTION><OPTION value="KI">Kiribati</OPTION><OPTION value="KW">Kuwait</OPTION><OPTION value="KG">Kyrgyzstan</OPTION><OPTION value="LA">Laos</OPTION><OPTION value="LV">Latvia</OPTION><OPTION value="LB">Lebanon</OPTION><OPTION value="LS">Lesotho</OPTION><OPTION value="LR">Liberia</OPTION><OPTION value="LY">Libya</OPTION><OPTION value="LI">Liechtenstein</OPTION><OPTION value="LT">Lithuania</OPTION><OPTION value="LU">Luxembourg</OPTION><OPTION value="MO">Macau</OPTION><OPTION value="MK">Macedonia</OPTION><OPTION value="MG">Madagascar</OPTION><OPTION value="MW">Malawi</OPTION><OPTION value="MY">Malaysia</OPTION><OPTION value="MV">Maldives</OPTION><OPTION value="ML">Mali</OPTION><OPTION value="MT">Malta</OPTION><OPTION value="MH">Marshall Islands</OPTION><OPTION value="MQ">Martinique</OPTION><OPTION value="MR">Mauritania</OPTION><OPTION value="MU">Mauritius</OPTION><OPTION value="YT">Mayotte</OPTION><OPTION value="MX">Mexico</OPTION><OPTION value="FM">Micronesia</OPTION><OPTION value="MD">Moldova</OPTION><OPTION value="MC">Monaco</OPTION><OPTION value="MN">Mongolia</OPTION><OPTION value="MS">Montserrat</OPTION><OPTION value="MA">Morocco</OPTION><OPTION value="MZ">Mozambique</OPTION><OPTION value="MM">Myanmar</OPTION><OPTION value="NA">Namibia</OPTION><OPTION value="NR">Nauru</OPTION><OPTION value="NP">Nepal</OPTION><OPTION value="NL">Netherlands</OPTION><OPTION value="AN">Netherlands Antilles</OPTION><OPTION value="NT">Neutral Zone</OPTION><OPTION value="NC">New Caledonia</OPTION><OPTION value="NZ">New Zealand</OPTION><OPTION value="NI">Nicaragua</OPTION><OPTION value="NE">Niger</OPTION><OPTION value="NG">Nigeria</OPTION><OPTION value="NU">Niue</OPTION><OPTION value="NF">Norfolk Island</OPTION><OPTION value="KP">North Korea</OPTION><OPTION value="MP">Northern Mariana Islands</OPTION><OPTION value="NO">Norway</OPTION><OPTION value="OM">Oman</OPTION><OPTION value="PK">Pakistan</OPTION><OPTION value="PW">Palau</OPTION><OPTION value="PA">Panama</OPTION><OPTION value="PG">Papua New Guinea</OPTION><OPTION value="PY">Paraguay</OPTION><OPTION value="PE">Peru</OPTION><OPTION value="PH">Philippines</OPTION><OPTION value="PN">Pitcaim</OPTION><OPTION value="PL">Poland</OPTION><OPTION value="PT">Portugal</OPTION><OPTION value="QA">Qatar</OPTION><OPTION value="RE">Reunion</OPTION><OPTION value="RO">Romania</OPTION><OPTION value="RU">Russia</OPTION><OPTION value="RW">Rwanda</OPTION><OPTION value="GS">S Georgia & S Sandwich Islands</OPTION><OPTION value="KN">Saint Kitts & Nevis</OPTION><OPTION value="LC">Saint Lucia</OPTION><OPTION value="VC">Saint Vicent & the Grenadines</OPTION><OPTION value="WS">Samoa</OPTION><OPTION value="SM">San Marino</OPTION><OPTION value="ST">Sao Tome and Principe</OPTION><OPTION value="SA">Saudi Arabia</OPTION><OPTION value="SN">Senegal</OPTION><OPTION value="SL">Serra Leone</OPTION><OPTION value="SC">Seychelles</OPTION><OPTION value="SG">Singapore</OPTION><OPTION value="SK">Slovak Republic</OPTION><OPTION value="SI">Slovenia</OPTION><OPTION value="SB">Solomon Islands</OPTION><OPTION value="SO">Somalia</OPTION><OPTION value="ZA">South Africa</OPTION><OPTION value="KR">South Korea</OPTION><OPTION value="ES">Spain</OPTION><OPTION value="LK">Sri Lanka</OPTION><OPTION value="SH">St. Helen</OPTION><OPTION value="PM">St. Pierre & Miquelon</OPTION><OPTION value="SD">Sudan</OPTION><OPTION value="SR">Suriname</OPTION><OPTION value="SJ">Svalbard & Jan Mayen Islands</OPTION><OPTION value="SZ">Swaziland</OPTION><OPTION value="SE">Sweden</OPTION><OPTION value="CH">Switzerland</OPTION><OPTION value="SY">Syria</OPTION><OPTION value="TW">Taiwan</OPTION><OPTION value="TJ">Tajikistan</OPTION><OPTION value="TZ">Tanzania</OPTION><OPTION value="TH">Thailand</OPTION><OPTION value="TG">Togo</OPTION><OPTION value="TK">Tokelau</OPTION><OPTION value="TO">Tonga</OPTION><OPTION value="TT">Trinidad and Tobago</OPTION><OPTION value="TN">Tunisia</OPTION><OPTION value="TR">Turkey</OPTION><OPTION value="TM">Turkmenistan</OPTION><OPTION value="TC">Turks and Caicos Islands</OPTION><OPTION value="TV">Tuvalu</OPTION><OPTION value="UG">Uganda</OPTION><OPTION value="UA">Ukraine</OPTION><OPTION value="AE">United Arab Emirates</OPTION><OPTION value="UK">United Kingdom</OPTION><OPTION value="UY">Uruguay</OPTION><OPTION value="UM">US Minor Outlying Islands</OPTION><OPTION value="UZ">Uzbekistan</OPTION><OPTION value="VU">Vanuatu</OPTION><OPTION value="VA">Vatican City State</OPTION><OPTION value="VE">Venezuela</OPTION><OPTION value="VN">Vietnam</OPTION><OPTION value="VG">Virgin Islands (British)</OPTION><OPTION value="WF">Wallis and Futuna Islands</OPTION><OPTION value="EH">Western Sahara</OPTION><OPTION value="YE">Yemen</OPTION><OPTION value="YU">Yugoslavia</OPTION><OPTION value="ZR">Zaire</OPTION><OPTION value="ZM">Zambia</OPTION><OPTION value="ZW">Zimbabwe</OPTION>
+ </SELECT>
+ </FONT></TD>
+ <TD BGCOLOR="#DDEEFF" ALIGN="center"><font face=Courier size=2>
+ *Phone:<BR>
+ <INPUT NAME="phone" VALUE="" SIZE=28 MAXLENGTH=40>
+ </FONT></TD>
+ </TR>
+ <TR VALIGN="bottom">
+ <TD BGCOLOR="#DDEEFF" ALIGN="center"><font face=Courier size=2>
+ Language:<BR>
+ <select name="lang">
+ <option value="1" selected>English</option>
+ <option value="2">Spanish</option>
+ <option value="3">Russian</option>
+ <option value="4">French</option>
+ </select>
+ </FONT></TD>
+ <TD BGCOLOR="#DDEEFF" ALIGN="center"><font face=Courier size=2>
+ E-mail:<BR>
+ <INPUT NAME="email" VALUE="" SIZE=28 MAXLENGTH=200>
+ </FONT></TD>
+ </TR>
+<input type="hidden" name="server" value="1">
+ <TR>
+ <TD BGCOLOR="#DDEEFF" ALIGN="right">
+ <BR>
+ <INPUT TYPE=RESET VALUE=" Reset " style="background-color:#FFFFF8; color: #003399;"><BR></TD><TD BGCOLOR="#DDEEFF" ALIGN="left"><BR>
+ <INPUT TYPE=SUBMIT VALUE=" Register " style="background-color:#FFFFF8; color: #003399;"><BR>
+ </TD>
+ </TR>
+</form>
+ <TR>
+ <TD BGCOLOR="#DDEEFF" COLSPAN="2" ALIGN="center">
+ <font face=verdana size=1>
+ * indicates a required field.<BR></FONT>
+ </FONT></TD>
+ </TR>
+ <TR>
+ <TD COLSPAN="2" align="center">
+<font face=Courier size=2><A HREF="Agreement.html">Agreement</A></font>
+ </TD>
+ </TR>
+
+
+</table>
+
+<!-- End Content -->
+
+
+<%@ include file="Footer.csp" %>
Index: libui/LoginServlet.h
===================================================================
--- libui/LoginServlet.h (revision 0)
+++ libui/LoginServlet.h (revision 0)
@@ -0,0 +1,22 @@
+#ifndef LOGINSERVLET_H
+#define LOGINSERVLET_H
+
+#include "UuServlet.h"
+
+/**
+ * This servlet:
+ * Receives login request.
+ * Accesses User model object.
+ * Stores results in request context.
+ * Determines the language to render page in based on user preferences.
+ * Forwards the request to the view object LoginView.csp.
+ */
+
+class LoginServlet : public UuServlet
+{
+public:
+ void service(servlet::HttpServletRequest& request, servlet::HttpServletResponse &response);
+};
+
+#endif//LOGINSERVLET_H
+
Index: libui/LoginServlet.cpp
===================================================================
--- libui/LoginServlet.cpp (revision 0)
+++ libui/LoginServlet.cpp (revision 0)
@@ -0,0 +1,51 @@
+#include "LoginServlet.h"
+
+using namespace std;
+using namespace servlet;
+
+void LoginServlet::service(HttpServletRequest& request, HttpServletResponse &response)
+{
+
+ bool isValidUser;
+ string csp = "LoginView.csp";
+ try{
+ isValidUser = isUserLoggedIn(request);
+ string newVisit = request.getParameter("new");
+ if(newVisit != "Y"){
+ string login = request.getParameter("login");
+ string password = request.getParameter("CustPwd");
+ int server = boost::lexical_cast<int>(request.getParameter("server"));
+ string message;
+ UuDbPool::Connection* con = getDbPool()->getConnection(login, password, server);
+ if(con == NULL)
+ throw std::logic_error("No DB connection exist for this request");
+ User* user = new User(*con, login);
+ bool isSuccess = user->isLoginPasswordValid(login, password);
+ if(isSuccess){
+ HttpSession* session = request.getSession(true);
+ if(!session)
+ throw std::logic_error("No session exist for this request");
+ if(session->hasAttribute("user_attr"))
+ session->removeAttribute("user_attr");
+ session->setAttribute("user_attr", setAttribute_t(new User(*user)));
+ session->setAttribute("server_attr", setAttribute_t(new int(server)));
+ string firstname = getCurrentUser(request).getFirstName();
+ string lastname = getCurrentUser(request).getLastName();
+ message = "Welcome back, "+firstname+" "+lastname+"!";
+ csp = "HomeView.csp";
+ } else {
+ message = "Login/password combination is invalid";
+ }
+ request.setAttribute("Message", setAttribute_t(new string(message)));
+ getDbPool()->releaseConnection(con);
+ }
+ }catch(const exception& ex) {
+ request.setAttribute("error", setAttribute_t(new string(ex.what())));
+ cerr<<__PRETTY_FUNCTION__<<": "<<ex.what()<<std::endl;
+ }
+ request.getRequestDispatcher(csp)->forward(request,response);
+
+}
+
+EXPORT_SERVLET(LoginServlet);
+
Index: themes/default/LoginView.csp
===================================================================
--- themes/default/LoginView.csp (revision 0)
+++ themes/default/LoginView.csp (revision 0)
@@ -0,0 +1,68 @@
+<!-- Login form view CSP -->
+
+<%@ include file="Header.csp" %>
+<%@ include file="Sidebar.csp" %>
+
+
+ <FORM ACTION="LoginServlet" METHOD="GET">
+
+ <TD ALIGN="center" valign="top" BGCOLOR="#DDEEFF" width="83%">
+
+<% if(request.hasAttribute("Message")) { %>
+<br>
+<font face=Courier size=2 color="#FF0033""><i><%= request.getAttribute<std::string>("Message") %></i></font>
+<% } %>
+
+<!-- Content -->
+
+<table width=100% cellpadding=4 cellspacing=4 border=0>
+<tr><td></td></tr>
+<TR>
+<TD ALIGN="center">
+<font face=Courier size=3 color="#003399"><b>Enter your membership data to login</B>
+</TD>
+</TR>
+<TR>
+<TD ALIGN="center" BGCOLOR="#DDEEFF">
+<table WIDTH="100%" bordercolor="#FF9900">
+<tr><td colspan="2"> </td></tr>
+<TR>
+<TD ALIGN="right">
+<font face=Courier size=2>Membership name:</font>
+</td>
+<td>
+<INPUT TYPE=TEXT NAME="login" VALUE="" SIZE=20 MAXLENGTH=50>
+</TD>
+</TR>
+<TR>
+<TD ALIGN="right">
+<font face=Courier size=2>Password:</font>
+</td>
+<td>
+<INPUT TYPE=PASSWORD NAME="CustPwd" SIZE=20 MAXLENGTH=50>
+</TD>
+</TR>
+<TR>
+<TD ALIGN="center" colspan="2">
+<input type="hidden" name="server" value="1">
+<BR><INPUT TYPE=SUBMIT NAME="OK" VALUE="Login" SIZE=10 style="background-color:#FFFFF8; color: #003399;">
+</TD>
+</TR>
+<tr><td colspan="2"> </td></tr>
+<TR>
+<TD ALIGN="center" colspan="2">
+<font face=verdana size=1><A HREF="#">Forgot Password?</A></font>
+</TD>
+</TR>
+</TABLE>
+</TD>
+</TR>
+
+
+
+</table>
+
+<!-- End Content -->
+
+<%@ include file="Footer.csp" %>
Index: libui/LogoutServlet.h
===================================================================
--- libui/LogoutServlet.h (revision 0)
+++ libui/LogoutServlet.h (revision 0)
@@ -0,0 +1,22 @@
+#ifndef LOGOUTSERVLET_H
+#define LOGOUTSERVLET_H
+
+#include "UuServlet.h"
+
+/**
+ * This servlet:
+ * Receives logout request.
+ * Cleans up HttpSession object.
+ * Stores results in request context.
+ * Determines the language to render page in based on user preferences.
+ * Forwards the request to the view object LoginView.csp.
+ */
+
+class LogoutServlet : public UuServlet
+{
+public:
+ void service(servlet::HttpServletRequest& request, servlet::HttpServletResponse &response);
+};
+
+#endif//LOGOUTSERVLET_H
+
Index: libui/LogoutServlet.cpp
===================================================================
--- libui/LogoutServlet.cpp (revision 0)
+++ libui/LogoutServlet.cpp (revision 0)
@@ -0,0 +1,30 @@
+#include "LogoutServlet.h"
+
+using namespace std;
+using namespace servlet;
+
+void LogoutServlet::service(HttpServletRequest& request, HttpServletResponse &response)
+{
+
+ string csp = "LoginView.csp";
+ string message;
+ try{
+ HttpSession* session = request.getSession(true);
+ if(!session)
+ throw std::logic_error("No session exist for this request");
+ session->invalidate();
+ HttpSession* sessionNew = request.getSession(true);
+ if(!sessionNew)
+ throw std::logic_error("No session exist for this request");
+ message="Logout successful";
+ request.setAttribute("Message", setAttribute_t(new string(message)));
+ }catch(const exception& ex) {
+ request.setAttribute("error", setAttribute_t(new string(ex.what())));
+ cerr<<__PRETTY_FUNCTION__<<": "<<ex.what()<<std::endl;
+ }
+ request.getRequestDispatcher(csp)->forward(request,response);
+
+}
+
+EXPORT_SERVLET(LogoutServlet);
+
Index: libui/AccountServlet.h
===================================================================
--- libui/AccountServlet.h (revision 0)
+++ libui/AccountServlet.h (revision 0)
@@ -0,0 +1,22 @@
+#ifndef ACCOUNTSERVLET_H
+#define ACCOUNTSERVLET_H
+
+#include "UuServlet.h"
+
+/**
+ * This servlet:
+ * Receives user account view request.
+ * Accesses User model object.
+ * Stores results in request context.
+ * Determines the language to render page in based on user preferences.
+ * Forwards the request to the view object AccountView.csp.
+ */
+
+class AccountServlet : public UuServlet
+{
+public:
+ void service(servlet::HttpServletRequest& request, servlet::HttpServletResponse &response);
+};
+
+#endif//ACCOUNTSERVLET_H
+
Index: libui/AccountServlet.cpp
===================================================================
--- libui/AccountServlet.cpp (revision 0)
+++ libui/AccountServlet.cpp (revision 0)
@@ -0,0 +1,44 @@
+#include "AccountServlet.h"
+
+using namespace std;
+using namespace servlet;
+
+void AccountServlet::service(HttpServletRequest& request, HttpServletResponse &response)
+{
+
+ bool isValidUser;
+ string csp = "AccountView.csp";
+ string message;
+ try{
+ isValidUser = isUserLoggedIn(request);
+ if(isValidUser) {
+ HttpSession* session = request.getSession(true);
+ if(!session)
+ throw std::logic_error("No session exist for this request");
+ string login = getCurrentUser(request).getLogin();
+ string password = getCurrentUser(request).getPassword();
+ string firstname = getCurrentUser(request).getFirstName();
+ string lastname = getCurrentUser(request).getLastName();
+ int server = session->getAttribute<int>("server_attr");
+ message = "You are logged in as "+firstname+" "+lastname;
+ UuDbPool::Connection* con = getDbPool()->getConnection(login, password, server);
+ if(con == NULL)
+ throw std::logic_error("No DB connection exist for this request");
+ //Run access protected query here
+ getDbPool()->releaseConnection(con);
+ }
+ }catch(const exception& ex) {
+ request.setAttribute("error", setAttribute_t(new string(ex.what())));
+ cerr<<__PRETTY_FUNCTION__<<": "<<ex.what()<<std::endl;
+ }
+ request.setAttribute("Message", setAttribute_t(new string(message)));
+ if(isValidUser){
+ request.getRequestDispatcher(csp)->forward(request,response);
+ } else {
+ redirectToLogin(response);
+ }
+
+}
+
+EXPORT_SERVLET(AccountServlet);
+
Index: themes/default/AccountView.csp
===================================================================
--- themes/default/AccountView.csp (revision 0)
+++ themes/default/AccountView.csp (revision 0)
@@ -0,0 +1,43 @@
+<!-- Account view CSP -->
+
+<%@ include file="Header.csp" %>
+<%@ include file="Sidebar.csp" %>
+
+
+
+
+ <TD ALIGN="center" valign="top" BGCOLOR="#DDEEFF" width="83%">
+
+<% if(request.hasAttribute("Message")) { %>
+<br>
+<font face=Courier size=2 color="#FF0033""><i><%= request.getAttribute<std::string>("Message") %></i></font>
+<% } %>
+
+
+
+<table width=100% cellpadding=4 cellspacing=4 border=0>
+<tr><td></td></tr>
+<TR>
+<TD ALIGN="center">
+<font face=Courier size=3 color="#003399"><b>My account info</B>
+</TD>
+</TR>
+<tr>
+<td valign="top">
+<font face=verdana size=2><A HREF="Author.html">My public info</A></font>
+<br>
+<font face=verdana size=2><A HREF="#">Update language</A></font>
+<br>
+<font face=verdana size=2><A HREF="#">Change mailing address</A></font>
+<br>
+<font face=verdana size=2><A HREF="#">Change Login/Password</A></font>
+<br>
+<font face=verdana size=2><A HREF="SubscribersRequests.html">Manage
+Subscribers Requests</A></font>
+<br>
+</td>
+</tr>
+</table>
+
+
+<%@ include file="Footer.csp" %>
Index: libui/HomeServlet.h
===================================================================
--- libui/HomeServlet.h (revision 0)
+++ libui/HomeServlet.h (revision 0)
@@ -0,0 +1,22 @@
+#ifndef HOMESERVLET_H
+#define HOMESERVLET_H
+
+#include "UuServlet.h"
+
+/**
+ * This servlet:
+ * Receives home view request.
+ * Accesses User model object.
+ * Stores results in request context.
+ * Determines the language to render page in based on user preferences.
+ * Forwards the request to the view object HomeView.csp.
+ */
+
+class HomeServlet : public UuServlet
+{
+public:
+ void service(servlet::HttpServletRequest& request, servlet::HttpServletResponse &response);
+};
+
+#endif//HOMESERVLET_H
+
Index: libui/HomeServlet.cpp
===================================================================
--- libui/HomeServlet.cpp (revision 0)
+++ libui/HomeServlet.cpp (revision 0)
@@ -0,0 +1,42 @@
+#include "HomeServlet.h"
+
+using namespace std;
+using namespace servlet;
+
+void HomeServlet::service(HttpServletRequest& request, HttpServletResponse &response)
+{
+
+ bool isValidUser;
+ string csp = "HomeView.csp";
+ string message;
+ try{
+ isValidUser = isUserLoggedIn(request);
+ if(isValidUser) {
+ HttpSession* session = request.getSession(true);
+ if(!session)
+ throw std::logic_error("No session exist for this request");
+ string login = getCurrentUser(request).getLogin();
+ string password = getCurrentUser(request).getPassword();
+ string firstname = getCurrentUser(request).getFirstName();
+ string lastname = getCurrentUser(request).getLastName();
+ int server = session->getAttribute<int>("server_attr");
+ message = "You are logged in as "+firstname+" "+lastname;
+ UuDbPool::Connection* con = getDbPool()->getConnection(login, password, server);
+ if(con == NULL)
+ throw std::logic_error("No DB connection exist for this request");
+ //Run access protected query here
+ getDbPool()->releaseConnection(con);
+ } else {
+ message = "You are not logged in";
+ }
+ }catch(const exception& ex) {
+ request.setAttribute("error", setAttribute_t(new string(ex.what())));
+ cerr<<__PRETTY_FUNCTION__<<": "<<ex.what()<<std::endl;
+ }
+ request.setAttribute("Message", setAttribute_t(new string(message)));
+ request.getRequestDispatcher(csp)->forward(request,response);
+
+}
+
+EXPORT_SERVLET(HomeServlet);
+
Index: themes/default/HomeView.csp
===================================================================
--- themes/default/HomeView.csp (revision 0)
+++ themes/default/HomeView.csp (revision 0)
@@ -0,0 +1,104 @@
+<!-- Home view CSP -->
+
+<%@ include file="Header.csp" %>
+<%@ include file="Sidebar.csp" %>
+
+
+ <TD ALIGN="center" valign="top" BGCOLOR="#DDEEFF" width="83%">
+
+
+<% if(request.hasAttribute("Message")) { %>
+<br>
+<font face=Courier size=2 color="#FF0033""><i><%= request.getAttribute<std::string>("Message") %></i></font>
+<% } %>
+
+
+<% if(isLoggedIn) { %>
+
+<table width=100% cellpadding=4 cellspacing=4 border=0>
+<tr>
+<td valign="top" height="100" width="50%">
+<center><font face=Courier size=3 color="#003399"><b>My Courses</b></font></center><br>
+<font face=Courier size=2><A HREF="CourseEdit.html">Calculus</A></font><br>
+<font face=Courier size=2><A HREF="CourseEdit.html">Derivatives</A></font><br>
+<font face=Courier size=2><A HREF="CourseEdit.html">Math</A></font><br>
+<font face=Courier size=2><A HREF="CourseEdit.html">Trigonometry</A></font><br>
+<br>
+<center><font face=verdana size=1><A HREF="RepositoryCourses.html">View All</A></font></center>
+</td>
+</tr>
+
+<tr><td colspan=2><hr color="#99CCFF"></td></tr>
+
+<tr>
+<td valign="top" height="100">
+<center><font face=Courier size=3 color="#003399"><b>Courses I study</b></font></center><br>
+<font face=Courier size=2><A HREF="CourseView1.html">Astronomy</A></font><br>
+<!-- <font face=Courier size=2><A HREF="CourseView1.html">Geology</A></font><br> -->
+<font face=Courier size=2><A HREF="CourseView.html">Theology</A></font><br>
+<br>
+<center><font face=verdana size=1><A HREF="CatalogStudent.html">Get new course</A></font></center>
+<br>
+<br>
+<font face=verdana size=1><A HREF="StudentView.html">My info(as a student)</A></font>
+
+
+</td>
+
+</tr>
+
+<tr><td colspan=2><hr color="#99CCFF"></td></tr>
+
+
+
+<tr>
+<td valign="top" height="100">
+<center><font face=Courier size=3 color="#003399"><b>Courses I teach</b></font></center><br>
+<font face=Courier size=2><A HREF="CourseViewTeach1.html">Math</A></font><br>
+<br>
+<font face=verdana size=1><A HREF="CatalogCoursesTeach.html">Teach new course</A></font>
+<br><br>
+<br>
+<center><font face=Courier size=2 color="#003399"><b>My students</b></font></center><br>
+
+<font face=Courier size=2><A HREF="StudentView.html">Student 1 (359 points)</A></font><br>
+<font face=Courier size=2><A HREF="StudentView.html">Student 2 (412 points)</A></font><br>
+<font face=Courier size=2><A HREF="StudentView.html">Student 3 (87 points)</A></font><br>
+<font face=Courier size=2><A HREF="StudentView.html">Student 4 (210 points)</A></font><br>
+
+<br>
+
+<center><font face=verdana size=1><A HREF="ProblemsList.html">Get list of problems with outstanding solutions</A></font></center>
+<br>
+</td>
+
+</tr>
+
+<tr><td colspan=2><hr color="#99CCFF"></td></tr>
+
+
+</table>
+
+<% } else { %>
+
+<table width=100% cellpadding=4 cellspacing=4 border=0>
+<tr>
+<td valign="top" height="100" width="50%">
+<center><font face=Courier size=3 color="#003399"><b>UU Courses</b></font></center><br>
+<font face=Courier size=2><A HREF="CourseEdit.html">Calculus</A></font><br>
+<font face=Courier size=2><A HREF="CourseEdit.html">Derivatives</A></font><br>
+<font face=Courier size=2><A HREF="CourseEdit.html">Math</A></font><br>
+<font face=Courier size=2><A HREF="CourseEdit.html">Trigonometry</A></font><br>
+<font face=Courier size=2><A HREF="CourseEdit.html">Geology</A></font><br>
+<font face=Courier size=2><A HREF="CourseEdit.html">Technology</A></font><br>
+<font face=Courier size=2><A HREF="CourseEdit.html">Astronomy</A></font><br>
+<font face=Courier size=2><A HREF="CourseEdit.html">Design</A></font><br>
+<br>
+<center><font face=verdana size=1><A HREF="RepositoryCourses.html">View All</A></font></center>
+</td>
+</tr>
+</table>
+
+<% } %>
+
+<%@ include file="Footer.csp" %>
Index: libdm/User.h
===================================================================
--- libdm/User.h (revision 0)
+++ libdm/User.h (revision 0)
@@ -0,0 +1,49 @@
+#ifndef USER_H
+#define USER_H
+
+#include <string>
+#include <boost/lexical_cast.hpp>
+#include <map>
+#include <vector>
+
+#include "UuDbPool.h"
+#include "SessionInfo.h"
+
+/**
+ *This class accesses and alters person_list, city_list tables.
+ */
+
+class User
+{
+public:
+ User(UuDbPool::Connection&, std::string);
+ virtual ~User();
+
+ private:
+ UuDbPool::Connection& m_handle;
+ std::string m_login;
+ std::string m_password;
+ std::string m_firstname;
+ std::string m_lastname;
+
+ public:
+ virtual std::string getLogin();
+ virtual std::string getPassword();
+ virtual std::string getFirstName();
+ virtual std::string getLastName();
+
+ /**
+ * Performs user authentication
+ */
+
+ bool isLoginPasswordValid(std::string login, std::string password);
+
+ /**
+ * Sets all user data during a registration process. Calls stored procedure "person_create" to insert user data into "person_list" table. If insert is successful, returns true. Otherwise returns false.
+ */
+
+ virtual bool setUserInfo ( std::string login, std::string password, int language, std::string firstName, std::string lastName, std::string street, std::string city, std::string state, std::string zip, std::string country, std::string email, std::string phone );
+
+};
+
+#endif // USER_H
Index: libdm/User.cpp
===================================================================
--- libdm/User.cpp (revision 0)
+++ libdm/User.cpp (revision 0)
@@ -0,0 +1,111 @@
+#include "User.h"
+
+using namespace std;
+using namespace sptk;
+using namespace boost;
+
+User::User(UuDbPool::Connection& handle, string login)
+ : m_handle(handle)
+ , m_login(login)
+{
+
+ try {
+ CQuery qrySelect(&m_handle,"select pl_login, pl_password, pl_first_name, pl_last_name from person_list where pl_login=:login");
+ qrySelect.param("login") = m_login;
+ qrySelect.open();
+ CField& passField = qrySelect["pl_password"];
+ CField& fnameField = qrySelect["pl_first_name"];
+ CField& lnameField = qrySelect["pl_last_name"];
+ while ( ! qrySelect.eof() ) {
+ m_password = passField.asString();
+ m_firstname = fnameField.asString();
+ m_lastname = lnameField.asString();
+ qrySelect.fetch();
+ }
+ qrySelect.close();
+ }
+ catch (exception& e) {
+ cout<<"\nError: " <<e.what();
+ }
+
+}
+User::~User ( )
+{}
+
+
+string User::getLogin()
+{
+
+ return m_login;
+
+}
+
+string User::getPassword()
+{
+
+ return m_password;
+
+}
+
+string User::getFirstName()
+{
+
+ return m_firstname;
+
+}
+
+string User::getLastName()
+{
+
+ return m_lastname;
+
+}
+
+/**
+ * Performs authentication.
+ * @return bool
+ */
+
+bool User::isLoginPasswordValid(string login, string password)
+{
+
+ bool isValid = false;
+ try {
+ CQuery qrySelect(&m_handle,"select pl_id from person_list where pl_login=:login and pl_password=:password");
+ qrySelect.param("login") = login;
+ qrySelect.param("password") = password;
+ qrySelect.open();
+ while ( ! qrySelect.eof() ) {
+ isValid = true;
+ qrySelect.fetch();
+ }
+ qrySelect.close();
+ }
+ catch (exception& e) {
+ cout<<"\nError: " <<e.what();
+ return false;
+ }
+ return isValid;
+
+}
+
+
+/**
+ * Sets all user data during a registration process. Calls stored procedure "person_create" to insert user data into "person_list" table. If insert is successful, returns true. Otherwise returns false.
+ */
+
+bool User::setUserInfo(string login, string password, int language, string firstName, string lastName, string street, string city, string state, string zip, string country, string email, string phone )
+{
+
+ try {
+ CQuery qryInsert(&m_handle,"select person_create('"+firstName+"','"+lastName+"','"+street+"','"+city+"','"+state+"','"+zip+"','"+country+"','"+email+"','"+phone+"','"+login+"','"+password+"')");
+ qryInsert.exec();
+ }
+ catch (exception& e) {
+ cout<<"\nError: " <<e.what();
+ return false;
+ }
+ return true;
+
+}
+
Index: libdm/UuDbPool.h
===================================================================
--- libdm/UuDbPool.h (revision 0)
+++ libdm/UuDbPool.h (revision 0)
@@ -0,0 +1,41 @@
+#include <sptk3/CODBCDatabase.h>
+#include <sptk3/CException.h>
+#include <sptk3/CQuery.h>
+#include <sptk3/CThread.h>
+#include <sptk3/CWaiter.h>
+
+#include <list>
+#include <boost/lexical_cast.hpp>
+
+class UuDbPool
+{
+public:
+ class Connection: public sptk::CODBCDatabase
+ {
+ public:
+ Connection(UuDbPool* pool)
+ : sptk::CODBCDatabase(pool->m_conString)
+ {}
+ };
+private:
+ typedef std::list<Connection*> connectionlist_t;
+private:
+ connectionlist_t m_connections;
+ std::string m_conString;
+ int m_maxCon;
+ int m_checkedOut;
+ int m_timeout;
+ sptk::CWaiter m_lock;
+public:
+ UuDbPool(std::string dsn, std::string dbuser, std::string dbpassword, std::string db, int maxCon, int timeout);
+ ~UuDbPool();
+public:
+ int& getMaxCon();
+ int& getTimeout();
+ Connection* getConnection(std::string login, std::string password, int server);
+ void releaseConnection(Connection* con);
+ void shutdown();
+
+};
+
+
Index: libdm/UuDbPool.cpp
===================================================================
--- libdm/UuDbPool.cpp (revision 0)
+++ libdm/UuDbPool.cpp (revision 0)
@@ -0,0 +1,129 @@
+#include "UuDbPool.h"
+
+using namespace std;
+using namespace sptk;
+using namespace boost;
+
+UuDbPool::UuDbPool(string dsn, string dbuser, string dbpassword, string db, int maxCon, int timeout)
+ : m_conString("DSN="+dsn+";UID="+dbuser+";PWD="+dbpassword+";DATABASE="+db)
+ , m_maxCon(maxCon)
+ , m_checkedOut(0)
+ , m_timeout(timeout)
+
+{
+
+ m_lock.lock();
+ getMaxCon();
+ getTimeout();
+ for(int i=0;i<maxCon;i++){
+ Connection* con=new Connection(this);
+ m_connections.push_front(con);
+ con->open();
+ }
+ m_lock.unlock();
+
+}
+
+UuDbPool::~UuDbPool()
+{
+
+ shutdown();
+
+}
+
+
+int& UuDbPool::getMaxCon()
+{
+
+ static int maxCon(m_maxCon);
+ return maxCon;
+
+}
+
+
+int& UuDbPool::getTimeout()
+{
+
+ static int timeout(m_timeout);
+ return timeout;
+
+}
+
+UuDbPool::Connection* UuDbPool::getConnection(string login, string password, int server)
+{
+
+ m_lock.lock();
+ while(m_checkedOut >= getMaxCon()){
+ m_lock.waitForSignal(getTimeout());
+ }
+ Connection* con = 0;
+ if(m_connections.size() > 0){
+ connectionlist_t::iterator iter = m_connections.begin();
+ con = *iter;
+ if(!con->active()){
+ con->open();
+ }
+ m_connections.erase(iter);
+ }
+ if(con != NULL){
+ m_checkedOut++;
+ try{
+ CQuery loginQuery(con,"select login(:login,:password,:server)");
+ loginQuery.param("login") = login;
+ loginQuery.param("password") = password;
+ loginQuery.param("server") = server;
+ loginQuery.exec();
+ }
+ catch (exception& e) {
+ cout<<"\nError: " <<e.what();
+ con = NULL;
+ }
+ }
+ //m_lock.broadcastSignalNoLock();
+ m_lock.unlock();
+ return con;
+
+}
+
+
+void UuDbPool::releaseConnection(Connection* con)
+{
+
+ m_lock.lock();
+ if(con != NULL){
+ if(con->active()){
+ m_connections.push_back(con);
+ m_checkedOut--;
+ try {
+ CQuery logoutQuery(con,"select logout()");
+ logoutQuery.exec();
+ }
+ catch (exception& e) {
+ cout<<"\nError: " <<e.what();
+ }
+ }
+ }
+ // m_lock.broadcastSignalNoLock();
+ m_lock.unlock();
+
+}
+
+
+void UuDbPool::shutdown()
+{
+
+ if(m_connections.size() > 0){
+ connectionlist_t::iterator it;
+ for(it=m_connections.begin();
+ it!=m_connections.end(); it++)
+ {
+ (*it)->close();
+ }
+ m_connections.clear();
+ m_connections.erase(it);
+ }
+ delete this;
+
+}
+
+
Index: themes/default/Footer.csp
===================================================================
--- themes/default/Footer.csp (revision 0)
+++ themes/default/Footer.csp (revision 0)
@@ -0,0 +1,16 @@
+<!-- Footer -->
+
+</td>
+</tr>
+</table>
+ </TD>
+ </TR>
+ </TABLE>
+
+ </CENTER><br>
+<P ALIGN="CENTER">
+ <font face=verdana size=1><A HREF="http://www.total-knowledge.com/copyleft.shtml" TARGET="_new">
+ Authoright © Total Knowledge: 2001-2007</A></font>
+</P>
+</BODY>
+</HTML>
\ No newline at end of file
Index: themes/default/Header.csp
===================================================================
--- themes/default/Header.csp (revision 0)
+++ themes/default/Header.csp (revision 0)
@@ -0,0 +1,68 @@
+
+<%
+
+bool isLoggedIn = false;
+servlet::HttpSession* session = request.getSession(false);
+if(session) {
+ if(session->hasAttribute("user_attr")){
+ isLoggedIn = true;
+ }
+}
+
+%>
+
+
+<HTML>
+<HEAD>
+<!-- <link href="styles.css" rel="stylesheet" media="screen"> -->
+<TITLE>TEST</TITLE>
+</HEAD>
+
+<BODY BGCOLOR="#FFFFF8" link="#003399" vlink="#003399">
+<CENTER><br>
+
+<!-- Header -->
+
+<TABLE width="770" border=0>
+<TR>
+<TD BGCOLOR="#3388FF" align="center">
+<table width="100%" border=1 cellpadding=1 cellspacing=0 class="st">
+
+<tr>
+<td align="center" width="16%" height="25">
+<FONT SIZE=2 face=verdana><a href="HomeServlet" class="headerLink"><B>HOME<B></a></FONT>
+</td>
+<% if(!isLoggedIn) { %>
+<td align="center" width="20%">
+<FONT SIZE=2 face=verdana><a href="RegisterServlet?new=Y" class="headerLinkOn"><B>REGISTRATION<B></a></FONT>
+</td>
+<td align="center" width="16%">
+<FONT SIZE=2 face=verdana><a href="LoginServlet?new=Y" class="headerLink"><B>LOGIN<B></a></FONT>
+</td>
+<% } else { %>
+<td align="center" width="20%">
+<FONT SIZE=2 face=verdana><a href="AccountServlet" class="headerLink"><B>MY ACCOUNT<B></a></FONT>
+</td>
+<td align="center" width="16%">
+<FONT SIZE=2 face=verdana><a href="LogoutServlet" class="headerLink"><B>LOGOUT<B></a></FONT>
+</td>
+<% } %>
+<td align="center" width="16%">
+<FONT SIZE=2 face=verdana><a href="Intro.html" class="headerLink"><B>ABOUT US<B></a></FONT>
+</td>
+
+<td align="center" width="16%">
+<FONT SIZE=2 face=verdana><a href="Policies.html" class="headerLink"><B>POLICIES<B></a></FONT>
+</td>
+<td align="center" width="16%">
+<FONT SIZE=2 face=verdana><a href="Help.html" class="headerLink"><B>HELP<B></a></FONT>
+</td>
+</tr>
+</table>
+
+</TD>
+</TR>
+
+<!-- End Header -->
+
Index: themes/default/Sidebar.csp
===================================================================
--- themes/default/Sidebar.csp (revision 0)
+++ themes/default/Sidebar.csp (revision 0)
@@ -0,0 +1,87 @@
+<!-- Side Bar -->
+
+ <TR>
+ <TD ALIGN="center" BGCOLOR="#DDEEFF">
+<table width="770" border=0 cellpadding=4 cellspacing=0>
+<TR>
+ <TD ALIGN="left" valign="top" BGCOLOR="#99CCFF" width="17%">
+<table width=100% cellpadding=4 cellspacing=4 border=0>
+<tr><form action="SearchResults.html" name="search">
+<td>
+<font face=verdana size=2 color="#003399"><b>Search</b></font><br>
+<font face=verdana size=2><input type="text" name="search" value="" size="4"></font> <font face=verdana size=2><input type="submit" name="go" value="go" style="background-color:#DDEEFF; color: #003399;"></font></td>
+
+</tr>
+<tr>
+<td>
+<font face=verdana size=1><A HREF="AdvancedSearch.html" class="navbarLink">Advanced Search</A></font><br>
+</td></form>
+</tr>
+
+
+<tr><td><hr color="#003399"></td></tr>
+<tr>
+<td>
+<font face=verdana size=2><A HREF="Repository.html" class="navbarLink"><b>My UMOs</b></A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryCourses.html" class="navbarLink">Courses</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryTopics.html" class="navbarLink">Topics</A></font><br>
+
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryProblems.html" class="navbarLink">Problems</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryExplanations.html" class="navbarLink">Explanations</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryTests.html" class="navbarLink">Tests</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryDialogs.html" class="navbarLink">Dialogs</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryTexts.html" class="navbarLink">Texts</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="CustomEdit.html" class="navbarLink">Advertising</A></font><br><br>
+<font face=verdana size=2><A HREF="#" class="navbarLink"><b>Create New</b></A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="CourseCreate.html" class="navbarLink">Course</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="TopicCreate.html" class="navbarLink">Topic</A></font><br>
+
+<font face=verdana size=1 color="#003399">• <A HREF="ProblemCreate.html" class="navbarLink">Problem</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="ExplanationCreate.html" class="navbarLink">Explanation</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="TestCreate.html" class="navbarLink">Test</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="DialogCreate.html" class="navbarLink">Dialog</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="TextCreate.html" class="navbarLink">Text</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="CustomCreate.html" class="navbarLink">Custom UMO</A></font><br></td>
+</tr>
+
+
+<tr><td><hr color="#003399"></td></tr>
+<tr>
+
+<td>
+<font face=verdana size=2><A HREF="RepositoryAll.html" class="navbarLink"><b>All UMOs</b></A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryCourses.html" class="navbarLink">Courses</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryTopics.html" class="navbarLink">Topics</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryProblems.html" class="navbarLink">Problems</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryExplanations.html" class="navbarLink">Explanations</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryTests.html" class="navbarLink">Tests</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryDialogs.html" class="navbarLink">Dialogs</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="RepositoryTexts.html" class="navbarLink">Texts</A></font><br>
+
+<br>
+
+<font face=verdana size=2><A HREF="SearchResults.html" class="navbarLink"><b>Catalog</b></A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="CatalogCourses.html" class="navbarLink">Courses</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="CatalogTopics.html" class="navbarLink">Topics</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="CatalogProblems.html" class="navbarLink">Problems</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="CatalogExplanations.html" class="navbarLink">Explanations</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="CatalogTests.html" class="navbarLink">Tests</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="CatalogDialogs.html" class="navbarLink">Dialogs</A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="CatalogTexts.html" class="navbarLink">Texts</A></font><br>
+
+
+</td>
+</tr>
+
+<tr><td><hr color="#003399"></td></tr>
+<tr>
+<td><font face=verdana size=2><A HREF="Basket.html" class="navbarLink"><b>My Basket</b></A></font><br>
+<font face=verdana size=1 color="#003399">• <A HREF="Basket.html" class="navbarLink">3 UMOs</a></font><br><br>
+</td>
+</tr>
+</table>
+ </TD>
+
+<!-- End Side Bar -->
+
+
Index: libui/Makefile.adon
===================================================================
--- libui/Makefile.adon (revision 82)
+++ libui/Makefile.adon (working copy)
@@ -0,0 +1,9 @@
+## libui Makefile
+
+noinst_LTLIBRARIES:=libuu
+noinst_HEADERS:=UuServlet.h HomeServlet.h RegisterServlet.h LoginServlet.h LogoutServlet.h AccountServlet.h
+libuu_SOURCES:=UuServlet.cpp HomeServlet.cpp RegisterServlet.cpp LoginServlet.cpp LogoutServlet.cpp AccountServlet.cpp
+libuu_LDFLAGS:=-lspdb3 -lsputil3 -luu -ldm
+libuu_DEPS:=libuu
+
+ADON_SUBDIRS:=
Index: themes/default/Makefile.adon
===================================================================
--- themes/default/Makefile.adon (revision 82)
+++ themes/default/Makefile.adon (working copy)
@@ -0,0 +1,40 @@
+## themes/default Makefile
+
+CPP_SERVLETS:=
+CSP_SERVLETS:= \
+ HomeView \
+ LoginView \
+ RegistrationView \
+ AccountView \
+
+CSP_COMPILE:=cxxsp_compile
+LOCAL_CPPFLAGS:=-I$(ADON_CURDIR)
+
+noinst_LTLIBRARIES:=
+noinst_HEADERS:=
+
+EXTRA_DIST:=Footer.csp Header.csp Sidebar.csp
+define CSP_TMPL
+$(1)_SOURCES:=$(1).cpp
+$(1)_LDFLAGS:=-lspdb3 -lsputil3 -luu -ldm
+$(1)_DEPS:=libuu libdm
+CLEANFILES+=$(1).cpp
+EXTRA_DIST+=$(1).csp
+noinst_LTLIBRARIES+=$(1)
+endef
+define CPP_TMPL
+$(1)_SOURCES:=$(1).cpp
+$(1)_LDFLAGS:=-lspdb3 -lsputil3 -luu -ldm
+$(1)_DEPS:=libuu libdm
+noinst_LTLIBRARIES+=$(1)
+endef
+
+$(foreach srv,$(CSP_SERVLETS),$(eval $(call CSP_TMPL,$(srv))))
+$(foreach srv,$(CPP_SERVLETS),$(eval $(call CPP_TMPL,$(srv))))
+
+
+%.cpp: %.csp
+ @echo "Parsing $< into $@"
+ $(Q)$(CSP_COMPILE) $< $@
+
+ADON_SUBDIRS:=
Index: themes/Makefile.adon
===================================================================
--- themes/Makefile.adon (revision 82)
+++ themes/Makefile.adon (working copy)
@@ -1 +1,3 @@
+## themes Makefile
+
+ADON_SUBDIRS:=default
Index: libdm/Makefile.adon
===================================================================
--- libdm/Makefile.adon (revision 82)
+++ libdm/Makefile.adon (working copy)
@@ -0,0 +1,7 @@
+## libdm Makefile
+
+noinst_LTLIBRARIES:=libdm
+noinst_HEADERS:=User.h UuDbPool.h
+libdm_SOURCES:=User.cpp UuDbPool.cpp
+
+ADON_SUBDIRS:=
Index: env-tests/env-test-custom.mk
===================================================================
--- env-tests/env-test-custom.mk (revision 82)
+++ env-tests/env-test-custom.mk (working copy)
@@ -0,0 +1,15 @@
+#####################################################
+ifneq ($(strip $(shell $(CXX) -v 2>&1| grep '^gcc')),)
+$(eval $(call cxx_flag_kirpich,-W))
+$(eval $(call cxx_flag_kirpich,-Wall))
+$(eval $(call cxx_flag_kirpich,-Wextra))
+#$(eval $(call cxx_flag_kirpich,-Wold-style-cast))
+#$(eval $(call cxx_flag_kirpich,-Woverloaded-virtual))
+$(eval $(call cxx_flag_kirpich,-Wredundant-decls))
+#$(eval $(call cxx_flag_kirpich,-pedantic))
+$(eval $(call sptk_kirpich))
+$(eval $(call sptk_namespace_kirpich))
+$(eval $(call sptk_odbc_kirpich))
+$(eval $(call sptk_sqlite_kirpich))
+endif
+#####################################################
Index: Makefile.adon
===================================================================
--- Makefile.adon (revision 82)
+++ Makefile.adon (working copy)
@@ -1 +1,6 @@
+## trunk Makefile
+
ADON_SUBDIRS:=libdm libui themes admin
+EXTRA_DIST := README engine.xml
+export CPPSERV_TEST_HOST ?= sergey
+export CPPSERV_TEST_URLBASE ?= http://localhost/~sergey/csp
Index: engine.xml
===================================================================
--- engine.xml (revision 0)
+++ engine.xml (revision 0)
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<listener protocol="unix" path="/tmp/cppserv.sock"/>
+<app name="">
+ <servlet name="UuServlet" dso="./debug/libui/libuu.so">
+ <parameter name="DSN" value="PostgreSQL"/>
+ <parameter name="UID" value="sergey"/>
+ <parameter name="PWD" value=""/>
+ <parameter name="DB" value="uu"/>
+ <parameter name="num_connections" value="5"/>
+ <parameter name="timeout" value="10000"/>
+ </servlet>
+ <servlet name="HomeServlet" dso="./debug/libui/libuu.so"/>
+ <servlet name="RegisterServlet" dso="./debug/libui/libuu.so"/>
+ <servlet name="LoginServlet" dso="./debug/libui/libuu.so"/>
+ <servlet name="LogoutServlet" dso="./debug/libui/libuu.so"/>
+ <servlet name="AccountServlet" dso="./debug/libui/libuu.so"/>
+ <csp name="themes/default/HomeView.csp" path="HomeView.csp" dso="./debug/themes/default/HomeView.so" hidden="true"/>
+ <csp name="themes/default/RegistrationView.csp" path="RegistrationView.csp" dso="./debug/themes/default/RegistrationView.so" hidden="true"/>
+ <csp name="themes/default/LoginView.csp" path="LoginView.csp" dso="./debug/themes/default/LoginView.so" hidden="true"/>
+ <csp name="themes/default/AccountView.csp" path="AccountView.csp" dso="./debug/themes/default/AccountView.so" hidden="true"/>
+</app>