public function ChangeDomainOwner(Domain $domain, $period = null, $extra = array())
 {
     $params = array("name" => $this->MakeNameIDNCompatible($domain->GetHostName()), "c_registrant" => $domain->GetContact(CONTACT_TYPE::REGISTRANT)->CLID, "c_onsite" => $domain->GetContact(CONTACT_TYPE::TECH)->CLID, "c_billing" => $this->Config->GetFieldByName('BillingContactCLID')->Value, "ns" => '<' . $this->ExtPrefix . ':ns>' . $this->GetNSXML($domain->GetNameserverList()) . '</' . $this->ExtPrefix . ':ns>');
     $response = $this->Request("domain-trade-request", $params);
     $status = $response->Succeed ? REGISTRY_RESPONSE_STATUS::PENDING : REGISTRY_RESPONSE_STATUS::FAILED;
     return new ChangeDomainOwnerResponse($status, $response->ErrMsg, $response->Code);
 }
 /**
  * Executor
  *
  * @throws UpdateDomainContactTask_Exception
  */
 public function Run($userid = null)
 {
     try {
         $Factory = RegistryModuleFactory::GetInstance();
         $Registry = $Factory->GetRegistryByExtension($this->Domain->Extension);
         $Manifest = $Registry->GetManifest();
         if ($userid && $this->Domain->UserID != $userid) {
             throw new UpdateDomainContactAction_Exception(_("You don't have permissions for manage this domain"), UpdateDomainContactAction_Exception::DOMAIN_NOT_BELONGS_TO_USER);
         }
         $OldContact = $this->Domain->GetContact($this->contact_type);
         if ($this->NewContact && $this->NewContact->UserID != $this->Domain->UserID) {
             throw new UpdateDomainContactAction_Exception(_("You don't have permissions for using this contact"), UpdateDomainContactAction_Exception::CONTACT_NOT_BELONGS_TO_USER);
         }
         $trade = $Manifest->GetRegistryOptions()->ability->trade == '1';
         if ($this->contact_type != CONTACT_TYPE::REGISTRANT || !$trade) {
             try {
                 $Registry->UpdateDomainContact($this->Domain, $this->contact_type, $OldContact, $this->NewContact);
                 return $this->Domain->HasPendingOperation(Registry::OP_UPDATE) ? UpdateDomainContactAction_Result::PENDING : UpdateDomainContactAction_Result::OK;
             } catch (Exception $e) {
                 throw new UpdateDomainContactAction_Exception(sprintf(_("Cannot change contact. Reason: %s"), $e->getMessage()));
             }
         } else {
             // Execute trade when:
             // - Trade invoice is paid
             // - Previous trade failed
             if ($this->Domain->IncompleteOrderOperation == INCOMPLETE_OPERATION::DOMAIN_TRADE || $this->Invoice && $this->Invoice->Status == INVOICE_STATUS::PAID) {
                 $this->Domain->SetContact($this->NewContact, CONTACT_TYPE::REGISTRANT);
                 $this->Domain->IncompleteOrderOperation = null;
                 $extra["requesttype"] = "ownerChange";
                 try {
                     $trade = $Registry->ChangeDomainOwner($this->Domain, 1, $extra);
                     return $this->Domain->HasPendingOperation(Registry::OP_TRADE) ? UpdateDomainContactAction_Result::PENDING : UpdateDomainContactAction_Result::OK;
                 } catch (Exception $e) {
                     $this->Domain->IncompleteOrderOperation = INCOMPLETE_OPERATION::DOMAIN_TRADE;
                     if ($this->Invoice) {
                         $this->Invoice->ActionStatus = INVOICE_ACTION_STATUS::FAILED;
                         $this->Invoice->ActionFailReason = $e->getMessage();
                     }
                     throw new UpdateDomainContactAction_Exception(sprintf(_("Cannot change contact. Reason: %s"), $e->getMessage()));
                 }
             } else {
                 // Issue an invoice for trade operation
                 $invoiceid = $this->Db->GetOne("SELECT * FROM invoices WHERE status=? AND itemid=? AND purpose=?", array(INVOICE_STATUS::PENDING, $this->Domain->ID, INVOICE_PURPOSE::DOMAIN_TRADE));
                 if (!$invoiceid) {
                     $this->Domain->SetExtraField("NewRegistrantCLID", $this->NewContact->CLID);
                     DBDomain::GetInstance()->Save($this->Domain);
                     $Invoice = new Invoice(INVOICE_PURPOSE::DOMAIN_TRADE, $this->Domain->ID, $userid);
                     $Invoice->Description = sprintf(_("%s domain name trade"), $this->Domain->GetHostName());
                     $Invoice->Save();
                     $this->Invoice = $Invoice;
                     return UpdateDomainContactAction_Result::INVOICE_GENERATED;
                 } else {
                     throw new UpdateDomainContactAction_Exception(_("Another domain trade is already initiated"));
                 }
             }
         }
     } catch (Exception $e) {
         throw new UpdateDomainContactAction_Exception($e->getMessage());
     }
 }
 private function ValidateDomain(Domain $domain)
 {
     if (!($Registrant = $domain->GetContact(CONTACT_TYPE::REGISTRANT))) {
         throw new Exception(_('Domain registrant contact is undefined'));
     }
     if (!($Admin = $domain->GetContact(CONTACT_TYPE::ADMIN))) {
         throw new Exception(_('Domain admin contact is undefined'));
     }
     if (!($Tech = $domain->GetContact(CONTACT_TYPE::TECH))) {
         throw new Exception(_('Domain tech contact is undefined'));
     }
 }
		public function UpdateDomainContact(Domain $domain, $contactType, Contact $oldContact, Contact $newContact)
		{
			if (!$newContact && !$oldContact)
				throw new Exception("At leat one contact (\$newContact or \$oldContact) must be passed into UpdateDomainContact");
			
			if ($contactType == CONTACT_TYPE::TECH && 
				preg_match('/^\d+/', $domain->GetContact(CONTACT_TYPE::REGISTRANT)->CLID))
			{
				throw new Exception("Domain transfer from SWITCH was buggy. You must update registrant contact first");
			}
				
			$params = array(
				"name" 		=> $this->MakeNameIDNCompatible($domain->GetHostName()),
				"change"	=> "",
				"add"		=> "",
				"rem"		=> ""
			);
			
			if ($contactType == CONTACT_TYPE::REGISTRANT)
				$params["change"] = "<domain:chg><domain:registrant>{$newContact->CLID}</domain:registrant></domain:chg>";
			else
			{
				if ($newContact)
					$params['add'] = '<domain:add><domain:contact type="'.$contactType.'">'.$newContact->CLID.'</domain:contact></domain:add>';
				
				if ($oldContact && !preg_match('/^\d+/', $oldContact->CLID)) 
					$params['rem'] = '<domain:rem><domain:contact type="'.$contactType.'">'.$oldContact->CLID.'</domain:contact></domain:rem>';
			}
			
			$response = $this->Request("domain-update-contact", $params);
			
			$status = ($response->Succeed) ? REGISTRY_RESPONSE_STATUS::SUCCESS : REGISTRY_RESPONSE_STATUS::FAILED;
			
			// Hack for bad transferred from SWITCH	
			if ($response->Succeed && preg_match('/^\d+/', $oldContact->CLID) && $contactType == CONTACT_TYPE::REGISTRANT)
			{
				$domain->SetContact(null, CONTACT_TYPE::TECH);
			}
			
			return new UpdateDomainContactResponse($status, $response->ErrMsg, $response->Code);
		}		
 /**
  * Enter description here...
  *
  * @param Domain $domain
  */
 public function OnDomainCreated(Domain $domain)
 {
     if ($domain->Extension == "de") {
         $admin_contact = $domain->GetContact(CONTACT_TYPE::ADMIN)->CLID;
         $resp = $this->GetRemoteDomain($domain);
         if ($resp->AdminContact != $admin_contact) {
             $contact = $this->RegistryAccessible->NewContactInstance(CONTACT_TYPE::ADMIN);
             $contact->CLID = $resp->AdminContact;
             $contact->UserID = 0;
             $contact->ID = null;
             $contact->SetFieldList(array("firstname" => "Preassigned", "lastname" => "RRPProxy contact"), false);
             $domain->SetContact($contact, CONTACT_TYPE::ADMIN);
         }
     }
 }
 /**
  * Send Domain Trade request (Change owner)
  *
  * @param Domain $domain Domain must have contacts and nameservers 
  * @param integer $period
  * @param array $extra
  * @return bool
  * @version v1000
  */
 public function ChangeDomainOwner(Domain $domain, $period = null, $extra = array())
 {
     //ownerNameChange,ownerChange
     $owner = $domain->GetContact(CONTACT_TYPE::REGISTRANT);
     if (!$owner) {
         throw new Exception(_('Domain registrant contact is undefined'));
     }
     $params = array("name" => "{$domain->Name}.{$this->Extension}", "new_id" => $owner->CLID, "request" => $extra["requesttype"]);
     $response = $this->Request("domain-trade-request", $params);
     if ($response->Code == RFC3730_RESULT_CODE::OK_PENDING) {
         $status = REGISTRY_RESPONSE_STATUS::PENDING;
     } elseif ($response->Code == RFC3730_RESULT_CODE::OK) {
         $status = REGISTRY_RESPONSE_STATUS::SUCCESS;
     } else {
         $status = REGISTRY_RESPONSE_STATUS::FAILED;
     }
     return new ChangeDomainOwnerResponse($status, $response->ErrMsg, $response->Code);
 }
		public function OnDomainTransferApproved (Domain $domain) 
		{
			$registrant = $domain->GetContact(CONTACT_TYPE::REGISTRANT);
			$admin = $domain->GetContact(CONTACT_TYPE::ADMIN);
			if ($registrant && $admin)
			{
				$this->AddRegistrantAssociation($admin->CLID, $registrant->CLID);	
			}
		}
 private function MapDomainToWhois(Domain $domain)
 {
     $Registrant = $domain->GetContact(CONTACT_TYPE::REGISTRANT);
     $Admin = $domain->GetContact(CONTACT_TYPE::ADMIN);
     $Tech = $domain->GetContact(CONTACT_TYPE::TECH);
     $Billing = $domain->GetContact(CONTACT_TYPE::BILLING);
     $data = array('domain' => $domain->GetHostName(), 'registered_date' => date('Y-m-d H:i:s', $domain->CreateDate), 'registerexpire_date' => date('Y-m-d H:i:s', $domain->ExpireDate), 'remarks' => '', 'mntnr_fkey' => $this->GetMaintainerId());
     if ($Registrant) {
         $data['holder'] = $this->CLIDToPersonId($Registrant->CLID);
     }
     if ($Admin) {
         $data['admin_c'] = $this->CLIDToPersonId($Admin->CLID);
     }
     if ($Tech) {
         $data['tech_c'] = $this->CLIDToPersonId($Tech->CLID);
     }
     if ($Billing) {
         $data['bill_c'] = $this->CLIDToPersonId($Billing->CLID);
     }
     return $data;
 }
 /**
  * This method send create domain request.
  * In order to pending domain creation, response must have status REGISTRY_RESPONSE_STATUS::PENDING
  *	 
  * @param Domain $domain
  * @param int $period Domain registration period
  * @param array $extra Extra data
  * @return CreateDomainResponse
  */
 public function CreateDomain(Domain $domain, $period, $extra = array())
 {
     $Registrant = $domain->GetContact(CONTACT_TYPE::REGISTRANT);
     $Tech = $domain->GetContact(CONTACT_TYPE::TECH);
     $Admin = $domain->GetContact(CONTACT_TYPE::ADMIN);
     $Billing = $domain->GetContact(CONTACT_TYPE::BILLING);
     $nslist = $domain->GetNameserverList();
     $params = array('name' => $domain->GetHostName(), 'type' => $this->GetDomainType(), 'registrant' => $Registrant->CLID, 'tech' => $Tech->CLID, 'admin' => $Admin->CLID, 'billing' => $Billing->CLID, 'ns1' => $nslist[0]->HostName, 'ns2' => $nslist[1]->HostName, 'period' => $period, 'pw' => $domain->AuthCode ? $domain->AuthCode : rand(100000, 99999999));
     $response = $this->Request('domain-create', $params);
     $status = $response->Succeed ? REGISTRY_RESPONSE_STATUS::SUCCESS : REGISTRY_RESPONSE_STATUS::FAILED;
     $ret = new CreateDomainResponse($status, $response->ErrMsg, $response->Code);
     if ($response->Succeed) {
         $ret->CreateDate = time();
         $ret->ExpireDate = strtotime("+{$period} year");
         $ret->AuthCode = (string) $params['pw'];
     }
     return $ret;
 }