has_familysearch=file_exists(WT_ROOT.'modules/FamilySearch/familySearchWrapper.php'); if ($this->has_familysearch) {; require_once WT_ROOT.'modules/FamilySearch/familySearchWrapper.php'; } // The PID can come from a URL or a form $this->pid=safe_REQUEST($_REQUEST, 'pid', WT_REGEX_XREF); $this->person=Person::getInstance($this->pid); $this->server_list=get_server_list(); $this->gedcom_list=get_all_gedcoms(); // Other input values come from the form $this->form_txtPID =safe_POST('txtPID', WT_REGEX_XREF); $this->form_cbRelationship =safe_POST('cbRelationship'); $this->form_location =safe_POST('location'); $this->form_txtURL =safe_POST('txtURL', WT_REGEX_URL); $this->form_txtTitle =safe_POST('txtTitle', '[^<>"%{};]+'); $this->form_txtGID =safe_POST('txtGID', preg_quote_array($this->gedcom_list)); $this->form_txtUsername =safe_POST('txtUsername', WT_REGEX_USERNAME); $this->form_txtPassword =safe_POST('txtPassword', WT_REGEX_PASSWORD); $this->form_cbExistingServers=safe_POST('cbExistingServers', array_keys($this->server_list)); $this->form_txtCB_Title =safe_POST('txtCB_Title', '[^<>"%{};]+'); $this->form_txtCB_GID =safe_POST('txtCB_GID', preg_quote_array($this->gedcom_list)); $this->form_txtFS_URL =safe_POST('txtFS_URL', WT_REGEX_URL); $this->form_txtFS_Title =safe_POST('txtFS_Title', '[^<>"%{};]+'); $this->form_txtFS_GID =safe_POST('txtFS_GID', preg_quote_array($this->gedcom_list)); $this->form_txtFS_Username =safe_POST('txtFS_Username', WT_REGEX_USERNAME); $this->form_txtFS_Password =safe_POST('txtFS_Password', WT_REGEX_PASSWORD); if (is_null($this->form_location)) { if ($this->server_list) { $this->form_location='existing'; } else { $this->form_location='remote'; } } } // Perform the desired action and return true/false success. function runAction($action) { switch ($action) { case 'addlink': return $this->addLink(); default: return false; } } // Add a remote webtrees server // // @param string $title // @param string $url // @param string $gedcom_id // @param string $username // @param string $password // @return mixed the serverID of the server to link to function addRemoteServer($title, $url, $gedcom_id, $username, $password) { if (!$url || !$gedcom_id || !$username || !$password) { return null; } if (preg_match('/\?wsdl$/', $url)==0) { $url.="?wsdl"; } $serverID=$this->checkExistingServer($url, $gedcom_id); if (!$serverID) { $gedcom_string="0 @new@ SOUR\n1 URL {$url}\n1 _DBID {$gedcom_id}\n2 _USER {$username}\n2 _PASS {$password}\n3 RESN confidential"; $service=new ServiceClient($gedcom_string); $sid=$service->authenticate(); if (PEAR::isError($sid)) { $sid=''; } if (!$sid) { echo 'failed to authenticate to remote site'; $serverID=null; } else { if (!$title) { $title=$service->getServiceTitle(); } $gedcom_string.="\n1 TITL {$title}"; $serverID=append_gedrec($gedcom_string, WT_GED_ID); } } return $serverID; } // Add a familySearch server // // @param string $title // @param string $url // @param string $gedcom_id // @param string $username // @param string $password // @return mixed the serverID of the server to link to function addFamilySearchServer($title, $url, $gedcom_id, $username, $password) { $serverID = $this->checkExistingServer($url, $gedcom_id); if (!$serverID) { $gedcom_string = "0 @new@ SOUR\n"; $gedcom_string.= "1 URL ".$url."\n"; $gedcom_string.= "2 TYPE FamilySearch\n"; $gedcom_string.= "1 _DBID ".$gedcom_id."\n"; $gedcom_string.= "2 _USER ".$username."\n"; $gedcom_string.= "2 _PASS ".$password."\n"; //-- only allow admin users to see password $gedcom_string.= "3 RESN confidential\n"; $service = new FamilySearchWrapper($gedcom_string); $sid = $service->authenticate(); if (PEAR::isError($sid)) { $sid = ''; } if (empty($sid)) { echo "failed to authenticate to remote site"; } else { if (empty($title)) { $title = $service->getServiceTitle(); } $title = $service->getServiceTitle(); $gedcom_string.= "1 TITL ".$title."\n"; $serverID = append_gedrec($gedcom_string, WT_GED_ID); } } return $serverID; } // Add a server record for a local remote link // // @param string $gedcom_id // @return mixed the serverID of the server to link to function addLocalServer($title, $gedcom_id) { $serverID = $this->checkExistingServer(WT_SERVER_NAME.WT_SCRIPT_PATH, $gedcom_id); if (!$serverID) { $gedcom_string = "0 @new@ SOUR\n"; if (empty($title)) { $title=get_gedcom_setting(get_id_from_gedcom($gedcom_id), 'title'); } $gedcom_string.= "1 TITL ".$title."\n"; $gedcom_string.= "1 URL ".WT_SERVER_NAME.WT_SCRIPT_PATH."\n"; $gedcom_string.= "1 _DBID ".$gedcom_id."\n"; $gedcom_string.= "2 _BLOCK false\n"; $serverID = append_gedrec($gedcom_string, WT_GED_ID); } return $serverID; } // check if the server already exists // // @param string $url // @param string $gedcom_id // @return mixed the id of the server to link to or false if it does not exist function checkExistingServer($url, $gedcom_id='') { //-- get rid of the protocol $turl = preg_replace('~^\w+://~', '', $url); //-- check the existing server list foreach ($this->server_list as $id=>$server) { if (stristr($server['url'], $turl)) { if (empty($gedcom_id) || preg_match("/\n1 _DBID {$gedcom_id}/", $server['gedcom'])) return $id; } } //-- check for recent additions return WT_DB::prepare( "SELECT xref". " FROM `##change`". " WHERE status='pending' AND gedcom_id=? AND new_gedcom LIKE CONCAT('%\n1 _DBID ', ?, '%')". " ORDER BY change_id DESC". " LIMIT 1" )->execute(array(WT_GED_ID, $gedcom_id))->fetchOne(); } function addLink() { global $GEDCOM; switch ($this->form_location) { case 'remote': $serverID=$this->addRemoteServer( $this->form_txtTitle, $this->form_txtURL, $this->form_txtGID, $this->form_txtUsername, $this->form_txtPassword ); break; case 'local': $serverID=$this->addLocalServer( $this->form_txtCB_Title, $this->form_txtCB_GID ); break; case 'existing': $serverID=$this->form_cbExistingServers; break; case "FamilySearch": //TODO: Make sure that it is merging correctly $serverID=$this->addFamilySearchServer( $this->form_txtFS_URL, $this->form_txtFS_URL, $this->form_txtFS_GID, $this->form_txtFS_Username, $this->form_txtFS_Password ); break; } $link_pid =$this->form_txtPID; $relation_type=$this->form_cbRelationship; if ($serverID && $link_pid) { $indirec=find_gedcom_record($this->pid, WT_GED_ID, true); switch ($relation_type) { case "father": $indistub="0 @new@ INDI\n1 SOUR @{$serverID}@\n2 PAGE {$link_pid}\n1 RFN {$serverID}:{$link_pid}"; $stub_id=append_gedrec($indistub, WT_GED_ID); $indistub=find_gedcom_record($stub_id, WT_GED_ID, true); $gedcom_fam="0 @new@ FAM\n1 HUSB @{$stub_id}@\n1 CHIL @{$this->pid}@"; $fam_id=append_gedrec($gedcom_fam, WT_GED_ID); $indirec.= "\n1 FAMC @{$fam_id}@"; replace_gedrec($this->pid, WT_GED_ID, $indirec); $serviceClient=ServiceClient::getInstance($serverID); $indistub=$serviceClient->mergeGedcomRecord($link_pid, $indistub, true, true); $indistub.="\n1 FAMS @{$fam_id}@"; replace_gedrec($stub_id, WT_GED_ID, $indistub); break; case "mother": $indistub="0 @new@ INDI\n1 SOUR @{$serverID}@\n2 PAGE {$link_pid}\n1 RFN {$serverID}:{$link_pid}"; $stub_id=append_gedrec($indistub, WT_GED_ID); $indistub=find_gedcom_record($stub_id, WT_GED_ID, true); $gedcom_fam="0 @new@ FAM\n1 WIFE @{$stub_id}@\n1 CHIL @{$this->pid}@"; $fam_id=append_gedrec($gedcom_fam, WT_GED_ID); $indirec.="\n1 FAMC @{$fam_id}@"; replace_gedrec($this->pid, WT_GED_ID, $indirec); $serviceClient=ServiceClient::getInstance($serverID); $indistub=$serviceClient->mergeGedcomRecord($link_pid, $indistub, true, true); $indistub.="\n1 FAMS @".$fam_id."@"; replace_gedrec($stub_id, WT_GED_ID, $indistub); break; case "husband": $indistub="0 @new@ INDI\n1 SOUR @{$serverID}@\n2 PAGE {$link_pid}\n1 RFN {$serverID}:{$link_pid}"; $stub_id=append_gedrec($indistub, WT_GED_ID); $indistub=find_gedcom_record($stub_id, WT_GED_ID, true); $gedcom_fam="0 @new@ FAM\n1 MARR Y\n1 WIFE @{$this->pid}@\n1 HUSB @{$stub_id}@\n"; $fam_id=append_gedrec($gedcom_fam, WT_GED_ID); $indirec.="\n1 FAMS @{$fam_id}@"; replace_gedrec($this->pid, WT_GED_ID, $indirec); $serviceClient=ServiceClient::getInstance($serverID); $indistub=$serviceClient->mergeGedcomRecord($link_pid, $indistub, true, true); $indistub.="\n1 FAMS @{$fam_id}@"; replace_gedrec($stub_id, WT_GED_ID, $indistub); break; case "wife": $indistub="0 @new@ INDI\n1 SOUR @{$serverID}@\n2 PAGE {$link_pid}\n1 RFN {$serverID}:{$link_pid}"; $stub_id=append_gedrec($indistub, WT_GED_ID); $indistub=find_gedcom_record($stub_id, WT_GED_ID, true); $gedcom_fam="0 @new@ FAM\n1 MARR Y\n1 WIFE @{$stub_id}@\n1 HUSB @{$this->pid}@"; $fam_id=append_gedrec($gedcom_fam, WT_GED_ID); $indirec.="\n1 FAMS @{$fam_id}@"; replace_gedrec($this->pid, WT_GED_ID, $indirec); $serviceClient=ServiceClient::getInstance($serverID); $indistub=$serviceClient->mergeGedcomRecord($link_pid, $indistub, true, true); $indistub.="\n1 FAMS @{$fam_id}@\n"; replace_gedrec($stub_id, WT_GED_ID, $indistub); break; case "son": case "daughter": $indistub="0 @new@ INDI\n1 SOUR @{$serverID}@\n2 PAGE {$link_pid}\n1 RFN {$serverID}:{$link_pid}"; $stub_id=append_gedrec($indistub, WT_GED_ID); $indistub=find_gedcom_record($stub_id, WT_GED_ID, true); if (get_gedcom_value('SEX', 1, $indirec, '', false)=='F') { $gedcom_fam="0 @new@ FAM\n1 WIFE @{$this->pid}@\n1 CHIL @{$stub_id}@"; } else { $gedcom_fam="0 @new@ FAM\n1 HUSB @{$this->pid}@\n1 CHIL @{$stub_id}@"; } $fam_id=append_gedrec($gedcom_fam, WT_GED_ID); $indirec.="\n1 FAMS @{$fam_id}@"; replace_gedrec($this->pid, WT_GED_ID, $indirec); $serviceClient=ServiceClient::getInstance($serverID); $indistub=$serviceClient->mergeGedcomRecord($link_pid, $indistub, true, true); $indistub.="\n1 FAMC @".$fam_id."@"; replace_gedrec($stub_id, WT_GED_ID, $indistub); break; case 'current_person': $indirec.="\n1 RFN {$serverID}:{$link_pid}\n1 SOUR @{$serverID}@\n2 PAGE {$link_pid}"; $serviceClient = ServiceClient::getInstance($serverID); if (!is_null($serviceClient)) { //-- get rid of change date $pos1=strpos($indirec, "\n1 CHAN"); if ($pos1!==false) { $pos2=strpos($indirec, "\n1", $pos1+5); $indirec=substr($indirec, 0, $pos1).substr($indirec, $pos2); } $indirec=$serviceClient->mergeGedcomRecord($link_pid, $indirec, true, true); } else { echo 'Unable to find server'; } break; } echo '', i18n::translate('Successfully added link'), ''; return true; } return false; } /** * whether or not the user has access to this area * * @return boolean */ function canAccess() { global $ALLOW_EDIT_GEDCOM; return $ALLOW_EDIT_GEDCOM && WT_USER_GEDCOM_ADMIN && $this->person->canDisplayDetails(); } }