Project

General

Profile

« Previous | Next » 

Revision 543dc925

Added by Jim Pingle about 2 years ago

Multiple issues with PPP providers. Fixes #14547

  • Update code for PHP 8.x
  • Fix connection name handling (validation, parsing, etc)
  • Fix output encoding of plan data

Tested with a variety of countries/providers/plans, output looks OK in
all cases I've checked.

View differences:

src/usr/local/www/getserviceproviders.php
40 40
function get_country_providers($country) {
41 41
	global $serviceproviders;
42 42
	foreach ($serviceproviders as $sp) {
43
		if ($sp['attr']['code'] == strtolower($country)) {
44
			return is_array($sp['provider'][0]) ? $sp['provider'] : array($sp['provider']);
43
		if (array_get_path($sp, 'attr/code', '') == strtolower($country)) {
44
			return is_array(array_get_path($sp, 'provider/0')) ? array_get_path($sp, 'provider') : [ array_get_path($sp, 'provider') ];
45 45
		}
46 46
	}
47 47
	$provider_list = (is_array($provider_list)) ? $provider_list : array();
......
53 53
	$country_list = get_country_name();
54 54
	foreach ($serviceproviders as $sp) {
55 55
		foreach ($country_list as $country) {
56
			if (strtoupper($sp['attr']['code']) == $country['code']) {
57
				echo $country['name'] . ":" . $country['code'] . "\n";
56
			if (!is_array($country) || empty($country)) {
57
				continue;
58
			}
59
			if (strtoupper(array_get_path($sp, 'attr/code')) == array_get_path($country, 'code')) {
60
				echo array_get_path($country, 'name', '') . ":" . array_get_path($country, 'code', '') . "\n";
58 61
			}
59 62
		}
60 63
	}
......
64 67
	$serviceproviders = get_country_providers($country);
65 68
	if (is_array($serviceproviders)) {
66 69
		foreach ($serviceproviders as $sp) {
67
			echo $sp['name']['value'] . "\n";
70
			echo array_get_path($sp, 'name/value', '') . "\n";
68 71
		}
69 72
	} else {
70 73
		$serviceproviders = array();
......
77 80
	echo "<connection>\n";
78 81
	$serviceproviders = get_country_providers($country);
79 82
	foreach ($serviceproviders as $sp) {
80
		if (strtolower($sp['name']['value']) == strtolower($provider)) {
83
		if (strtolower(array_get_path($sp, 'name/value', '')) == strtolower($provider)) {
81 84
			if (strtoupper($connection) == "CDMA") {
82
				$conndata = $sp['cdma'];
85
				$conndata = array_get_path($sp, 'cdma');
83 86
			} else {
84
				if (!is_array($sp['gsm']['apn'][0])) {
85
					$conndata = $sp['gsm']['apn'];
87
				if (!is_array(array_get_path($sp, 'gsm/apn/0'))) {
88
					$conndata = array_get_path($sp, 'gsm/apn');
89
					$connection = array_get_path($sp, 'gsm/apn/attr/value', $connection);
86 90
				} else {
87
					foreach ($sp['gsm']['apn'] as $apn) {
88
						if ($apn['attr']['value'] == $connection) {
91
					foreach (array_get_path($sp, 'gsm/apn', []) as $apn) {
92
						if (array_get_path($apn, 'attr/value') == $connection) {
89 93
							$conndata = $apn;
90 94
							break;
91 95
						}
......
93 97
				}
94 98
			}
95 99
			if (is_array($conndata)) {
96
				echo "<apn>" . $connection . "</apn>\n";
97
				echo "<username>" . $conndata['username']['value'] . "</username>\n";
98
				echo "<password>" . $conndata['password']['value'] . "</password>\n";
100
				echo "<apn>" . htmlentities($connection) . "</apn>\n";
101
				echo "<username>" . htmlentities(array_get_path($conndata, 'username/value', '')) . "</username>\n";
102
				echo "<password>" . htmlentities(array_get_path($conndata, 'password/value', '')) . "</password>\n";
99 103

  
100
				$dns_arr = is_array($conndata['dns'][0]) ? $conndata['dns'] : array($conndata['dns']);
104
				$dns_arr = is_array(array_get_path($conndata, 'dns/0')) ? array_get_path($conndata, 'dns') : [ array_get_path($conndata, 'dns') ];
101 105
				foreach ($dns_arr as $dns) {
102
					echo '<dns>' . $dns['value'] . "</dns>\n";
106
					if (is_array($dns) && !empty($dns)) {
107
						echo '<dns>' . array_get_path($dns, 'value') . "</dns>\n";
108
					}
103 109
				}
104 110
			}
105 111
			break;
......
111 117
function provider_plans_list($country, $provider) {
112 118
	$serviceproviders = get_country_providers($country);
113 119
	foreach ($serviceproviders as $sp) {
114
		if (strtolower($sp['name']['value']) == strtolower($provider)) {
120
		if (strtolower(array_get_path($sp, 'name/value', '')) == strtolower($provider)) {
115 121
			if (array_key_exists('gsm', $sp)) {
116
				if (array_key_exists('attr', $sp['gsm']['apn'])) {
117
					$name = ($sp['gsm']['apn']['name'] ? $sp['gsm']['apn']['name'] : $sp['name']['value']);
118
					echo $name . ":" . $sp['gsm']['apn']['attr']['value'];
122
				if (array_key_exists('attr', array_get_path($sp, 'gsm/apn', []))) {
123
					$name = array_get_path($sp, 'gsm/apn/name/value', array_get_path($sp, 'name/value', ''));
124
					echo $name . ":" . array_get_path($sp, 'gsm/apn/attr/value', '');
119 125
				} else {
120
					foreach ($sp['gsm']['apn'] as $apn_info) {
121
						$name = ($apn_info['name']['value'] ? $apn_info['name']['value'] : $apn_info['gsm']['apn']['name']);
122
						echo $name . ":" . $apn_info['attr']['value'] . "\n";
126
					foreach (array_get_path($sp, 'gsm/apn', []) as $apn_info) {
127
						$name = array_get_path($apn_info, 'name/value', array_get_path($apn_info, 'gsm/apn/name', ''));
128
						echo $name . ":" . array_get_path($apn_info, 'attr/value', '') . "\n";
123 129
					}
124 130
				}
125 131
			}
126 132
			if (array_key_exists('cdma', $sp)) {
127
				$name = $sp['cdma']['name']['value'] ? $sp['cdma']['name']['value']:$sp['name']['value'];
133
				$name = array_get_path($sp, 'cdma/name/value', array_get_path($sp, 'name/value', ''));
128 134
				echo $name . ":" . "CDMA";
129 135
			}
130 136
		}
131 137
	}
132 138
}
133 139

  
134
$_REQ_OR_POST = ($_SERVER['REQUEST_METHOD'] === 'POST') ? $_POST : $_REQUEST;
135

  
136
if (isset($_REQ_OR_POST['country']) && !isset($_REQ_OR_POST['provider'])) {
137
	providers_list($_REQ_OR_POST['country']);
138
} elseif (isset($_REQ_OR_POST['country']) && isset($_REQ_OR_POST['provider'])) {
139
	if (isset($_REQ_OR_POST['plan'])) {
140
		provider_plan_data($_REQ_OR_POST['country'], $_REQ_OR_POST['provider'], $_REQ_OR_POST['plan']);
140
if (!empty($_POST)) {
141
	if (isset($_POST['country']) && !isset($_POST['provider'])) {
142
		providers_list($_POST['country']);
143
	} elseif (isset($_POST['country']) && isset($_POST['provider'])) {
144
		if (isset($_POST['plan'])) {
145
			provider_plan_data($_POST['country'], $_POST['provider'], $_POST['plan']);
146
		} else {
147
			provider_plans_list($_POST['country'], $_POST['provider']);
148
		}
141 149
	} else {
142
		provider_plans_list($_REQ_OR_POST['country'], $_REQ_OR_POST['provider']);
150
		country_list();
143 151
	}
144
} else {
145
	country_list();
146 152
}
147 153
?>
src/usr/local/www/interfaces.php
3779 3779
		$('#country').children().remove();
3780 3780
		$('#provider_list').children().remove();
3781 3781
		$('#providerplan').children().remove();
3782
		$.ajax("getserviceproviders.php",{
3782
		$.ajax({
3783
			type: 'post',
3784
			url: 'getserviceproviders.php',
3785
			data: { get_country_list: true },
3783 3786
			success: function(response) {
3784 3787

  
3785 3788
				var responseTextArr = response.split("\n");

Also available in: Unified diff