def doEppDomainInfo(self, *args, **kwargs): """ Action method. """ if self.skip_info: self.check_results = {dn: (dn in self.existing_domains) for dn in self.target_domain_names} self.event('skip-info') return try: response = zclient.cmd_domain_info( domain=self.current_domain_name, ) except zerrors.EPPError as exc: self.log(self.debug_level, 'Exception in doEppDomainInfo: %s' % exc) self.event('error', exc) else: if self.verify_registrant: known_domain = zdomains.domain_find(domain_name=self.current_domain_name) known_registrant_epp_id = None if not known_domain else known_domain.registrant.epp_id real_registrant_epp_id = response['epp']['response']['resData']['infData'].get('registrant', None) if real_registrant_epp_id and known_registrant_epp_id and known_registrant_epp_id != real_registrant_epp_id: logger.warn('domain %s suppose to belong to another registrant: %r, but received another id: %r', self.current_domain_name, known_registrant_epp_id, real_registrant_epp_id) self.event('error', zerrors.EPPRegistrantAuthFailed(response=response)) return self.check_results[self.current_domain_name] = True self.event('response', response)
def doEppDomainInfo(self, *args, **kwargs): """ Action method. """ try: response = zclient.cmd_domain_info( domain=self.target_domain.name, ) except zerrors.EPPError as exc: self.log(self.debug_level, 'Exception in doEppDomainInfo: %s' % exc) self.event('error', exc) else: self.event('response', response)
def doEppDomainInfo(self, *args, **kwargs): """ Action method. """ try: response = zclient.cmd_domain_info( domain=self.target_domain.name, auth_info=self.target_domain.auth_key or None, raise_for_result=False, ) except zerrors.EPPError as exc: self.log(self.debug_level, 'Exception in doEppDomainInfo: %s' % exc) self.event('error', exc) else: self.latest_domain_info = response self.event('response', response)
def doEppDomainInfo(self, *args, **kwargs): """ Action method. """ try: response = zclient.cmd_domain_info( domain=self.domain_name, raise_for_result=False, ) except zerrors.EPPError as exc: self.log(self.debug_level, 'Exception in doEppDomainInfo: %s' % exc) self.event('error', exc) return # catch "2201 Authorization error" result, that means domain exists, but have another owner try: code = int(response['epp']['response']['result']['@code']) except ( ValueError, IndexError, TypeError, ) as exc: self.log(self.debug_level, 'Exception in doEppDomainInfo: %s' % exc) self.event('error', exc) return if code == 2201: self.domain_info_response = response self.event('response', response) return # read create/expire date try: datetime.datetime.strptime( response['epp']['response']['resData']['infData']['exDate'], '%Y-%m-%dT%H:%M:%S.%fZ', ) datetime.datetime.strptime( response['epp']['response']['resData']['infData']['crDate'], '%Y-%m-%dT%H:%M:%S.%fZ', ) except Exception as exc: self.log(self.debug_level, 'Exception in doEppDomainInfo: %s' % exc) raise zerrors.EPPBadResponse('response field not recognized') # detect current nameservers try: current_nameservers = response['epp']['response']['resData'][ 'infData']['ns']['hostObj'] except: current_nameservers = [] if not isinstance(current_nameservers, list): current_nameservers = [ current_nameservers, ] self.received_nameservers = current_nameservers # detect current contacts try: current_contacts = response['epp']['response']['resData'][ 'infData']['contact'] except: current_contacts = [] if not isinstance(current_contacts, list): current_contacts = [ current_contacts, ] self.received_contacts = [{ 'type': i['@type'], 'id': i['#text'], } for i in current_contacts] self.new_domain_contacts = { i['@type']: i['#text'] for i in current_contacts } # compare known contacts we have in DB with contacts received from back-end if not self.target_domain: self.contacts_changed = True else: add_contacts, remove_contacts, change_registrant = zdomains.compare_contacts( domain_object=self.target_domain, domain_info_response=response, ) if add_contacts or remove_contacts or change_registrant: self.contacts_changed = True # detect current registrant try: self.received_registrant_epp_id = response['epp']['response'][ 'resData']['infData']['registrant'] except Exception as exc: self.log(self.debug_level, 'Exception in doEppDomainInfo: %s' % exc) self.event('error', zerrors.EPPRegistrantUnknown(response=response)) return self.domain_info_response = response if self.expected_owner: # if pending order exists, select registrant from the owner self.known_registrant = self.expected_owner.registrants.first() logger.info('trying to use registrant from existing owner: %r', self.known_registrant) else: # find registrant in local DB self.known_registrant = zcontacts.registrant_find( self.received_registrant_epp_id) logger.info('trying to find registrant by epp id %r: %r', self.received_registrant_epp_id, self.known_registrant) if self.rewrite_contacts and self.known_registrant: logger.info( 'going to rewrite domain %r contacts from existing owner %r', self.domain_name, self.known_registrant.owner) self.event('rewrite-contacts', response) return if self.known_registrant: logger.info('registrant for domain %r is known: %r', self.domain_name, self.known_registrant) self.event('response', response) return if not self.create_new_owner_allowed: if self.domain_transferred_away: logger.error('domain %r is marked as transferred away', self.domain_name) self.event('domain-transferred-away') else: # fail if registrant not exist in local DB # that means owner of the domain changed, or his contact is not in sync with back-end # this also happens when domain is transferred to Zenaida, but user account not exist yet logger.error('registrant %r not exist in local DB', self.received_registrant_epp_id) self.event( 'error', zerrors.EPPRegistrantAuthFailed( 'registrant not exist in local DB')) return # currently registrant not exist in local DB, user account needs to be checked and created first logger.info( 'registrant not exist in local DB, going to create new registrant') self.event('registrant-unknown', response)
def test_update_hostnames(): if os.environ.get('E2E', '0') != '1': return pytest.skip('skip E2E') # @UndefinedVariable tester = testsupport.prepare_tester_account() tester_domain = testsupport.prepare_tester_domain( domain_name='test.%s' % settings.ZENAIDA_SUPPORTED_ZONES[0], tester=tester, domain_epp_id=zclient.make_epp_id(tester.email), add_contacts=[ 'registrant', 'admin', ], nameservers=[ 'ns1.google.com', 'ns2.google.com', 'ns3.google.com', ]) scenario1 = [] cs1 = domain_hostnames_synchronizer.DomainHostnamesSynchronizer( update_domain=True, log_events=True, log_transitions=True, raise_errors=True, ) cs1.add_state_changed_callback( cb=lambda oldstate, newstate, event, *args, **kwargs: scenario1.append( ( oldstate, newstate, event, )), ) cs1.event( 'run', target_domain=tester_domain, known_domain_info=zclient.cmd_domain_info(domain=tester_domain.name), ) outputs1 = list(cs1.outputs) del cs1 tester_domain.nameserver4 = 'ns4.google.com' tester_domain.save() scenario2 = [] cs2 = domain_hostnames_synchronizer.DomainHostnamesSynchronizer( update_domain=True, log_events=True, log_transitions=True, raise_errors=True, ) cs2.add_state_changed_callback( cb=lambda oldstate, newstate, event, *args, **kwargs: scenario2.append( ( oldstate, newstate, event, )), ) cs2.event( 'run', target_domain=tester_domain, known_domain_info=zclient.cmd_domain_info(domain=tester_domain.name), ) outputs2 = list(cs2.outputs) del cs2 # one nameserver should be removed assert scenario1 == [ ('AT_STARTUP', 'DOMAIN_INFO?', 'run'), ('DOMAIN_INFO?', 'HOSTS_CHECK', 'response'), ('HOSTS_CHECK', 'DOMAIN_UPDATE!', 'no-hosts-to-be-added'), ('DOMAIN_UPDATE!', 'DONE', 'response'), ] assert len(outputs1) == 1 assert outputs1[0]['epp']['response']['result']['@code'] == '1000' # one nameserver should be added back assert scenario2 == [ ('AT_STARTUP', 'DOMAIN_INFO?', 'run'), ('DOMAIN_INFO?', 'HOSTS_CHECK', 'response'), ('HOSTS_CHECK', 'HOSTS_CREATE', 'response'), ('HOSTS_CREATE', 'DOMAIN_UPDATE!', 'all-hosts-created'), ('DOMAIN_UPDATE!', 'DONE', 'response'), ] assert len(outputs2) == 1 assert outputs2[0]['epp']['response']['result']['@code'] == '1000'