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); } } }
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); }
public void CanParseDN(string dn, string expected = null) { var parsed = new LdapDistinguishedName(dn); if (expected is null) { expected = dn; } Assert.Equal(expected, parsed.ToString()); }
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); }
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); }
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)); }