blob: ce91912fae43639998b19a7cfe54ef92cbcd7014 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License") + you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openmeetings.data.conference;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.TimeZone;
import java.util.Vector;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import org.apache.openmeetings.OpenmeetingsVariables;
import org.apache.openmeetings.data.basic.AuthLevelUtil;
import org.apache.openmeetings.data.basic.FieldManager;
import org.apache.openmeetings.data.basic.dao.ConfigurationDao;
import org.apache.openmeetings.data.basic.dao.OmTimeZoneDao;
import org.apache.openmeetings.data.calendar.daos.AppointmentDao;
import org.apache.openmeetings.data.calendar.management.AppointmentLogic;
import org.apache.openmeetings.data.conference.dao.RoomDao;
import org.apache.openmeetings.data.user.UserManager;
import org.apache.openmeetings.data.user.dao.UsersDao;
import org.apache.openmeetings.persistence.beans.basic.MailMessage;
import org.apache.openmeetings.persistence.beans.basic.OmTimeZone;
import org.apache.openmeetings.persistence.beans.calendar.Appointment;
import org.apache.openmeetings.persistence.beans.calendar.MeetingMember;
import org.apache.openmeetings.persistence.beans.invitation.Invitations;
import org.apache.openmeetings.persistence.beans.lang.Fieldlanguagesvalues;
import org.apache.openmeetings.persistence.beans.user.User;
import org.apache.openmeetings.templates.InvitationTemplate;
import org.apache.openmeetings.utils.crypt.MD5;
import org.apache.openmeetings.utils.crypt.ManageCryptStyle;
import org.apache.openmeetings.utils.mail.IcalHandler;
import org.apache.openmeetings.utils.mail.MailHandler;
import org.apache.openmeetings.utils.math.CalendarPatterns;
import org.apache.openmeetings.utils.math.TimezoneUtil;
import org.apache.openmeetings.utils.sms.SMSHandler;
import org.red5.logging.Red5LoggerFactory;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
/**
*
* @author swagner
*
*/
@Transactional
public class InvitationManager {
private static final Logger log = Red5LoggerFactory.getLogger(
InvitationManager.class, OpenmeetingsVariables.webAppRootKey);
@PersistenceContext
private EntityManager em;
@Autowired
private AppointmentLogic appointmentLogic;
@Autowired
private ConfigurationDao configurationDao;
@Autowired
private UserManager userManager;
@Autowired
private FieldManager fieldManager;
@Autowired
private ManageCryptStyle manageCryptStyle;
@Autowired
private RoomDao roomDao;
@Autowired
private UsersDao usersDao;
@Autowired
private MailHandler mailHandler;
@Autowired
private SMSHandler smsHandler;
@Autowired
private InvitationTemplate invitationTemplate;
@Autowired
private AuthLevelUtil authLevelUtil;
@Autowired
private TimezoneUtil timezoneUtil;
@Autowired
private AppointmentDao appointmentDaoImpl;
@Autowired
private OmTimeZoneDao omTimeZoneDaoImpl;
/**
* Sending invitation within plain mail
*
* @param user_level
* @param username
* @param message
* @param baseurl
* @param email
* @param subject
* @param rooms_id
* @param conferencedomain
* @param isPasswordProtected
* @param invitationpass
* @param valid
* @param validFrom
* @param validTo
* @param createdBy
* @return
*/
// ---------------------------------------------------------------------------------------------------------
public Invitations addInvitationLink(Long user_level, String username,
String message, String baseurl, String email, String subject,
Long rooms_id, String conferencedomain,
Boolean isPasswordProtected, String invitationpass, Integer valid,
Date validFrom, Date validTo, Long createdBy, String baseUrl,
Long language_id, Boolean sendMail, Date gmtTimeStart,
Date gmtTimeEnd, Long appointmentId, String fromUserField, OmTimeZone omTimeZone) {
try {
if (authLevelUtil.checkUserLevel(user_level)) {
Invitations invitation = new Invitations();
invitation.setIsPasswordProtected(isPasswordProtected);
if (isPasswordProtected) {
invitation.setInvitationpass(manageCryptStyle
.getInstanceOfCrypt().createPassPhrase(
invitationpass));
}
invitation.setInvitationWasUsed(false);
log.debug(baseUrl);
invitation.setBaseUrl(baseUrl);
invitation.setOmTimeZone(omTimeZone);
// valid period of Invitation
if (valid == 1) {
// endless
invitation.setIsValidByTime(false);
invitation.setCanBeUsedOnlyOneTime(false);
} else if (valid == 2) {
// period
invitation.setIsValidByTime(true);
invitation.setCanBeUsedOnlyOneTime(false);
Date gmtTimeStartShifted = new Date(gmtTimeStart.getTime()
- (5 * 60 * 1000));
invitation.setValidFrom(gmtTimeStartShifted);
invitation.setValidTo(gmtTimeEnd);
// invitation.setValidFrom(validFrom);
// invitation.setValidTo(validTo);
} else {
// one-time
invitation.setIsValidByTime(false);
invitation.setCanBeUsedOnlyOneTime(true);
invitation.setInvitationWasUsed(false);
}
invitation.setDeleted(false);
User us = usersDao.get(createdBy);
String hashRaw = "HASH" + (System.currentTimeMillis());
invitation.setHash(MD5.do_checksum(hashRaw));
invitation.setInvitedBy(us);
invitation.setInvitedname(username);
invitation.setInvitedEMail(email);
invitation.setRoom(roomDao.get(rooms_id));
invitation.setConferencedomain(conferencedomain);
invitation.setStarttime(new Date());
invitation.setAppointmentId(appointmentId);
invitation = em.merge(invitation);
long invitationId = invitation.getInvitations_id();
invitation.setInvitations_id(invitationId);
if (invitationId > 0) {
if (sendMail) {
this.sendInvitionLink(us.getAdresses().getEmail(),
username, message, baseurl,
email, subject, invitation.getHash(),
validFrom, validTo, language_id, fromUserField);
}
return invitation;
}
}
} catch (Exception err) {
log.error("addInvitationLink", err);
}
return null;
}
// ----------------------------------------------------------------------------------------------------------------
/**
* @author becherer
* @param ment
* @param member
*/
// -----------------------------------------------------------------------------------------------
public void cancelInvitation(Appointment appointment, MeetingMember member,
Long canceling_user_id, Long language_id) {
log.debug("cancelInvitation");
User user;
try {
user = userManager.getUserById(canceling_user_id);
} catch (Exception e) {
log.error("cancelInvitation Cancelling user cant be retrieved", e);
return;
}
if (appointment.getRemind() == null) {
log.error("Appointment " + appointment.getAppointmentName()
+ " has no ReminderType!");
return;
}
User us = member.getUserid();
TimeZone timezone = null;
// external users have no user object stored so we will need to get the
// timezone from the stored string
if (us != null) {
timezone = timezoneUtil.getTimezoneByUser(us);
} else {
timezone = timezoneUtil.getTimezoneByInternalJName(member
.getOmTimeZone().getJname());
}
String subject = formatCancelSubject(language_id, appointment, user,
timezone);
String message = formatCancelMessage(language_id, appointment, user,
timezone);
// checking reminderType
if (appointment.getRemind().getTypId() == 1) {
log.debug("no remindertype defined -> no cancel of invitation");
} else if (appointment.getRemind().getTypId() == 2) {
log.debug("ReminderType simple mail -> sending simple mail...");
sendInvitationCancelMail(member.getEmail(),
member.getAppointment(), user.getAdresses().getEmail(),
subject, message);
} else if (appointment.getRemind().getTypId() == 3) {
try {
sendInvitationIcalCancelMail(member.getEmail(),
member.getFirstname() + " " + member.getLastname(),
appointment, canceling_user_id, member.getInvitor(),
appointment.getAppointmentStarttime(),
appointment.getAppointmentEndtime(), timezone, subject,
message);
} catch (Exception e) {
log.error("Error sending IcalCancelMail for User "
+ member.getEmail() + " : " + e.getMessage());
log.error("[cancelInvitation]", e);
}
}
// Deleting invitation, if exists
Invitations inv = member.getInvitation();
if (inv != null) {
inv.setDeleted(true);
updateInvitation(inv);
}
}
private String formatCancelSubject(Long language_id,
Appointment appointment, User user, TimeZone timezone) {
try {
String message = fieldManager.getString(1157L, language_id)
+ appointment.getAppointmentName();
message += " "
+ CalendarPatterns.getDateWithTimeByMiliSecondsAndTimeZone(
appointment.getAppointmentStarttime(), timezone)
+ " - "
+ CalendarPatterns.getDateWithTimeByMiliSecondsAndTimeZone(
appointment.getAppointmentEndtime(), timezone);
return message;
} catch (Exception err) {
log.error("Could not format cancel message", err);
return "Error formatCancelMessage";
}
}
private String formatCancelMessage(Long language_id,
Appointment appointment, User user, TimeZone timezone) {
try {
String message = fieldManager.getString(1157L, language_id)
+ appointment.getAppointmentName();
if (appointment.getAppointmentDescription().length() != 0) {
Fieldlanguagesvalues labelid1152 = fieldManager
.getFieldByIdAndLanguage(new Long(1152), language_id);
message += labelid1152.getValue()
+ appointment.getAppointmentDescription();
}
Fieldlanguagesvalues labelid1153 = fieldManager
.getFieldByIdAndLanguage(new Long(1153), language_id);
Fieldlanguagesvalues labelid1154 = fieldManager
.getFieldByIdAndLanguage(new Long(1154), language_id);
message += "<br/>"
+ labelid1153.getValue()
+ ' '
+ CalendarPatterns.getDateWithTimeByMiliSecondsAndTimeZone(
appointment.getAppointmentStarttime(), timezone)
+ "<br/>";
message += labelid1154.getValue()
+ ' '
+ CalendarPatterns.getDateWithTimeByMiliSecondsAndTimeZone(
appointment.getAppointmentEndtime(), timezone)
+ "<br/>";
String invitorName = user.getFirstname() + " " + user.getLastname()
+ " [" + user.getAdresses().getEmail() + "]";
Fieldlanguagesvalues labelid1156 = fieldManager
.getFieldByIdAndLanguage(new Long(1156), language_id);
message += labelid1156.getValue() + invitorName + "<br/>";
return message;
} catch (Exception err) {
log.error("Could not format cancel message", err);
return "Error formatCancelMessage";
}
}
// -----------------------------------------------------------------------------------------------
/**
* @author becherer, seba.wagner
* @param ment
* @param member
*/
// -----------------------------------------------------------------------------------------------
public void updateInvitation(Appointment appointment, MeetingMember member,
Long canceling_user_id, Long language_id, String invitorName, boolean sendMail) {
log.debug("updateInvitation");
User user = userManager.getUserById(canceling_user_id);
if (user == null) {
log.error("Cancelling user cant be retrieved");
return;
}
if (appointment.getRemind() == null) {
log.error("Appointment " + appointment.getAppointmentName()
+ " has no ReminderType!");
return;
}
log.debug("Remindertype : " + appointment.getRemind().getTypId());
User us = member.getUserid();
TimeZone timezone = null;
// external users have no user object stored so we will need to get the
// timezone from the stored string
if (us != null) {
timezone = timezoneUtil.getTimezoneByUser(us);
} else {
timezone = timezoneUtil.getTimezoneByInternalJName(member
.getOmTimeZone().getJname());
}
// Get text messages
String subject = formatUpdateSubject(language_id, appointment, user,
timezone);
String message = formatUpdateMessage(language_id, appointment, user,
timezone, invitorName);
// checking reminderType and send emails, reminder type 1 receives
// nothing
if (sendMail) {
if (appointment.getRemind().getTypId() == 2) {
sendInvitationUpdateMail(member.getEmail(), appointment, user
.getAdresses().getEmail(), subject, message);
} else if (appointment.getRemind().getTypId() == 3) {
try {
sendInvitationIcalUpdateMail(member.getEmail(),
member.getFirstname() + " " + member.getLastname(),
appointment, canceling_user_id, member.getInvitor(),
language_id, appointment.getAppointmentStarttime(),
appointment.getAppointmentEndtime(), timezone, subject,
message);
} catch (Exception e) {
log.error("Error sending IcalUpdateMail for User "
+ member.getEmail() + " : " + e.getMessage());
log.error("[updateInvitation]", e);
}
}
}
}
private String formatUpdateSubject(Long language_id,
Appointment appointment, User user, TimeZone timezone) {
try {
String message = fieldManager.getString(1155L, language_id) + " "
+ appointment.getAppointmentName();
if (appointment.getAppointmentDescription().length() != 0) {
Fieldlanguagesvalues labelid1152 = fieldManager
.getFieldByIdAndLanguage(new Long(1152), language_id);
message += labelid1152.getValue()
+ appointment.getAppointmentDescription();
}
message += " "
+ CalendarPatterns.getDateWithTimeByMiliSecondsAndTimeZone(
appointment.getAppointmentStarttime(), timezone)
+ " - "
+ CalendarPatterns.getDateWithTimeByMiliSecondsAndTimeZone(
appointment.getAppointmentEndtime(), timezone);
return message;
} catch (Exception err) {
log.error("Could not format update subject", err);
return "Error formatUpdateSubject";
}
}
private String formatUpdateMessage(Long language_id,
Appointment appointment, User user, TimeZone timezone,
String invitorName) {
try {
String message = fieldManager.getString(1155L, language_id) + " "
+ appointment.getAppointmentName();
if (appointment.getAppointmentDescription().length() != 0) {
Fieldlanguagesvalues labelid1152 = fieldManager
.getFieldByIdAndLanguage(new Long(1152), language_id);
message += labelid1152.getValue()
+ appointment.getAppointmentDescription();
}
Fieldlanguagesvalues labelid1153 = fieldManager
.getFieldByIdAndLanguage(1153L, language_id);
Fieldlanguagesvalues labelid1154 = fieldManager
.getFieldByIdAndLanguage(1154L, language_id);
message += "<br/>"
+ labelid1153.getValue()
+ ' '
+ CalendarPatterns.getDateWithTimeByMiliSecondsAndTimeZone(
appointment.getAppointmentStarttime(), timezone)
+ "<br/>";
message += labelid1154.getValue()
+ ' '
+ CalendarPatterns.getDateWithTimeByMiliSecondsAndTimeZone(
appointment.getAppointmentEndtime(), timezone)
+ "<br/>";
Fieldlanguagesvalues labelid1156 = fieldManager
.getFieldByIdAndLanguage(new Long(1156), language_id);
message += labelid1156.getValue() + invitorName + "<br/>";
return message;
} catch (Exception err) {
log.error("Could not format update message", err);
return "Error formatUpdateMessage";
}
}
// -----------------------------------------------------------------------------------------------
/**
* @author o.becherer
* @param user_level
* @param username
* @param message
* @param baseurl
* @param email
* @param subject
* @param rooms_id
* @param conferencedomain
* @param isPasswordProtected
* @param invitationpass
* @param valid
* @param validFrom
* @param validTo
* @param createdBy
* @return
*/
// ---------------------------------------------------------------------------------------------------------
public Long addInvitationIcalLink(Long user_level, String username,
String message, String baseurl, String email, String subject,
Long rooms_id, String conferencedomain,
Boolean isPasswordProtected, String invitationpass, Integer valid,
Date validFrom, Date validTo, Long createdBy, Long appointMentId,
Boolean invitor, Long language_id, TimeZone timezone,
Long appointmentId, String fromUserField) {
log.debug("addInvitationIcalLink");
try {
if (authLevelUtil.checkUserLevel(user_level)) {
Invitations invitation = new Invitations();
invitation.setIsPasswordProtected(isPasswordProtected);
if (isPasswordProtected) {
invitation.setInvitationpass(manageCryptStyle
.getInstanceOfCrypt().createPassPhrase(
invitationpass));
}
invitation.setInvitationWasUsed(false);
// valid period of Invitation
if (valid == 1) {
// endless
invitation.setIsValidByTime(false);
invitation.setCanBeUsedOnlyOneTime(false);
} else if (valid == 2) {
// period
invitation.setIsValidByTime(true);
invitation.setCanBeUsedOnlyOneTime(false);
invitation.setValidFrom(validFrom);
invitation.setValidTo(validTo);
} else {
// one-time
invitation.setIsValidByTime(false);
invitation.setCanBeUsedOnlyOneTime(true);
invitation.setInvitationWasUsed(false);
}
invitation.setDeleted(false);
User us = usersDao.get(createdBy);
String hashRaw = "InvitationHash"
+ (System.currentTimeMillis());
log.debug("addInvitationIcalLink : rawHash = " + hashRaw);
invitation.setHash(MD5.do_checksum(hashRaw));
invitation.setInvitedBy(us);
invitation.setBaseUrl(baseurl);
invitation.setInvitedname(username);
invitation.setInvitedEMail(email);
invitation.setRoom(roomDao.get(rooms_id));
invitation.setConferencedomain(conferencedomain);
invitation.setStarttime(new Date());
invitation.setAppointmentId(appointmentId);
invitation = em.merge(invitation);
long invitationId = invitation.getInvitations_id();
if (invitationId > 0) {
this.sendInvitionIcalLink(username, message, baseurl,
email, subject, invitation.getHash(),
appointMentId, createdBy, invitor, language_id,
validFrom, validTo, timezone, fromUserField);
return invitationId;
}
}
} catch (Exception err) {
log.error("addInvitationIcalLink", err);
}
return null;
}
// ---------------------------------------------------------------------------------------------------------
public String sendInvitionLink(User us, Invitations inv, String message, String baseurl, String subject, Long language_id) {
return sendInvitionLink(us != null ? us.getAdresses().getEmail() : inv.getInvitedEMail()
, inv.getInvitedname()
, message, baseurl, inv.getInvitedEMail(), subject, inv.getHash()
, inv.getValidFrom(), inv.getValidTo(), language_id, us.getFirstname() + " " + us.getLastname());
}
/**
* @param username
* @param message
* @param baseurl
* @param email
* @param replyTo
* @param subject
* @param invitationsHash
* @param dStart
* @param dEnd
* @param language_id If it is >0 then "&language=" is added to the link
*/
private String sendInvitionLink(String replyTo, String username, String message,
String baseurl, String email, String subject,
String invitationsHash, Date dStart, Date dEnd, Long language_id, String fromUserField) {
try {
String invitation_link = baseurl + "?invitationHash="
+ invitationsHash;
if (language_id > 0) {
invitation_link += "&language=" + language_id.toString();
}
// Long default_lang_id = Long.valueOf(cfgManagement.
// getConfKey(3,"default_lang_id").getConf_value()).longValue();
String template = invitationTemplate.getRegisterInvitationTemplate(
fromUserField, message, invitation_link, language_id, dStart,
dEnd);
mailHandler.send(email, replyTo, subject, template);
return "success";
} catch (Exception err) {
log.error("sendInvitationLink", err);
}
return null;
}
/**
* @author o.becherer
* @param userName
* @param message
* @param baseUrl
* @param email
* @param subject
* @param invitationHash
* @return
*/
// ----------------------------------------------------------------------------------------------------
public String sendInvitationReminderLink(long langId, String message, String baseUrl,
String email, String subject, String invitationHash) {
log.debug("sendInvitationReminderLink");
try {
String invitation_link = baseUrl + "?invitationHash="
+ invitationHash;
mailHandler.send(new MailMessage(
email
, null
, subject
, message + "<br/><a href='" + invitation_link + "'>"
+ fieldManager.getFieldByIdAndLanguage(626L, langId) + "</a>"), true);
return "success";
} catch (Exception e) {
log.error("sendInvitationReminderLink", e);
}
return null;
}
/**
* This method sends invitation reminder SMS
* @param phone user's phone
* @param subject
* @return
*/
public boolean sendInvitationReminderSMS(String phone, String subject, long language_id) {
if (phone != null && phone.length() > 0) {
log.debug("sendInvitationReminderSMS to " + phone + ": " + subject);
try {
return smsHandler.sendSMS(phone, subject, language_id);
} catch (Exception e) {
log.error("sendInvitationReminderSMS", e);
}
}
return false;
}
// ----------------------------------------------------------------------------------------------------
/**
*
* @param email
* @param point
* @param cancelling_person
* @return
*/
// --------------------------------------------------------------------------------------------------------------
private String sendInvitationCancelMail(String email, Appointment point,
String cancelling_person, String subject, String message) {
log.debug("sendInvitationCancelmail");
try {
mailHandler.send(email, subject, message);
return "success";
} catch (Exception e) {
log.error("sendInvitationCancelmail : " + e.getMessage());
log.error("[sendInvitationCancelmail]", e);
}
return null;
}
// --------------------------------------------------------------------------------------------------------------
/**
*
* @param email
* @param point
* @param replyTo
* @param subject
* @param mesage
* @return
*/
// --------------------------------------------------------------------------------------------------------------
private String sendInvitationUpdateMail(String email, Appointment point,
String replyTo, String subject, String message) {
log.debug("sendInvitationUpdateMail");
try {
mailHandler.send(email, replyTo, subject, message);
return "success";
} catch (Exception e) {
log.error("sendInvitationUpdateMail : " + e.getMessage());
log.error("[sendInvitationUpdateMail]", e);
}
return null;
}
// --------------------------------------------------------------------------------------------------------------
/**
*
* @param email
* @param point
* @param cancelling_person
* @return
*/
// --------------------------------------------------------------------------------------------------------------
private String sendInvitationIcalCancelMail(String email, String userName,
Appointment point, Long organizer_userId, Boolean invitor,
Date startdate, Date enddate, TimeZone timezone, String subject,
String message) throws Exception {
log.debug("sendInvitationIcalCancelMail");
// Defining Organizer
User user = userManager.getUserById(organizer_userId);
// TODO: Check time zone handling in iCal Mail
// OmTimeZone omTimeZone = omTimeZoneDaoImpl.getOmTimeZone(jNameTimeZone);
IcalHandler handler = new IcalHandler(IcalHandler.ICAL_METHOD_CANCEL);
// refresh appointment
point = appointmentLogic.getAppointMentById(point.getAppointmentId());
// Transforming Meeting Members
HashMap<String, String> attendeeInDerHashMap = handler.getAttendeeData(
email, userName, invitor);
Vector<HashMap<String, String>> atts = new Vector<HashMap<String, String>>();
atts.add(attendeeInDerHashMap);
HashMap<String, String> organizer = handler.getAttendeeData(user
.getAdresses().getEmail(), user.getLogin(), invitor);
handler.addNewMeeting(startdate, enddate,
point.getAppointmentName(), atts,
subject, organizer, point.getIcalId(), timezone);
log.debug(handler.getICalDataAsString());
mailHandler.send(new MailMessage(email, user.getAdresses().getEmail(), subject, message, handler.getIcalAsByteArray()));
return null;
}
// --------------------------------------------------------------------------------------------------------------
/**
*
* @param email
* @param point
* @param cancelling_person
* @return
*/
// --------------------------------------------------------------------------------------------------------------
private String sendInvitationIcalUpdateMail(String email, String userName,
Appointment point, Long organizer_userId, Boolean invitor,
Long language_id, Date starttime, Date endtime, TimeZone timeZone,
String subject, String message) throws Exception {
log.debug("sendInvitationIcalUpdateMail");
// Defining Organizer
User user = userManager.getUserById(organizer_userId);
IcalHandler handler = new IcalHandler(IcalHandler.ICAL_METHOD_REQUEST);
// refresh appointment
point = appointmentLogic.getAppointMentById(point.getAppointmentId());
// Transforming Meeting Members
HashMap<String, String> attendeeInDerHashMap = handler.getAttendeeData(
email, userName, invitor);
Vector<HashMap<String, String>> atts = new Vector<HashMap<String, String>>();
atts.add(attendeeInDerHashMap);
HashMap<String, String> organizer = handler.getAttendeeData(user
.getAdresses().getEmail(), user.getLogin(), invitor);
handler.addNewMeeting(starttime, endtime, point.getAppointmentName(), atts,
subject, organizer, point.getIcalId(), timeZone);
log.debug(handler.getICalDataAsString());
mailHandler.send(new MailMessage(email, user.getAdresses().getEmail(), subject, message, handler.getIcalAsByteArray()));
return null;
}
// --------------------------------------------------------------------------------------------------------------
/**
*
* @param username
* @param message
* @param baseurl
* @param email
* @param subject
* @param invitationsHash
* @param appointMentId
* @param organizer_userId
* @param invitor
* @param language_id If it is >0 then "&language=" is added to the link
* @param starttime
* @param endtime
* @param timezone
* @return
*/
public String sendInvitionIcalLink(String username, String message,
String baseurl, String email, String subject,
String invitationsHash, Long appointMentId, Long organizer_userId,
Boolean invitor, Long language_id, Date starttime, Date endtime,
TimeZone timezone, String fromUserField) {
try {
String invitation_link = baseurl + "?invitationHash="
+ invitationsHash;
if (language_id > 0) {
invitation_link += "&language=" + language_id.toString();
}
// Long default_lang_id = Long.valueOf(cfgManagement.
// getConfKey(3,"default_lang_id").getConf_value()).longValue();
String template = invitationTemplate.getRegisterInvitationTemplate(
fromUserField, message, invitation_link, language_id, starttime,
endtime);
IcalHandler handler = new IcalHandler(
IcalHandler.ICAL_METHOD_REQUEST);
Appointment point = appointmentLogic
.getAppointMentById(appointMentId);
// Transforming Meeting Members
HashMap<String, String> attendeeList = handler.getAttendeeData(
email, username, invitor);
Vector<HashMap<String, String>> atts = new Vector<HashMap<String, String>>();
atts.add(attendeeList);
// Defining Organizer
User user = userManager.getUserById(organizer_userId);
HashMap<String, String> organizerAttendee = handler
.getAttendeeData(email, username, invitor);
String replyToEmail = null;
if (user != null) {
replyToEmail = user.getAdresses().getEmail();
organizerAttendee = handler.getAttendeeData(replyToEmail, user.getLogin(), invitor);
}
// Create ICal Message
String meetingId = handler.addNewMeeting(starttime, endtime,
point.getAppointmentName(), atts, invitation_link,
organizerAttendee, point.getIcalId(), timezone);
// Writing back meetingUid
if (point.getIcalId() == null || point.getIcalId().length() < 1) {
point.setIcalId(meetingId);
appointmentDaoImpl.updateAppointment(point);
}
log.debug(handler.getICalDataAsString());
mailHandler.send(new MailMessage(email, replyToEmail, subject, template, handler.getIcalAsByteArray()));
return "success";
} catch (Exception err) {
log.error("sendInvitionIcalLink", err);
}
return null;
}
/**
*
* @param user_level
* @param username
* @param message
* @param domain
* @param room
* @param roomtype
* @param baseurl
* @param email
* @param subject
* @param room_id
* @return
*/
public String sendInvitionLink(Long user_level, String username,
String message, String domain, String room, String roomtype,
String baseurl, String email, String replyTo, String subject, Long room_id,
Date starttime, Date endtime) {
try {
if (authLevelUtil.checkUserLevel(user_level)) {
String invitation_link = baseurl
+ "?lzproxied=solo&lzr=swf8&lzt=swf&domain=" + domain
+ "&room=" + room + "&roomtype=" + roomtype + "&email="
+ email + "&roomid=" + room_id;
Long default_lang_id = configurationDao.getConfValue("default_lang_id", Long.class, "1");
String template = invitationTemplate
.getRegisterInvitationTemplate(username, message,
invitation_link, default_lang_id, starttime,
endtime);
mailHandler.send(email, replyTo, subject, template);
return "success";
}
} catch (Exception err) {
log.error("sendInvitationLink", err);
}
return null;
}
/**
* @author becherer
* @param invId
*
*/
public Invitations getInvitationbyId(Long invId) {
log.debug("getInvitationbyId");
try {
String hql = "select invi from Invitations invi "
+ "WHERE invi.deleted <> :deleted "
+ "AND invi.invitations_id = :invid";
TypedQuery<Invitations> query = em.createQuery(hql, Invitations.class);
query.setParameter("deleted", true);
query.setParameter("invid", invId);
Invitations inv = null;
try {
inv = query.getSingleResult();
} catch (NoResultException ex) {
}
return inv;
} catch (Exception e) {
log.error("getInvitationsbyId : ", e);
return null;
}
}
public Invitations getInvitationbyAppointementId(Long invId) {
log.debug("getInvitationbyId");
try {
String hql = "select invi from Invitations invi "
+ "WHERE invi.deleted <> :deleted "
+ "AND invi.invitations_id = :invid";
TypedQuery<Invitations> query = em.createQuery(hql, Invitations.class);
query.setParameter("deleted", true);
query.setParameter("invid", invId);
Invitations inv = null;
try {
inv = query.getSingleResult();
} catch (NoResultException ex) {
}
return inv;
} catch (Exception e) {
log.error("getInvitationsbyId : ", e);
return null;
}
}
/**
*
* @param hashCode
* @param hidePass
* @return
*/
public Object getInvitationByHashCode(String hashCode, boolean hidePass) {
try {
String hql = "select c from Invitations as c "
+ "where c.hash LIKE :hashCode "
+ "AND c.deleted = :deleted";
TypedQuery<Invitations> query = em.createQuery(hql, Invitations.class);
query.setParameter("hashCode", hashCode);
query.setParameter("deleted", false);
Invitations invitation = null;
try {
invitation = query.getSingleResult();
} catch (NoResultException ex) {
}
if (invitation == null) {
// already deleted or does not exist
return new Long(-31);
} else {
if (invitation.getCanBeUsedOnlyOneTime()) {
// do this only if the user tries to get the Invitation, not
// while checking the PWD
if (hidePass) {
// one-time invitation
if (invitation.getInvitationWasUsed()) {
// Invitation is of type *only-one-time* and was
// already used
return new Long(-32);
} else {
// set to true if this is the first time / a normal
// getInvitation-Query
invitation.setInvitationWasUsed(true);
this.updateInvitation(invitation);
// invitation.setInvitationpass(null);
invitation.setAllowEntry(true);
return invitation;
}
} else {
invitation.setAllowEntry(true);
return invitation;
}
} else if (invitation.getIsValidByTime()) {
OmTimeZone tz = invitation.getOmTimeZone() == null
? omTimeZoneDaoImpl.getOmTimeZone(configurationDao.getConfValue("default.timezone", String.class, "Europe/Berlin"))
: invitation.getOmTimeZone();
Calendar now = Calendar.getInstance(TimeZone.getTimeZone(tz.getIcal()));
Calendar start = Calendar.getInstance(TimeZone.getTimeZone(tz.getIcal()));
start.setTime(invitation.getValidFrom());
Calendar end = Calendar.getInstance(TimeZone.getTimeZone(tz.getIcal()));
end.setTime(invitation.getValidTo());
if (now.after(start) && now.before(end)) {
this.updateInvitation(invitation);
// invitation.setInvitationpass(null);
invitation.setAllowEntry(true);
return invitation;
} else {
// Invitation is of type *period* and is not valid
// anymore, this is an extra hook to display the time
// correctly
// in the method where it shows that the hash code does
// not work anymore
invitation.setAllowEntry(false);
return invitation;
}
} else {
// Invitation is not limited, neither time nor single-usage
this.updateInvitation(invitation);
invitation.setAllowEntry(true);
// invitation.setInvitationpass(null);
return invitation;
}
}
} catch (Exception err) {
log.error("[getInvitationByHashCode]", err);
}
return new Long(-1);
}
/**
*
* @param invitation
*/
public void updateInvitation(Invitations invitation) {
try {
invitation.setUpdatetime(new Date());
if (invitation.getInvitations_id() == null) {
em.persist(invitation);
} else {
if (!em.contains(invitation)) {
em.merge(invitation);
}
}
} catch (Exception ex2) {
log.error("[selectMaxFromUsers] ", ex2);
}
}
/**
*
* @param hashCode
* @param pass
* @return
*/
public Object checkInvitationPass(String hashCode, String pass) {
try {
Object obj = this.getInvitationByHashCode(hashCode, false);
log.debug("checkInvitationPass - obj: " + obj);
if (obj instanceof Invitations) {
Invitations invitation = (Invitations) obj;
// log.debug("invitationId "+invitation.getInvitations_id());
// log.debug("pass "+pass);
// log.debug("getInvitationpass "+invitation.getInvitationpass());
if (manageCryptStyle.getInstanceOfCrypt().verifyPassword(pass,
invitation.getInvitationpass())) {
return new Long(1);
} else {
return new Long(-34);
}
} else {
return obj;
}
} catch (Exception ex2) {
log.error("[checkInvitationPass] ", ex2);
}
return new Long(-1);
}
public void updateInvitationByAppointment(Long appointmentId,
Date appointmentstart, Date appointmentend) {
try {
Date gmtTimeStartShifted = new Date(appointmentstart.getTime()
- (5 * 60 * 1000));
String hql = "select a from Invitations a "
+ "WHERE a.appointmentId = :appointmentId ";
TypedQuery<Invitations> query = em.createQuery(hql, Invitations.class);
query.setParameter("appointmentId", appointmentId);
List<Invitations> listInvitations = query.getResultList();
for (Invitations inv : listInvitations) {
inv.setValidFrom(gmtTimeStartShifted);
inv.setValidTo(appointmentend);
if (inv.getInvitations_id() == null) {
em.persist(inv);
} else {
if (!em.contains(inv)) {
em.merge(inv);
}
}
}
} catch (Exception err) {
log.error("[updateInvitationByAppointment]", err);
}
}
}