649 lines
33 KiB
PHP
649 lines
33 KiB
PHP
<?php
|
|
if (!empty($_SESSION['site801_edit']))
|
|
{
|
|
// ====================================================================================================
|
|
// Synchronizacja kont z systemem SYNDIS.
|
|
// Strona pobiera przez SOAP pelny wykaz kont z SYNDIS (GetUserInfos), odrzuca te, ktore juz istnieja
|
|
// w sys_users i pokazuje pozostale do recznego wyboru. Operator decyduje, ktore konta zalozyc oraz
|
|
// jakie nadac im regiony i profile.
|
|
// Haslo nowego konta jest zawsze ustawiane wg wzorca [login].123 - tego wzorca wymaga logowanie
|
|
// z SYNDIS (index.php -> 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"<div class='actionERROR'>$lab_Field_site801_028</div>";
|
|
else
|
|
{
|
|
?>
|
|
<div class="tag100">
|
|
<div class="head_tag"><?php echo $lab_Tag_site801_007 ;?></div>
|
|
<div class="tag">
|
|
<table WIDTH="100%" class="tag">
|
|
<tr>
|
|
<td class="label"><?php echo $lab_Field_site801_001 ;?></td>
|
|
<td class="label"><?php echo $lab_Field_site801_002 ;?></td>
|
|
<td class="label"><?php echo $lab_Field_site801_003 ;?></td>
|
|
<td class="label"><?php echo $lab_Field_site801_023 ;?></td>
|
|
<td class="label"><?php echo $lab_Field_site801_013 ;?></td>
|
|
<td class="label"><?php echo $lab_Field_site801_006 ;?></td>
|
|
</tr>
|
|
<?php
|
|
foreach ($_POST['inAdd'] as $idx => $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"<tr><td class='field_center'>".htmlspecialchars($login, ENT_QUOTES, 'UTF-8')."</td><td class='field_center' colspan='5'>$lab_Field_site801_030</td></tr>";
|
|
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"<tr><td class='field_center'>".htmlspecialchars($login, ENT_QUOTES, 'UTF-8')."</td><td class='field_center' colspan='5'>".mysql_error()."</td></tr>";
|
|
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"
|
|
<tr>
|
|
<td class='field_center'>".htmlspecialchars($login, ENT_QUOTES, 'UTF-8')."</td>
|
|
<td class='field_center'>".htmlspecialchars(trim($_POST['inFName'][$idx]), ENT_QUOTES, 'UTF-8')."</td>
|
|
<td class='field_center'>".htmlspecialchars(trim($_POST['inLName'][$idx]), ENT_QUOTES, 'UTF-8')."</td>
|
|
<td class='field_center'>".implode(', ', $addedReg)."</td>
|
|
<td class='field_center'>".implode(', ', $addedPro)."</td>
|
|
<td class='field_center'>$statusDesc</td>
|
|
</tr>
|
|
";
|
|
}
|
|
?>
|
|
</table>
|
|
</div>
|
|
<div class="tag_buttons">
|
|
<a class="btn btn-info btn-sm" style="text-decoration: none;" href="./?pg=site801" role="button"><?php echo $lab_ButtonName_BackToList; ?></a>
|
|
</div>
|
|
</div>
|
|
<?php
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ====================================================================================================
|
|
// LISTA - konta z SYNDIS, ktorych nie ma w SoftSPM
|
|
// ====================================================================================================
|
|
else
|
|
{
|
|
// ================================================================================================
|
|
// Pobranie listy kont z SYNDIS.
|
|
//
|
|
// UWAGA: swiadomie NIE uzywamy tu klasy SoapClient ani soap.php.
|
|
// Usluga SYNDIS [gSOAP 2.7] zwraca poprawne HTTP 200 z kompletna trescia, ale PHP nie potrafi
|
|
// jej sparsowac - konczy sie bledem "looks like we got no XML document" niezaleznie od opcji
|
|
// transportu [sprawdzone: domyslne, keep_alive=false, SOAP 1.2, kompresja gzip].
|
|
// Odpowiedz deklaruje encoding="UTF-8", ale zawiera bajty, ktorych libxml nie akceptuje.
|
|
// Dlatego wysylamy zadanie recznie przez gniazdo i parsujemy odpowiedz po oczyszczeniu.
|
|
// ================================================================================================
|
|
|
|
// wysyla zadanie SOAP surowym POST-em i zwraca tresc odpowiedzi
|
|
if (!function_exists('syndisHttpSoap'))
|
|
{
|
|
function syndisHttpSoap($url, $action, $envelope, &$err, &$dump)
|
|
{
|
|
$err = ''; $dump = '';
|
|
|
|
$p = parse_url($url);
|
|
$host = isset($p['host']) ? $p['host'] : '';
|
|
$port = isset($p['port']) ? (int) $p['port'] : 80;
|
|
$path = (isset($p['path']) && $p['path'] != '') ? $p['path'] : '/';
|
|
if ($host == '') { $err = 'Niepoprawny adres uslugi: '.$url; return ''; }
|
|
|
|
$errNo = 0; $errStr = '';
|
|
$fp = @fsockopen($host, $port, $errNo, $errStr, 15);
|
|
if (!$fp) { $err = 'Brak polaczenia z '.$host.':'.$port.' - '.$errStr.' ['.$errNo.']'; return ''; }
|
|
|
|
$req = "POST ".$path." HTTP/1.1\r\n";
|
|
$req .= "Host: ".$host.":".$port."\r\n";
|
|
$req .= "Content-Type: text/xml; charset=utf-8\r\n";
|
|
$req .= "SOAPAction: \"".$action."\"\r\n";
|
|
$req .= "User-Agent: SoftSPM\r\n";
|
|
$req .= "Content-Length: ".strlen($envelope)."\r\n";
|
|
$req .= "Connection: close\r\n\r\n".$envelope;
|
|
|
|
stream_set_timeout($fp, 30);
|
|
fwrite($fp, $req);
|
|
|
|
$raw = '';
|
|
while (!feof($fp))
|
|
{
|
|
$chunk = fread($fp, 8192);
|
|
if ($chunk === false || $chunk === '') break;
|
|
$raw .= $chunk;
|
|
if (strlen($raw) > 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, '<?xml');
|
|
if ($start === false) $start = strpos($body, '<SOAP');
|
|
if ($start !== false && $start > 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 = '<?xml version="1.0" encoding="'.$enc.'"?>'
|
|
. '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"'
|
|
. ' xmlns:ns1="http://www.mikronika.com.pl/2014/11/24/spm/types">'
|
|
. '<SOAP-ENV:Body><ns1:GetUserInfoRequest><login>'.$safe.'</login>'
|
|
. '</ns1:GetUserInfoRequest></SOAP-ENV:Body></SOAP-ENV:Envelope>';
|
|
|
|
$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 = '<?xml version="1.0" encoding="UTF-8"?>'
|
|
. '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"'
|
|
. ' xmlns:ns1="http://www.mikronika.com.pl/2014/11/24/spm/types">'
|
|
. '<SOAP-ENV:Body><ns1:GetUserInfosRequest/></SOAP-ENV:Body></SOAP-ENV: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"<div class='actionERROR'>$lab_Field_site801_027<br/>
|
|
[".$syndisStep."] ".htmlspecialchars($syndisError, ENT_QUOTES, 'UTF-8')."<br/>
|
|
Adres uslugi: ".htmlspecialchars($syndisUrl, ENT_QUOTES, 'UTF-8')."</div>";
|
|
|
|
// podglad surowej komunikacji - do diagnostyki po stronie SYNDIS
|
|
if (!empty($syndisRaw))
|
|
echo"<div class='tag100'><div class='head_tag'>Diagnostyka - surowa komunikacja SOAP</div><div class='tag'>
|
|
<pre style='white-space:pre-wrap;word-break:break-all;font-size:11px;max-height:420px;overflow:auto;margin:0;'>"
|
|
.htmlspecialchars($syndisRaw, ENT_QUOTES, 'UTF-8')."</pre></div></div>";
|
|
echo"<div class='tag100'><div class=tag_buttons><a class='btn btn-info btn-sm' style='text-decoration: none;' href='./?pg=site801' role='button'>$lab_ButtonName_BackToList</a></div></div>";
|
|
}
|
|
else if (count($missing)==0)
|
|
{
|
|
echo"<div class='actionOK'>$lab_Field_site801_026</div>";
|
|
echo"<div class='tag100'><div class=tag_buttons><a class='btn btn-info btn-sm' style='text-decoration: none;' href='./?pg=site801' role='button'>$lab_ButtonName_BackToList</a></div></div>";
|
|
}
|
|
else
|
|
{
|
|
?>
|
|
<FORM ACTION="./?pg=site801syn" METHOD="POST" id="SyndisSyncForm">
|
|
|
|
<div class="tag100">
|
|
<div class="head_tag"><?php echo $lab_Tag_site801_005 ;?></div>
|
|
</div>
|
|
|
|
<?php
|
|
// ostrzezenie zbiorcze, jesli SYNDIS przyslal loginy z utraconymi polskimi znakami
|
|
$anyBadChars = false;
|
|
foreach ($missing as $uChk)
|
|
if (strpos($uChk["login"], '?') !== false || strpos($uChk["fullName"], '?') !== false) { $anyBadChars = true; break; }
|
|
if ($anyBadChars) echo"<div class='actionERROR'>".$lab_Field_site801_033."</div>";
|
|
?>
|
|
|
|
<?php
|
|
foreach ($missing as $idx => $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;
|
|
?>
|
|
|
|
<div class="tag100">
|
|
<div class="head_tag"><?php echo htmlspecialchars($login, ENT_QUOTES, 'UTF-8')." » ".htmlspecialchars($fullName, ENT_QUOTES, 'UTF-8'); ?></div>
|
|
<div class="tag">
|
|
<table class="desc_val">
|
|
<tr>
|
|
<td class="desc"><?php echo $lab_Field_site801_019 ; ?></td>
|
|
<td class="desc_value"><INPUT TYPE=CHECKBOX NAME="inAdd[<?php echo $idx; ?>]" VALUE="1"></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="desc"><?php echo $lab_Field_site801_001 ; ?></td>
|
|
<td class="desc_value">
|
|
<INPUT class="text50" TYPE="TEXT" NAME="inLogin[<?php echo $idx; ?>]" value="<?php echo htmlspecialchars($loginValue, ENT_QUOTES, 'UTF-8'); ?>"
|
|
oninput="var p=document.getElementById('pw_<?php echo $idx; ?>'); if(p) p.firstChild.nodeValue=this.value;">
|
|
<?php
|
|
if ($loginFixed != '')
|
|
echo "<span style='color:#1f8a53;font-weight:bold;'> ".$lab_Field_site801_035."</span>";
|
|
else if (count($loginHints) > 0)
|
|
echo "<span style='color:#b3760a;font-weight:bold;'> ".$lab_Field_site801_036.": "
|
|
.htmlspecialchars(implode(', ', $loginHints), ENT_QUOTES, 'UTF-8')."</span>";
|
|
else if (strpos($login, '?') !== false)
|
|
echo "<span style='color:#c1272d;font-weight:bold;'> ".$lab_Field_site801_034."</span>";
|
|
?>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="desc"><?php echo $lab_Field_site801_020 ; ?></td>
|
|
<td class="desc_value"><?php echo htmlspecialchars($fullName, ENT_QUOTES, 'UTF-8'); ?></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="desc"><?php echo $lab_Field_site801_021 ; ?></td>
|
|
<td class="desc_value"><?php echo (count($rights)>0 ? implode(', ', $rights) : '-'); ?></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="desc"><?php echo $lab_Field_site801_022 ; ?></td>
|
|
<td class="desc_value"><?php echo (count($uRegionNo)>0 ? implode(', ', $uRegionNo).' ['.implode(', ', $uRegionDesc).']' : '-'); ?></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="desc"><?php echo $lab_Field_site801_002 ; ?></td>
|
|
<td class="desc_value"><INPUT class="text50" TYPE="TEXT" NAME="inFName[<?php echo $idx; ?>]" value="<?php echo htmlspecialchars($fName, ENT_QUOTES, 'UTF-8'); ?>"></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="desc"><?php echo $lab_Field_site801_003 ; ?></td>
|
|
<td class="desc_value"><INPUT class="text50" TYPE="TEXT" NAME="inLName[<?php echo $idx; ?>]" value="<?php echo htmlspecialchars($lName, ENT_QUOTES, 'UTF-8'); ?>"></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="desc"><?php echo $lab_Field_site801_004 ; ?></td>
|
|
<td class="desc_value"><INPUT class="text50" TYPE="TEXT" NAME="inMail[<?php echo $idx; ?>]" value=""></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="desc"><?php echo $lab_Field_site801_005 ; ?></td>
|
|
<td class="desc_value"><INPUT TYPE="TEXT" NAME="inPhone[<?php echo $idx; ?>]" value=""></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="desc"><?php echo $lab_Field_site801_006 ; ?></td>
|
|
<td class="desc_value">
|
|
<select name="inStatus[<?php echo $idx; ?>]">
|
|
<option value="1" <?php if($isActive) echo "selected";?> ><?php echo $lab_Field_site801_007 ; ?></option>
|
|
<option value="0" <?php if(!$isActive) echo "selected";?> ><?php echo $lab_Field_site801_008 ; ?></option>
|
|
<option value="2"><?php echo $lab_Field_site801_009 ; ?></option>
|
|
</select>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="desc"><?php echo $lab_Field_site801_024 ; ?></td>
|
|
<td class="desc_value"><b><span id="pw_<?php echo $idx; ?>"><?php echo htmlspecialchars($loginValue, ENT_QUOTES, 'UTF-8'); ?></span>.123</b> <?php echo $lab_Field_site801_025 ; ?></td>
|
|
</tr>
|
|
<tr>
|
|
<td class="desc"><?php echo $lab_Field_site801_023 ; ?></td>
|
|
<td class="desc_value">
|
|
<?php
|
|
foreach ($regionList as $regIdx => $regDesc)
|
|
{
|
|
$regChecked = in_array($regDesc, $uRegionDesc) ? 'checked' : '';
|
|
echo"<INPUT TYPE=CHECKBOX NAME=\"inRegion[$idx][$regIdx]\" VALUE=\"1\" $regChecked> $regDesc ";
|
|
}
|
|
?>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
|
|
<div class="head_tag"><?php echo $lab_Tag_site801_004 ;?></div>
|
|
<div class="tag">
|
|
<table class="desc_val">
|
|
<tr>
|
|
<td class="label"><?php echo $lab_Field_site801_013 ;?></td>
|
|
<td class="label"><?php echo $lab_Field_site801_014 ;?></td>
|
|
<td class="label"></td>
|
|
</tr>
|
|
<?php
|
|
foreach ($profileArr as $p)
|
|
{
|
|
$proChecked = ($p["PRO_ID"]==$defProID) ? 'checked' : '';
|
|
echo"
|
|
<tr>
|
|
<td class='field_center'>".$p["PRO_NAME"]."</td>
|
|
<td class='field_center'>".$p["PRO_DESCRIPTION"]."</td>
|
|
<td class='field_center'><INPUT TYPE=CHECKBOX NAME=\"inProfile[$idx][".$p["PRO_ID"]."]\" VALUE=\"1\" $proChecked></td>
|
|
</tr>
|
|
";
|
|
}
|
|
?>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<?php
|
|
}
|
|
?>
|
|
|
|
<div class="tag100">
|
|
<div class="tag_buttons">
|
|
<a class="btn btn-info btn-sm" style="text-decoration: none;" href="./?pg=site801" role="button"><?php echo $lab_ButtonName_Cancel; ?></a>
|
|
<INPUT class='btn btn-success btn-sm' TYPE='SUBMIT' NAME='subUserSave' VALUE="<?php echo $lab_ButtonName_Save; ?>">
|
|
</div>
|
|
</div>
|
|
</FORM>
|
|
<?php
|
|
}
|
|
}
|
|
|
|
}
|
|
else showFooterWarningAccessNotification($lab_FooterWarningAccessNotification_001);
|
|
?>
|