package cc.blynk.server.core.dao; import cc.blynk.server.core.model.auth.Session; import cc.blynk.server.core.model.auth.User; import io.netty.channel.EventLoop; import io.netty.handler.codec.http.FullHttpRequest; import io.netty.handler.codec.http.HttpHeaderNames; import io.netty.handler.codec.http.cookie.Cookie; import io.netty.handler.codec.http.cookie.ServerCookieDecoder; import io.netty.util.AttributeKey; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; /** * Holds session info related to specific user. * * The Blynk Project. * Created by Dmitriy Dumanskiy. * Created on 2/18/2015. */ public class SessionDao { public final static AttributeKey<User> userAttributeKey = AttributeKey.valueOf("user"); private static final Logger log = LogManager.getLogger(SessionDao.class); public final ConcurrentMap<UserKey, Session> userSession = new ConcurrentHashMap<>(); //threadsafe public Session getOrCreateSessionByUser(UserKey key, EventLoop initialEventLoop) { Session group = userSession.get(key); //only one side came if (group == null) { Session value = new Session(initialEventLoop); group = userSession.putIfAbsent(key, value); if (group == null) { log.trace("Creating unique session for user: {}", key); return value; } } return group; } public static final String SESSION_COOKIE = "session"; private final ConcurrentMap<String, User> httpSession = new ConcurrentHashMap<>(); public String generateNewSession(User user) { String sessionId = UUID.randomUUID().toString(); httpSession.put(sessionId, user); return sessionId; } public boolean isValid(Cookie cookie) { return cookie.name().equals(SESSION_COOKIE); } public User getUserFromCookie(FullHttpRequest request) { String cookieString = request.headers().get(HttpHeaderNames.COOKIE); if (cookieString != null) { Set<Cookie> cookies = ServerCookieDecoder.STRICT.decode(cookieString); if (!cookies.isEmpty()) { for (Cookie cookie : cookies) { if (isValid(cookie)) { String token = cookie.value(); return httpSession.get(token); } } } } return null; } }