Exemple #1
0
        protected override async Task <ResultCode> OnSaslBindAsync(LdapDistinguishedName bindDN, string username, ReadOnlyMemory <byte> password, LdapClientConnection connection)
        {
            if (String.IsNullOrEmpty(username))
            {
                Console.WriteLine($"bind to {bindDN} (anon) [{connection.Id}]");
                return(ResultCode.Success);
            }

            using (var context = GetContext())
            {
                Console.WriteLine($"bind to {bindDN} ({username}) [{connection.Id}]");
                var eventId = await context.Events.Where(x => x.Name == username).Select(x => x.Id).FirstOrDefaultAsync(connection.CancellationToken);

                if (eventId != default)
                {
                    Sessions.AddOrUpdate(connection.Id, eventId, (x, y) => eventId);
                    if (!String.IsNullOrEmpty(AdminToken))
                    {
                        var pass = Encoding.UTF8.GetString(password.Span);
                        if (pass == AdminToken)
                        {
                            _admins.AddOrUpdate(connection.Id, true, (x, y) => true);
                        }
                    }
                    return(ResultCode.Success);
                }
                else
                {
                    return(ResultCode.InvalidCredentials);
                }
            }
        }
Exemple #2
0
        private async Task <IEnumerable <LdapRequestMessage> > SearchEventAsync(IQueryable <Event> query, LdapSearchRequest request, LdapClientConnection connection, CancellationToken cancellationToken)
        {
            var eventQuery = SearchEvent(query, request, connection);

            if (request.SizeLimit > 0)
            {
                eventQuery = eventQuery.Take(request.SizeLimit);
            }
            var result = await eventQuery.ToArrayAsync(cancellationToken);

            var events = result.Select(x => new OrganizationalUnitObjectClass
            {
                Ou          = { Entries = { x.Name } },
                Description = String.IsNullOrEmpty(x.Description)
                    ? null
                    : new DescriptionAttribute {
                    Entries = { x.Description }
                },
                Locality = String.IsNullOrEmpty(x.Location) ? null : new LocalityAttribute {
                    Entries = { x.Location }
                }
            }).ToList();
            var results = new List <LdapRequestMessage>(events.Count);

            foreach (var item in events)
            {
                var attributes = item.GetAttributes(request.Attributes, request.TypesOnly);
                var dn         = new LdapDistinguishedName(item.Ou.Name, item.Ou.Entries[0], RootDN);
                results.Add(request.Result(dn, attributes.ToArray(), new LdapControl[0]));
            }
            return(results);
        }
Exemple #3
0
        public void CanParseDN(string dn, string expected = null)
        {
            var parsed = new LdapDistinguishedName(dn);

            if (expected is null)
            {
                expected = dn;
            }
            Assert.Equal(expected, parsed.ToString());
        }
Exemple #4
0
        public void CanParseUnescapedEqual()
        {
            var dn     = "CN=test=user,DC=example,DC=ne=t";
            var parsed = new LdapDistinguishedName(dn);

            Assert.Equal(3, parsed.RDNs.Count);
            var value = Assert.Single(parsed.RDNs[0].Values);

            Assert.Equal("CN", value.Type);
            Assert.Equal("test=user", value.Value);
            value = Assert.Single(parsed.RDNs[1].Values);
            Assert.Equal("DC", value.Type);
            Assert.Equal("example", value.Value);
            value = Assert.Single(parsed.RDNs[2].Values);
            Assert.Equal("DC", value.Type);
            Assert.Equal("ne=t", value.Value);
        }
Exemple #5
0
        private async Task <IEnumerable <LdapRequestMessage> > SearchExtensionAsync(IQueryable <Extension> query, LdapSearchRequest request, CancellationToken cancellationToken)
        {
            var extensionQuery = SearchExtension(query, request);

            if (request.SizeLimit > 0)
            {
                extensionQuery = extensionQuery.Take(request.SizeLimit);
            }
            var result = await extensionQuery.ToArrayAsync(cancellationToken);

            var extensions = result.Select(x => new OrganizationalPersonObjectClass
            {
                Parent   = new LdapDistinguishedName("ou", x.Event, RootDN),
                Cn       = { Entries = { x.Number } },
                Sn       = { Entries = { String.IsNullOrEmpty(x.Name) ? x.Number : x.Name } },
                Locality = String.IsNullOrEmpty(x.Location) ? null : new LocalityAttribute {
                    Entries = { x.Location }
                },
                OrganizationalUnitName = new OuAttribute {
                    Entries = { x.Event }
                },
                TelephoneNumber = new TelephoneNumberAttribute {
                    Entries = { x.Number }
                },
                CreatorsName = new CreatorsNameAttribute {
                    Entries = { new LdapDistinguishedName("cn", "GURU3", RootDN) }
                },
                ModifiersName = new ModifiersNameAttribute {
                    Entries = { new LdapDistinguishedName("cn", "GURU3", RootDN) }
                },
                ModifyTimestamp = new ModifyTimestampAttribute {
                    Entries = { x.LastModified }
                },
            })
                             .ToList();
            var results = new List <LdapRequestMessage>(extensions.Count);

            foreach (var item in extensions)
            {
                var attributes = item.GetAttributes(request.Attributes, request.TypesOnly);
                var dn         = new LdapDistinguishedName(item.Cn.Name, item.Cn.Entries[0], item.Parent);
                results.Add(request.Result(dn, attributes.ToArray(), new LdapControl[0]));
            }
            return(results);
        }
Exemple #6
0
        protected override Task <ResultCode> OnBindAsync(LdapDistinguishedName bindDN, ReadOnlyMemory <byte> password, LdapClientConnection connection)
        {
            var username = bindDN.RDNs.SelectMany(x => x.Values).Select(x => x.Value).FirstOrDefault();

            return(OnSaslBindAsync(bindDN, username, password, connection));
        }