<?php
// THE BONIFMEISTER CAN SWIM INTO FIRE
//////////////////////////////////////
function logged_in()
{
	@session_start();
	if (isset($_SESSION['current_user'])) return true;
	else return false;
}

function log_connexion($id,$type)
{
	if ($type == 1)
		{
			$last_log = pg_fetch_array(r_exec('local',"select timestamp_log from connections where contact_id=".$id." and connection_type=1 order by timestamp_log desc limit 1",false));
			$_SESSION['last_login'] = date_format(date_create($last_log[0]),'d/m/Y H:i:s');
		}	
	$temps=date("Y-m-d H:i:s");
	if (r_exec('local',"insert into connections (contact_id,timestamp_log,ip_addr,connection_type,login) values ('".$id."','".$temps."','".$_SERVER['REMOTE_ADDR']."','".$type."','".$_SESSION['current_hdl']."')"))
		return true;
	return false;
}

function log_in($id_contact,$nom,$prenom,$hdl)
{
	session_start();
	$_SESSION['current_user'] = $id_contact;
	$_SESSION['current_hdl'] = $hdl;
	$_SESSION['current_name'] = $nom;
	$_SESSION['current_firstname'] = $prenom;
	if (isset($_SESSION['current_user']))
		{
			log_connexion($id_contact,1);
			return true;
		}
	else return false;
}

function bad_login($username)
{
	$temps=date("Y-m-d H:i:s");
	$data = pg_fetch_array(r_exec('local',"select id_contact from contact where nichandle='".$username."'",false));
	if ($data[0] == '') $id = -999;
		else $id = $data[0];
	if (r_exec('local',"insert into connections (contact_id,timestamp_log,ip_addr,connection_type,login) values (".$id.",'".$temps."','".$_SERVER['REMOTE_ADDR']."',2,'".$username."')"))
		return true;
	return false;
}

function too_many_attempts($type,$value)
{
	$data = pg_fetch_array(r_exec('local',"select s_value from settings where s_name='max_connections'",false));
	$nb_max = $data[0];
	$data = pg_fetch_array(r_exec('local',"select s_value from settings where s_name='minutes_before_retry'",false));
	$time2block = $data[0];
	$req = "select count(connection_id) from connections where connection_type=2 and timestamp_log>CURRENT_TIMESTAMP - INTERVAL '".$time2block."' MINUTE";
	if ($type == 'ip')
		$req.= " and ip_addr='".$value."'";
	else $req.= " and login='".$value."'"; 
	$data = pg_fetch_array(r_exec('local',$req,false));
	if ($data[0]>=$nb_max)
		{
			$email_alert = pg_fetch_result(r_exec('local',"select s_value from settings where s_name='email_alert'",false),0);
			$texte = "Un echec de connexion a &#233;t&#233; d&#233;tect&#233;<br> Tentatives : ".$data[0]."<br>".$type." : ".$value."<br>Bloqu&#233; pour : ".$time2block." minutes.<br><br>";
			$texte.= " Consultez l'interface d'administration pour plus d'informations.<br><br>";
			envoi_mail($texte,"[Echec authentification] Blocage ".$type." ".$value,$email_alert,-1,'Authentification',-1);
			return true;
		}
	return false;
}

function from_http()
{
	if (isset($_SERVER['HTTP_HOST']) && isset($_SERVER['REQUEST_URI']))
		return true;
	return false;
}

function admin($id_user)
{
	return pg_num_rows(r_exec('local',"select id_contact from contact where id_contact=".$id_user." and is_admin=1",false));
}

function passwd_equals($str1, $str2)
{
	if(strlen($str1) != strlen($str2))
		{
			return false;
		}
	else
		{
			$res = $str1 ^ $str2;
			$ret = 0;
			for($i = strlen($res) - 1; $i >= 0; $i--)
				$ret |= ord($res[$i]);
			return !$ret;
		}
}

function valid_date($date, $format = 'Y-m-d H:i:s')
{
	$d = DateTime::createFromFormat($format, $date);
	return $d && $d->format($format) == $date;
}

function duree($d1,$d2)
{
	$total=strtotime($d1)-strtotime($d2);
	$jours=floor($total/86400);
	$reste=$total%86400;
	$heures=floor($reste/3600);
	$reste=$reste%3600;
	$minutes=floor($reste/60);
	$secondes=$reste%60;
	return $jours."j ".$heures."h ".$minutes."m ".$secondes."s ";
}

function strtoupper_fr($string) {
   $string = strtoupper($string);
   $string = str_replace(
      array("'", 'é', 'è', 'ê', 'ë', 'à', 'â', 'î', 'ï', 'ô', 'ù', 'û', 'ç'),
      array("''",'E', 'E', 'E', 'E', 'A', 'A', 'I', 'I', 'O', 'U', 'U', 'C'),
      $string
   );
   return $string;
}

function r_exec($base,$req,$record = true)
{
	require "connect_".$base.".php";
	$res_req = pg_query ($dbconn, $req);
	if (!$res_req) 
		echo $base." : ".$req."<br>".pg_last_error()."<br>";
	else 
		{
		if ($record)
			{
				require "connect_local.php";
				if (isset($_SESSION['current_user'])) $remote_user=$_SESSION['current_user'];
					else $remote_user="unknown";
				if (isset($_SERVER['REMOTE_ADDR'])) $remote_addr=$_SERVER['REMOTE_ADDR'];
                                        else $remote_addr="unknown";
				if (isset($_SERVER['HTTP_REFERER'])) $http_referer=$_SERVER['HTTP_REFERER'];
                                        else $http_referer="unknown";

				$log = "insert into sql_log (logtime,base,sqlreg,who,ipaddr,page) values('".date("Y-m-d H:i:s")."','".$base."','".str_replace("'","''",$req)."','".$remote_user."','".$remote_addr."','".$http_referer."')";
				$ins = pg_query ($dbconn, $log);
			}
		return $res_req;
		}
	pg_close($dbconn); 
}

function new_serial($extension)
{
	$serial = intval(date('Ymd')."00");
	$verif = pg_fetch_array(r_exec('local',"select serial_num from prod,domaine_extension where prod.id_extension=domaine_extension.id_extension and nom_extension='.".$extension."' order by serial_num desc limit 1",false)); 
	if ($verif[0] >= $serial)
		$serial=$verif[0]+1;
	return $serial;
}

function info($mess,$titre = " - Information - ")
{
	echo "<center><table border=0 width=70%><tr><td><fieldset><legend>".$titre."</legend>".$mess."</fieldset></table></center>";
}

function titre($text)
{
	echo "<center><table border=0 width=53%><tr><td><font size=4><b><u>".$text."</u></b></font></table><br></center>";
}

function jmahm($val)
{
	return substr($val,8,2)."/".substr($val,5,2)."/".substr($val,0,4)." ".substr($val,11,5);
}

function jma($val)
{
	return substr($val,8,2)."/".substr($val,5,2)."/".substr($val,0,4);
}

function verif_date($date, $format = 'd-m-Y')
{
	$dt = DateTime::createFromFormat($format, $date);
	return $dt && $dt->format($format) === $date;
}

function random_str($nbr) {
    $str = "";
    $chaine = "abcdefghijklmnpqrstuvwxyABCDEFGHIJKLMNOPQRSUTVWXYZ0123456789";
    $nb_chars = strlen($chaine);

    for($i=0; $i<$nbr; $i++)
    {
        $str .= $chaine[ rand(0, ($nb_chars-1)) ];
    }

    return $str;
}

function registrar($id)
{
if ($id != '')
	{	
		$req = "select designation,nom,prenom,nichandle from registrar where id_registrar=".$id;
		$result =  r_exec('local',"select designation,nom,prenom,nichandle from registrar where id_registrar=".$id,false);
		$data = pg_fetch_row($result);
		if (pg_num_rows($result) > 0)
			{
				if ($data[0] !='') return $data[0]."<br>(".$data[3].")";
					else return $data[1]." ".$data[2]." <br>(".$data[3].")";
			}
		else return false;
	}
else return false;
}

function del_opid($opid)
{
	if (r_exec('remote',"delete from pending where opid=".$opid))
		return r_exec('local',"delete from request_log where opid=".$opid);
}

function del_pending_request($opid)
{
	return r_exec('remote',"delete from pending where opid=".$opid);
}

function update_pending_request($opid,$status)
{
	$ts_check=date('Y-m-d H:i:s');
	return r_exec('remote',"update pending set status=".$status.", timestamp_check='".$ts_check."' where opid=".$opid." and status=0");
}

function log_request($opid)
{
	$req="select object,object_id,value_old,value_new,timestamp_request,timestamp_check,status,field,parent_id,id_user,id_registrar from pending where opid=".$opid;
	$result = r_exec('remote',$req,false);

	while ($row = pg_fetch_row($result))
	{	
		if (isset($_SESSION['current_user']) && $_SESSION['current_user']!='') $id_admin = $_SESSION['current_user'];    // SI PAS DE VARIABLE DE SESSION USER C'ET QU'ON VIENT D'UN SCRIPT AUTO
			else $id_admin = $row[9];		
		$ins= "insert into request_log (object,object_id,value_old,value_new,timestamp_request,timestamp_check,status,field,parent_id,id_user,id_registrar,opid,invoice_status,id_admin)";
		$ins.=" values('".$row[0]."',".$row[1].",'".str_replace("'","''",$row[2])."','".str_replace("'","''",$row[3])."','".$row[4]."','".$row[5]."',".$row[6].",'".$row[7]."',".$row[8].",".$row[9].",".$row[10].",".$opid.",0,".$id_admin.")";
		$res_ins = r_exec('local',$ins);
	}
	return $res_ins;
}

function verif_infos($rs,$nom,$addr1,$cp,$ville,$tel1,$email,$id_registrar=-1,$passwd = "12345678",$passwd_c = "12345678")
{
	if ($rs.$nom == '') return "Au moins la soci&#233;t&#233; ou le nom doit &#234;tre renseign&#233;.";
	if ($addr1 == '') return "L'adresse est obligatoire.";
	if ($cp == '') return "Le code postal est obligatoire.";
	if ($ville == '') return "La ville est obligatoire.";
	if ($tel1.$email == '') return "Au moins le t&#233;l&#233;phone ou l'email doit &#234;tre renseign&#233;.";
	if ($id_registrar == -1) return "Le bureau d'enregistrement parent est obligatoire.";
	if ($passwd != $passwd_c) return "Les mots de passe ne correspondent pas.";
	if (strlen($passwd)<8) return "Le mot de passe doit faire au moins 8 caract&#232;res.";

	return 1;
}
function exist_domain($domaine)
{
	$req = "select concat(d_nom,nom_extension) from domaine, domaine_extension where domaine.id_extension=domaine_extension.id_extension and concat(d_nom,nom_extension) = '".$domaine."' and id_status not in (98,99)";
	$val = pg_fetch_array(r_exec('local',$req,false));
	if ($val) return true;
		else return false;;	
}

function bsa_blocked($domaine)
{
	$dom = explode(".",$domaine);
	$req = "select count(domain_label) from bsa_labels,bsa_suborders where domain_label='".$dom[0]."' and bsa_labels.suborder_id=bsa_suborders.suborder_id and bsa_suborders.status='Active'";
	$nb = pg_fetch_result(r_exec('local',$req,false),0);
	if ($nb > 0) return true;
	return false;
}

function login_ok($login)
{
	$handle = "-MCNIC";
	if (strtoupper(substr($login,-6)) != $handle)
		return false;
	$i = 0;
	$tab= array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","0","1","2","3","4","5","6","7","8","9","-");
	while ($i<strlen($login))
		{
			if (in_array($login[$i],$tab))
				$i++;
			else return false;
		}
	return true;
}

function syntaxe_ok($domaine,$qui = "nic" )
{
	$taillemax = 66;
	$i=0;
	$point = 0;
	$tab= array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9","-",".");
	while ($i<strlen($domaine))
		{
			if ($domaine[$i] == "-" && $domaine[$i+1] == "-") return false;

			if ($domaine[$i]==".")
				$point++;
			if (in_array($domaine[$i],$tab))
				$i++;
			else return false;
		}

	if (strlen(strstr($domaine,'.',true)) < 3) return false;
	if ($qui != "nic" && $point > 1) return false;
	if ($i>$taillemax) return false;
	if ($domaine[0] == "-" || $domaine[strlen($domaine)-4] == "-") return false;
	if ($qui == "nic")
		{
			$ext = pg_fetch_result(r_exec('local',"select count(id_extension) from domaine_extension where nom_extension='".strstr($domaine,'.')."'",false),0);
			if ($ext == 0) return false;
		}
	return true;
}

function exist_contact($cont)
{
	$cont_id = pg_fetch_array(r_exec('local',"select id_contact from contact where nichandle='".$cont."'",false));
        if ($cont_id[0])
		return $cont_id[0];
        else 
		{
			echo "Contact ".$cont." non trouv&#233;<br>";
			return false;
		}
}

function type_request($opid)
{
	$result = r_exec('remote',"select object,object_id from pending where opid=".$opid,false);
	while ($row = pg_fetch_row($result))
	{
  		if ($row[0] == 'domaine' && $row[1] == -1) return 1; // CREATION DOMAINE
		if ($row[0] == 'contact' && $row[1] == -1) return 2; // CREATION CONTACT
		if ($row[0] == 'domaine' && $row[1] != -1 && $row[2] == '--del') return 3; //SUPPRESSION DOMAINE
		if ($row[0] == 'contact' && $row[1] != -1 && $row[2] == '--del') return 4; //SUPPRESSION CONTACT
		if ($row[0] == 'domaine' && $row[1] != -1) return 5; // MODIF  DOMAINE
		if ($row[0] == 'contact' && $row[1] != -1) return 6; // MODIF CONTACT		
		if ($row[0] == 'registrar' && $row[1] != -1 ) return 7; //MODIF REGISTRAR
		if ($row[0] == 'registrar' && $row[1] == -1 ) return 8; //CREATION REGISTRAR
		if ($row[0] == 'registrar' && $row[1] != -1 && $row[2] == '--del') return 9; //SUPPRESSION REGISTRAR
		if ($row[0] == 'nameserver' && $row[1] != -1 ) return 10; // MODIF NAMESERVER
	}
}

function contact_create($opid,$who)
{
	$result = r_exec('remote',"select field,value_new,timestamp_request,id_user from pending where opid=".$opid." and object='contact' and object_id=-1",false);
	while ($row = pg_fetch_row($result))
        {
		$row[1] = str_replace("'","''",$row[1]);  // POUR VALIDER LES APOSTROPHES

		if ($row[0] == 'nichandle') $nchdl=$row[1];
                if ($row[0] == 'type') $type=$row[1];
		if ($row[0] == 'passwd') $passwd=$row[1];
		if ($row[0] == 'rs') $rs=$row[1];
                if ($row[0] == 'nom') $nom=$row[1];
		if ($row[0] == 'prenom') $prenom=$row[1];
		If ($row[0] == 'addr1') $addr1=$row[1];
		if ($row[0] == 'addr2') $addr2=$row[1];
		if ($row[0] == 'cp') $cp=$row[1];
		if ($row[0] == 'ville') $ville=$row[1];
		if ($row[0] == 'pays') $pays=$row[1];
		if ($row[0] == 'tel1') $tel1=$row[1];
		if ($row[0] == 'tel2') $tel2=$row[1];
		if ($row[0] == 'email') $email=$row[1];
		if ($row[0] == 'is_admin') $is_admin=$row[1];
		if ($row[0] == 'is_registrar') $is_registrar=$row[1];
		if ($row[0] == 'id_registrar') $id_registrar=$row[1];
		$date_creation=$row[2];
	}

        $insert = "insert into contact (kd_contact, nichandle,nom, prenom, adresse1, adresse2, cp, ville, tel1, tel2, email, id_registrar_parent,code_pays,timestamp_creation, id_ident_creation,societe,";
	$insert .= "status,is_admin,is_registrar,passwd)";
	$insert .= " values (".$type.",'".$nchdl."','".$nom."','".$prenom."','".$addr1."','".$addr2."','".$cp."','".$ville."','".$tel1."','".$tel2."','".$email."',".$id_registrar.",'".$pays."','".$date_creation."',";
	$insert .= $who.",'".$rs."',1,".$is_admin.",".$is_registrar.",'".$passwd."')";
	
	if (r_exec('local',$insert)) return 1;	
}

function contact_update($opid)
{
	$result = r_exec('remote',"select field,value_new,timestamp_request,id_user,object_id from pending where opid=".$opid." and object='contact'",false);
        while ($row = pg_fetch_row($result))
        {
		$row[1] = str_replace("'","''",$row[1]);  // POUR VALIDER LES APOSTROPHES

		if ($row[0] == 'status')
                	$insert = "set status=".substr($row[1],1,1);

          	if ($row[0] == 'rs')
			$insert = "set societe='".$row[1]."'";

    		if ($row[0] == 'nom')
                	{
                        	if ($insert) $insert.=",nom='".$row[1]."'";
                                	else $insert.= "set nom='".$row[1]."'";
                       	}
		if ($row[0] == 'prenom')
                	{
                        	if ($insert) $insert.=",prenom='".$row[1]."'";
                                	else $insert.= "set prenom='".$row[1]."'";
                 	}
   		if ($row[0] == 'addr1')
			{
                        	if ($insert) $insert.=",adresse1='".$row[1]."'";
                                	else $insert.= "set adresse1='".$row[1]."'";
           		}
		if ($row[0] == 'addr2')
                	{
                        	if ($insert) $insert.=",adresse2='".$row[1]."'";
                                	else $insert.= "set adresse2='".$row[1]."'";
             		}
                if ($row[0] == 'cp')
                	{
                		if ($insert) $insert.=",cp='".$row[1]."'";
                                	else $insert.= "set cp='".$row[1]."'";
            		}
           	if ($row[0] == 'ville')
                	{
                        	if ($insert) $insert.=",ville='".$row[1]."'";
                                 	else $insert.= "set ville='".$row[1]."'";
                  	}
          	if ($row[0] == 'pays')
                	{
                        	if ($insert) $insert.=",code_pays='".$row[1]."'";
                                  	else $insert.= "set code_pays='".$row[1]."'";
               		}
         	if ($row[0] == 'tel1')
                	{
				if ($insert) $insert.=",tel1='".$row[1]."'";
                                	else $insert.= "set tel1='".$row[1]."'";
             		}
		if ($row[0] == 'tel2')
			{
				if ($insert) $insert.=",tel2='".$row[1]."'";
					else $insert.= "set tel2='".$row[1]."'";
			}
		if ($row[0] == 'email')
			{
				if ($insert) $insert.=",email='".$row[1]."'";
					else $insert.= "set email='".$row[1]."'";
			}

		if ($row[0] == 'id_registrar')
                        {
                                if ($insert) $insert.=",id_registrar_parent='".$row[1]."'";
                        		else $insert.= "set id_registrar_parent='".$row[1]."'";
			}
		if ($row[0] == 'is_registrar')
			{
				if ($insert) $insert.=",is_registrar='".$row[1]."'";
					else $insert.= "set is_registrar='".$row[1]."'";
			}
		if ($row[0] == 'is_admin')
			{
				if ($insert) $insert.=",is_admin='".$row[1]."'";
					else $insert.= "set is_admin='".$row[1]."'";
			}
		if ($row[0] == 'passwd')
			{
				if ($insert) $insert.=",passwd='".$row[1]."'";
					else $insert.= "set passwd='".$row[1]."'";
			}

     		$date_modif=$row[2];
                $registrar=$row[3];
		$object_id=$row[4];
        }
	if (r_exec('local',"update contact ".$insert." where id_contact=".$object_id)) return 1;
}

function contact_copy($old_id,$id_registrar,$id_user)
{
	$opid = create_OPID();
	$parent_id = new_parent_id('contact',-1,$id_user);

	$req = "select nom,prenom,adresse1,adresse2,cp,ville,tel1,tel2,email,code_pays,societe,is_admin,is_registrar,passwd from contact where id_contact=".$old_id;
	$data = pg_fetch_array(r_exec('local',$req,false));

	$nichandle = create_nc_hdl($data['nom'],$data['prenom'],$data['societe']);
	if ($data['is_admin'] == 1) $is_admin=1;
		else $is_admin=0;
	request('contact','nichandle',-1,'',$nichandle,$parent_id,$opid,$id_user,$id_registrar);
	request('contact','type',-1,'',1,$parent_id,$opid,$id_user,$id_registrar);
	request('contact','rs',-1,'',$data['societe'],$parent_id,$opid,$id_user,$id_registrar);
	request('contact','nom',-1,'',$data['nom'],$parent_id,$opid,$id_user,$id_registrar);
	request('contact','prenom',-1,'',$data['prenom'],$parent_id,$opid,$id_user,$id_registrar);
	request('contact','addr1',-1,'',$data['adresse1'],$parent_id,$opid,$id_user,$id_registrar);
	request('contact','addr2',-1,'',$data['adresse2'],$parent_id,$opid,$id_user,$id_registrar);
	request('contact','cp',-1,'',$data['cp'],$parent_id,$opid,$id_user,$id_registrar);
	request('contact','ville',-1,'',$data['ville'],$parent_id,$opid,$id_user,$id_registrar);
	request('contact','pays',-1,'',$data['code_pays'],$parent_id,$opid,$id_user,$id_registrar);
	request('contact','tel1',-1,'',$data['tel1'],$parent_id,$opid,$id_user,$id_registrar);
	request('contact','tel2',-1,'',$data['tel2'],$parent_id,$opid,$id_user,$id_registrar);
	request('contact','email',-1,'',$data['email'],$parent_id,$opid,$id_user,$id_registrar);
	request('contact','id_registrar',-1,'',$id_registrar,$parent_id,$opid,$id_user,$id_registrar);
	request('contact','is_registrar',-1,'',$data['is_registrar'],$parent_id,$opid,$id_user,$id_registrar);
	request('contact','passwd',-1,'',$data['passwd'],$parent_id,$opid,$id_user,$id_registrar);
	request('contact','is_admin',-1,'',$is_admin,$parent_id,$opid,$id_user,$id_registrar);

//	if (admin($id_user))
//		{
			if (contact_create($opid,$id_user) == 1)
				if (update_pending_request($opid,'1'))
					if (log_request($opid))
						return nchdl2id($nichandle,'contact');
//		}
	return 0;	
}

function contact_delete($opid)
{
	$id_c = pg_fetch_result(r_exec('remote',"select object_id from pending where opid=".$opid." and object='contact' and field='--del'",false),0);
	$actifs = pg_fetch_result(r_exec('local',"select count(id_contact) from dom_contacts,domaine where id_contact=".$id_c." and domaine.id_domaine=dom_contacts.id_domaine and id_status not in (98,99)",false),0);
	if ($actifs<1)
		{
			if (r_exec('local',"update contact set status=99 where id_contact=".$id_c))
				return 1;
			else return 0;
		}
	else
	 	{
			$message = " Ce contact a ".$actifs." domaine(s) actif(s).<br>".$message;
			return 0;
		}
}

function modif_dom_contact($dom_id,$contact_nchdl,$type)
{
	$data = pg_fetch_array(r_exec('local',"select id_contact from contact where nichandle='".$contact_nchdl."'",false));
	if (r_exec('local',"update dom_contacts set id_contact=".$data[0]." where id_domaine=".$dom_id." and type_contact=".$type))
		return 1;
	else return 0;
}

function ns_update($opid)
{
	$result = r_exec('remote',"select field,value_new,object_id from pending where opid=".$opid." and object='nameserver'",false);
        while ($row = pg_fetch_row($result))
        {
                if ($row[0] == 'ns')
                        $insert = "set nameserver='".$row[1]."'";
		if ($row[0] == 'ip')
			{
                        	if ($insert) $insert.=",ipv4='".$row[1]."'";
					else $insert.= "set ipv4='".$row[1]."'";
			}
		$object_id = $row[2];
	}
	if (r_exec('local',"update nameserver ".$insert." where id_nameserver=".$object_id))
		return 1;
	else return 0;
}	

function dns_id($nameserver)
{
	$data = pg_fetch_array(r_exec('local'," select id_nameserver from nameserver where nameserver='".$nameserver."'",false));
	if ($data[0] == "")
	{
		// c'est un nouveau nameserver alors on le cree d'abord
		$action = r_exec('local',"insert into nameserver (ipv4, nameserver) values ('0.0.0.0','".$nameserver."');");
		$cherche_dns = " select id_nameserver from nameserver where nameserver='".$nameserver."'";
		$data2 = pg_fetch_array(r_exec('local',$cherche_dns,false));
		return $data2[0];
	}
        else return $data[0];
}

function syntaxe_ip($addr)
{
	if (filter_var($addr, FILTER_VALIDATE_IP) !== false)
		return true;
	return false;
//	$i=0;
//	$point=0;
  //      $tab= array("0","1","2","3","4","5","6","7","8","9",".");
    //    while ($i<strlen($addr))
      //          {
      //                  if (in_array($addr[$i],$tab))
	//			{
	//				if ($addr[$i] == ".") $point++;
          //                      	$i++;
	//			}
          //              else return false;
            //    }
//	if ($point!=3) return false;


//        return true;
}
function dns_doublon($dns1,$dns2,$dns3,$dns4,$dns5,$dns6,$dns7,$dns8)
{
	$t_dns = array($dns1,$dns2,$dns3,$dns4,$dns5,$dns6,$dns7,$dns8);
	for($i=0;$i<8;$i++)
		for($j=$i+1;$j<8;$j++)
			if ($t_dns[$i] == $t_dns[$j] && $t_dns[$j]!="")
			//	echo "double ".$t_dns[$j]."<br>";
				return true;
	return false;
}

function dns_ok($nameserver)
{
	// Vérification de la syntaxe du nom de domaine avec une expression régulière
	if (!preg_match('/^[a-zA-Z0-9.-]+$/', $nameserver))
		return false;
    
	// Vérification que le champ ne commence pas par un "." et ne se termine pas par "."
	if (preg_match('/^\./', $nameserver) || preg_match('/\.$/', $nameserver))
		return false;

	// Vérification de l'existence du serveur DNS
	$ip = gethostbyname($nameserver);
	if ($ip === $nameserver)
		return false;

	return true;
}

function dns_ok_old($nameserver)
{
	$i=0;
	$point=0;
	$tab= array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9","-",".");
	while ($i<strlen($nameserver))
		{
			if ($nameserver[$i] == ".") $point++;
			if (in_array($nameserver[$i],$tab))
				$i++;
			else return false;
		}
	if ($nameserver[$i-1] != "." && $nameserver[$i-2] != "." && $nameserver[0] != ".") // le premier et les deux derniers caracteres ne peuvent pas etre un point
		if ($point > 0) // Un fqdn a au moins 1 point 
			if (!syntaxe_ip($nameserver))
				return true;
	return false;
}

function domain_status_update($id,$old,$new)
{
//	echo "old=".$old.", new=".$new;
	if (r_exec('local',"update domaine set id_status=".$new." where id_domaine=".$id." and id_status=".$old))
		return 1;
	else return 0;
}

function dnssec_update($id_dom,$keytag = false,$algorithm = false,$digesttype = false,$keydigest = false)
{
	$exist = pg_num_rows(r_exec('local',"select id_dom from dnssec where id_dom=".$id_dom,false));

	if ( $exist>0 && $keytag == 0 && $algorithm == 0 && $digesttype == 0 & $keydigest == "off")
		if (r_exec("local","delete from dnssec where id_dom=".$id_dom))
			return 1;
		
	if ($exist == 0 && $keytag && $algorithm && $digesttype && $keydigest) //  IL EXISTE PAS ON CREE
		{
			$res = r_exec("local","insert into dnssec (id_dom,keytag,algorithm,digest_type,key_digest) values(".$id_dom.",".$keytag.",".$algorithm.",".$digesttype.",'".$keydigest."')");
			if ($res) return 1;
		}
	else   // DONC C'EST JUSTE UNE MAJ
		{
			if ($keytag) $req = "keytag=".$keytag;
			if ($algorithm)
				{
					if ($req) $req.=",";
					$req .="algorithm=".$algorithm;
				}
			if ($digesttype)
                        	{
                                	if ($req) $req.=",";
                   			$req .="digest_type=".$digesttype;
          			}
			if ($keydigest)
                		{
                                	if ($req) $req.=",";
                                	$req .="key_digest='".$keydigest."'";
                        	}
			echo $req;
			$res = r_exec("local","update dnssec set ".$req." where id_dom=".$id_dom);
			if ($res) return 1;
		}
	return 0;
}

function dns_ordre_ok($id_dom)
{
	$req = r_exec('local',"select id_nameserver,ordre from dns_domain where id_domaine=".$id_dom." order by ordre",false);
	$nb = 0;
	while ($row = pg_fetch_row($req))
		{
			$nb++;
		//	$tab_dns['id']=$row[0];
		//	$tab_dns['ordre']=$row[1];
			if ($row[1] != $nb) r_exec('local',"update dns_domain set ordre=".$nb." where id_domaine=".$id_dom." and id_nameserver=".$row[0]);
		}
}

function domain_update($opid)
{
	$retour = 0;
	$result = r_exec('remote',"select object,object_id,field,value_old,value_new,timestamp_request,parent_id,id_user from pending where opid=".$opid." and object='domaine' order by pending_id",false);
	$nb_dns=0;
        while ($row = pg_fetch_row($result))
        {
		$id_dom=$row[1];
		if ($row[2] == 'ndd') $retour = domain_ndd_update($id_dom,$row[3],$row[4]);
		if ($row[2] == 'status') $retour = domain_status_update($id_dom,$row[3],$row[4]);
		elseif ($row[2] == 'registrar') $retour = domain_transfer($id_dom,$row[3],$row[4]);
                	elseif ($row[2] == 'tit') $retour = modif_dom_contact($row[1],$row[4],1);
                		elseif ($row[2] == 'adm') $retour = modif_dom_contact($row[1],$row[4],3);
                			elseif ($row[2] == 'tec') $retour = modif_dom_contact($row[1],$row[4],4);
               					elseif (substr($row[2],0,3)=='DNS')
               						{
								$nb_dns++;
               							$tab_dns[$nb_dns]['old'] = $row[3];
								$tab_dns[$nb_dns]['new'] = $row[4];
								$tab_dns[$nb_dns]['ordre'] = substr($row[2],3,1);
							}
							elseif ($row[2] == 'keytag') $keytag=$row[4];
								elseif ($row[2] == 'algorithm') $algorithm=$row[4];
									elseif ($row[2] == 'digesttype') $digesttype=$row[4];
										elseif ($row[2] == 'keydigest') $keydigest=$row[4];
											elseif ($row[2] == 'expiration' || $row[2] == 'renew') $retour=domain_expiration_update($id_dom,$row[3],$row[4]);
												elseif ($row[2] == 'autorenew') $retour=autorenew_update($id_dom,$row[3],$row[4]);
	}
	if (isset($keytag) || isset($algorithm) || isset($digesttype) || isset($keydigest))
		$retour = dnssec_update($id_dom,$keytag,$algorithm,$digesttype,$keydigest);
	if ($nb_dns>0)
		{
			for ($i=1;$i<=$nb_dns;$i++)
			{
				if ($tab_dns[$i]['new'] != '') $ns_new = dns_id($tab_dns[$i]['new']);   // RECHERCHE DE L'ID DU NAMESERVER A AJOUTER
				if ($tab_dns[$i]['old'] != '') $ns_old = dns_id($tab_dns[$i]['old']);   // RECHERCHE DE L'ID DU NAMESERVER A SUPPRIMER

				if ($tab_dns[$i]['new'] =='')   // on suppirme
					$req = "delete from dns_domain where id_domaine=".$id_dom." and id_nameserver=".$ns_old;

				else
					{
						$existe=pg_fetch_array(r_exec('local',"select count(id_nameserver) from dns_domain where id_domaine=".$id_dom." and id_nameserver=".$ns_new,false));
						if ($existe[0] == 0)
							{
								if ($tab_dns[$i]['old'] =='')  // un nouveau, on l'ajoute
									$req = "insert into dns_domain (id_domaine, id_nameserver, ordre) select ".$id_dom.",".$ns_new.",max(ordre)+1 from dns_domain where id_domaine=".$id_dom;

								else // C'est un update
									$req = "update dns_domain set id_nameserver=".$ns_new." where id_domaine=".$id_dom." and id_nameserver=".$ns_old;
							}
						else $retour = "Probl&#233;me avec les serveurs DNS (doublon).";
					}

				$upd = r_exec('local',$req);
				if ($upd) $retour = 1;
			}
			dns_ordre_ok($id_dom);				
		}
return $retour;
}

function domain_expiration_update($id_dom,$date_old,$date_new)
{
	if (r_exec('local',"update domaine set d_date_expiration=to_date('".$date_new."','yyyy-mm-dd') where id_domaine=".$id_dom))
		return 1;
}

function autorenew_update($id_dom,$old,$new)
{
        if (r_exec('local',"update domaine set d_auto_renew=".$new." where id_domaine=".$id_dom." and d_auto_renew=".$old))
                return 1;
}

function domain_transfer($id_dom,$old,$new)
{
	if (r_exec('local',"update domaine set id_registrar=".$new." where id_domaine=".$id_dom." and id_registrar=".$old))
		return 1;
}
function domain_delete($opid)
{
	$data = pg_fetch_array(r_exec('remote',"select object_id from pending where opid=".$opid." and object='domaine' and field='--del'",false));
	if (r_exec('local',"update domaine set id_status=4 where id_domaine=".$data[0]))
		return 1;	
}
	
function domain_create($opid)
{
	$result = r_exec('remote',"select object,object_id,field,value_old,value_new,timestamp_request,parent_id,id_user from pending where opid=".$opid." and object='domaine' and object_id=-1 order by pending_id",false);
	$nb_dns=0;
        while ($row = pg_fetch_row($result))
	{
		if ($row[2] == 'ndd') $ndd=$row[4];
		if ($row[2] == 'autorenew') $autorenew=$row[4];
		if ($row[2] == 'registrar') $registrar=$row[4];
		if ($row[2] == 'tit') $tit=$row[4];
		if ($row[2] == 'adm') $adm=$row[4];
		if ($row[2] == 'tec') $tec=$row[4];
		if ($row[2] == 'rci') $rci=$row[4];
		if (substr($row[2],0,3)=='DNS')
			{
				$tab_dns[$nb_dns] = $row[4];
				$nb_dns++;
			}
		$date_creation=$row[5];
	}
	// Extension
	$domaine=strstr($ndd,'.',true);
	$ext=strstr($ndd,'.');
	$id_ext = pg_fetch_result(r_exec('local',"select id_extension from domaine_extension where nom_extension='".$ext."'",false),0);

	// Dates debut fin
	$date_rec = date("Y-m-d H:i:s");
	$date_fin = date('Y-m-d H:i:s',strtotime('+1 year'));

	//////////////// SI c'est bon on passe a l'enregistrement
	$tit_id = exist_contact($tit);
	$adm_id = exist_contact($adm);
	$tec_id = exist_contact($tec);
	if ($tit_id && $adm_id && $tec_id)
	{
		// insert des DNS
                //
                for ($i=0;$i<$nb_dns;$i++)
                {
			// D'abord, existent-ils ?
                        if (pg_num_rows(r_exec('local',"select id_nameserver from nameserver where nameserver='".$tab_dns[$i]."'",false)) == 0) // pas trouve, on le cree
					$result = r_exec('local',"insert into nameserver (nameserver,ipv4) values('".$tab_dns[$i]."','0.0.0.0')");
                }
		// insert du domaine	
			$dom_ins="insert into domaine (id_extension,id_status,d_nom,d_date_demande,d_date_enregistrement,d_date_expiration,id_registrar,d_pj,d_auto_renew)";
			$dom_ins.=" values(".$id_ext.",1,'".$domaine."','".$date_creation."','".$date_rec."','".$date_fin."',".$registrar.",'".$rci."',".$autorenew.")";
			$result = r_exec('local',$dom_ins);

			// id domaine ?
			$dom_id = pg_fetch_result(r_exec('local',"select id_domaine from domaine where d_nom='".$domaine."' and id_extension=".$id_ext." and id_status=1",false),0);

			// insert des correspondances contacts
			$insert_tit = "insert into dom_contacts (id_domaine,id_contact,type_contact) values (".$dom_id.",".$tit_id.",1);";
                        $insert_adm = "insert into dom_contacts (id_domaine,id_contact,type_contact) values (".$dom_id.",".$adm_id.",3);";
                        $insert_tec = "insert into dom_contacts (id_domaine,id_contact,type_contact) values (".$dom_id.",".$tec_id.",4);";
			$result = r_exec('local',$insert_tit.$insert_adm.$insert_tec);
			// insert des corerespondances DNS
			for ($i=0;$i<$nb_dns;$i++)
	                	{
					$dns = pg_fetch_result(r_exec('local',"select id_nameserver from nameserver where nameserver='".$tab_dns[$i]."'",false),0);
					r_exec('local',"insert into dns_domain (id_domaine,id_nameserver,ordre) values(".$dom_id.",".$dns.",".intval($i+1).")");
				}
		return 1;
	}
return 0;
}

function domain_ndd_update($id_dom,$old,$new)
{
	if (!exist_domain($new))
		{
			// Extension
			$domaine=strstr($new,'.',true);
			$ext=strstr($new,'.');
			$data= pg_fetch_array(r_exec('local',"select id_extension from domaine_extension where nom_extension='".$ext."'",false));
			$id_ext = $data[0];
			
			if (r_exec('local',$req = "update domaine set d_nom='".$domaine."',id_extension=".$id_ext." where id_domaine=".$id_dom))
				return 1;
		}
	return 0;
}

function domain_status_change($id_reg,$old,$new,$id_dom)
{
	if ($id_dom == 0)	// CA VEUT DIRE TOUS LES DOMAINES
		{
			$req = "select id_domaine from domaine where id_status=".$old." and id_registrar=".$id_reg;
			$res = r_exec('local',$req,false);
			$nb = 0;
			$nb_ok = 0;
			while ($data = pg_fetch_array($res))
				{
					$nb++;
					$parent_id = new_parent_id('domaine',$data['id_domaine'],1);
					$opid=create_OPID();
					if (request('domaine','status',$data[0],$old,$new,$parent_id,$opid,1,$id_reg))
						if (domain_update($opid))
							if (update_pending_request($opid,'1'))
								if (log_request($opid))
								
	$nb_ok++;
				}
			if ($nb == $nb_ok) return 1;

		//	$req = "select id_domaine from domaine where id_registrar=".$id_reg." and id_status=".$old;
		//	$res = r_exec('local',$req,false);
		//	while ($data = pg_fetch_array($res))
		//		{
		//			$upd = "update domaine set id_status =".$new." where id_domaine=".$data[0]." and id_status=".$old;
		//			if (!r_exec('local',$upd))
		//				return 0;
		//		}
		//	$upd = "update domaine set id_status =".$new." where id_registrar=".$id_reg." and id_status=".$old;
		}
	else 
		{
			$parent_id = new_parent_id('domaine',$data['id_domaine'],1);
			$opid=create_OPID();
			if (request('domaine','status',$id_dom,$old,$new,$parent_id,$opid,1,$id_reg))
				if (domain_update($opid))
					if (update_pending_request($opid,'1'))
						if (log_request($opid))
							return 1;
	//		$upd = "update domaine set id_status =".$new." where id_domaine=".$id_dom." and id_status=".$old;
	//		if (!r_exec('local',$upd))
	//			return 0;
		}
//	if (!r_exec('local',$upd))
//		return 0;
return 0;

}

function registrar_update($opid)
{
	$result = r_exec('remote',"select field,value_new,timestamp_request,id_user,object_id,value_old from pending where opid=".$opid." and object='registrar'",false);
	while ($row = pg_fetch_row($result))
		{

			$date_modif = $row[2];
			$registrar = $row[3];
			$object_id = $row[4];

			$row[1] = str_replace("'","''",$row[1]); 	// POUR GERER LES APOSTROPHES

				if ($row[0] == 'status')
					{
						$new_status = substr($row[1],1,1);	
						$old_status = substr($row[5],1,1);
						// EN FONCTION DU STATUT (ACTIF OU PAS), ON PASSE LES DOMAINES DU REGISTRAR A ORPHELIN OU ACTIF
						$insert = "set valid=".$new_status;
						if ($new_status == "1" && $old_status == "0")
							{
								$activation = date("Y-m-d H:i:s");
								$insert.= ",timestamp_activation='".$activation."'";
								$new_dom_status = "1";
							}
						if ($new_status == "1" && $old_status == "3")	// ON DEBLOQUE SES DOMAINES
							$new_dom_status = "1";
						if ($new_status == "3")
							$new_dom_status = "3";			// ON BLOQUE TOUS SES DOMAINES

						if ($new_status == "0")		// SI ON DESACTIVE LE REGISTRAR
							$new_dom_status = "5";	// SES DOMAINES DEVIENNENT ORPHELINS
										// ON MET A JOUR L'ETAT DES DOMAINES EN FONCTION DE L'ETAT DU REGISTRAR
						domain_status_change($object_id,$old_status,$new_dom_status,0);
					}

                                if ($row[0] == 'rs') 
						$insert = "set designation='".$row[1]."'";
					
                                if ($row[0] == 'nom')
					{
						if ($insert) $insert.=",nom='".$row[1]."'";
							else $insert.= "set nom='".$row[1]."'";
					}
                                if ($row[0] == 'prenom')
					{
						if ($insert) $insert.=",prenom='".$row[1]."'";
                                                	else $insert.= "set prenom='".$row[1]."'";
                                        }
                                if ($row[0] == 'addr1')
					{
                                                if ($insert) $insert.=",adresse1='".$row[1]."'";
                                        		else $insert.= "set adresse1='".$row[1]."'";
                                        }
                                if ($row[0] == 'addr2')
					{
                                                if ($insert) $insert.=",adresse2='".$row[1]."'";
                                                	else $insert.= "set adresse2='".$row[1]."'";
                                        }
                                if ($row[0] == 'cp')
					{
                                                if ($insert) $insert.=",cp='".$row[1]."'";
                                                	else $insert.= "set cp='".$row[1]."'";
                                        }
                                if ($row[0] == 'ville')
					{
                                                if ($insert) $insert.=",ville='".$row[1]."'";
                                                	else $insert.= "set ville='".$row[1]."'";
                                        }
                                if ($row[0] == 'pays')
					{
                                                if ($insert) $insert.=",code_pays='".$row[1]."'";
                                                	else $insert.= "set code_pays='".$row[1]."'";
                                        }
                                if ($row[0] == 'tel1')
					{
                                                if ($insert) $insert.=",tel1='".$row[1]."'";
                                                	else $insert.= "set tel1='".$row[1]."'";
                                        }
                                if ($row[0] == 'tel2')
					{
                                                if ($insert) $insert.=",tel2='".$row[1]."'";
                                                	else $insert.= "set tel2='".$row[1]."'";
                                        }
                                if ($row[0] == 'email')
					{
                                                if ($insert) $insert.=",email='".$row[1]."'";
                                                	else $insert.= "set email='".$row[1]."'";
                                        }
				if ($row[0] == 'billing_email')
					{
						if ($insert) $insert.=",billing_email='".$row[1]."'";
							else $insert.= "set billing_email='".$row[1]."'";
					}
				if ($row[0] == 'langue')
					{
						if ($insert) $insert.=",langue='".$row[1]."'";
                                                	else $insert.= "set langue='".$row[1]."'";
					}
				if ($row[0] == 'annuaire')
					{
						if ($insert) $insert.=",annuaire='".$row[1]."'";
							else $insert.= "set annuaire='".$row[1]."'";
					}
				if ($row[0] == 'url')
					{
						if ($insert) $insert.=",url='".$row[1]."'";
							else $insert.= "set url='".$row[1]."'";
					}
				if ($row[0] == 'logo')
					{
						if ($insert) $insert.=",logo='".$row[1]."'";
							else $insert.= "set logo='".$row[1]."'";
					}
				if ($row[0] == 'web_name')
					{
						if ($insert) $insert.=",web_name='".$row[1]."'";
							else $insert.= "set web_name='".$row[1]."'";
					}
				if ($row[0] == 'web_phone')
					{
						if ($insert) $insert.=",web_phone='".$row[1]."'";
							else $insert.= "set web_phone='".$row[1]."'";
					}
				if ($row[0] == 'web_email')
					{
						if ($insert) $insert.=",web_email='".$row[1]."'";
							else $insert.= "set web_email='".$row[1]."'";
					}
				if ($row[0] == 'web_lang')
					{
						if ($insert) $insert.=",web_lang='".$row[1]."'";
							else $insert.= "set web_lang='".$row[1]."'";
					}
				if ($row[0] == 'debit')
					{
						if ($insert) $insert.=",debit='".$row[1]."'";
							else $insert.= "set debit='".$row[1]."'";
					}
				if ($row[0] == 'debit_registration')
					{
						if ($insert) $insert.=",debit_registration='".$row[1]."'";
							else $insert.= "set debit_registration='".$row[1]."'";
					}
				if ($row[0] == 'bic')
					{
						if ($insert) $insert.=",bic='".$row[1]."'";
							else $insert.= "set bic='".$row[1]."'";
					}
				if ($row[0] == 'iban')
					{
						if ($insert) $insert.=",iban='".$row[1]."'";
							else $insert.= "set iban='".$row[1]."'";
					}

	}

	if (r_exec('local',"update registrar ".$insert." where id_registrar=".$object_id))
		return 1;
}

function registrar_delete($opid)
{
	$data = pg_fetch_array(r_exec('remote', "select object_id from pending where opid=".$opid." and object='registrar' and field='--del'",false));
	$actif = pg_fetch_array(r_exec('local',"select count(id_registrar) from domaine where id_registrar=".$data[0]." and id_status not in (98,99)",false));
        if ($actif[0]<1)
                {
			$result = r_exec('local',"update registrar set valid=99 where id_registrar=".$data[0]);
                        return 1;
                }
        else
                {
                        $message =  "Impossible de supprimer ce compte. Il poss&#232;de encore des domaines";
                        return 0;
                }
}

function registrar_create($opid)
{
	$retour = 0;
	$req="select object,object_id,field,value_old,value_new,timestamp_request,parent_id,id_user from pending where opid=".$opid." and object='registrar' and object_id=-1";
	$result = r_exec('remote',$req,false);
        while ($row = pg_fetch_row($result))
        {
		$row[4] = str_replace("'","''",$row[4]);  // POUR VALIDER LES APOSTROPHES

		if ($row[2] == "rs") $societe = $row[4];
		if ($row[2] == "nom") $nom = $row[4];
		if ($row[2] == "prenom") $prenom = $row[4]; 
		if ($row[2] == "addr1") $addr1 = $row[4];
		if ($row[2] == "addr2") $addr2 = $row[4];
		if ($row[2] == "cp") $cp = $row[4];
		if ($row[2] == "ville") $ville = $row[4];
		if ($row[2] == "pays") $pays = $row[4];
		if ($row[2] == "tel1") $tel1 = $row[4];
		if ($row[2] == "tel2") $tel2 = $row[4];
		if ($row[2] == "email") $email = $row[4];
		if ($row[2] == "billing_email") $billing_email = $row[4];
		if ($row[2] == "nichandle") $nichandle = $row[4];
		if ($row[2] == "lang") $lang = $row[4];
		if ($row[2] == "annuaire") $annuaire = $row[4];
		if ($row[2] == "url") $url = $row[4];
		if ($row[2] == "logo") $logo = $row[4];
		if ($row[2] == "web_name") $web_name = $row[4];
		if ($row[2] == "web_email") $web_email = $row[4];
		if ($row[2] == "web_phone") $web_phone = $row[4];
		if ($row[2] == "web_lang") $web_lang = $row[4];
		if ($row[2] == "debit") $debit = $row[4];
		if ($row[2] == "debit_registration")
			{
				if ($row[4] == '')
					$debit_registration = "null";
				else
					$debit_registration = "'".$row[4]."'";
			}
		if ($row[2] == "bic") $bic = $row[4];
		if ($row[2] == "iban") $iban = $row[4];
	}

	$creation_timestamp = date("Y-m-d H:i:s");
	$req = "insert into registrar (designation,nom,prenom,adresse1,adresse2,cp,ville,tel1,tel2,email,code_pays,valid,id_ident_creation,timestamp_creation,nichandle,langue,annuaire,url,logo,web_name,web_phone,web_email,web_lang,";
	$req.= "billing_email,debit,debit_registration,bic,iban)";
	$req.= " values('".$societe."','".$nom."','".$prenom."','".$addr1."','".$addr2."','".$cp."','".$ville."','".$tel1."','".$tel2."','".$email."','".$pays."',0,".$_SESSION['current_user'].",'".$creation_timestamp;
	$req.= "','".$nichandle."','".$lang."',".$annuaire.",'".$url."','".$logo."','".$web_name."','".$web_phone."','".$web_email."','".$web_lang."','".$billing_email."',".$debit.",".$debit_registration.",'".$bic."','".$iban."')";
	if (r_exec('local',$req))
		{
			$message = "Enregistrement effectu&#233;";
			$retour = 1;
		}
return $retour;
}

function create_nc_hdl($nom,$prenom,$societe)  // VERSION SERVER  ADMIN
{
        $erreur=1;
        $chiffre=1;
        while ($erreur != 0)
                {
			$chaine= strtoupper_fr(str_replace("'","",str_replace(" ","",str_replace(".","",str_replace("&","",$nom.$prenom.$societe)))));
			
                        $nichandle_c = substr($chaine,0,3).$chiffre."-MCNIC";
			$nb = pg_fetch_array(r_exec('local',"select count(nichandle) from contact where nichandle = '".$nichandle_c."'",false));
                        if ($nb[0] > 0)
                                $chiffre++;
                        else
                                {
					$nb = pg_fetch_array(r_exec('local',"select count(nichandle) from registrar where nichandle = '".$nichandle_c."'",false));
                                        if ($nb[0] > 0)
                                                $chiffre++;
                                        else
                                                {
							$nb = pg_fetch_array(r_exec('remote',"select count(object) from pending where field='nichandle' and value_new = '".$nichandle_c."'",false));
                                                        if ($nb[0] > 0)
                                                                $chiffre++;
                                                        else
                                                                $erreur=0;
                                                }
                                }
                }
return $nichandle_c;
}

function id2ndd($id_dom)
{
	$req = "select concat(d_nom,nom_extension) from domaine,domaine_extension where id_domaine=".$id_dom." and domaine.id_extension=domaine_extension.id_extension";
	return pg_fetch_result(r_exec('local',$req,false),0);
}
function ndd2id($ndd)
{
	$complet = explode('.',trim($ndd));
	$nom = $complet[0];
	$extension = implode('.', array_slice($complet, 1));
	$req = "select id_domaine from domaine,domaine_extension where d_nom='".$nom."' and domaine.id_extension=domaine_extension.id_extension and domaine_extension.nom_extension='".".".$extension."'";
	$id = pg_fetch_result(r_exec('local',$req,false),0);
	return $id;
}

function nchdl2id($nchdl,$mode)
{
	if ($mode=='registrar') $req = "select id_registrar from registrar where nichandle='".$nchdl."'";
		else $req = "select id_contact from contact where nichandle='".$nchdl."'";
	$data = pg_fetch_array(r_exec('local',$req,false));
	if ($data[0]) return $data[0];
}

function id2nchdl($id,$mode)
{
	if ($mode=='registrar') $req = "select nichandle from registrar where id_registrar=".$id;
		else $req = "select nichandle from contact where id_contact=".$id; 
	$data = pg_fetch_array(r_exec('local',$req,false));
	if ($data[0]) return $data[0];
}

function id2registrar($id)
{
	$req = "select designation from registrar where id_registrar =".$id;
	return pg_fetch_result(r_exec('local',$req,false),0);
}

function dom2reg($id)
{
	return pg_fetch_result(r_exec('local',"select id_registrar from domaine where id_domaine=".$id,false),0);
}

function create_OPID()
{
	$temps=date("ymd");
	$num=1;
	$erreur=1;

	while ($erreur==1)
        	{
                	if(strlen($num) == 1)
                                $opid=$temps.'00'.$num;
                        	else if(strlen($num) == 2)
                                        $opid=$temps.'0'.$num;
					else $opid=$temps.$num;
			$nb = pg_fetch_array(r_exec('remote',"select max(opid) from pending",false));
			if ($nb[0]<$opid)
				$erreur = 0;
			else $num++;
		}
	return $opid;
}

function search_parent($object_type,$object_id,$user)
{

	$req = "select max(parent_id) from pending where object='".$object_type."' and object_id=".$object_id." and id_user=".$user.";";
	$dat = pg_fetch_array(r_exec('remote',$req,false));
	return $dat[0]+1;
}

function request($object,$field,$object_id,$value_old,$value_new,$parent,$opid,$user_id = -1,$reg_id = -1)
{
        $temps=date("Y-m-d H:i:s");
        $req="insert into pending (object,object_id, field, value_old,value_new,timestamp_request,status,parent_id, id_user,id_registrar,opid)";
        $req.=" values ('".$object."',".$object_id.",'".$field."','".str_replace("'","''",$value_old)."','".str_replace("'","''",$value_new)."','".$temps."',0,".$parent.",".$user_id.",".$reg_id.",".$opid.")";
	return r_exec('remote',$req);
}

function new_parent_id($object,$object_id,$user_id)
{
        $req = "select max(parent_id) from pending where object='".$object."' and object_id=".$object_id." and id_user=".$user_id;
	$dat = pg_fetch_array(r_exec('remote',$req,false));
	return $dat[0]+1;
}

function correspondance($value)
{
	return pg_fetch_result(r_exec('local',"select longname from correspondances where shortname='".$value."'",false),0);
}

function new_reg_nchdl($societe,$nom,$prenom)
{
	if ($societe.$nom.$prenom != '')
	{
		$chaine= strtoupper_fr(str_replace("'","",str_replace(" ","",str_replace(".","",$nom.$prenom.$societe))));

		$erreur=1;
		$chiffre=1;
		while ($erreur != 0)
        		{
				$nichandle_r = substr($chaine,0,3).$chiffre."-MCNIC";
                        	$compte="select count(nichandle) from registrar where nichandle = '".$nichandle_r."';";
				$nb = pg_fetch_array(r_exec('local',$compte,false));
                        	if ($nb[0] > 0)
                        			$chiffre++;
            				else $erreur=0;
      			}
		return $nichandle_r;
	}
}

function reg_contact($reg_id,$cont_id)
{
	$data = pg_fetch_array(r_exec('local',"select id_registrar_parent from contact where id_contact=".$cont_id." and id_registrar_parent=".$reg_id,false));
	if ($data[0] == $reg_id)
		return true;
return false;
}

function historique($obj_type,$obj_id,$obj_value,$max_op,$bg_1,$bg_2)
{
	$nb=0;
	$req = "select field, value_old, value_new,timestamp_request,timestamp_check,object,object_id,status,opid,id_user,id_admin from request_log";
	$req.= " where object='".$obj_type."' and (object_id=".$obj_id." or value_new='".$obj_value."') order by opid desc, pending_id asc";
	$result = r_exec('local',$req,false);
	while ($row = pg_fetch_array($result))
                        {
                                $pending[$nb]["champ"] = $row['field'];
				$pending[$nb]["old"] = $row['value_old'];
                                $pending[$nb]["new"] = $row['value_new'];
				if ($pending[$nb]["champ"] == 'registrar')
					{
						$pending[$nb]["old"] = pg_fetch_result(r_exec('local',"select designation from registrar where id_registrar=".$row['value_old'],false),0);
						$pending[$nb]["new"] = pg_fetch_result(r_exec('local',"select designation from registrar where id_registrar=".$row['value_new'],false),0);
					}
                                $pending[$nb]["date_d"] = $row['timestamp_request'];
                                $pending[$nb]["date_f"] = $row['timestamp_check'];
                                $pending[$nb]["object"] = $row['object'];
                                if ($row['object']=="domaine") $req="select concat(d_nom,nom_extension) from domaine,domaine_extension where id_domaine=".$row['object_id']." and domaine.id_extension=domaine_extension.id_extension";
                                else if ($row['object']=="contact") $req="select concat(nom,' ',prenom) from contact where id_contact=".$row['object_id'];
                                        else $req="select designation from registrar where id_registrar=".$row['object_id'];
                                $data = pg_fetch_array(r_exec('local',$req,false));
                                $pending[$nb]["object_value"] = $data[0];
                                $pending[$nb]["object_id"] = $row['object_id'];
                                $pending[$nb]["opid"] = $row['opid'];
                                $pending[$nb]["status"] = $row['status'];
				if ($row['id_user'] == 0) $pending[$nb]["user"] = "Archive NIC";
					else if ($row['id_user'] == 1) $pending[$nb]["user"] = "Auto-Agent NIC";
						else
							{
								$pending[$nb]["user"] = pg_fetch_result(r_exec('local',"select concat(prenom,' ',nom) from contact where id_contact=".$row['id_user'],false),0);
								$pending[$nb]["admin"] = pg_fetch_result(r_exec('local',"select concat(prenom,' ',nom) from contact where id_contact=".$row['id_admin'],false),0);
							}
                                $nb++;
				if ($row['object_id'] == -1) break 1;	// Quand on arrive à la ligne de creation, pas besoin d'aller plus loin
									// ca evite d'afficher des vieilles entrees au cas ou on tomberait sur un domaine supprime mais qui avait le meme nom.
                        }
        if ($nb >0)
        {
		echo "<br><br><br><br><br>";
		echo "<center><table border=0 width=48%><tr><td><hr><font size=5><b>Historique > ".$max_op." Derni&#232;res op&#233;rations</b></font><hr></table><br><br>";
		echo "<table border=0 cellpadding=15 cellspacing=0 width=85%><tr valign=top align=center><td>#<td>Type<td>Date demande<td> Date de validation<td colspan=3>D&#233;tails";
		echo "<tr><td colspan=11><hr>";

                $bg_col=$bg_2;
                $opid=0;
                for ($i=0;$i<$nb;$i++)
                {
                        if (($opid < $max_op) && ($current != $pending[$i]["opid"]))
                        {
                                // on demarre la nouvelle
                                $field='';
                                $old='';
                                $new='';
                                ////
                                // Recherche des anciennes valeurs si modif
                                //
                                if ($pending[$i]["object_id"] == -1)
					$type="Cr&#233;ation";
                                                else    $type="Modification";
                                if ($bg_col == $bg_2) $bg_col=$bg_1;
                                         else $bg_col=$bg_2;
                                echo "<tr bgcolor='".$bg_col."'><td width=80>".$pending[$i]["opid"];
                                echo "<td width=90 align=center>".$type; //." ".correspondance($pending[$i]["object"]);
                                echo "<td align=center>".date_format(date_create($pending[$i]["date_d"]), "d-m-Y H:i:s");
                                echo "<td align=center>".date_format(date_create($pending[$i]["date_f"]), "d-m-Y H:i:s");
                                $current=$pending[$i]["opid"];
                        }

                        $field  .= correspondance($pending[$i]["champ"])."<br>";
                        if (in_array($pending[$i]["champ"],array('status','autorenew')))
                                {
                                        $old .= correspondance($pending[$i]["old"])."<br>";
                                        $new .= correspondance($pending[$i]["new"])."<br>";
                                }
						
                        else
                                {
                                        $old .= $pending[$i]["old"]."<br>";
                                        $new .= $pending[$i]["new"]."<br>";
                                }

                        if (($opid < $max_op) && ($current != $pending[$i+1]["opid"]))
                        {
                                // On finit la ligne precedente
                                if ($field.$old.$new!='')
                                        {
                                                if ($pending[$i]["champ"] != '--del')
                                                        echo "<td valign=center>".$field."<td valign=middle>".$old."<td valign=middle>".$new;
                                                else echo "<td colspan=3 align=center>Suppression demand&#233;e";
                                        }
                                echo "<td><img width=25 src='images/";
				if (!isset($pending[$i]["admin"])) $pending[$i]["admin"] = $pending[$i]["user"];
			//	$valide = '';
				if ($pending[$i]["admin"]!=$pending[$i]["user"])
					$valide ="Demand&#233; par ".$pending[$i]["user"]."<br>";
				//	else $pending[$i]["admin"] = $pending[$i]["user"];
                                if (in_array($pending[$i]["status"],array(1,11,21,31))) echo "green.png'><td valign=middle><i>".$valide."Trait&#233;";
                                        else if (in_array($pending[$i]["status"],array(2,12,22))) echo "red.png'><td valign=middle><i> Refus&#233;e";
				echo " par ".$pending[$i]["admin"];
				unset($valide);
                                $opid++;
                        }
                } // FERMETURE DU FOR
		echo "</table>";
	} // fin du if($nb >0)
	else echo "<center><font size=5><b>Historique > Aucune op&#233;ration effectu&#233;e.</b></font><br></center><br>";
}

function detruire($type,$obj_id,$obj_value)
{
	$mess_ko = "Un probl&#232;me est survenu pour supprimer le ".$type." ".$obj_value." #";
	$mess_ok = "Le ".$type." ".$obj_value." a &#233;t&#233; d&#233;finitivement supprim&#233;.";
	$del = 0 ;
	$req = "select distinct(opid) from request_log where object='".$type."' and (object_id=".$obj_id." or value_new='".$obj_value."')";
	$data = r_exec('local',$req,false);
	if ($data[0] == '') $del = 1;
	while ($tab = pg_fetch_array($data))
			if (r_exec('local',"delete from request_log where opid=".$tab[0]))
				if (r_exec('remote',"delete from pending where opid=".$tab[0]))
						$del = 1;
				else $mess_ko .= "REMOTE_PENDING.";
			else $mess_ko .= "LOCAL_REQUESTLOG."; 

	if ($del == 1)
		{
			if ($type == 'contact')
				if (r_exec('local',"delete from contact where id_contact=".$obj_id))
						return $mess_ok;
			if ($type == 'domaine')
				if (r_exec('local',"delete from dom_contacts where id_domaine=".$obj_id))
					if (r_exec('local',"delete from dns_domain where id_domaine=".$obj_id))
						if (r_exec('local',"delete from dnssec where id_dom=".$obj_id))
							if (r_exec('local',"delete from domaine where id_domaine=".$obj_id))
								return $mess_ok;
		}
	return $mess_ko." LOCAL_BASE";
}

function envoi_mail($texte,$sujet,$dest,$opid,$type,$id_dom,$fichier = null) {
	$signature = true; 	// Par defaut on ajoute la signature a la fin des mails -- avant c'était un choix passé en parametre
	$email_nic = pg_fetch_result(r_exec('local',"select s_value from settings where s_name='email_nic'",false),0);
	$email_from = pg_fetch_result(r_exec('local',"select s_value from settings where s_name='email_from'",false),0);

        $boundary = "-----=".md5(uniqid(rand()));
        $headers = "MIME-Version: 1.0\r\n";
	$headers .= "From: NIC Monaco<".$email_from.">"."\r\n";
//	$headers .= "From: NIC Monaco<nic@nic.mc>"."\r\n";
	$headers .= "Reply-To: ".$email_nic."\r\n";
//	$headers .= "Reply-To: nic@nic.mc\r\n";
	$headers .= "Bcc: ".$email_nic."\r\n";
//	$headers .= "Bcc: root@nic.mc\r\n";
        $headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
        $headers .= "\r\n";

        $msg = "--$boundary\r\n";
        $msg .= "Content-Type: text/html; charset=\"iso-8859-1\"\r\n";
        $msg .= "Content-Transfer-Encoding:8bit\r\n";
        $msg .= "\r\n<html>".$texte."\r\n";
	if ($signature)
		{
			require "inc/messages.php";
			$msg .= $mail_coords;  // voir fichier messages
			$msg .= "\r\n";
			$msg .= "<img src='cid:part1.06090408.01060107' alt=''>\r\n";
			$msg .= $greentouch;    // voir fichier messages
			$msg .= "\r\n";
			$file = "images/gp.gif";				// VERSION WEB
			if (!file_exists($file)) $file = "/var/www/".$file;	// VERSION SCRIPT
			$fp = fopen($file, "rb");
			$attachment = fread($fp, filesize($file));
			fclose($fp);
			$attachment = chunk_split(base64_encode($attachment));
			$msg .= "--$boundary\r\n";
			$msg .= "Content-Type: image/gif; name=\"$file\"\r\n";
			$msg .= "Content-Transfer-Encoding: base64\r\n";
			$msg .= "Content-ID: <part1.06090408.01060107>\r\n";
			$msg .= "Content-Disposition: inline; filename=\"$file\"\r\n";
 			$msg .= "\r\n";
			$msg .= $attachment . "\r\n";
			$msg .= "\r\n\r\n";
		//	$msg .= "--$boundary";
		}

	if ($fichier != null)
		{
			if (!file_exists($fichier)) $fichier = "/var/www/".$fichier;	// Si probleme pour trouver le fichier, en fonction du lieu d'appel - Web ou local
		//	$type_form = mime_content_type($fichier);
			$finfo = finfo_open(FILEINFO_MIME_TYPE);
			$type_form = finfo_file($finfo, $fichier);
			finfo_close($finfo);

		//	$form_content = chunk_split(base64_encode(file_get_contents($fichier)));
			$handle = fopen($fichier, 'rb');
			$form_content = base64_encode(fread($handle, filesize($fichier)));
			fclose($handle);

			$nom_fichier = strrchr($fichier,"/");
			$msg .= "--$boundary\r\n";							// Fin du boundary precedent
			$msg .= "Content-Type: $type_form; name=\"$nom_fichier\" \r\n";
			$msg .= "Content-Transfer-Encoding: base64 \r\n";
			$msg .= "Content-Disposition: attachment; filename=\"$nom_fichier\"\r\n";
			$msg .= "\r\n";
			$msg .= $form_content."\r\n";
		//	$msg .= "--$boundary";
		}

	$msg .= "--$boundary--\r\n";				// Fin du dernier boundary quelqu'il soit ! sinon ca peut generer des fichiers attaches supp. dans certains clients mail.
	mail($dest, $sujet,$msg,$headers);
	if (isset($_SESSION['current_user'])) $user = $_SESSION['current_user'];
		else $user = 0;
	if ($id_dom == '') $id_dom = -1;
	r_exec('local',"insert into mail_log (destinataire,id_user,message,opid,sujet,type,mail_date,domain_id) values('".$dest."',".$user.",'".str_replace("'","''",utf8_encode($texte))."',".$opid.",'".utf8_encode($sujet)."','".$type."','".date('Y-m-d H:i:s')."',".$id_dom.")",false);
}

function occurence($chaine, $caractere) {
    $occurrences = 0;
    for ($i = 0; $i < strlen($chaine); $i++) {
        if ($chaine[$i] == $caractere) {
            $occurrences++;
        }
    }
    return $occurrences;
}

function cancel_renew($id_dom)
{
	// On verifie si c'est une suppression demandée et si un renouvellement a été demandé il y a moins de DELAY jours
	$cancel_delay = pg_fetch_result(r_exec('local',"select s_value from settings where s_name='cancel_delay'",false),0);
	$verif_req = "select pending_id,invoice_status,opid from request_log where object='domaine' and object_id=".$id_dom." and field='renew' and (timestamp_request >= NOW() - INTERVAL '".$cancel_delay."' DAY)";
	$verif_res = r_exec('local',$verif_req,false);
	while ($row = pg_fetch_row($verif_res))
		{
			//Si pas encore facturé on va l'annuler
			if ($row[1] == 0)
				{
					$upd_req = "update request_log set invoice_status=2 where pending_id=".$row[0];
				}
			elseif ($row[1] == 1)   // Deja facture -- on le tag comme annulé et on fait un avoir
				{
					$upd_req = "update request_log set invoice_status=3 where pending_id=".$row[0];
					new_asset($opid);
				}
			if (r_exec('local',$upd_req)) return true;
		}
	return false;
}

function new_asset($opid)	// On cree un avoir en fonction d'un opid déjà facturé - typiquement un renouvellement de ndd
{
	// Il faut trouver le num de facture où il a été facturé
	$comment = "Remboursement Op. #".$opid;
	$res = r_exec('local',"select invoice_number,amount from invoice_detail where opid=".$opid,false);
	while ($data = pg_fetch_row($res))
		{
			$invoice_number = $data[0];
			$amount = $data[1];
		}
	$req = "insert into invoices_assets (invoice_number,status,amount_total,date_asset,amount_remain,comments)";
	$req.= " values ('".$invoice_number."',0,".$amount.",'".date('Y-m-d H:i:s')."',".$amount.",'".$comment."')";
	if (r_exec('local',req,true))
		return true;
	return false;
}	

function domain_check($domain,$nameserver)
{
	$cmd = "dig @$nameserver $domain ANY +short +time=0";
	$output = shell_exec($cmd);
	if (!empty($output))
		return true;
	return false;
}
?>
