diff --git a/YACOSWeb/WebContent/WEB-INF/classes/config.properties b/YACOSWeb/WebContent/WEB-INF/classes/config.properties
index a297649..103935b 100644
--- a/YACOSWeb/WebContent/WEB-INF/classes/config.properties
+++ b/YACOSWeb/WebContent/WEB-INF/classes/config.properties
@@ -1 +1,3 @@
-download.dir.path=../server/default/data/uploadedFiles/
\ No newline at end of file
+download.dir.path=../server/default/data/uploadedFiles/
+mailService.fromEmailAddress=system@yacos.dreamhosters.com
+mailService.replyToEmailAddress=no-reply@yacos.dreamhosters.com
\ No newline at end of file
diff --git a/YACOSWeb/WebContent/WEB-INF/classes/messages.properties b/YACOSWeb/WebContent/WEB-INF/classes/messages.properties
index 1269315..412aa16 100644
--- a/YACOSWeb/WebContent/WEB-INF/classes/messages.properties
+++ b/YACOSWeb/WebContent/WEB-INF/classes/messages.properties
@@ -97,7 +97,7 @@ form.submission.listauthor=Article's author
form.submission.mainauthor=Main author
form.submission.secondaryauthor=Secondary authors
form.submission.file=File
-
+form.addConference.invitationsHeader=Invitations
button.add=Add
@@ -162,7 +162,7 @@ submissionArticle.file=please choose an article to submit
#valider les articles
validate.download=download the article
-validate.report=consulter the result of the evaluation
+validate.report=View the result of the evaluation
validate.validate=validate
validate.reject=reject
diff --git a/YACOSWeb/WebContent/WEB-INF/jsp/addConference5.jsp b/YACOSWeb/WebContent/WEB-INF/jsp/addConference5.jsp
index 4087d9d..74d266b 100644
--- a/YACOSWeb/WebContent/WEB-INF/jsp/addConference5.jsp
+++ b/YACOSWeb/WebContent/WEB-INF/jsp/addConference5.jsp
@@ -7,6 +7,8 @@
+
+
-
-
+
@@ -108,11 +37,7 @@ var SecondaryAuthorManager = Class.create({
- "/>
-
-
+ "/>
diff --git a/YACOSWeb/WebContent/WEB-INF/yacos-servlet.xml b/YACOSWeb/WebContent/WEB-INF/yacos-servlet.xml
index 7e61f77..7957e2a 100644
--- a/YACOSWeb/WebContent/WEB-INF/yacos-servlet.xml
+++ b/YACOSWeb/WebContent/WEB-INF/yacos-servlet.xml
@@ -202,7 +202,7 @@
class="org.yacos.web.PCmember.controller.CreateReportController">
-
+
@@ -212,6 +212,7 @@
class="org.yacos.web.system.controller.ListConferenceController">
+
@@ -285,6 +286,17 @@
class="org.yacos.web.system.session.SessionService">
+
+
+
+
+
+
+
+
+
+
diff --git a/YACOSWeb/WebContent/images/menu-header-background-repeat.png b/YACOSWeb/WebContent/images/menu-header-background-repeat.png
new file mode 100644
index 0000000..d0beb7d
Binary files /dev/null and b/YACOSWeb/WebContent/images/menu-header-background-repeat.png differ
diff --git a/YACOSWeb/WebContent/javascripts/yacos/addConference_invitation.js b/YACOSWeb/WebContent/javascripts/yacos/addConference_invitation.js
new file mode 100644
index 0000000..bf7bbf4
--- /dev/null
+++ b/YACOSWeb/WebContent/javascripts/yacos/addConference_invitation.js
@@ -0,0 +1,66 @@
+
+var InvitationsManager = Class.create({
+ initialize: function(buttonAdd,buttonRemove,inputField){
+ this.buttonAdd = buttonAdd;
+ this.buttonRemove = buttonRemove;
+ this.inputField = inputField;
+ $(buttonAdd).observe("click",this.addRemote.bind(this));
+ $(buttonRemove).observe("click",this.removeRemote.bind(this));
+ $(inputField).observe("keypress", this.keyPressHandler.bindAsEventListener(this));
+ },
+ select: function(event){
+ var item = event.element();
+ if(item.hasClassName('selected')){
+ item.removeClassName('selected');
+ } else {
+ item.addClassName('selected');
+ }
+ },
+ removeRemote: function() {
+ var itemsToRemove = $('invitationList').select('div.selected');
+ var emailList = itemsToRemove.pluck('id');
+ AddCriteriaJS.removeInvitations(emailList,this.remove.bind(this));
+ },
+ remove: function() {
+ var itemsToRemove = $('invitationList').select('div.selected');
+ itemsToRemove.invoke('remove');
+ },
+ keyPressHandler: function(event){
+ switch(event.keyCode){
+ case Event.KEY_RETURN:
+ this.addRemote();
+ event.stop();
+ return false;
+ }
+ },
+ addRemote: function(){
+ var value = $(this.inputField).value;
+ AddCriteriaJS.addInvitation(value,function(success){
+ if(success){
+ this.add(value);
+ }
+ }.bind(this));
+ },
+ add: function(email) {
+ var elem = new Element('div',
+ { 'class':'dynamicListItem',
+ 'style':'display:none;height:0px;width:0px;',
+ 'id':email}).update(email);
+ $('invitationList').insert(elem);
+ elem.observe('click', this.select.bindAsEventListener());
+ elem.appear();
+ },
+ refreshList: function(){
+ AddCriteriaJS.getInvitations(function(emailList){
+ this.removeAll();
+ emailList.each(this.add.bind(this));
+ });
+ },
+ removeAll: function(){
+ var itemsToRemove = $('invitationList').select('div.dynamicListItem');
+ itemsToRemove.invoke('remove');
+ }
+});
+
+Event.observe(window,'load', function(){
+ new InvitationsManager('inviteButton','removeInvitationButton','emailAddress')});
diff --git a/YACOSWeb/WebContent/javascripts/yacos/submissionArticle.js b/YACOSWeb/WebContent/javascripts/yacos/submissionArticle.js
new file mode 100644
index 0000000..a16905a
--- /dev/null
+++ b/YACOSWeb/WebContent/javascripts/yacos/submissionArticle.js
@@ -0,0 +1,54 @@
+
+var SecondaryAuthorManager = Class.create({
+ lastRef: 0,
+ initialize: function(buttonAdd,buttonRemove,inputField){
+ this.buttonAdd = buttonAdd;
+ this.buttonRemove = buttonRemove;
+ this.inputField = inputField;
+ $(buttonAdd).observe("click",this.AddSecondaryAuthor.bind(this));
+ $(buttonRemove).observe("click",this.RemoveSecondaryAuthor.bind(this));
+ $(inputField).observe("keypress", this.KeyPressHandler.bindAsEventListener(this));
+ },
+ SelectSecondaryAuthor: function(event){
+ var item = event.element();
+ if(item.hasClassName('selected')){
+ item.removeClassName('selected');
+ } else {
+ item.addClassName('selected');
+ }
+ },
+ RemoveSecondaryAuthor: function() {
+ var itemsToRemove = $('secondaryAuthorList').select('div.selected');
+ // Fade and remove
+ itemsToRemove.invoke('fade',{
+ afterFinish: function(obj){
+ obj.element.remove();
+ }
+ });
+ },
+ KeyPressHandler: function(event){
+ switch(event.keyCode){
+ case Event.KEY_RETURN:
+ this.AddSecondaryAuthor();
+ event.stop();
+ return false;
+ }
+ },
+ AddSecondaryAuthor: function() {
+ var ref = this.lastRef++;
+ var elemName = "liste["+ref+"]";
+ var value = $('newSecondaryAuthorInput').value;
+ var hidden = new Element('input',{'id':elemName,'name':elemName,'type':'hidden','value':value});
+ var elem = new Element('div',
+ { 'class':'dynamicListItem',
+ 'style':'display:none;height:0px;width:0px;',
+ 'id':elemName}).update(value).insert(hidden);
+ elem.observe('click', this.SelectSecondaryAuthor.bindAsEventListener());
+ $('secondaryAuthorList').insert(elem);
+ $(this.inputField).clear();
+ elem.appear();
+ }
+});
+
+Event.observe(window,'load', function(){
+ new SecondaryAuthorManager('addSecondaryButton','removeSecondaryButton','newSecondaryAuthorInput')});
diff --git a/YACOSWeb/WebContent/stylesheets/base.css b/YACOSWeb/WebContent/stylesheets/base.css
index 9e1b5d1..d3c23f3 100644
--- a/YACOSWeb/WebContent/stylesheets/base.css
+++ b/YACOSWeb/WebContent/stylesheets/base.css
@@ -251,3 +251,31 @@ body {
}
/* @end */
+
+/* @group dynamicList */
+.dynamicList {
+ display: table;
+ border-collapse: collapse;
+ border-spacing: 3px;
+ min-width: 200px;
+ min-height: 40px;
+ max-height: 200px;
+ overflow: auto;
+}
+
+.dynamicList > * {
+ display: table-row;
+ border: thin solid #f57627;
+ padding:3px;
+}
+
+.dynamicListHeader {
+ background-image: url(../images/menu-header-background-repeat.png);
+ background-repeat: repeat-x;
+ height: 23px;
+}
+
+.selected {
+ background-color: #fea752;
+}
+/* @end */
\ No newline at end of file
diff --git a/YACOSWeb/src/org/yacos/web/chairman/controller/AddConferenceController.java b/YACOSWeb/src/org/yacos/web/chairman/controller/AddConferenceController.java
index a34b1d4..6951ce3 100644
--- a/YACOSWeb/src/org/yacos/web/chairman/controller/AddConferenceController.java
+++ b/YACOSWeb/src/org/yacos/web/chairman/controller/AddConferenceController.java
@@ -6,12 +6,18 @@ import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+
+import org.acegisecurity.util.UrlUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.springframework.mail.MailSendException;
import org.springframework.validation.BindException;
import org.springframework.validation.Errors;
+import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.ModelAndViewDefiningException;
import org.springframework.web.servlet.mvc.AbstractWizardFormController;
@@ -19,13 +25,17 @@ import org.yacos.core.conferences.Conference;
import org.yacos.core.conferences.IConferenceManager;
import org.yacos.core.evaluation.Criterion;
import org.yacos.core.evaluation.IEvaluationManager;
+import org.yacos.core.exceptions.ConferenceDoesntExistException;
import org.yacos.core.users.IUserManager;
import org.yacos.core.users.User;
import org.yacos.core.users.Role.RoleType;
import org.yacos.web.chairman.form.FormConference;
import org.yacos.web.chairman.validation.ConferenceValidator;
+import org.yacos.web.system.controller.MailSenderService;
import org.yacos.web.system.session.SessionService;
+import com.sun.mail.smtp.SMTPAddressFailedException;
+
public class AddConferenceController extends AbstractWizardFormController {
protected final Log logger = LogFactory.getLog(getClass());
@@ -33,7 +43,7 @@ public class AddConferenceController extends AbstractWizardFormController {
private IConferenceManager conferenceManager;
private IUserManager userManager;
-
+
private IEvaluationManager evaluationManager;
public IEvaluationManager getEvaluationManager() {
@@ -62,6 +72,7 @@ public class AddConferenceController extends AbstractWizardFormController {
private List listPersonBean;
private List listPersonFiltered;
private List listPersonAdded;
+ private List listInvitations;
public void fillUser(String text) {
if (text.equals(""))
@@ -89,12 +100,6 @@ public class AddConferenceController extends AbstractWizardFormController {
listPersonFiltered.remove(truePerson);
}
- public void addInvitation(String email){
- PersonBean invitationBean = new PersonBean();
- invitationBean.setLogin(email);
- listPersonAdded.add(invitationBean);
- }
-
public void deletePerson(PersonBean b) {
PersonBean truePerson = getTruePerson(b.getLogin());
@@ -136,6 +141,30 @@ public class AddConferenceController extends AbstractWizardFormController {
public List getUsersAdded() {
return listPersonAdded;
}
+
+ public List getInvitation(){
+ return listInvitations;
+ }
+
+ public boolean addInvitation(String email){
+ email = email.toLowerCase();
+ Pattern emailPattern = Pattern.compile("^[a-z0-9._-]+@[a-z0-9._-]{2,}[.][a-z]{2,4}$"); // Regex
+ Matcher emailMatcher = emailPattern.matcher(email);
+
+ if(!emailMatcher.matches()){
+ return false;
+ }
+
+ listInvitations.add(email);
+
+ return true;
+ }
+
+ public void removeInvitations(List emailList){
+ for(String email : emailList){
+ listInvitations.remove(email);
+ }
+ }
// ###########################################################
@@ -145,7 +174,7 @@ public class AddConferenceController extends AbstractWizardFormController {
private Set criteria;
private Set criteriaAll;
-
+
public Set getCriteriaAll() {
return criteriaAll;
}
@@ -153,7 +182,7 @@ public class AddConferenceController extends AbstractWizardFormController {
public Set getCriteriaAdded() {
return criteria;
}
-
+
public CriterionBean getTrueCriteria(int id) {
for (CriterionBean cb : criteriaAll) {
if (cb.getId() == id){
@@ -166,15 +195,15 @@ public class AddConferenceController extends AbstractWizardFormController {
return cb;
}
}
-
+
return null;
}
-
+
public void setCriterionClick(CriterionBean c) {
if (c.getId() == -1) {
c.setId(getNextId());
}
-
+
criteria.remove(c);
criteria.add(c);
}
@@ -185,18 +214,18 @@ public class AddConferenceController extends AbstractWizardFormController {
}
CriterionBean trueCriteria = getTrueCriteria(c.getId());
-
+
criteria.remove(trueCriteria);
criteria.add(trueCriteria);
criteriaAll.remove(trueCriteria);
}
public void deleteCriterion(CriterionBean c) {
-
+
CriterionBean trueCriteria = getTrueCriteria(c.getId());
-
-
-
+
+
+
criteria.remove(trueCriteria);
criteriaAll.add(trueCriteria);
}
@@ -216,14 +245,15 @@ public class AddConferenceController extends AbstractWizardFormController {
protected Object formBackingObject(HttpServletRequest request) throws ModelAndViewDefiningException {
logger.info(this.getClass().toString() + " dans le formBackingObject");
-
+
FormConference conference = new FormConference();
-
+
String action = request.getParameter("action");
- if (action == null || action.equals("")) {
- // TODO : tester ici si le gars a le droit d'�tre ici
- // a-t-il le droit de cr�er une conf�rence ?
-
+ if (action == null || action.equals(""))
+ {
+ // TODO : tester ici si le gars a le droit d'être ici
+ // a-t-il le droit de créer une conférence ?
+
criteria = new HashSet();
criteriaAll = new HashSet();
List listCriterion = evaluationManager.getCriterions();
@@ -246,9 +276,10 @@ public class AddConferenceController extends AbstractWizardFormController {
criteriaAll.add(cb);
getNextId();
}
-
+
listPersonBean = new ArrayList();
listPersonAdded = new ArrayList();
+ listInvitations = new ArrayList();
listPersonFiltered = listPersonBean;
List listUsers = userManager.getUsers();
for (User user : listUsers) {
@@ -259,12 +290,12 @@ public class AddConferenceController extends AbstractWizardFormController {
pb.setLogin(user.getLogin());
listPersonBean.add(pb);
}
-
+
return conference;
}
else if (action.equals("modify")) {
Conference conf = SessionService.getInstance().getCurrentConference();
-
+
criteria = new HashSet();
criteriaAll = new HashSet();
@@ -309,6 +340,8 @@ public class AddConferenceController extends AbstractWizardFormController {
listPersonBean = new ArrayList();
listPersonAdded = new ArrayList();
+ // Should get the invitation tokens and allow them to be removed
+ listInvitations = new ArrayList();
listPersonFiltered = listPersonBean;
List listUsers = userManager.getUsers();
for (User user : listUsers) {
@@ -338,7 +371,7 @@ public class AddConferenceController extends AbstractWizardFormController {
listPersonBean.remove(person);
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
-
+
conference.setTitle(conf.getTitle());
conference.setDateArticleParsed(conf.getDateArticle());
conference.setDateArticle(format.format(conf.getDateArticle()));
@@ -350,7 +383,7 @@ public class AddConferenceController extends AbstractWizardFormController {
conference.setDateStart(format.format(conf.getDateStart()));
conference.setDescription(conf.getDescription());
conference.setOtherInformations(conf.getOtherInformations());
-
+
// TODO : ajouter ca ds conf ejb...
/*conference.setPageNumber(pageNumber);
conference.setSendInfo(sendInfo);
@@ -358,18 +391,18 @@ public class AddConferenceController extends AbstractWizardFormController {
conference.setTypeODT(typeODT);
conference.setTypePDF(typePDF);
conference.setTypeWord(typeWord);*/
-
+
return conference;
-
+
}
else {
throw new ModelAndViewDefiningException(new ModelAndView("404error"));
}
-
+
}
-
-
+
+
protected void validatePage(Object command, Errors errors, int page) {
FormConference conference = (FormConference) command;
ConferenceValidator conferenceValidator = (ConferenceValidator) getValidator();
@@ -393,36 +426,60 @@ public class AddConferenceController extends AbstractWizardFormController {
String action = request.getParameter("action");
if (action == null || action.equals("")) {
- Conference conf = conferenceManager.addConference(
- conference.getTitle(),
- conference.getDescription(),
- conference.getOtherInformations(),
- conference.getDateArticleParsed(),
- conference.getDateArticleParsed(),
- conference.getDateEvaluationParsed(),
- conference.getDateStartParsed(),
- conference.getDateEndParsed());
-
- conference.setConferenceId(conf.getId());
- SessionService.getInstance().setCurrentConference(conf);
-
- for(CriterionBean criterion : criteria){
- conferenceManager.addCriterionToConference(
- conf.getId(),
- criterion.getLabel(),
- criterion.getMin(),
- criterion.getMax());
- }
-
- for(PersonBean personBean : listPersonAdded){
- conferenceManager.addPCMemberToConference(
- conf.getId(),
- personBean.getLogin());
- }
-
- conferenceManager.addRole(RoleType.CHAIRMAN, SessionService.getInstance().getCurrentUserLogin(), conf.getId());
+
+ Conference conf = conferenceManager.addConference(
+ conference.getTitle(),
+ conference.getDescription(),
+ conference.getOtherInformations(),
+ conference.getDateArticleParsed(),
+ conference.getDateArticleParsed(),
+ conference.getDateEvaluationParsed(),
+ conference.getDateStartParsed(),
+ conference.getDateEndParsed());
+
+ conference.setConferenceId(conf.getId());
+ SessionService.getInstance().setCurrentConference(conf);
+
+ for(CriterionBean criterion : criteria){
+ conferenceManager.addCriterionToConference(
+ conf.getId(),
+ criterion.getLabel(),
+ criterion.getMin(),
+ criterion.getMax());
}
- else {
+
+ for(PersonBean personBean : listPersonAdded){
+ conferenceManager.addPCMemberToConference(
+ conf.getId(),
+ personBean.getLogin());
+ }
+
+ String mailSubject = "YACOS "+conf.getTitle()+" invitation";
+ String mailBody = "Greetings,\n";
+ mailBody += "You've been invited to join the program comity of the conference :\n";
+ mailBody += conf.getTitle()+"/n";
+ mailBody += "You can register on this page : \n";
+ String baseUrl = request.getSession().getServletContext().getContextPath();
+ mailBody += baseUrl+"/registerUser.htm /n";
+ mailBody += "Please note that you MUST use this eMail address in the registration form in order to get the appropriate credentials.";
+ // TODO : use a template
+ for(String invitationEmail : listInvitations){
+ try {
+ conferenceManager.addInvitationToken(invitationEmail, RoleType.PCMEMBER, conf.getId());
+ MailSenderService.getInstance().sendEMail(invitationEmail, mailSubject , mailBody);
+ } catch (ConferenceDoesntExistException e) {
+ // Should never happen
+ e.printStackTrace();
+ } catch (MailSendException e) {
+ // TODO : see what we can do about this
+ e.printStackTrace();
+ }
+ }
+
+ conferenceManager.addRole(RoleType.CHAIRMAN, SessionService.getInstance().getCurrentUserLogin(), conf.getId());
+ // Refresh the roles to take into account the chairman credentials
+ SessionService.getInstance().refreshAuthentication();
+ } else {
Conference conf = SessionService.getInstance().getCurrentConference();
conf.setTitle(conference.getTitle());
conf.setDescription(conference.getDescription());
@@ -452,7 +509,6 @@ public class AddConferenceController extends AbstractWizardFormController {
conf.getId(),
personBean.getLogin());
}
-
}
return new ModelAndView("main");
diff --git a/YACOSWeb/src/org/yacos/web/system/controller/MailSenderService.java b/YACOSWeb/src/org/yacos/web/system/controller/MailSenderService.java
new file mode 100644
index 0000000..f5570dd
--- /dev/null
+++ b/YACOSWeb/src/org/yacos/web/system/controller/MailSenderService.java
@@ -0,0 +1,73 @@
+package org.yacos.web.system.controller;
+
+import org.springframework.mail.MailSender;
+import org.springframework.mail.SimpleMailMessage;
+
+public class MailSenderService {
+ public static MailSenderService instance = new MailSenderService();
+ private MailSender mailSender;
+ private String fromEmail;
+ private String replyTo;
+
+ public MailSenderService(){
+
+ }
+
+ public static MailSenderService getInstance(){
+ if(instance == null){
+ instance = new MailSenderService();
+ }
+ return instance;
+ }
+
+ public void sendEMail(String toEmail, String subject, String body){
+ SimpleMailMessage message = composeEmail(toEmail, fromEmail, subject, body, replyTo, null, null);
+ mailSender.send(message);
+ }
+
+ public SimpleMailMessage composeEmail(String toEmail, String fromEmail, String subject, String body){
+ return composeEmail(toEmail, fromEmail, subject, body, fromEmail, null, null);
+ }
+
+ public SimpleMailMessage composeEmail(String toEmail, String fromEmail, String subject, String body, String replyTo, String cc, String bcc){
+ SimpleMailMessage mailMessage = new SimpleMailMessage();
+
+ mailMessage.setTo(toEmail);
+ mailMessage.setFrom(fromEmail);
+ mailMessage.setSubject(subject);
+ mailMessage.setText(body);
+ mailMessage.setReplyTo(replyTo);
+ if(cc!=null){
+ mailMessage.setCc(cc);
+ }
+ if(bcc != null){
+ mailMessage.setBcc(bcc);
+ }
+
+ return mailMessage;
+ }
+
+ public String getFromEmail() {
+ return fromEmail;
+ }
+
+ public void setFromEmail(String fromEmail) {
+ this.fromEmail = fromEmail;
+ }
+
+ public String getReplyTo() {
+ return replyTo;
+ }
+
+ public void setReplyTo(String replyTo) {
+ this.replyTo = replyTo;
+ }
+
+ public void setMailSender(MailSender mailSender) {
+ this.mailSender = mailSender;
+ }
+
+ public MailSender getMailSender() {
+ return mailSender;
+ }
+}
diff --git a/YACOSWeb/src/org/yacos/web/system/session/SessionService.java b/YACOSWeb/src/org/yacos/web/system/session/SessionService.java
index bac5f8f..fedf27a 100644
--- a/YACOSWeb/src/org/yacos/web/system/session/SessionService.java
+++ b/YACOSWeb/src/org/yacos/web/system/session/SessionService.java
@@ -74,6 +74,15 @@ public class SessionService {
}
public IConferenceManager getConferenceManager() {
+ if(conferenceManager == null){
+ Context context;
+ try {
+ context = new InitialContext();
+ conferenceManager = (IConferenceManager) context.lookup("ConferenceManagerBean/remote");
+ } catch (NamingException e) {
+ e.printStackTrace();
+ }
+ }
return conferenceManager;
}
@@ -82,6 +91,15 @@ public class SessionService {
}
public IUserManager getUserManager() {
+ if(userManager == null){
+ Context context;
+ try {
+ context = new InitialContext();
+ userManager = (IUserManager) context.lookup("UserManagerBean/remote");
+ } catch (NamingException e) {
+ e.printStackTrace();
+ }
+ }
return userManager;
}
diff --git a/YACOSWeb/src/org/yacos/web/system/validation/UserValidator.java b/YACOSWeb/src/org/yacos/web/system/validation/UserValidator.java
index a722714..8ecff54 100644
--- a/YACOSWeb/src/org/yacos/web/system/validation/UserValidator.java
+++ b/YACOSWeb/src/org/yacos/web/system/validation/UserValidator.java
@@ -50,6 +50,7 @@ public class UserValidator implements Validator {
// EMAIL VALIDATOR
public void validateEmail(String email, Errors errors){
+ email = email.toLowerCase();
Pattern emailPattern = Pattern.compile("^[a-z0-9._-]+@[a-z0-9._-]{2,}[.][a-z]{2,4}$"); // Regex
Matcher emailMatcher = emailPattern.matcher(email);