A self hosted chat application with end-to-end encrypted messaging.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

98 lines
3.1 KiB

package org.ros.chatto.logged;
import java.time.Instant;
import java.util.List;
import java.util.Optional;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionEvent;
import org.ros.chatto.model.ChatUser;
import org.ros.chatto.model.UserSession;
import org.ros.chatto.repository.UserSessionRepository;
import org.ros.chatto.service.UserService;
import org.ros.chatto.service.UserTokenService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import lombok.Getter;
import lombok.Setter;
@Component
@Getter
@Setter
public class LoggedUser implements HttpSessionBindingListener {
private final String username;
private UserService userService;
private UserTokenService userTokenService;
public LoggedUser(String username) {
this.username = username;
userService = BeanUtil.getBean(UserService.class);
userTokenService = BeanUtil.getBean(UserTokenService.class);
}
public LoggedUser() {
username = null;
}
@Override
public void valueBound(HttpSessionBindingEvent event) {
// UserService userService = getUserService(event);
UserService userService = BeanUtil.getBean(UserService.class);
// UserSessionRepository userSessionRepository = getUserSessionRepository(event);
UserSessionRepository userSessionRepository = BeanUtil.getBean(UserSessionRepository.class);
LoggedUser user = (LoggedUser) event.getValue();
Instant instant = Instant.now();
ChatUser chatUser = userService.findByUserName(user.getUsername());
UserSession userSession = userSessionRepository.findByUserName(user.getUsername());
if (userSession == null) {
userSession = new UserSession();
}
userSession.setUser(chatUser);
userSession.setTimeStamp(instant);
userSession.setOnline(true);
userSession.setNumSessions(userSession.getNumSessions() + 1);
userSessionRepository.save(userSession);
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
LoggedUser user = (LoggedUser) event.getValue();
UserService userService = BeanUtil.getBean(UserService.class);;
UserSessionRepository userSessionRepository = BeanUtil.getBean(UserSessionRepository.class);;
Instant instant = Instant.now();
ChatUser chatUser = userService.findByUserName(user.getUsername());
UserSession userSession = userSessionRepository.findByUserName(user.getUsername());
if (userSession == null) {
// userSession = new UserSession();
throw new UsernameNotFoundException("User session not found");
}
int numSessions = userSession.getNumSessions();
if (--numSessions == 0) {
userSession.setOnline(false);
}
userSession.setUser(chatUser);
userSession.setTimeStamp(instant);
userSession.setNumSessions(numSessions);
userSessionRepository.save(userSession);
userTokenService.deleteToken(chatUser.getUserName());
TokenCacheUtil.evictSingleTokenValue(chatUser.getUserName());
}
}