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""; 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""; 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')."$lab_Field_site801_030
".htmlspecialchars($login, ENT_QUOTES, 'UTF-8')."".mysql_error()."
".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"
$lab_ButtonName_BackToList
"; } else if (count($missing)==0) { echo"
$lab_Field_site801_026
"; echo"
$lab_ButtonName_BackToList
"; } else { ?>
".$lab_Field_site801_033.""; ?> $u) { $login = trim($u["login"]); $fullName = trim($u["fullName"]); // rozbicie pelnej nazwy z SYNDIS na imie i nazwisko - SYNDIS przekazuje ja w jednym polu $spacePos = strpos($fullName, ' '); if ($spacePos===false) { $fName=$fullName; $lName=''; } else { $fName=substr($fullName,0,$spacePos); $lName=trim(substr($fullName,$spacePos+1)); } $isActive = ($u["isActive"]==true || $u["isActive"]==1); // SYNDIS gubi polskie znaki - odsyla je jako znak zapytania [poza litera 'o' z kreska]. // Takiego loginu nie wolno zapisac bez poprawienia, bo nie zgodzi sie z logowaniem z SYNDIS. $badChars = (strpos($login, '?') !== false || strpos($fullName, '?') !== false); // proba odtworzenia loginu i potwierdzenia go w SYNDIS $loginFixed = ''; $loginHints = array(); if (strpos($login, '?') !== false && $probeCalls < $probeMax && (microtime(true) - $probeStart) < $probeMaxSec) { $hits = array(); foreach (array('UTF-8', 'windows-1250') as $enc) { foreach (syndisLoginCandidates($login) as $cand) { if ($probeCalls >= $probeMax || (microtime(true) - $probeStart) >= $probeMaxSec) break; $probeCalls++; if (syndisLoginExists($syndisUrl, $cand, $enc)) $hits[] = $cand; } if (count($hits) > 0) break; } // ufamy wynikowi tylko wtedy, gdy potwierdzil sie DOKLADNIE jeden wariant if (count($hits) == 1) $loginFixed = $hits[0]; else if (count($hits) > 1) $loginHints = $hits; } $loginValue = ($loginFixed != '') ? $loginFixed : $login; // uprawnienia z SYNDIS - do informacji dla operatora $rights = array(); if ($u["isAdmin"]==true || $u["isAdmin"]==1) $rights[]='isAdmin'; if ($u["isEditForms"]==true || $u["isEditForms"]==1) $rights[]='isEditForms'; if ($u["isEditReports"]==true || $u["isEditReports"]==1) $rights[]='isEditReports'; if ($u["isConfig"]==true || $u["isConfig"]==1) $rights[]='isConfig'; if ($u["isChangeValues"]==true || $u["isChangeValues"]==1) $rights[]='isChangeValues'; // regiony z SYNDIS - pojedynczy region przychodzi jako liczba, kilka jako tablica $uRegionNo = array(); $uRegionDesc = array(); if (isset($u["regions"])) { foreach ((array) $u["regions"] as $regNo) { $regNo = (int) $regNo; $uRegionNo[] = $regNo; if (isset($regionMap[$regNo]) && !in_array($regionMap[$regNo], $uRegionDesc)) $uRegionDesc[] = $regionMap[$regNo]; } } // domyslny profil wg uprawnien z SYNDIS: operator dla edytujacych, w pozostalych przypadkach tylko odczyt if (($u["isAdmin"]==true || $u["isAdmin"]==1) || ($u["isEditForms"]==true || $u["isEditForms"]==1)) $defProID=3; else $defProID=2; ?>
  ".$lab_Field_site801_035.""; else if (count($loginHints) > 0) echo "  ".$lab_Field_site801_036.": " .htmlspecialchars(implode(', ', $loginHints), ENT_QUOTES, 'UTF-8').""; else if (strpos($login, '?') !== false) echo "  ".$lab_Field_site801_034.""; ?>
0 ? implode(', ', $rights) : '-'); ?>
0 ? implode(', ', $uRegionNo).'  ['.implode(', ', $uRegionDesc).']' : '-'); ?>
.123   
$regDesc) { $regChecked = in_array($regDesc, $uRegionDesc) ? 'checked' : ''; echo" $regDesc    "; } ?>
"; } ?>
".$p["PRO_NAME"]." ".$p["PRO_DESCRIPTION"]."