예제 #1
0
        ///GENMHASH:7D787B3687385E18B312D5F6D6DA9444:BFFE923AC1A74C33749D31F3CABB1EA2
        protected override RecordSetInner PrepareForUpdate(RecordSetInner resource)
        {
            if (Inner.ARecords != null && Inner.ARecords.Count > 0)
            {
                if (resource.ARecords == null)
                {
                    resource.ARecords = new List <ARecord>();
                }
                foreach (var record in Inner.ARecords)
                {
                    resource.ARecords.Add(record);
                }
                Inner.ARecords.Clear();
            }

            if (this.recordSetRemoveInfo.ARecords.Count > 0)
            {
                if (resource.ARecords != null)
                {
                    foreach (var recordToRemove in this.recordSetRemoveInfo.ARecords)
                    {
                        foreach (var record in resource.ARecords)
                        {
                            if (record.Ipv4Address.Equals(recordToRemove.Ipv4Address, System.StringComparison.OrdinalIgnoreCase))
                            {
                                resource.ARecords.Remove(record);
                                break;
                            }
                        }
                    }
                }
                this.recordSetRemoveInfo.ARecords.Clear();
            }
            return(resource);
        }
예제 #2
0
        private PrivateDnsRecordSetImpl WrapModel(RecordSetInner inner)
        {
            var recordSet = new PrivateDnsRecordSetImpl(inner.Name, inner.Type, this, inner);

            switch (recordSet.RecordType())
            {
            case RecordType.A:
                return(new ARecordSetImpl(inner.Name, this, inner));

            case RecordType.AAAA:
                return(new AaaaRecordSetImpl(inner.Name, this, inner));

            case RecordType.CNAME:
                return(new CnameRecordSetImpl(inner.Name, this, inner));

            case RecordType.MX:
                return(new MxRecordSetImpl(inner.Name, this, inner));

            case RecordType.PTR:
                return(new PtrRecordSetImpl(inner.Name, this, inner));

            case RecordType.SOA:
                return(new SoaRecordSetImpl(inner.Name, this, inner));

            case RecordType.SRV:
                return(new SrvRecordSetImpl(inner.Name, this, inner));

            case RecordType.TXT:
                return(new TxtRecordSetImpl(inner.Name, this, inner));

            default:
                return(recordSet);
            }
        }
예제 #3
0
 ///GENMHASH:A65D7F670CB73E56248FA5B252060BCD:0B3E2A2CA99FEE8D024AAE98E6686F31
 protected override IAaaaRecordSet WrapModel(RecordSetInner inner)
 {
     if (inner == null)
     {
         return(null);
     }
     return(new AaaaRecordSetImpl(inner.Name, dnsZone, inner));
 }
예제 #4
0
        ///GENMHASH:3F0A6CC3DBBB3330F47E8737215D7ECE:17D906D49BFF77D8768FB115CC63703F
        public ISoaRecordSet GetSoaRecordSet()
        {
            RecordSetInner inner = Extensions.Synchronize(() => Manager.Inner.RecordSets.GetAsync(ResourceGroupName, Name, "@", RecordType.SOA));

            if (inner == null)
            {
                return(null);
            }
            return(new SoaRecordSetImpl(inner.Name, this, inner));
        }
        ///GENMHASH:5C58E472AE184041661005E7B2D7EE30:2CAFCB69FA35BE2592639975C84B12D6
        public async override Task <IARecordSet> GetByNameAsync(string name, CancellationToken cancellationToken = default(CancellationToken))
        {
            RecordSetInner inner = await dnsZone.Manager.Inner.RecordSets.GetAsync(
                dnsZone.ResourceGroupName,
                dnsZone.Name,
                name,
                recordType,
                cancellationToken);

            return(new ARecordSetImpl(dnsZone, inner));
        }
예제 #6
0
        public async Task <RecordSetT> GetByNameAsync(string name, CancellationToken cancellationToken = default(CancellationToken))
        {
            RecordSetInner inner = await parent.Manager.Inner.RecordSets.GetAsync(
                parent.ResourceGroupName,
                parent.Name,
                recordType,
                name,
                cancellationToken);

            return(WrapModel(inner));
        }
예제 #7
0
        public async Task <RecordSetT> GetByIdAsync(string id, CancellationToken cancellationToken = default(CancellationToken))
        {
            RecordSetInner inner = await parent.Manager.Inner.RecordSets.GetAsync(
                parent.ResourceGroupName,
                parent.Name,
                recordType,
                ResourceUtils.NameFromResourceId(id),
                cancellationToken);

            return(WrapModel(inner));
        }
예제 #8
0
 ///GENMHASH:7D787B3687385E18B312D5F6D6DA9444:AF11C8A7E2B299112E3CED7714F622A7
 protected override RecordSetInner PrepareForUpdate(RecordSetInner resource)
 {
     if (resource.CnameRecord == null)
     {
         resource.CnameRecord = new CnameRecord();
     }
     if (Inner.CnameRecord.Cname != null)
     {
         resource.CnameRecord.Cname = Inner.CnameRecord.Cname;
     }
     return(resource);
 }
        ///GENMHASH:7D787B3687385E18B312D5F6D6DA9444:352DEB81080973F0DD8A640958597C6B
        protected override RecordSetInner PrepareForUpdate(RecordSetInner resource)
        {
            if (resource.SoaRecord == null)
            {
                resource.SoaRecord = new SoaRecord();
            }

            if (Inner.SoaRecord.Email != null)
            {
                resource.SoaRecord.Email = Inner.SoaRecord.Email;
            }

            if (Inner.SoaRecord.ExpireTime != null)
            {
                resource.SoaRecord.ExpireTime = Inner.SoaRecord.ExpireTime;
            }

            if (Inner.SoaRecord.MinimumTtl != null)
            {
                resource.SoaRecord.MinimumTtl = Inner.SoaRecord.MinimumTtl;
            }

            if (Inner.SoaRecord.RefreshTime != null)
            {
                resource.SoaRecord.RefreshTime = Inner.SoaRecord.RefreshTime;
            }

            if (Inner.SoaRecord.RetryTime != null)
            {
                resource.SoaRecord.RetryTime = Inner.SoaRecord.RetryTime;
            }

            if (Inner.SoaRecord.SerialNumber != null)
            {
                resource.SoaRecord.SerialNumber = Inner.SoaRecord.SerialNumber;
            }

            Inner.SoaRecord = new SoaRecord();
            return(resource);
        }
 ///GENMHASH:7D787B3687385E18B312D5F6D6DA9444:53BB67595D71CD0CA502C876E02949C2
 protected override RecordSetInner PrepareForUpdate(RecordSetInner resource)
 {
     if (Inner.SrvRecords != null && Inner.SrvRecords.Count > 0)
     {
         if (resource.SrvRecords == null)
         {
             resource.SrvRecords = new List <SrvRecord>();
         }
         foreach (var record in Inner.SrvRecords)
         {
             resource.SrvRecords.Add(record);
         }
         Inner.SrvRecords.Clear();
     }
     if (this.recordSetRemoveInfo.SrvRecords.Count > 0)
     {
         if (resource.SrvRecords != null)
         {
             foreach (var recordToRemove in this.recordSetRemoveInfo.SrvRecords)
             {
                 foreach (var record in resource.SrvRecords)
                 {
                     if (record.Target.Equals(recordToRemove.Target, StringComparison.OrdinalIgnoreCase) &&
                         (record.Port == recordToRemove.Port) &&
                         (record.Weight == recordToRemove.Weight) &&
                         (record.Priority == recordToRemove.Priority))
                     {
                         resource.SrvRecords.Remove(record);
                         break;
                     }
                 }
             }
         }
         this.recordSetRemoveInfo.SrvRecords.Clear();
     }
     return(resource);
 }
        ///GENMHASH:7D787B3687385E18B312D5F6D6DA9444:3DADD08418376111AE3468B0B95AA093
        protected override RecordSetInner PrepareForUpdate(RecordSetInner resource)
        {
            if (Inner.MxRecords != null && Inner.MxRecords.Count > 0)
            {
                if (resource.MxRecords == null)
                {
                    resource.MxRecords = new List <MxRecord>();
                }

                foreach (var record in Inner.MxRecords)
                {
                    resource.MxRecords.Add(record);
                }
                Inner.MxRecords.Clear();
            }

            if (this.recordSetRemoveInfo.MxRecords.Count > 0)
            {
                if (resource.MxRecords != null)
                {
                    foreach (var recordToRemove in this.recordSetRemoveInfo.MxRecords)
                    {
                        foreach (var record in resource.MxRecords)
                        {
                            if (record.Exchange.Equals(recordToRemove.Exchange, StringComparison.OrdinalIgnoreCase) &&
                                (record.Preference == recordToRemove.Preference))
                            {
                                resource.MxRecords.Remove(record);
                                break;
                            }
                        }
                    }
                }
                this.recordSetRemoveInfo.MxRecords.Clear();
            }
            return(resource);
        }
        ///GENMHASH:7D787B3687385E18B312D5F6D6DA9444:EE1172F9D1290826C7FCCEB7011C5DBF
        protected override RecordSetInner PrepareForUpdate(RecordSetInner resource)
        {
            if (Inner.TxtRecords != null && Inner.TxtRecords.Count > 0)
            {
                if (resource.TxtRecords == null)
                {
                    resource.TxtRecords = new List <TxtRecord>();
                }

                foreach (var record in Inner.TxtRecords)
                {
                    resource.TxtRecords.Add(record);
                }

                Inner.TxtRecords.Clear();
            }

            if (this.recordSetRemoveInfo.TxtRecords.Count > 0)
            {
                if (resource.TxtRecords != null)
                {
                    foreach (var recordToRemove in this.recordSetRemoveInfo.TxtRecords)
                    {
                        foreach (var record in resource.TxtRecords)
                        {
                            if (record.Value.Count != 0 && record.Value[0].Equals(recordToRemove.Value[0], StringComparison.OrdinalIgnoreCase))
                            {
                                resource.TxtRecords.Remove(record);
                                break;
                            }
                        }
                    }
                }
                this.recordSetRemoveInfo.TxtRecords.Clear();
            }
            return(resource);
        }
 ///GENMHASH:7D787B3687385E18B312D5F6D6DA9444:4C25CCDE325968ECA10D0148DB18F640
 protected override RecordSetInner PrepareForUpdate(RecordSetInner resource)
 {
     if (Inner.CaaRecords != null && Inner.CaaRecords.Count > 0)
     {
         if (resource.CaaRecords == null)
         {
             resource.CaaRecords = new List<CaaRecord>();
         }
         foreach (var record in Inner.CaaRecords)
         {
             resource.CaaRecords.Add(record);
         }
         Inner.CaaRecords.Clear();
     }
     if (this.recordSetRemoveInfo.CaaRecords.Count > 0)
     {
         if (resource.CaaRecords != null)
         {
             foreach (var recordToRemove in this.recordSetRemoveInfo.CaaRecords)
             {
                 foreach (var record in resource.CaaRecords)
                 {
                     if (record.Value.Equals(recordToRemove.Value, StringComparison.OrdinalIgnoreCase)
                         && (record.Flags == recordToRemove.Flags)
                         && (record.Tag.Equals(recordToRemove.Tag, StringComparison.OrdinalIgnoreCase)))
                     {
                         resource.CaaRecords.Remove(record);
                         break;
                     }
                 }
             }
         }
         this.recordSetRemoveInfo.CaaRecords.Clear();
     }
     return resource;
 }
 protected override IPtrRecordSet WrapModel(RecordSetInner inner)
 {
     return(inner == null ? null : new PtrRecordSetImpl(inner.Name, parent, inner));
 }
 ///GENMHASH:BCDFEFE12CEE04070A4BEFF0946CAA2C:51674516D8D4498FBB083895496288A6
 internal TxtRecordSetImpl(string name, DnsZoneImpl parent, RecordSetInner innerModel)
     : base(name, Enum.GetName(typeof(RecordType), Models.RecordType.TXT), parent, innerModel)
 {
 }
예제 #16
0
 ///GENMHASH:901E189AE86408AC3D4B4FC4B66B4701:3F5F2CC7F3C4A3B943EC7C1953A9D2E5
 internal NSRecordSetImpl(DnsZoneImpl parent, RecordSetInner innerModel) : base(parent, innerModel)
 {
 }
 ///GENMHASH:A65D7F670CB73E56248FA5B252060BCD:29F76B986FA21FD2583D531C098AD879
 protected override IARecordSet WrapModel(RecordSetInner inner)
 {
     return(new ARecordSetImpl(dnsZone, inner));
 }
 protected override RecordSetInner PrepareForUpdate(RecordSetInner resource)
 {
     return(resource);
 }
예제 #19
0
        public async Task DnsAuthorizationAsync(string named, string instanceId, AcmeChallengeResponse challenge)
        {
            var options = _optionsMonitor.Get(named);

            using var dnsManagementClient = await CreateDnsManagementClientAsync(options);

            var zone       = (await dnsManagementClient.Zones.ListAsync()).FirstOrDefault(x => challenge.Domain.EndsWith(x?.Name !));
            var resourceId = ParseResourceId(zone.Id);

            var fullDomainName = GetChallengeDnsName(challenge.Domain);

            var domain = fullDomainName.Replace("." + zone.Name, string.Empty);

            _logger.LogInformation("[Azure Dns Update][Started] Domain Name: {domainName}", challenge.Domain);

            RecordSetInner?recordSet;

            try
            {
                recordSet = await dnsManagementClient.RecordSets.GetAsync(resourceId["resourceGroups"], zone.Name, domain, RecordType.TXT);
            }
            catch
            {
                recordSet = null;
            }

            if (recordSet != null)
            {
                if (recordSet.Metadata == null || !recordSet.Metadata.TryGetValue("InstanceId", out var dnsInstanceId) || dnsInstanceId != instanceId)
                {
                    recordSet.Metadata = new Dictionary <string, string>
                    {
                        { "InstanceId", instanceId }
                    };

                    recordSet.TxtRecords.Clear();
                }

                recordSet.TTL = 3600;
                recordSet.TxtRecords.Add(new TxtRecord(new[] { challenge.Token }));
            }
            else
            {
                recordSet = new RecordSetInner()
                {
                    TTL      = 3600,
                    Metadata = new Dictionary <string, string>
                    {
                        { "InstanceId", instanceId }
                    },
                    TxtRecords = new[]
                    {
                        new TxtRecord(new[] { challenge.Token })
                    }
                };
            }

            await dnsManagementClient.RecordSets.CreateOrUpdateAsync(resourceId["resourceGroups"], zone.Name, domain, RecordType.TXT, recordSet);

            _logger.LogInformation("[Azure DNS Update][Ended] Domain Name: {domainName}", challenge.Domain);

            await CheckDnsChallengeAsync(challenge, fullDomainName);
        }
 /// <summary>
 /// Creates or updates a record set within a DNS zone.
 /// </summary>
 /// <param name='operations'>
 /// The operations group for this extension method.
 /// </param>
 /// <param name='resourceGroupName'>
 /// The name of the resource group.
 /// </param>
 /// <param name='zoneName'>
 /// The name of the DNS zone (without a terminating dot).
 /// </param>
 /// <param name='relativeRecordSetName'>
 /// The name of the record set, relative to the name of the zone.
 /// </param>
 /// <param name='recordType'>
 /// The type of DNS record in this record set. Record sets of type SOA can be
 /// updated but not created (they are created when the DNS zone is created).
 /// Possible values include: 'A', 'AAAA', 'CAA', 'CNAME', 'MX', 'NS', 'PTR',
 /// 'SOA', 'SRV', 'TXT'
 /// </param>
 /// <param name='parameters'>
 /// Parameters supplied to the CreateOrUpdate operation.
 /// </param>
 /// <param name='ifMatch'>
 /// The etag of the record set. Omit this value to always overwrite the current
 /// record set. Specify the last-seen etag value to prevent accidentally
 /// overwritting any concurrent changes.
 /// </param>
 /// <param name='ifNoneMatch'>
 /// Set to '*' to allow a new record set to be created, but to prevent updating
 /// an existing record set. Other values will be ignored.
 /// </param>
 /// <param name='cancellationToken'>
 /// The cancellation token.
 /// </param>
 public static async Task <RecordSetInner> CreateOrUpdateAsync(this IRecordSetsOperations operations, string resourceGroupName, string zoneName, string relativeRecordSetName, RecordType recordType, RecordSetInner parameters, string ifMatch = default(string), string ifNoneMatch = default(string), CancellationToken cancellationToken = default(CancellationToken))
 {
     using (var _result = await operations.CreateOrUpdateWithHttpMessagesAsync(resourceGroupName, zoneName, relativeRecordSetName, recordType, parameters, ifMatch, ifNoneMatch, null, cancellationToken).ConfigureAwait(false))
     {
         return(_result.Body);
     }
 }
예제 #21
0
 internal SoaRecordSetImpl(string name, PrivateDnsZoneImpl parent, RecordSetInner innerModel)
     : base(name, Enum.GetName(typeof(RecordType), Models.RecordType.SOA), parent, innerModel)
 {
 }
예제 #22
0
        private async Task <ChallengeResult> DnsAuthorizationAsync(string authorizationUrl, string instanceId)
        {
            var acmeProtocolClient = await CreateAcmeClientAsync();

            var authorizationDetails = await acmeProtocolClient.GetAuthorizationDetailsAsync(authorizationUrl);

            var challenge = authorizationDetails.Challenges.First(x => x.Type == "dns-01");
            var challengeValidationDetails = AuthorizationDecoder.ResolveChallengeForDns01(authorizationDetails, challenge, acmeProtocolClient.Signer);

            var dnsManagementClient = await CreateDnsManagementClientAsync();

            var zone              = (await dnsManagementClient.Zones.ListAsync()).First(x => challengeValidationDetails.DnsRecordName.EndsWith(x.Name));
            var resourceId        = ParseResourceId(zone.Id);
            var acmeDnsRecordName = challengeValidationDetails.DnsRecordName.Replace("." + zone.Name, "");

            RecordSetInner recordSet;

            try
            {
                recordSet = await dnsManagementClient.RecordSets.GetAsync(resourceId["resourceGroups"], zone.Name, acmeDnsRecordName, RecordType.TXT);
            }
            catch
            {
                recordSet = null;
            }

            if (recordSet != null)
            {
                if (recordSet.Metadata == null || !recordSet.Metadata.TryGetValue("InstanceId", out var dnsInstanceId) || dnsInstanceId != instanceId)
                {
                    recordSet.Metadata = new Dictionary <string, string>
                    {
                        { "InstanceId", instanceId }
                    };

                    recordSet.TxtRecords.Clear();
                }

                recordSet.TTL = 60;
                recordSet.TxtRecords.Add(new TxtRecord(new[] { challengeValidationDetails.DnsRecordValue }));
            }
            else
            {
                recordSet = new RecordSetInner()
                {
                    TTL      = 60,
                    Metadata = new Dictionary <string, string>
                    {
                        { "InstanceId", instanceId }
                    },
                    TxtRecords = new[]
                    {
                        new TxtRecord(new[] { challengeValidationDetails.DnsRecordValue })
                    }
                };
            }

            await dnsManagementClient.RecordSets.CreateOrUpdateAsync(resourceId["resourceGroups"], zone.Name, acmeDnsRecordName, RecordType.TXT, recordSet);

            return(new ChallengeResult()
            {
                Url = challenge.Url,
                DnsRecordName = challengeValidationDetails.DnsRecordName,
                DnsRecordValue = challengeValidationDetails.DnsRecordValue
            });
        }