package cloud.tianai.captcha.site; import java.security.SecureRandom; import java.util.Base64; import java.util.Collection; import java.util.Collections; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; public class SiteManager { private final ConcurrentHashMap sitesBySiteKey = new ConcurrentHashMap<>(); private final ConcurrentHashMap sitesBySiteId = new ConcurrentHashMap<>(); private final SecureRandom random = new SecureRandom(); public SiteConfig registerSite(String name, Set domains, Set allowedTypes) { SiteConfig config = new SiteConfig(); config.setSiteId(generateId()); config.setSiteKey(generateKey()); config.setSecretKey(generateKey()); config.setName(name); config.setDomains(domains); config.setAllowedTypes(allowedTypes); sitesBySiteKey.put(config.getSiteKey(), config); sitesBySiteId.put(config.getSiteId(), config); return config; } public SiteConfig getSiteBySiteKey(String siteKey) { return sitesBySiteKey.get(siteKey); } public SiteConfig getSiteBySiteId(String siteId) { return sitesBySiteId.get(siteId); } public boolean validateSiteKey(String siteKey, String domain) { SiteConfig config = sitesBySiteKey.get(siteKey); if (config == null || !config.isEnabled()) { return false; } if (domain != null && config.getDomains() != null && !config.getDomains().isEmpty()) { return config.getDomains().contains(domain) || config.getDomains().contains("*"); } return true; } public boolean validateSecretKey(String siteKey, String secretKey) { SiteConfig config = sitesBySiteKey.get(siteKey); return config != null && config.getSecretKey().equals(secretKey); } public boolean isTypeAllowed(String siteKey, String type) { SiteConfig config = sitesBySiteKey.get(siteKey); if (config == null) return false; if (config.getAllowedTypes() == null || config.getAllowedTypes().isEmpty()) return true; return config.getAllowedTypes().contains(type); } public void removeSite(String siteKey) { SiteConfig config = sitesBySiteKey.remove(siteKey); if (config != null) { sitesBySiteId.remove(config.getSiteId()); } } public Collection getAllSites() { return Collections.unmodifiableCollection(sitesBySiteKey.values()); } private String generateId() { byte[] bytes = new byte[16]; random.nextBytes(bytes); return Base64.getUrlEncoder().withoutPadding().encodeToString(bytes); } private String generateKey() { byte[] bytes = new byte[32]; random.nextBytes(bytes); return Base64.getUrlEncoder().withoutPadding().encodeToString(bytes); } }