diff --git a/opensync-ext-static/src/main/resources/ProfileCaptive.json b/opensync-ext-static/src/main/resources/ProfileCaptive.json new file mode 100644 index 0000000..1367917 --- /dev/null +++ b/opensync-ext-static/src/main/resources/ProfileCaptive.json @@ -0,0 +1,58 @@ +[ + { + "model_type": "Profile", + "id": 2, + "customerId": 2, + "profileType": "captive_portal", + "name": "Captive-portal", + "details": { + "model_type": "CaptivePortalConfiguration", + "name": "Captive-portal", + "browserTitle": "Access the network as Guest", + "headerContent": "Captive Portal", + "userAcceptancePolicy": "Use this network at your own risk. No warranty of any kind.", + "successPageMarkdownText": "Welcome to the network", + "redirectURL": "", + "externalCaptivePortalURL": null, + "sessionTimeoutInMinutes": 60, + "logoFile": { + "model_type": "ManagedFileInfo", + "md5checksum": null, + "lastModifiedTimestamp": null, + "apExportUrl": "netExpLogo.png", + "fileCategory": "CaptivePortalLogo", + "fileType": "PNG", + "altSlot": false + }, + "backgroundFile": { + "model_type": "ManagedFileInfo", + "md5checksum": null, + "lastModifiedTimestamp": null, + "apExportUrl": "netExpBackgroud.jpg", + "fileCategory": "CaptivePortalBackground", + "fileType": "JPG", + "altSlot": false + }, + "walledGardenAllowlist": [ + "1.2.3.4", + "1.2.3.4-2.3.4.5", + "connectus.ai" + ], + "usernamePasswordFile": null, + "authenticationType": "guest", + "radiusAuthMethod": "CHAP", + "maxUsersWithSameCredentials": 42, + "externalPolicyFile": null, + "backgroundPosition": "left_top", + "backgroundRepeat": "no_repeat", + "radiusServiceName": null, + "expiryType": "unlimited", + "userList": [], + "macAllowList": [], + "profileType": "captive_portal" + }, + "createdTimestamp": 1595341820188, + "lastModifiedTimestamp": 1595341820188, + "childProfileIds": [] + } +] \ No newline at end of file diff --git a/opensync-gateway-cloud-process/src/main/resources/application.properties b/opensync-gateway-cloud-process/src/main/resources/application.properties index 408ecd2..041d50c 100644 --- a/opensync-gateway-cloud-process/src/main/resources/application.properties +++ b/opensync-gateway-cloud-process/src/main/resources/application.properties @@ -133,6 +133,9 @@ tip.wlan.firmwareServiceBaseUrl=https://localhost:9092 tip.wlan.manufacturerServiceBaseUrl=https://localhost:9092 tip.wlan.portalUserServiceBaseUrl=https://localhost:9092 +tip.wlan.fileStoreDirectory=/tmp/tip-wlan-filestore +tip.wlan.externalFileStoreURL=https://localhost:9096 + #server.session-timeout= # session timeout in seconds #server.tomcat.max-threads = 0 # number of threads in protocol handler diff --git a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java index 7ef35be..b50058d 100644 --- a/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java +++ b/opensync-gateway/src/main/java/com/telecominfraproject/wlan/opensync/ovsdb/dao/OvsdbDao.java @@ -46,6 +46,8 @@ import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.WifiInetConfigInfo import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.WifiRadioConfigInfo; import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.WifiStatsConfigInfo; import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.WifiVifConfigInfo; +import com.telecominfraproject.wlan.profile.captiveportal.models.CaptivePortalConfiguration; +import com.telecominfraproject.wlan.profile.captiveportal.models.ManagedFileInfo; import com.telecominfraproject.wlan.profile.models.Profile; import com.telecominfraproject.wlan.profile.radius.models.RadiusProfile; import com.telecominfraproject.wlan.profile.radius.models.RadiusServer; @@ -129,6 +131,12 @@ public class OvsdbDao { public long upgradeDlTimerSeconds; @org.springframework.beans.factory.annotation.Value("${tip.wlan.ovsdb.awlan-node.upgrade_timer:90}") public long upgradeTimerSeconds; + + @org.springframework.beans.factory.annotation.Value("${tip.wlan.fileStoreDirectory:/tmp/tip-wlan-filestore}") + private String fileStoreDirectory; + @org.springframework.beans.factory.annotation.Value("${tip.wlan.externalFileStoreURL:https://localhost:9096}") + private String externalFileStoreURL; + public static final String HTTP = "http"; public static final String ovsdbName = "Open_vSwitch"; public static final String awlanNodeDbTable = "AWLAN_Node"; @@ -2576,6 +2584,11 @@ public class OvsdbDao { security.put("mode", "1"); } } + + // TODO put into AP captive parameter + Map captiveMap = new HashMap<>(); + List walledGardenAllowlist = new ArrayList<>(); + getCaptiveConfiguration(opensyncApConfig, ssidConfig, captiveMap, walledGardenAllowlist); boolean enabled = ssidConfig.getSsidAdminState().equals(StateSetting.enabled); @@ -2638,6 +2651,50 @@ public class OvsdbDao { } } } + + private void getCaptiveConfiguration(OpensyncAPConfig opensyncApConfig, SsidConfiguration ssidConfig, + Map captiveMap, List walledGardenAllowlist) { + if (ssidConfig.getCaptivePortalId() != null && opensyncApConfig.getCaptiveProfiles() != null) { + for (Profile profileCaptive : opensyncApConfig.getCaptiveProfiles()) { + if (ssidConfig.getCaptivePortalId() == profileCaptive.getId() && + profileCaptive.getDetails() != null) { + CaptivePortalConfiguration captiveProfileDetails = ((CaptivePortalConfiguration) profileCaptive.getDetails()); + captiveMap.put("sessionTimeoutInMinutes", String.valueOf(captiveProfileDetails.getSessionTimeoutInMinutes())); + captiveMap.put("redirectURL", captiveProfileDetails.getRedirectURL()); + captiveMap.put("browserTitle", captiveProfileDetails.getBrowserTitle()); + captiveMap.put("headerContent", captiveProfileDetails.getHeaderContent()); + captiveMap.put("userAcceptancePolicy", captiveProfileDetails.getUserAcceptancePolicy()); + captiveMap.put("successPageMarkdownText", captiveProfileDetails.getSuccessPageMarkdownText()); + captiveMap.put("externalCaptivePortalURL", captiveProfileDetails.getExternalCaptivePortalURL()); + captiveMap.put("backgroundPosition", captiveProfileDetails.getBackgroundPosition().toString()); + captiveMap.put("backgroundRepeat", captiveProfileDetails.getBackgroundRepeat().toString()); + walledGardenAllowlist.addAll(captiveProfileDetails.getWalledGardenAllowlist()); + + captiveMap.put("logoFileURL", getCaptiveFileUrl("logoFileURL", captiveProfileDetails.getLogoFile())); + captiveMap.put("backgroundFileURL", getCaptiveFileUrl("backgroundFileURL", captiveProfileDetails.getBackgroundFile())); + + LOG.debug("captiveMap {}", captiveMap); + } + } + } + } + + private String getCaptiveFileUrl(String fileDesc, ManagedFileInfo fileInfo) { + if (fileInfo == null || fileInfo.getApExportUrl() == null) { + return ""; + } + if (fileInfo.getApExportUrl().startsWith(HTTP)) { + return fileInfo.getApExportUrl(); + } + if (externalFileStoreURL == null || fileStoreDirectory == null) { + LOG.error("Missing externalFileStoreURL or fileStoreDirectory)"); + return ""; + } + LOG.debug("Captive file {}: {}", fileDesc, externalFileStoreURL + fileStoreDirectory + "/" + + fileInfo.getApExportUrl()); + + return externalFileStoreURL + fileStoreDirectory + "/" + fileInfo.getApExportUrl(); + } private void updateWifiInetConfig(OvsdbClient ovsdbClient, int vlanId, String ifName, boolean enabled, boolean isNAT, String ifType, String gateway, String inet, Map dns, String ipAssignScheme,