Example #1
0
        private JobStates readPollMessages(Job job)
        {
            EppAPI epp = new EppAPI();

            foreach (Registry registry in Provider.Database.ReadList <Registry>().Where(r => r.FollowPollMessages && !r.IsDeleted))
            {
                try
                {
                    var aTldExtension = Provider.Database.GetString("SELECT TOP 1 Name FROM Product WHERE SupplierId = {0} AND IsDeleted <> 1", registry.Id);
                    if (aTldExtension.IsEmpty())
                    {
                        continue;
                    }

                    var domainName = "example" + (aTldExtension.StartsWith(".") ? "" : ".") + aTldExtension;
                    var res        = epp.PollRequest(new ReqPollRequest {
                        DomainName = domainName
                    });

                    while (res != null && res.Count > 0)
                    {
                        Job j = new Job
                        {
                            Command           = JobCommands.HandlePollMessage,
                            Executer          = JobExecuters.Machine,
                            Name              = registry.Name,
                            RelatedEntityId   = registry.Id,
                            RelatedEntityName = "Registry",
                            StartDate         = Provider.Database.Now,
                            State             = JobStates.NotStarted,
                            CommandParameter  = res.Message,
                            ParentJobId       = job.Id
                        };
                        j.Save();

                        JobData jd = new JobData {
                            JobId    = j.Id,
                            Request  = res.Details,
                            Response = ""
                        };
                        jd.Save();

                        var res2 = epp.PollAcknowledge(new ReqPollAcknowledge {
                            DomainName = domainName, MessageId = res.MessageId
                        });
                        if (res2.Count == 0)
                        {
                            break;
                        }

                        res = epp.PollRequest(new ReqPollRequest {
                            DomainName = domainName
                        });
                    }
                }
                catch { }
            }

            return(JobStates.Done);
        }
Example #2
0
        public bool UpdateDomainNameServers(ReqUpdateDomainNameServers req)
        {
            MemberDomain md = Provider.Database.Read <MemberDomain>("DomainName = {0}", req.DomainName);

            if (md == null)
            {
                throw new APIException("Domain name not found: " + req.DomainName);
            }

            MemberProduct mp = Provider.Database.Read <MemberProduct>("Id = {0}", md.Id);

            if (mp == null)
            {
                throw new APIException("Critical error: MemberDomain exists but MemberProduct doesn't, for domain : " + req.DomainName);
            }

            if (mp.MemberId != Provider.CurrentMember.Id)
            {
                throw new APIException("Creditentials not authorized for this domain: " + req.DomainName);
            }

            EppAPI eppApi = new EppAPI();

            var res = eppApi.HostCheck(new DealerSafe.DTO.Epp.Request.ReqHostCheck {
                DomainName = req.DomainName, HostNames = req.NameServers
            });

            foreach (var hostInfo in res.HostInfos)
            {
                if (hostInfo.Available)
                {
                    var res2 = eppApi.HostCreate(new DealerSafe.DTO.Epp.Request.ReqHostCreate {
                        DomainName = req.DomainName, HostName = hostInfo.HostName
                    });
                }
            }

            var res3 = eppApi.DomainUpdate(new DealerSafe.DTO.Epp.Request.ReqDomainUpdate
            {
                Rem = new Epp.Protocol.Domains.DomainAddRemType
                {
                    NameServers = new Epp.Protocol.Domains.NameServerList(md.NameServers.SplitWithTrim(',').Select(ns => new NameServerInfo {
                        HostName = ns
                    }))
                },
                Add = new Epp.Protocol.Domains.DomainAddRemType
                {
                    NameServers = new Epp.Protocol.Domains.NameServerList(req.NameServers.Select(ns => new NameServerInfo {
                        HostName = ns
                    }))
                },
                DomainName = req.DomainName
            });

            return(true);
        }
Example #3
0
        public Dictionary <string, bool> CheckDomainAvailablity(List <string> domainNames)
        {
            var eppApi = new EppAPI();

            return(eppApi
                   .DomainCheck(new DealerSafe.DTO.Epp.Request.ReqDomainCheck {
                DomainNames = domainNames.Distinct().ToList()
            })
                   .DomainInfos.ToDictionary(x => x.DomainName, x => x.Available));
        }
Example #4
0
        private ResContactCreate createContact(string contactId, EppAPI eppApi, string domainName)
        {
            var domainContact = Provider.Database.Read <DomainContact>("Id={0}", contactId);

            if (domainContact == null)
            {
                throw new Exception("Supplied contact ID is available on registry but there is no record with that ID in the table DomainContact");
            }
            return(eppApi.ContactCreate(domainContact.ConvertToReqContactCreate(domainName)));
        }
Example #5
0
        private JobStates domainTransferRequest(Job job)
        {
            var orderItem = Provider.Database.Read <OrderItem>("Id={0}", job.RelatedEntityId);
            var member    = orderItem.Order().Member();


            var memberDomain = Provider.Database.Read <MemberDomain>("DomainName={0}", orderItem.DisplayName);

            if (memberDomain == null || memberDomain.AuthInfo.IsEmpty())
            {
                throw new Exception("Member should enter domain transfer secret");
            }

            // Aşağıdaki işlemler RFC 5730 dikkate alınarak yazılmıştır. (https://tools.ietf.org/html/rfc5730#page-35)
            var eppApi = new EppAPI();

            var req = new ReqDomainTransferRequest();

            req.DomainName = memberDomain.DomainName;
            req.AuthInfo   = new Epp.Protocol.Shared.AuthInfo {
                Password = memberDomain.AuthInfo
            };
            req.Period = new DomainPeriod
            {
                Units  = orderItem.ProductPrice().Unit == "years" ? DomainPeriod.PeriodUnits.Year : DomainPeriod.PeriodUnits.Month,
                Period = orderItem.Amount
            };

            var res = eppApi.DomainTransferRequest(req);

            new Job()
            {
                Command           = JobCommands.DomainTransferQuery,
                Name              = orderItem.DisplayName,
                RelatedEntityName = "OrderItem",
                RelatedEntityId   = orderItem.Id,
                State             = JobStates.NotStarted,
                Executer          = JobExecuters.Machine,
                StartDate         = Provider.Database.Now.AddHours(1)
            }.Save();

            return(JobStates.Done);
        }
Example #6
0
        private JobStates domainCancel(Job job)
        {
            OrderItem oi = Provider.Database.Read <OrderItem>("Id={0}", job.RelatedEntityId);

            if (oi == null)
            {
                throw new APIException("OrderItem not found. refNo: " + job.RelatedEntityId);
            }

            MemberProduct mp = Provider.Database.Read <MemberProduct>("OrderItemId = {0}", oi.Id);

            if (mp == null)
            {
                throw new APIException("Critical error: OrderItem exists but MemberProduct doesn't, for orderItem : " + oi.Id);
            }

            MemberDomain md = Provider.Database.Read <MemberDomain>("Id = {0}", mp.Id);

            if (md == null)
            {
                throw new APIException("Critical error: MemberProduct exists but MemberDomain doesn't, for memberProduct : " + mp.Id);
            }

            if (mp.StartDate < Provider.Database.Now.AddDays(-5))
            {
                throw new APIException("You can cancel your domain and refund in the first 5 days of your domain registration.");
            }

            var eppApi = new EppAPI();

            eppApi.DomainDelete(new DealerSafe.DTO.Epp.Request.ReqDomainDelete
            {
                DomainName = md.DomainName
            });

            md.Delete();
            mp.Delete();

            oi.Cancel();

            return(JobStates.Done);
        }
Example #7
0
        private JobStates domainRenew(Job job)
        {
            var orderItem = Provider.Database.Read <OrderItem>("Id={0}", job.RelatedEntityId);
            var member    = orderItem.Order().Member();

            var memberDomain = Provider.Database.Read <MemberDomain>("DomainName={0}", orderItem.DisplayName);

            if (memberDomain == null)
            {
                throw new Exception("Domain name not found (" + orderItem.DisplayName + ")");
            }

            var memberProduct = Provider.Database.Read <MemberProduct>("Id={0}", memberDomain.Id);

            if (memberProduct == null)
            {
                throw new Exception("MemberProduct for domain name not found (" + orderItem.DisplayName + ")");
            }

            // Aşağıdaki işlemler RFC 5731 dikkate alınarak yazılmıştır. (https://tools.ietf.org/html/rfc5731#page-18)
            var eppApi = new EppAPI();

            var req = new ReqDomainRenew();

            req.DomainName         = memberDomain.DomainName;
            req.CurrExpirationDate = memberProduct.EndDate;
            req.Period             = new DomainPeriod {
                Units  = orderItem.ProductPrice().Unit == "years" ? DomainPeriod.PeriodUnits.Year : DomainPeriod.PeriodUnits.Month,
                Period = orderItem.Amount
            };

            var res = eppApi.DomainRenew(req);

            memberProduct.EndDate = res.ExpirationDate.Value;

            memberProduct.Save();

            return(JobStates.Done);
        }
Example #8
0
        private JobStates domainRestore(Job job)
        {
            // according to https://tools.ietf.org/html/rfc3915

            var orderItem = Provider.Database.Read <OrderItem>("Id={0}", job.RelatedEntityId);
            var member    = orderItem.Order().Member();


            var memberDomain = Provider.Database.Read <MemberDomain>("DomainName={0}", orderItem.DisplayName);

            if (memberDomain == null)
            {
                throw new Exception("MemberDomain record not found. If a domain name is not in our database, cannot be restored.");
            }

            var eppApi = new EppAPI();

            var req = new ReqDomainInfo();

            req.DomainName = memberDomain.DomainName;

            var res = eppApi.DomainInfo(req);

            // eğer domain state OK ise restore işlemi tamamlanmıştır
            if (res.Statuses.FirstOrDefault(s => s.Status == Epp.Protocol.Shared.Status.Ok) != null)
            {
                var memberProduct = Provider.Database.Read <MemberProduct>("Id={0}", memberDomain.Id);
                if (memberProduct == null)
                {
                    //null olmaması gerekir ama bir hatadan dolayı null ise hemen create edelim. bi sakınca yok
                    memberProduct = new MemberProduct
                    {
                        StartDate   = res.CreationDate.Value,
                        OrderItemId = job.RelatedEntityId,
                        MemberId    = member.Id,
                    };
                }

                memberProduct.EndDate = res.ExpirationDate.Value;
                memberProduct.Save();

                memberDomain.RegistryStatus = res.Statuses.StringJoin(",");
                memberDomain.RGPStatus      = res.ExtRgp == null ? statusValueType.NONE : res.ExtRgp.rgpStatus.FirstOrDefault().s;

                memberDomain.Save();

                return(JobStates.Done);
            }

            // eğer domain state OK değilse, pendingDelete de değilse, restore'da ne işin var kardeşim?
            if (res.Statuses.FirstOrDefault(s => s.Status == Epp.Protocol.Shared.Status.PendingDelete) == null)
            {
                throw new Exception("A domain with no pendingDelete status cannot be restored.");
            }

            // eğer domain redemptionPeriod'da ise, restore request komutunu göndeririz
            if (res.ExtRgp.rgpStatus.FirstOrDefault(s => s.s == statusValueType.redemptionPeriod) != null)
            {
                var reqRestore = new ReqDomainUpdate
                {
                    DomainName = memberDomain.DomainName,
                    ExtRgp     = new DealerSafe.DTO.Epp.Protocol.Rgp.updateType
                    {
                        restore = new DealerSafe.DTO.Epp.Protocol.Rgp.restoreType
                        {
                            op = DealerSafe.DTO.Epp.Protocol.Rgp.rgpOpType.request
                        }
                    }
                };

                var resRestore = eppApi.DomainUpdate(reqRestore);

                job.StartDate = Provider.Database.Now.AddMinutes(10);

                return(JobStates.TryAgain);
            }

            // eğer domain pendingRestore'da ise, restore report komutunu göndeririz
            if (res.ExtRgp.rgpStatus.FirstOrDefault(s => s.s == statusValueType.pendingRestore) != null)
            {
                var reqReport = new ReqDomainUpdate
                {
                    DomainName = memberDomain.DomainName,
                    ExtRgp     = new DealerSafe.DTO.Epp.Protocol.Rgp.updateType
                    {
                        restore = new DealerSafe.DTO.Epp.Protocol.Rgp.restoreType
                        {
                            op = DealerSafe.DTO.Epp.Protocol.Rgp.rgpOpType.report
                        }
                    }
                };

                var resRestore = eppApi.DomainUpdate(reqReport);

                job.StartDate = Provider.Database.Now.AddMinutes(10);

                return(JobStates.TryAgain);
            }

            job.StartDate = Provider.Database.Now.AddMinutes(10);
            return(JobStates.TryAgain);
        }
Example #9
0
        private JobStates domainTransferQuery(Job job)
        {
            // according to https://tools.ietf.org/html/rfc5730#page-30

            var orderItem = Provider.Database.Read <OrderItem>("Id={0}", job.RelatedEntityId);
            var member    = orderItem.Order().Member();


            var memberDomain = Provider.Database.Read <MemberDomain>("DomainName={0}", orderItem.DisplayName);

            if (memberDomain == null)
            {
                throw new Exception("Domain transfer process not yet started (first request then query)");
            }

            // Aşağıdaki işlemler RFC 5730 dikkate alınarak yazılmıştır. (https://tools.ietf.org/html/rfc5730#page-35)
            var eppApi = new EppAPI();

            var req = new ReqDomainTransferQuery();

            req.DomainName = memberDomain.DomainName;
            req.AuthInfo   = new Epp.Protocol.Shared.AuthInfo {
                Password = memberDomain.AuthInfo
            };
            req.Period = new DomainPeriod
            {
                Units  = orderItem.ProductPrice().Unit == "years" ? DomainPeriod.PeriodUnits.Year : DomainPeriod.PeriodUnits.Month,
                Period = orderItem.Amount
            };

            var res = eppApi.DomainTransferQuery(req);

            if (res.TransferRequestState.ToLowerInvariant() == memberDomain.TransferState.ToString().ToLowerInvariant())
            {
                return(JobStates.TryAgain);
            }

            switch (res.TransferRequestState.ToLowerInvariant())
            {
            case "clientApproved":
                memberDomain.TransferState = TransferStates.ClientApproved;
                memberDomain.Save();
                return(JobStates.TryAgain);

            case "clientCancelled":
                memberDomain.TransferState = TransferStates.ClientCancelled;
                memberDomain.Save();
                return(JobStates.Canceled);

            case "clientRejected":
                memberDomain.TransferState = TransferStates.ClientRejected;
                memberDomain.Save();
                return(JobStates.Canceled);

            case "pending":
                memberDomain.TransferState = TransferStates.Pending;
                memberDomain.Save();
                return(JobStates.TryAgain);

            case "serverApproved":
                memberDomain.TransferState = TransferStates.ServerApproved;
                memberDomain.Save();
                var memberProduct = Provider.Database.Read <MemberProduct>("Id={0}", memberDomain.Id);
                memberProduct.EndDate = res.ExpireDate.Value;
                memberProduct.Save();
                return(JobStates.Done);

            case "serverCancelled":
                memberDomain.TransferState = TransferStates.ServerCancelled;
                memberDomain.Save();
                return(JobStates.Canceled);

            default:
                memberDomain.TransferState = TransferStates.None;
                memberDomain.Save();
                throw new Exception("Registry returned an unknown transfer status: " + res.TransferRequestState);
            }


            return(JobStates.Failed); // buraya hiç gelmemesi lazım
        }
Example #10
0
        private JobStates domainRegister(Job job)
        {
            var orderItem = Provider.Database.Read <OrderItem>("Id={0}", job.RelatedEntityId);

            if (orderItem == null)
            {
                throw new Exception("OrderItem not found (in worker method domainRegister)");
            }

            var domainName = orderItem.DisplayName;

            var member = orderItem.Order().Member();

            var memberDomain =
                Provider.Database.Read <MemberDomain>("DomainName={0}", domainName)
                ??
                member.CreateNewMemberDomain(orderItem.DisplayName, orderItem.Id);

            var memberProduct = Provider.Database.Read <MemberProduct>("Id={0}", memberDomain.Id);

            if (memberProduct.CurrentPhase != LifeCyclePhases.None)
            {
                throw new Exception("Domain name (" + domainName + " #" + memberDomain.Id + ") already created (in worker method domainRegister)");
            }

            var product = memberProduct.OrderItem().Product();

            // Aşağıdaki işlemler RFC 5731 dikkate alınarak yazılmıştır. (https://tools.ietf.org/html/rfc5731#page-18)
            var eppApi = new EppAPI();

            var req = new ReqDomainCreate();

            // 1. ContactCheck
            if (product.GetProperty("WhoisServerHolder") == "Registry")
            {
                var reqContactCheck = new ReqContactCheck()
                {
                    DomainName = domainName
                };

                // 1.1. contact id'lerin hepsini bir seferde check edelim
                reqContactCheck.ContactIDs = new List <string>();
                if (!memberDomain.OwnerDomainContactId.IsEmpty())
                {
                    reqContactCheck.ContactIDs.Add(memberDomain.OwnerDomainContactId);
                }
                if (!memberDomain.AdminDomainContactId.IsEmpty())
                {
                    reqContactCheck.ContactIDs.Add(memberDomain.AdminDomainContactId);
                }
                if (!memberDomain.BillingDomainContactId.IsEmpty())
                {
                    reqContactCheck.ContactIDs.Add(memberDomain.BillingDomainContactId);
                }
                if (!memberDomain.TechDomainContactId.IsEmpty())
                {
                    reqContactCheck.ContactIDs.Add(memberDomain.TechDomainContactId);
                }
                reqContactCheck.ContactIDs = reqContactCheck.ContactIDs.Distinct().ToList();

                if (reqContactCheck.ContactIDs.Count > 0)
                {
                    var resContactCheck = eppApi.ContactCheck(reqContactCheck);

                    // 1.2. eğer registry tarafında contact create edilmemişse create edelim
                    if (!memberDomain.OwnerDomainContactId.IsEmpty())
                    {
                        if (resContactCheck.IsAvailable(memberDomain.OwnerDomainContactId))
                        {
                            createContact(memberDomain.OwnerDomainContactId, eppApi, domainName);
                            resContactCheck.ContactInfos.First(ci => ci.ContactId == memberDomain.OwnerDomainContactId).Available = false;
                        }
                        req.Registrant = memberDomain.OwnerDomainContactId;
                    }
                    if (!memberDomain.AdminDomainContactId.IsEmpty())
                    {
                        if (resContactCheck.IsAvailable(memberDomain.AdminDomainContactId))
                        {
                            createContact(memberDomain.AdminDomainContactId, eppApi, domainName);
                            resContactCheck.ContactInfos.First(ci => ci.ContactId == memberDomain.AdminDomainContactId).Available = false;
                        }
                        if (req.Contacts == null)
                        {
                            req.Contacts = new List <DomainContactInfo>();
                        }
                        req.Contacts.Add(new DomainContactInfo(memberDomain.AdminDomainContactId, DomainContactInfo.ContactType.Admin));
                    }
                    if (!memberDomain.BillingDomainContactId.IsEmpty())
                    {
                        if (resContactCheck.IsAvailable(memberDomain.BillingDomainContactId))
                        {
                            createContact(memberDomain.BillingDomainContactId, eppApi, domainName);
                            resContactCheck.ContactInfos.First(ci => ci.ContactId == memberDomain.BillingDomainContactId).Available = false;
                        }
                        if (req.Contacts == null)
                        {
                            req.Contacts = new List <DomainContactInfo>();
                        }
                        req.Contacts.Add(new DomainContactInfo(memberDomain.BillingDomainContactId, DomainContactInfo.ContactType.Billing));
                    }
                    if (!memberDomain.TechDomainContactId.IsEmpty())
                    {
                        if (resContactCheck.IsAvailable(memberDomain.TechDomainContactId))
                        {
                            createContact(memberDomain.TechDomainContactId, eppApi, domainName);
                            resContactCheck.ContactInfos.First(ci => ci.ContactId == memberDomain.TechDomainContactId).Available = false;
                        }
                        if (req.Contacts == null)
                        {
                            req.Contacts = new List <DomainContactInfo>();
                        }
                        req.Contacts.Add(new DomainContactInfo(memberDomain.TechDomainContactId, DomainContactInfo.ContactType.Tech));
                    }
                }
            }

            req.Registrant = memberDomain.OwnerDomainContactId;

            // 2. Nameserver'ları set edelim
            if (!memberDomain.NameServers.IsEmpty())
            {
                foreach (string host in memberDomain.NameServers.SplitWithTrim(";"))
                {
                    if (host.Contains(','))
                    {
                        var parts = host.SplitWithTrim(","); //TODO: IPv6'yı da desteklemek gerekecek gibi
                        req.NameServers.Add(new NameServerInfo {
                            HostName = parts[0], Addresses = new List <IpAddress> {
                                new IpAddress {
                                    Address = parts[1], Type = IpAddress.IpAddressType.V4
                                }
                            }
                        });
                    }
                    else
                    {
                        req.NameServers.Add(new NameServerInfo {
                            HostName = host
                        });
                    }
                }
            }

            // 3. The domain name itself
            req.DomainName = memberDomain.DomainName;

            // 4. Period
            req.RegistrationPeriod = new DomainPeriod
            {
                Units  = orderItem.ProductPrice().Unit == "years" ? DomainPeriod.PeriodUnits.Year : DomainPeriod.PeriodUnits.Month,
                Period = orderItem.Amount
            };

            // 5. AuthInfo
            req.AuthInfo = new Epp.Protocol.Shared.AuthInfo(memberDomain.AuthInfo);

            var res = eppApi.DomainCreate(req);

            memberProduct.StartDate    = res.CreateDate;
            memberProduct.EndDate      = res.ExpireDate.Value;
            memberProduct.CurrentPhase = LifeCyclePhases.Active;

            memberProduct.Save();

            var resInfo = eppApi.DomainInfo(new ReqDomainInfo {
                AuthInfo = req.AuthInfo, DomainName = req.DomainName
            });

            memberDomain.RegistryStates = resInfo.Statuses.Select(s => s.Status).ToList();
            memberDomain.Save();

            return(JobStates.Done);
        }