mirror of
				https://github.com/Telecominfraproject/ols-ucentral-schema.git
				synced 2025-10-30 01:32:26 +00:00 
			
		
		
		
	schema: add pass-point support
Signed-off-by: John Crispin <john@phrozen.org>
This commit is contained in:
		| @@ -18,16 +18,19 @@ | ||||
| 				proto: ssid.encryption.proto, | ||||
| 				key: ssid.encryption.key | ||||
| 		}; | ||||
| 		warn(ssid.encryption.proto); | ||||
| 		if (ssid.encryption.proto in [ "wpa", "wpa2", "wpa-mixed", "wpa3", "wpa3-mixed" ] && | ||||
| 		    ssid.encryption.radius && ssid.encryption.radius.authentication && | ||||
| 		    ssid.encryption.radius.authentication.host && | ||||
| 		    ssid.encryption.radius.authentication.port && | ||||
| 		    ssid.encryption.radius.authentication.secret) | ||||
| 		    ssid.radius && ssid.radius.authentication && | ||||
| 		    ssid.radius.authentication.host && | ||||
| 		    ssid.radius.authentication.port && | ||||
| 		    ssid.radius.authentication.secret) | ||||
| 			return { | ||||
| 				proto: ssid.encryption.proto, | ||||
| 				auth: ssid.encryption.ssid.encryption.radius.authentication, | ||||
| 				acct: ssid.encryption.ssid.encryption.radius.accounting | ||||
| 				auth: ssid.radius.authentication, | ||||
| 				acct: ssid.radius.accounting, | ||||
| 				radius: ssid.radius | ||||
| 			}; | ||||
| 		warn("Can't find any valid encryption settings"); | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| @@ -42,6 +45,16 @@ | ||||
| 		return index([ "wds-ap", "wds-sta", "wds-repeater" ], ssid.bss_mode); | ||||
| 	} | ||||
|  | ||||
| 	function match_hs20_auth_type(auth_type) { | ||||
| 		let types = { | ||||
| 			"terms-and-conditions": "00", | ||||
| 			"online-enrollment": "01", | ||||
| 			"http-redirection": "02", | ||||
| 			"dns-redirection": "03" | ||||
| 		}; | ||||
| 		return (auth_type && auth_type.type) ? types[auth_type.type] : ''; | ||||
| 	} | ||||
|  | ||||
| 	let bss_mode = ssid.bss_mode; | ||||
| 	if (ssid.bss_mode == "wds-ap") | ||||
| 		bss_mode =  "ap"; | ||||
| @@ -100,16 +113,51 @@ set wireless.{{ section }}.mcast_rate={{ ssid.rates.multicast }} | ||||
| set wireless.{{ section }}.ieee80211w={{ match_ieee80211w() }} | ||||
| set wireless.{{ section }}.encryption={{ crypto.proto }} | ||||
| set wireless.{{ section }}.key={{ crypto.key }} | ||||
| {%   if (crypto.radius): %} | ||||
| set wireless.{{ section }}.request_cui={{ b(crypto.radius.chargeable_user_id) }} | ||||
| set wireless.{{ section }}.nasid={{ s(crypto.radius.nas_identifier) }} | ||||
| {%   endif %} | ||||
| {%   if (crypto.auth): %} | ||||
| set wireless.{{ section }}.auth_server={{ crypto.auth.host }} | ||||
| set wireless.{{ section }}.auth_port={{ crypto.auth.port }} | ||||
| set wireless.{{ section }}.auth_secret={{ crypto.auth.secret }} | ||||
| {%     for (let request in crypto.auth.request_attribute): %} | ||||
| add_list wireless.{{ section }}.radius_auth_req_attr={{ s(request.id + ':' + request.value) }} | ||||
| {%     endfor %} | ||||
| {%   endif %} | ||||
| {%   if (crypto.acct): %} | ||||
| set wireless.{{ section }}.acct_server={{ crypto.acct.host }} | ||||
| set wireless.{{ section }}.acct_port={{ crypto.acct.port }} | ||||
| set wireless.{{ section }}.acct_secret={{ crypto.acct.secret }} | ||||
| set wireless.{{ section }}.acct_interval={{ crypto.acct.interval }} | ||||
| {%     for (let request in crypto.acct.request_attribute): %} | ||||
| add_list wireless.{{ section }}.radius_acct_req_attr={{ s(request.id + ':' + request.value) }} | ||||
| {%     endfor %} | ||||
| {%   endif %} | ||||
| {%   if (ssid.pass_point): %} | ||||
| set wireless.{{ section }}.interworking=1 | ||||
| set wireless.{{ section }}.hs20=1 | ||||
| {%     for (let name in ssid.pass_point.venue_name): %} | ||||
| add_list wireless.{{ section }}.iw_venue_name={{ s(name) }} | ||||
| {%     endfor %} | ||||
| set wireless.{{ section }}.iw_venue_group='{{ ssid.pass_point.venue_group }}' | ||||
| set wireless.{{ section }}.iw_venue_type='{{ ssid.pass_point.venue_type }}' | ||||
| {%     for (let n, url in ssid.pass_point.venue_url): %} | ||||
| add_list wireless.{{ section }}.iw_venue_url={{ s((n + 1) + ":" +url) }} | ||||
| {%     endfor %} | ||||
| set wireless.{{ section }}.iw_network_auth_type='{{ match_hs20_auth_type(ssid.pass_point.auth_type) }}' | ||||
| set wireless.{{ section }}.iw_domain_name={{ s(ssid.pass_point.domain_name) }} | ||||
| {%     for (let realm in ssid.pass_point.nai_realm): %} | ||||
| set wireless.{{ section }}.iw_nai_realm='{{ realm }}' | ||||
| {%     endfor %} | ||||
| set wireless.{{ section }}.osen={{ b(ssid.pass_point.osen) }} | ||||
| set wireless.{{ section }}.anqp_domain_id='{{ ssid.pass_point.anqp_domain }}' | ||||
| {%     for (let name in ssid.pass_point.friendly_name): %} | ||||
| add_list wireless.{{ section }}.hs20_oper_friendly_name={{ s(name) }} | ||||
| {%     endfor %} | ||||
| {%     for (let icon in ssid.pass_point.icon): %} | ||||
| add_list wireless.{{ section }}.operator_icon={{ s(icon.uri) }} | ||||
| {%     endfor %} | ||||
| {%   endif %} | ||||
| set wireless.{{ section }}.wds='{{ b(match_wds()) }}' | ||||
| {%   if (ssid.rate_limit && (ssid.rate_limit.ingress_rate || ssid.rate_limit.egress_rate)): %} | ||||
|   | ||||
| @@ -6,7 +6,9 @@ properties: | ||||
|     description: | ||||
|       This parameter can be used to configure one or more Venue Name Duples | ||||
|       for Venue Name ANQP information. | ||||
|     type: string | ||||
|     type: array | ||||
|     items: | ||||
|       type: string | ||||
|   venue-group: | ||||
|     description: | ||||
|       The available values are defined in 802.11u. | ||||
| @@ -21,8 +23,10 @@ properties: | ||||
|     description: | ||||
|       This parameter can be used to configure one or more Venue URL Duples to | ||||
|       provide additional information corresponding to Venue Name information. | ||||
|     type: string | ||||
|     format: uri | ||||
|     type: array | ||||
|     items: | ||||
|       type: string | ||||
|       format: uri | ||||
|   auth-type: | ||||
|     description: | ||||
|       This parameter indicates what type of network authentication is used in | ||||
| @@ -56,7 +60,9 @@ properties: | ||||
|   nai-realm: | ||||
|     description: | ||||
|       NAI Realm information | ||||
|     type: string | ||||
|     type: array | ||||
|     items: | ||||
|       type: string | ||||
|   osen: | ||||
|     description: | ||||
|       OSU Server-Only Authenticated L2 Encryption Network; | ||||
| @@ -72,7 +78,9 @@ properties: | ||||
|     description: | ||||
|       This parameter can be used to configure one or more Operator Friendly | ||||
|       Name Duples. | ||||
|     type: string | ||||
|     type: array | ||||
|     items: | ||||
|       type: string | ||||
|   icon: | ||||
|     description: | ||||
|       The operator icons. | ||||
|   | ||||
| @@ -57,8 +57,3 @@ properties: | ||||
|         value: Example Operator | ||||
|     examples: | ||||
|     - 126:s:Operator | ||||
|   request-cui: | ||||
|     description: | ||||
|       This will enable support for Chargeable-User-Identity (RFC 4372). | ||||
|     type: boolean | ||||
|     default: false | ||||
|   | ||||
| @@ -3,6 +3,16 @@ description: | ||||
|   allowing us to connect to the AAA servers. | ||||
| type: object | ||||
| properties: | ||||
|   nas-identifier: | ||||
|     description: | ||||
|       NAS-Identifier string for RADIUS messages. When used, this should be unique | ||||
|       to the NAS within the scope of the RADIUS server. | ||||
|     type: string | ||||
|   chargeable-user-id: | ||||
|     description: | ||||
|       This will enable support for Chargeable-User-Identity (RFC 4372). | ||||
|     type: boolean | ||||
|     default: false | ||||
|   local-users: | ||||
|     description: | ||||
|       Specifies a collection of local EAP user/psk/vid triplets. | ||||
| @@ -13,11 +23,10 @@ properties: | ||||
|     $ref: "https://ucentral.io/schema/v1/interface/ssid/radius/server/" | ||||
|   accounting: | ||||
|     $ref: "https://ucentral.io/schema/v1/interface/ssid/radius/server/" | ||||
|     properties: | ||||
|       interval: | ||||
|         description: | ||||
|           The interim accounting update interval. This value is defined in seconds. | ||||
|         type: integer | ||||
|         maximum: 600 | ||||
|         minimum: 60 | ||||
|         default: 60 | ||||
|     interval: | ||||
|       description: | ||||
|         The interim accounting update interval. This value is defined in seconds. | ||||
|       type: integer | ||||
|       maximum: 600 | ||||
|       minimum: 60 | ||||
|       default: 60 | ||||
|   | ||||
							
								
								
									
										109
									
								
								schemareader.uc
									
									
									
									
									
								
							
							
						
						
									
										109
									
								
								schemareader.uc
									
									
									
									
									
								
							| @@ -1891,22 +1891,6 @@ function instantiateInterfaceSsidRadiusServer(location, value, errors) { | ||||
| 		obj.request_attribute = parseRequestAttribute(location + "/request-attribute", value["request-attribute"], errors); | ||||
| 	} | ||||
|  | ||||
| 	function parseRequestCui(location, value, errors) { | ||||
| 		if (type(value) != "bool") { | ||||
| 			push(errors, [ location, "must be of type boolean" ]); | ||||
| 			return null; | ||||
| 		} | ||||
|  | ||||
| 		return value; | ||||
| 	} | ||||
|  | ||||
| 	if (exists(value, "request-cui")) { | ||||
| 		obj.request_cui = parseRequestCui(location + "/request-cui", value["request-cui"], errors); | ||||
| 	} | ||||
| 	else { | ||||
| 		obj.request_cui = false; | ||||
| 	} | ||||
|  | ||||
| 	return obj; | ||||
| } | ||||
|  | ||||
| @@ -1918,6 +1902,35 @@ function instantiateInterfaceSsidRadius(location, value, errors) { | ||||
|  | ||||
| 	let obj = {}; | ||||
|  | ||||
| 	function parseNasIdentifier(location, value, errors) { | ||||
| 		if (type(value) != "string") { | ||||
| 			push(errors, [ location, "must be of type string" ]); | ||||
| 			return null; | ||||
| 		} | ||||
|  | ||||
| 		return value; | ||||
| 	} | ||||
|  | ||||
| 	if (exists(value, "nas-identifier")) { | ||||
| 		obj.nas_identifier = parseNasIdentifier(location + "/nas-identifier", value["nas-identifier"], errors); | ||||
| 	} | ||||
|  | ||||
| 	function parseChargeableUserId(location, value, errors) { | ||||
| 		if (type(value) != "bool") { | ||||
| 			push(errors, [ location, "must be of type boolean" ]); | ||||
| 			return null; | ||||
| 		} | ||||
|  | ||||
| 		return value; | ||||
| 	} | ||||
|  | ||||
| 	if (exists(value, "chargeable-user-id")) { | ||||
| 		obj.chargeable_user_id = parseChargeableUserId(location + "/chargeable-user-id", value["chargeable-user-id"], errors); | ||||
| 	} | ||||
| 	else { | ||||
| 		obj.chargeable_user_id = false; | ||||
| 	} | ||||
|  | ||||
| 	function parseLocalUsers(location, value, errors) { | ||||
| 		if (type(value) != "array") { | ||||
| 			push(errors, [ location, "must be of type array" ]); | ||||
| @@ -1951,12 +1964,21 @@ function instantiateInterfaceSsidPassPoint(location, value, errors) { | ||||
| 	let obj = {}; | ||||
|  | ||||
| 	function parseVenueName(location, value, errors) { | ||||
| 		if (type(value) != "string") { | ||||
| 			push(errors, [ location, "must be of type string" ]); | ||||
| 		if (type(value) != "array") { | ||||
| 			push(errors, [ location, "must be of type array" ]); | ||||
| 			return null; | ||||
| 		} | ||||
|  | ||||
| 		return value; | ||||
| 		function parseItem(location, value, errors) { | ||||
| 			if (type(value) != "string") { | ||||
| 				push(errors, [ location, "must be of type string" ]); | ||||
| 				return null; | ||||
| 			} | ||||
|  | ||||
| 			return value; | ||||
| 		} | ||||
|  | ||||
| 		return map(value, (item, i) => parseItem(location + "/" + i, item, errors)); | ||||
| 	} | ||||
|  | ||||
| 	if (exists(value, "venue-name")) { | ||||
| @@ -1996,15 +2018,24 @@ function instantiateInterfaceSsidPassPoint(location, value, errors) { | ||||
| 	} | ||||
|  | ||||
| 	function parseVenueUrl(location, value, errors) { | ||||
| 		if (type(value) != "string") { | ||||
| 			push(errors, [ location, "must be of type string" ]); | ||||
| 		if (type(value) != "array") { | ||||
| 			push(errors, [ location, "must be of type array" ]); | ||||
| 			return null; | ||||
| 		} | ||||
|  | ||||
| 		if (!matchUri(value)) | ||||
| 			push(errors, [ location, "must be a valid URI" ]); | ||||
| 		function parseItem(location, value, errors) { | ||||
| 			if (type(value) != "string") { | ||||
| 				push(errors, [ location, "must be of type string" ]); | ||||
| 				return null; | ||||
| 			} | ||||
|  | ||||
| 		return value; | ||||
| 			if (!matchUri(value)) | ||||
| 				push(errors, [ location, "must be a valid URI" ]); | ||||
|  | ||||
| 			return value; | ||||
| 		} | ||||
|  | ||||
| 		return map(value, (item, i) => parseItem(location + "/" + i, item, errors)); | ||||
| 	} | ||||
|  | ||||
| 	if (exists(value, "venue-url")) { | ||||
| @@ -2075,12 +2106,21 @@ function instantiateInterfaceSsidPassPoint(location, value, errors) { | ||||
| 	} | ||||
|  | ||||
| 	function parseNaiRealm(location, value, errors) { | ||||
| 		if (type(value) != "string") { | ||||
| 			push(errors, [ location, "must be of type string" ]); | ||||
| 		if (type(value) != "array") { | ||||
| 			push(errors, [ location, "must be of type array" ]); | ||||
| 			return null; | ||||
| 		} | ||||
|  | ||||
| 		return value; | ||||
| 		function parseItem(location, value, errors) { | ||||
| 			if (type(value) != "string") { | ||||
| 				push(errors, [ location, "must be of type string" ]); | ||||
| 				return null; | ||||
| 			} | ||||
|  | ||||
| 			return value; | ||||
| 		} | ||||
|  | ||||
| 		return map(value, (item, i) => parseItem(location + "/" + i, item, errors)); | ||||
| 	} | ||||
|  | ||||
| 	if (exists(value, "nai-realm")) { | ||||
| @@ -2120,12 +2160,21 @@ function instantiateInterfaceSsidPassPoint(location, value, errors) { | ||||
| 	} | ||||
|  | ||||
| 	function parseFriendlyName(location, value, errors) { | ||||
| 		if (type(value) != "string") { | ||||
| 			push(errors, [ location, "must be of type string" ]); | ||||
| 		if (type(value) != "array") { | ||||
| 			push(errors, [ location, "must be of type array" ]); | ||||
| 			return null; | ||||
| 		} | ||||
|  | ||||
| 		return value; | ||||
| 		function parseItem(location, value, errors) { | ||||
| 			if (type(value) != "string") { | ||||
| 				push(errors, [ location, "must be of type string" ]); | ||||
| 				return null; | ||||
| 			} | ||||
|  | ||||
| 			return value; | ||||
| 		} | ||||
|  | ||||
| 		return map(value, (item, i) => parseItem(location + "/" + i, item, errors)); | ||||
| 	} | ||||
|  | ||||
| 	if (exists(value, "friendly-name")) { | ||||
|   | ||||
| @@ -773,16 +773,19 @@ | ||||
|                     "examples": [ | ||||
|                         "126:s:Operator" | ||||
|                     ] | ||||
|                 }, | ||||
|                 "request-cui": { | ||||
|                     "type": "boolean", | ||||
|                     "default": false | ||||
|                 } | ||||
|             } | ||||
|         }, | ||||
|         "interface.ssid.radius": { | ||||
|             "type": "object", | ||||
|             "properties": { | ||||
|                 "nas-identifier": { | ||||
|                     "type": "string" | ||||
|                 }, | ||||
|                 "chargeable-user-id": { | ||||
|                     "type": "boolean", | ||||
|                     "default": false | ||||
|                 }, | ||||
|                 "local-users": { | ||||
|                     "type": "array", | ||||
|                     "items": { | ||||
| @@ -794,13 +797,11 @@ | ||||
|                 }, | ||||
|                 "accounting": { | ||||
|                     "$ref": "#/$defs/interface.ssid.radius.server", | ||||
|                     "properties": { | ||||
|                         "interval": { | ||||
|                             "type": "integer", | ||||
|                             "maximum": 600, | ||||
|                             "minimum": 60, | ||||
|                             "default": 60 | ||||
|                         } | ||||
|                     "interval": { | ||||
|                         "type": "integer", | ||||
|                         "maximum": 600, | ||||
|                         "minimum": 60, | ||||
|                         "default": 60 | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| @@ -809,7 +810,10 @@ | ||||
|             "type": "object", | ||||
|             "properties": { | ||||
|                 "venue-name": { | ||||
|                     "type": "string" | ||||
|                     "type": "array", | ||||
|                     "items": { | ||||
|                         "type": "string" | ||||
|                     } | ||||
|                 }, | ||||
|                 "venue-group": { | ||||
|                     "type": "integer", | ||||
| @@ -820,8 +824,11 @@ | ||||
|                     "maximum": 32 | ||||
|                 }, | ||||
|                 "venue-url": { | ||||
|                     "type": "string", | ||||
|                     "format": "uri" | ||||
|                     "type": "array", | ||||
|                     "items": { | ||||
|                         "type": "string", | ||||
|                         "format": "uri" | ||||
|                     } | ||||
|                 }, | ||||
|                 "auth-type": { | ||||
|                     "type": "object", | ||||
| @@ -852,7 +859,10 @@ | ||||
|                     "format": "hostname" | ||||
|                 }, | ||||
|                 "nai-realm": { | ||||
|                     "type": "string" | ||||
|                     "type": "array", | ||||
|                     "items": { | ||||
|                         "type": "string" | ||||
|                     } | ||||
|                 }, | ||||
|                 "osen": { | ||||
|                     "type": "boolean" | ||||
| @@ -863,7 +873,10 @@ | ||||
|                     "minimum": 0 | ||||
|                 }, | ||||
|                 "friendly-name": { | ||||
|                     "type": "string" | ||||
|                     "type": "array", | ||||
|                     "items": { | ||||
|                         "type": "string" | ||||
|                     } | ||||
|                 }, | ||||
|                 "icon": { | ||||
|                     "type": "array", | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 John Crispin
					John Crispin