usrLoginAndSiteAccess($uName, $uName.".123", ...)).
// ====================================================================================================
// Adres uslugi SOAP systemu SYNDIS - konfigurowalny w sys_setup_parameters [SSP_NAME='SYNDIS_URL'].
// Plik WSDL nie jest tu potrzebny - zadanie budujemy i parsujemy sami, patrz komentarz nizej.
$syndisUrl = sqlStringValue("select SSP_VALUE from sys_setup_parameters where SSP_NAME='SYNDIS_URL'", "SSP_VALUE");
if (empty($syndisUrl)) $syndisUrl = "http://172.22.64.101:3615/";
// numer regionu z SYNDIS -> opis zapisywany w sys_users_regions
$regionMap = array(1 => 'P/Szczerców', 2 => 'P/Szczerców', 3 => 'Dębina', 4 => 'P/Bełchatów');
$regionList = array('P/Szczerców', 'Dębina', 'P/Bełchatów');
// lista profili - pobierana raz, uzywana przy kazdym koncie
$profileArr = array();
$wynikPro = mysql_query("select PRO_ID,PRO_NAME,PRO_DESCRIPTION from sys_profiles order by PRO_NAME");
if($wynikPro)while ($rPro = mysql_fetch_array($wynikPro))
{
// profil 1 [nieograniczony dostep] moze nadac tylko admin - tak jak na site801E
if ($rPro["PRO_ID"] != 1 || $_SESSION['user']=='admin') $profileArr[] = $rPro;
}
// ====================================================================================================
// ZAPIS - zakladanie wybranych kont
// ====================================================================================================
if ($_POST['subUserSave']==$lab_ButtonName_Save)
{
if (!is_array($_POST['inAdd']) || count($_POST['inAdd'])==0)
echo"
$lab_Field_site801_028
";
else
{
?>
|
|
|
|
|
|
$chk)
{
$idx = (int) $idx;
$login = trim($_POST['inLogin'][$idx]);
if ($login=='') continue;
$loginSql = mysql_real_escape_string($login);
// konto moglo powstac w miedzyczasie - sprawdzamy tuz przed zapisem
if (sqlValue("select count(1) from sys_users where USR_USERNAME='".$loginSql."'")>0)
{
echo"| ".htmlspecialchars($login, ENT_QUOTES, 'UTF-8')." | $lab_Field_site801_030 |
";
continue;
}
$fNameSql = mysql_real_escape_string(trim($_POST['inFName'][$idx]));
$lNameSql = mysql_real_escape_string(trim($_POST['inLName'][$idx]));
$mailSql = mysql_real_escape_string(trim($_POST['inMail'][$idx]));
$phoneSql = mysql_real_escape_string(trim($_POST['inPhone'][$idx]));
$status = (int) $_POST['inStatus'][$idx];
if ($status!=0 && $status!=1 && $status!=2) $status=1;
mysql_query("INSERT INTO sys_users SET USR_USERNAME='".$loginSql."',USR_PASSWORD=md5('".$loginSql.".123'),USR_FIRST_NAME='".$fNameSql."',USR_LAST_NAME='".$lNameSql."',USR_MAIL='".$mailSql."',USR_PHONE='".$phoneSql."',USR_STATUS='".$status."',USR_PRT_ID=1,USR_AUDIT_CU='".mysql_real_escape_string($_SESSION['user'])."',USR_AUDIT_CD=now()");
$newUsrID = sqlValue("select max(USR_ID) from sys_users where USR_USERNAME='".$loginSql."'");
if ($newUsrID<=0)
{
echo"| ".htmlspecialchars($login, ENT_QUOTES, 'UTF-8')." | ".mysql_error()." |
";
continue;
}
// profile
$addedPro = array();
if (is_array($_POST['inProfile'][$idx]))
{
foreach ($_POST['inProfile'][$idx] as $proID => $proChk)
{
$proID = (int) $proID;
// profil 1 tylko dla admina - powtorzone po stronie zapisu, formularz nie jest zabezpieczeniem
if ($proID==1 && $_SESSION['user']!='admin') continue;
if ($proID>0 && sqlValue("select count(1) from sys_profiles where PRO_ID=".$proID)>0)
{
mysql_query("INSERT INTO sys_user_profiles SET SUP_USR_ID=".$newUsrID.",SUP_PRO_ID=".$proID);
$addedPro[] = sqlStringValue("select PRO_NAME from sys_profiles where PRO_ID=".$proID, "PRO_NAME");
}
}
}
// regiony - URG_ID jest AUTO_INCREMENT, nie podajemy go jawnie
$addedReg = array();
if (is_array($_POST['inRegion'][$idx]))
{
foreach ($_POST['inRegion'][$idx] as $regIdx => $regChk)
{
$regIdx = (int) $regIdx;
if (isset($regionList[$regIdx]))
{
mysql_query("INSERT INTO sys_users_regions SET URG_USR_ID=".$newUsrID.",URG_DESC='".mysql_real_escape_string($regionList[$regIdx])."'");
$addedReg[] = $regionList[$regIdx];
}
}
}
if ($status=='0') $statusDesc=$lab_Field_site801_008;
else if ($status=='1') $statusDesc=$lab_Field_site801_007;
else $statusDesc=$lab_Field_site801_009;
echo"
| ".htmlspecialchars($login, ENT_QUOTES, 'UTF-8')." |
".htmlspecialchars(trim($_POST['inFName'][$idx]), ENT_QUOTES, 'UTF-8')." |
".htmlspecialchars(trim($_POST['inLName'][$idx]), ENT_QUOTES, 'UTF-8')." |
".implode(', ', $addedReg)." |
".implode(', ', $addedPro)." |
$statusDesc |
";
}
?>
4000000) break;
}
$meta = stream_get_meta_data($fp);
fclose($fp);
if ($meta['timed_out']) { $err = 'Przekroczono czas oczekiwania na odpowiedz uslugi.'; return ''; }
if ($raw === '') { $err = 'Usluga nie zwrocila zadnej tresci.'; return ''; }
$pos = strpos($raw, "\r\n\r\n");
$headers = ($pos === false) ? $raw : substr($raw, 0, $pos);
$body = ($pos === false) ? '' : substr($raw, $pos + 4);
$status = strtok($headers, "\r\n");
$dump = "----- ZADANIE -----\n".$req."\n\n----- NAGLOWKI ODPOWIEDZI -----\n".$headers
."\n\n----- ODPOWIEDZ (".strlen($body)." B) -----\n".substr($body, 0, 8000);
// odpowiedz dzielona na czesci [chunked]
if (stripos($headers, 'Transfer-Encoding: chunked') !== false)
{
$out = ''; $i = 0;
while ($i < strlen($body))
{
$nl = strpos($body, "\r\n", $i);
if ($nl === false) break;
$len = hexdec(trim(substr($body, $i, $nl - $i)));
if ($len <= 0) break;
$out .= substr($body, $nl + 2, $len);
$i = $nl + 2 + $len + 2;
}
$body = $out;
}
if (strpos($status, ' 200') === false) { $err = 'Usluga zwrocila: '.$status; return ''; }
if (trim($body) == '') { $err = 'Usluga zwrocila pusta tresc [HTTP 200].'; return ''; }
return $body;
}
}
// czysci i parsuje odpowiedz XML z SYNDIS
if (!function_exists('syndisParseXml'))
{
function syndisParseXml($body, &$err)
{
$err = '';
// 1. odciecie ewentualnych smieci przed deklaracja XML
$start = strpos($body, ' 0) $body = substr($body, $start);
// 2. usuniecie znakow sterujacych niedozwolonych w XML 1.0
$body = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F]/', '', $body);
// 3. jesli tresc nie jest poprawnym UTF-8 - konwersja z Windows-1250
// [SYNDIS deklaruje UTF-8, ale wysyla polskie znaki jednobajtowo]
if (!preg_match('//u', $body))
{
$conv = @iconv('CP1250', 'UTF-8//IGNORE', $body);
if ($conv === false || $conv === '') $conv = @iconv('ISO-8859-2', 'UTF-8//IGNORE', $body);
if ($conv !== false && $conv !== '') $body = $conv;
}
// 4. usuniecie prefiksow przestrzeni nazw - upraszcza dostep do wezlow
$body = preg_replace('/\s+xmlns(:[A-Za-z0-9_.-]+)?\s*=\s*"[^"]*"/', '', $body);
$body = preg_replace('/(<\/?)[A-Za-z0-9_.-]+:/', '$1', $body);
libxml_use_internal_errors(true);
libxml_clear_errors();
$xml = simplexml_load_string($body);
if ($xml === false)
{
$msgs = array();
foreach (libxml_get_errors() as $le) $msgs[] = 'linia '.$le->line.': '.trim($le->message);
libxml_clear_errors();
$err = 'Nie udalo sie odczytac odpowiedzi XML. '.implode(' | ', array_slice($msgs, 0, 5));
return null;
}
return $xml;
}
}
// ================================================================================================
// Odtwarzanie loginu utraconego przez blad kodowania po stronie SYNDIS.
//
// SYNDIS odsyla polskie znaki jako '?' [poza litera 'o' z kreska] - informacja jest tracona
// u zrodla, wiec nie da sie jej wyliczyc. Mozna ja jednak ODTWORZYC I ZWERYFIKOWAC:
// podstawiamy w miejsce '?' kolejne polskie litery i pytamy usluge operacja GetUserInfo,
// ktory wariant faktycznie istnieje. To nie jest zgadywanie - to sprawdzenie u zrodla.
// Gdy zaden albo wiecej niz jeden wariant sie potwierdzi, login zostaje do recznej poprawy.
// ================================================================================================
// buduje warianty loginu przez podstawienie polskich liter w miejsce znakow zapytania
if (!function_exists('syndisLoginCandidates'))
{
function syndisLoginCandidates($login)
{
$marks = substr_count($login, '?');
if ($marks == 0 || $marks > 2) return array();
$small = array('ą','ć','ę','ł','ń','ó','ś','ź','ż');
$big = array('Ą','Ć','Ę','Ł','Ń','Ó','Ś','Ź','Ż');
// przy dwoch niewiadomych ograniczamy sie do malych liter, zeby nie mnozyc zapytan
$set = ($marks == 1) ? array_merge($small, $big) : $small;
$out = array($login);
for ($m = 0; $m < $marks; $m++)
{
$next = array();
foreach ($out as $cand)
{
$q = strpos($cand, '?');
if ($q === false) continue;
foreach ($set as $ch) $next[] = substr($cand, 0, $q).$ch.substr($cand, $q + 1);
}
$out = $next;
}
return $out;
}
}
// sprawdza w SYNDIS, czy konto o podanym loginie istnieje
if (!function_exists('syndisLoginExists'))
{
function syndisLoginExists($url, $login, $enc)
{
$safe = str_replace(array('&','<','>'), array('&','<','>'), $login);
if ($enc != 'UTF-8')
{
$conv = @iconv('UTF-8', $enc.'//IGNORE', $safe);
if ($conv === false || $conv === '') return false;
$safe = $conv;
}
$env = ''
. ''
. ''.$safe.''
. '';
$err = ''; $dump = '';
$body = syndisHttpSoap($url, 'http://www.mikronika.com.pl/2014/11/24/spm/GetUserInfo', $env, $err, $dump);
if (!empty($err) || $body == '') return false;
$e2 = '';
$xml = syndisParseXml($body, $e2);
if ($xml === null) return false;
if (isset($xml->Body->Fault)) return false;
if (!isset($xml->Body->GetUserInfoResponse)) return false;
$r = $xml->Body->GetUserInfoResponse;
return (trim((string) $r->login) != '' && trim((string) $r->fullName) != '');
}
}
// limity, zeby odtwarzanie loginow nie zablokowalo strony
$probeCalls = 0;
$probeMax = 200;
$probeStart = microtime(true);
$probeMaxSec = 25;
$syndisError = '';
$syndisStep = '';
$syndisRaw = '';
$syndisUsers = array();
$envelope = ''
. ''
. '';
$body = syndisHttpSoap($syndisUrl, 'http://www.mikronika.com.pl/2014/11/24/spm/GetUserInfos', $envelope, $syndisError, $syndisRaw);
if (!empty($syndisError)) $syndisStep = 'POLACZENIE';
if (empty($syndisError))
{
$xml = syndisParseXml($body, $syndisError);
if (!empty($syndisError)) $syndisStep = 'ODPOWIEDZ';
if (empty($syndisError))
{
// fault zwrocony przez usluge
if (isset($xml->Body->Fault))
{
$syndisStep = 'USLUGA';
$syndisError = trim((string) $xml->Body->Fault->faultstring);
if ($syndisError == '') $syndisError = 'Usluga zwrocila SOAP Fault.';
}
else
{
foreach ($xml->Body->GetUserInfosResponse->users as $node)
{
$one = array(
'login' => (string) $node->login,
'fullName' => (string) $node->fullName,
'isActive' => ((string) $node->isActive == 'true' || (string) $node->isActive == '1'),
'isAdmin' => ((string) $node->isAdmin == 'true' || (string) $node->isAdmin == '1'),
'isEditForms' => ((string) $node->isEditForms == 'true' || (string) $node->isEditForms == '1'),
'isEditReports' => ((string) $node->isEditReports == 'true' || (string) $node->isEditReports == '1'),
'isConfig' => ((string) $node->isConfig == 'true' || (string) $node->isConfig == '1'),
'isChangeValues' => ((string) $node->isChangeValues == 'true' || (string) $node->isChangeValues == '1'),
'regions' => array()
);
foreach ($node->regions as $reg) $one['regions'][] = (int) $reg;
$syndisUsers[] = $one;
}
if (count($syndisUsers) == 0)
{
$syndisStep = 'ODPOWIEDZ';
$syndisError = 'Usluga odpowiedziala, ale nie zwrocila zadnego konta.';
}
}
}
}
// odrzucamy konta juz istniejace w SoftSPM
$missing = array();
foreach ($syndisUsers as $u)
{
$login = trim($u["login"]);
if ($login=='') continue;
if (sqlValue("select count(1) from sys_users where USR_USERNAME='".mysql_real_escape_string($login)."'")>0) continue;
$missing[] = $u;
}
if (!empty($syndisError))
{
echo"$lab_Field_site801_027
[".$syndisStep."] ".htmlspecialchars($syndisError, ENT_QUOTES, 'UTF-8')."
Adres uslugi: ".htmlspecialchars($syndisUrl, ENT_QUOTES, 'UTF-8')."
";
// podglad surowej komunikacji - do diagnostyki po stronie SYNDIS
if (!empty($syndisRaw))
echo"Diagnostyka - surowa komunikacja SOAP
"
.htmlspecialchars($syndisRaw, ENT_QUOTES, 'UTF-8')." ";
echo"";
}
else if (count($missing)==0)
{
echo"$lab_Field_site801_026
";
echo"";
}
else
{
?>