/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package be.neutrinet.ispng.vpn.admin; import be.neutrinet.ispng.VPN; import be.neutrinet.ispng.util.DateUtil; import be.neutrinet.ispng.vpn.*; import be.neutrinet.ispng.vpn.api.VPNClientCertificate; import be.neutrinet.ispng.vpn.ca.Certificates; import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.misc.TransactionManager; import com.j256.ormlite.table.DatabaseTable; import org.apache.log4j.Logger; import java.sql.SQLException; import java.time.LocalDate; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.UUID; /** * @author wannes */ @DatabaseTable(tableName = "registrations") public class Registration { private static final Map<UUID, Registration> activeRegistrations = new HashMap<>(); @DatabaseField(canBeNull = false) public UUID user; @DatabaseField(foreign = true, foreignAutoRefresh = true) public Client client; @DatabaseField(canBeNull = false) public Date timeInitiated; @DatabaseField public int ipv4Id; @DatabaseField public int ipv6Id; @DatabaseField(foreign = true, foreignAutoRefresh = true) public UnlockKey unlockKey; @DatabaseField public Date completed; private User cachedUser; @DatabaseField(id = true, canBeNull = false) private UUID id; private Registration() { } public Registration(UUID id) { this.id = id; } public static Map<UUID, Registration> getActiveRegistrations() { return activeRegistrations; } public UUID getId() { return id; } public void createInitialClient() { if (this.user == null) throw new IllegalStateException("No user is coupled"); try { this.client = new Client(); this.client.commonName = "!!TEMPORARY_CN!!"; this.client.userId = this.user; this.client.enabled = true; Clients.dao.create(client); } catch (SQLException ex) { Logger.getLogger(getClass()).error("Failed to create initial client", ex); } } /** * Commits and finalizes registration */ public void commit(boolean sendConfirmationEmail) { try { TransactionManager.callInTransaction(VPN.cs, () -> { if (ipv4Id != 0) { IPAddress ip4 = IPAddresses.dao.queryForId("" + this.ipv4Id); ip4.expiry = DateUtil.convert(LocalDate.now().plusDays(365L)); ip4.leasedAt = new Date(); ip4.client = this.client; IPAddresses.dao.update(ip4); } if (unlockKey != null) { assert unlockKey.usedAt == null; unlockKey.usedAt = this.timeInitiated; UnlockKeys.dao.update(unlockKey); } this.completed = new Date(); this.client.user().enabled = true; Users.update(this.client.user()); // Check if user has certificates that need to be signed Certificates.dao.queryForEq("client_id", client.id).forEach(VPNClientCertificate::sign); Registrations.dao.update(this); if (sendConfirmationEmail) VPN.generator.sendRegistrationConfirmation(this); return true; }); } catch (SQLException ex) { Logger.getLogger(getClass()).error("Registration failed", ex); } } public User user() { if (cachedUser == null) cachedUser = Users.queryForId(this.id); return cachedUser; } public void setUser(User user) { cachedUser = user; this.user = user.id; } }