/**
* Copyright (c) 2011-2014, OpenIoT
*
* This file is part of OpenIoT.
*
* OpenIoT is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* OpenIoT is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with OpenIoT. If not, see <http://www.gnu.org/licenses/>.
*
* Contact: OpenIoT mailto: info@openiot.eu
* @author Behnaz Bostanipour
* @author Timotee Maret
*/
package org.openiot.gsn.http.ac;
import org.openiot.gsn.Main;
import org.apache.log4j.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Vector;
/**
* Created by IntelliJ IDEA.
* User: Behnaz Bostanipour
* Date: Apr 18, 2010
* Time: 7:31:12 PM
* To change this template use File | Settings | File Templates.
*/
public class MyUserCandidateRegistrationServlet extends HttpServlet
{
private static transient Logger logger = Logger.getLogger( MyUserCandidateRegistrationServlet.class );
/****************************************** Servlet Methods*******************************************/
/****************************************************************************************************/
public void doGet(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException
{
res.setContentType("text/html");
PrintWriter out = res.getWriter();
HttpSession session = req.getSession();
checkSessionScheme(req, res);
setSessionPrintWriter(req,out);
printHeader(out);
printLayoutMastHead(out);
printLayoutContent(out);
printForm(out);
printLayoutFooter(out);
}
public void doPost(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException
{
doGet(req,res);
handleForm(req, res);
}
/****************************************** HTML Printing Methods*******************************************/
/***********************************************************************************************************/
private void printHeader(PrintWriter out)
{
out.println("<HTML>");
out.println("<HEAD>");
//For Java Script!!
//this.printEmbeddedJS(out);
out.println("<script type=\"text/javascript\" src=\"/js/acjavascript.js\"></script>");
out.println("<TITLE>Sign Up Form</TITLE>");
out.println(" <link rel=\"stylesheet\" media=\"screen\" type=\"text/css\" href=\"/style/acstyle.css\"/>");
//printStyle(out);
out.println("</HEAD>");
out.println("<body>");
out.println("<div id=\"container\">");
out.println("<div class=box>");
}
private void printLayoutMastHead(PrintWriter out)
{
out.println("<div id=\"masthead\">");
out.println("<div class=\"image_float\"><img src=\"/style/gsn-mark.png\" alt=\"GSN logo\" /></div><br>");
out.println("<h1>Sign Up Form </h1>");
out.println("<div class=\"spacer\"></div>");
out.println("</div>");
out.println("<div id=\"mastheadborder\">");
this.printLinks(out);
out.println("<br><br>");
out.println("</div>");
}
private void printLayoutContent(PrintWriter out)
{
out.println("<div id=\"content\">");
}
private void printLayoutFooter(PrintWriter out)
{
out.println("</div>");
out.println("<div id=\"footer\">");
out.println(" <p align=\"center\"><FONT COLOR=\"#000000\"/>Powered by <a class=\"nonedecolink\" href=\"http://globalsn.sourceforge.net/\">GSN</a>, Distributed Information Systems Lab, EPFL 2010</p>");
out.println("</div>");
out.println("</div>");
out.println("</div>");
out.println("</body>");
out.println("</html>");
}
private void printLinks(PrintWriter out)
{
out.println("<a class=linkclass href=\"/\">GSN home</a>");
out.println("<a class=linkclass href=/gsn/MyAccessRightsManagementServlet>access rights management</a>");
}
private void printForm(PrintWriter out) throws ServletException
{
Vector groupList = this.getGroupList();
if(groupList==null)
{
out.println("<p><b>Can not print the form !</b></p>");
return;
}
else
{ out.println("<br>");
out.println("<FORM METHOD=POST>"); // posts to itself
//out.println("<div class=image_float>");
out.println("<h2> Personal Information</h2>");
//out.println("<br>");
this.printPersonalInputs(out);
out.println("<br>");
out.println("<br>");
//out.println("</div>");
out.println("<h2> Account Information</h2>");
//out.println("<font class=myhead> Account Information</font>");
//out.println("<br>");
this.printAccountInputs(out);
out.println("<br>");
out.println("<BR>");
out.println("<h2> Choose your group(s)</h2>");
//out.println("<br>");
//out.println("<font class=myhead> Choose your group(s)</font>");
this.printGroupList(out,groupList);
out.println("<BR>");
out.println("<BR>");
this.printFormButtons(out);
out.println("</FORM>");
}
}
private void printPersonalInputs(PrintWriter out)
{
out.println("<table>");
out.println("<tr><th>first name</th><td><INPUT class=inputclass TYPE=TEXT NAME=firstname size=30></td></tr>");
out.println("<tr><th>last name</th><td><INPUT class=inputclass TYPE=TEXT NAME=lastname size=30></td></tr>");
out.println("<tr><th>E-mail</th><td><INPUT class=inputclass TYPE=TEXT NAME=email size=30 ></td></tr>");
out.println("</table>");
}
private void printAccountInputs(PrintWriter out)
{
out.println("<table>");
out.println("<tr><th>username</th><td><INPUT class=inputclass TYPE=TEXT NAME=username size=30></td></tr>");
out.println("<tr><th>password</th><td><INPUT class=inputclass TYPE=PASSWORD NAME=password size=30></td></tr>");
out.println("</table>");
}
private void printFormButtons(PrintWriter out)
{
//out.println("<table class=transparenttable>");
out.println("<INPUT TYPE=SUBMIT class=bigsumitbuttonstyle VALUE=\"Submit \">");
//out.println("<td><INPUT TYPE=RESET class=changegroupbuttonstyle VALUE=\"Reset\"></td></tr>");
out.println("</table>");
}
private void printGroupList(PrintWriter out,Vector groupList)
{
Group gr=null;
String grname=null;
Vector grds=null;
if(groupList.size()==0)
{
out.println("<table class=invisibletable>");
out.println("<tr><td>No group is available.</td></tr>");
out.println("</table>");
}
else
{
out.println("<table border= 1 >");
out.println("<tr>");
out.println("<th>group name</th>");
out.println("<th>group structure</th>");
out.println("<th>choose this group</th>");
out.println("</tr>");
for(int i=0; i<groupList.size();i++)
{
out.println("<tr>");
gr=(Group)(groupList.get(i));
grname=gr.getGroupName();
grds=gr.getDataSourceList();
this.printGroupName(out, grname);
this.printGroupStructureLink(out, grname);
//this.printDataSourceList(out,gr);
this.printCheckBox(out, grname);
out.println("</tr>");
}
out.println("</table>");
}
}
private void printGroupName(PrintWriter out, String groupname)
{
out.println("<td>"+groupname +"</td>");
}
private void printCheckBox(PrintWriter out, String groupname)
{
out.println("<td style=text-align:center><INPUT TYPE=CHECKBOX class=checkboxclass NAME= groupname VALUE= "+groupname+"></td>");
}
private void printGroupStructureLink(PrintWriter out, String groupname)
{
String groupurl="/gsn/MyGroupHtmlResultSetServlet?groupname="+groupname;
out.println("<ul class=displaylinkul >");
out.println("<td style=text-align:center><LI class=displaylinkli><a href="+groupurl+" onClick=\"poptastic(this.href); return false;\">    view    </a></LI>");
out.println("</td>");
out.println("</ul>");
}
/****************************************** Client Session related Methods*******************************************/
/********************************************************************************************************************/
private void setSessionPrintWriter(HttpServletRequest req,PrintWriter out)
{
req.getSession().setAttribute("out",out);
}
private void checkSessionScheme(HttpServletRequest req, HttpServletResponse res)throws IOException
{
if(req.getScheme().equals("https")== true)
{
if((req.getSession().getAttribute("scheme")==null))
{
req.getSession().setAttribute("scheme","https");
}
}
else if(req.getScheme().equals("http")== true )
{
if((req.getSession().getAttribute("scheme")==null))
{
req.getSession().setAttribute("scheme","http");
}
res.sendRedirect("https://"+req.getServerName()+":"+ Main.getContainerConfig().getSSLPort()+"/gsn/MyUserCandidateRegistrationServlet");
}
}
/****************************************** DB related Methods******************************************************/
/********************************************************************************************************************/
private Vector getGroupList()
{
Vector groupList =null;
ConnectToDB ctdb = null;
try
{ ctdb = new ConnectToDB();
groupList = ctdb.getGroupList();
}
catch(Exception e)
{
logger.error("ERROR IN getGroupList");
logger.error(e.getMessage(),e);
}
finally
{
if(ctdb!=null)
{
ctdb.closeStatement();
ctdb.closeConnection();
}
}
return groupList;
}
/****************************************** AC related Methods******************************************************/
/********************************************************************************************************************/
private void handleForm(HttpServletRequest req,HttpServletResponse res) throws IOException
{
HttpSession session = req.getSession();
PrintWriter out = (PrintWriter) session.getAttribute("out");
ParameterSet pm = new ParameterSet(req);
//Vector groupnames= pm.getValuesForParam("groupname",req);
//groupVectorForGroupNames(pm.getValuesForParam("groupname",req));
User user=allowUserToRegister(pm, out,groupVectorForGroupNames(pm.getValuesForParam("groupname",req)));
if(user!= null)
{ ConnectToDB ctdb = null; // used to retrieve admin data
try
{ //printRegistrationOk(out);
// send a confirmation email to the user
Emailer email = new Emailer();
String msgHead = "Dear "+user.getFirstName() +", "+"\n"+"\n";
String msgTail = "Best Regards,"+"\n"+"GSN Team";
String msgBody = "Welcome to GSN, we would like to confirm your request for a new Account."+"\n"
+"You will receive another email confirming the activation of your account.\n\n";
// first change Emailer class params to use sendEmail
email.sendEmail( "GSN ACCESS ", "GSN USER",user.getEmail(),"Your registration to GSN ", msgHead, msgBody, msgTail);
// send email to Administrator
ctdb = new ConnectToDB();
User userFromBD = ctdb.getUserForUserName("Admin"); // get the details for the Admin account
msgHead = "Dear "+userFromBD.getFirstName() +", "+"\n"+"\n";
msgTail = "Best Regards,"+"\n"+"GSN Team";
msgBody = "A new Account has been created and awaits your confirmation."+"\n"
+"The account details are the following:\n"+
"First name: " + user.getFirstName() + "\n"+
"Last name: " + user.getLastName() + "\n"+
"Email address: " + user.getEmail() + "\n\n"+
"You can manage this change by choosing the following options in GSN:\n"+
"Access Rights Management -> Admin Only -> User Registration Waiting List\n"+
"or via the URL: "+req.getServerName()+":"+req.getServerPort()+"/gsn/MyUserCandidateWaitingListServlet\n\n";
// first change Emailer class params to use sendEmail
email.sendEmail( "GSN ACCESS ", "GSN USER",userFromBD.getEmail(),"Request for new GSN Account", msgHead, msgBody, msgTail);
//logger.warn("The email address of the Admin is: " + userFromBD.getEmail());
// redirect them to the page
res.sendRedirect("/gsn/MyRegistrationOkServlet");
}
catch (Exception ignored)
{
out.println("problem with redirecting to the target !");
}
finally
{
if(ctdb!=null)
{
ctdb.closeStatement();
ctdb.closeConnection();
}
}
}
else
{
/*out.println("Failed to sign up"+"<BR>");
out.println("You may want to try again <BR>");*/
}
}
User allowUserToRegister(ParameterSet pm,PrintWriter out,Vector groupList)
{
User waitinguser=null;
ConnectToDB ctdb =null;
EmailAddress emailadd=null;
try
{
if(pm.hasEmptyParameter())
{
//out.println("At least one of the input parameters is empty "+"<br>");
this.managaeUserAlert(out, "At least one of the input parameters is empty " );
}
else
{
emailadd= new EmailAddress(pm.valueForName("email"));
if (emailadd.isValid()==false)
{
//out.println("Invalid email address "+"<br>");
this.managaeUserAlert(out, "Invalid email address " );
//redirect
// return false;
}
else
{
ctdb =new ConnectToDB();
if(ctdb.valueExistsForThisColumn(new Column("USERNAME",pm.valueForName("username")), "ACUSER")==false)
{
User temp=new User(pm.valueForName("username"),Protector.encrypt(pm.valueForName("password")),pm.valueForName("firstname"),pm.valueForName("lastname"),pm.valueForName("email"),groupList,"yes");
if(ctdb.registerUserCandidate(temp)== true)
{
waitinguser=temp;
}
else
{
//out.println("Registration failed !");
this.managaeUserAlert(out, "Registration failed !" );
}
}
else
{
//out.println("This username exists already in DB, choose another one!");
this.managaeUserAlert(out, "This username exists already in DB, choose another one!" );
}
}
}
}
catch(Exception e)
{
out.println("Exception caught : "+e.getMessage());
}
finally
{
if(ctdb!=null)
{
ctdb.closeStatement();
ctdb.closeConnection();
}
}
return waitinguser;
}
private Vector groupVectorForGroupNames(Vector groupNames)
{
Vector groupVector = new Vector();
for(int i=0;i<groupNames.size();i++)
{
groupVector.add(new Group((String)groupNames.get(i)));
}
return groupVector;
}
private void managaeUserAlert(PrintWriter out, String alertMessage)
{
this.createAlertBox(out, alertMessage);
this.callAlertBox(out);
}
private void createAlertBox(PrintWriter out, String alertMessage)
{
out.println("<div id=\"AlertBox\" class=\"alert\">");
out.println("<p>");
out.println(alertMessage );
out.println("</p>");
out.println("<p>");
out.println("Failed to sign up, ");
out.println("you may want to try again !");
out.println("</p>");
out.println("<form style=\"text-align:right\">");
out.println("<input");
out.println("type=\"button\"");
out.println("class= alertbuttonstyle");
out.println("value=\"OK\"");
out.println("style=\"width:75px;\"");
out.println("onclick=\"document.getElementById('AlertBox').style.display='none'\">");
out.println("</form>");
out.println("</div>");
}
private void callAlertBox(PrintWriter out)
{
out.println("<SCRIPT LANGUAGE=\"JavaScript\" TYPE=\"TEXT/JAVASCRIPT\">");
out.println("<!--");
out.println("DisplayAlert('AlertBox',500,200);");
out.println("//-->");
out.println("</SCRIPT>");
}
}