示例#1
0
        public LdapSearchQueue Search(string @base, int scope, RfcFilter filter, string[] attrs, bool namesOnly = false)
        {
            LdapMessage m = new LdapSearchRequest(@base, scope, filter, attrs,
                                                  LdapSearchConstraints.DerefAlways, 512, 1, namesOnly, null);

            return((LdapSearchQueue)Connection.SendRequest(m, null));
        }
示例#2
0
        public LdapMessageQueue SendSearch(string searchBase, string filter)
        {
            var lcm = LdapConnectionManager.Instance;
            var con = lcm.GetConnection();

            var sb = searchBase + config.searchBase;

            var req = new LdapSearchRequest(sb, LdapConnection.ScopeSub, filter, null, LdapSearchConstraints.DerefNever, config.maxResults, 0, false, null);

            var queue = con.SendRequest(req, null);

            return(queue);
        }
示例#3
0
 private void LoadBaseDNData()
 {
     using (LdapConnHelper ldapConn = new LdapConnHelper(DomainName, LdapConnHelper.DefaultLdapPortNum, true, false))
     {
         ldapConn.TryConnection(new TimeSpan(0, 1, 0), CredentialCache.DefaultNetworkCredentials, 3, AuthType.Basic);
         if (ldapConn.IsConnected)
         {
             WriteTrace("Connected to: " + DomainName);
         }
         LdapFilter        ldapFilter = new LdapFilter(LdapFilter.AllObjects);
         LdapSearchRequest searchReq  = new LdapSearchRequest(RootOU, ldapFilter,
                                                              System.DirectoryServices.Protocols.SearchScope.OneLevel, null);
         SearchResponse searchResp = ldapConn.PerformSearch(searchReq);
         foreach (SearchResultEntry sre in searchResp.Entries)
         {
             DdBaseDN.Items.Add(sre.DistinguishedName);
         }
     }
 }
示例#4
0
 private void BtnSearch_Click(object sender, EventArgs e)
 {
     using (LdapConnHelper ldapConn = new LdapConnHelper(DomainName, LdapConnHelper.DefaultLdapPortNum, true, false))
     {
         ldapConn.TryConnection(new TimeSpan(0, 1, 0), CredentialCache.DefaultNetworkCredentials, 3, AuthType.Basic);
         if (ldapConn.IsConnected)
         {
             WriteTrace("Connected to: " + DomainName);
         }
         LdapFilter        ldapFilter = new LdapFilter(TxtSearchFilter.Text.Trim());
         LdapSearchRequest searchReq  = new LdapSearchRequest(DdBaseDN.Text, ldapFilter,
                                                              System.DirectoryServices.Protocols.SearchScope.Subtree, LdapSearchRequest.UserAttributes);
         SearchResponse searchResp = ldapConn.PerformSearch(searchReq);
         foreach (SearchResultEntry sre in searchResp.Entries)
         {
             LdapUserRecord usrRecord = new LdapUserRecord(sre);
             if (usrRecord.IsValidUser())
             {
                 WriteTrace(usrRecord.ToString());
             }
         }
     }
 }
示例#5
0
            public Task <IEnumerable <LdapRequestMessage> > Search(string baseDN, string filter, SearchScope scope, int sizeLimit, string[] attributes)
            {
                var request = new LdapSearchRequest(2, baseDN, scope, filter, attributes, false, TimeSpan.Zero, sizeLimit, new LdapControl[0]);

                return(OnSearchAsync(request, _connection, _connection.CancellationToken));
            }
示例#6
0
 private IQueryable <LdapExtension> SearchExtension(IQueryable <Extension> extensions, LdapSearchRequest request)
 {
     return(extensions
            .Where(x => x.InPhonebook)
            .Where(x => x.Number != String.Empty)
            .Select(x => new LdapExtension
     {
         Number = x.Number,
         Name = x.Name,
         Location = x.Location,
         Event = x.Event.Name,
         LastModified = x.LastChanged
     })
            .Where(FilterExtension(request.Filter)));
 }
示例#7
0
 private IQueryable <LdapEvent> SearchEvent(IQueryable <Event> events, LdapSearchRequest request, LdapClientConnection connection)
 {
     return(SearchEvent(events, connection).Where(FilterEvent(request.Filter)));
 }
示例#8
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);
        }
示例#9
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);
        }
示例#10
0
        protected override async Task <IEnumerable <LdapRequestMessage> > OnSearchAsync(LdapSearchRequest request, LdapClientConnection connection, CancellationToken cancellationToken)
        {
            Console.WriteLine($"search for {request.Filter} in {request.BaseObject} ({request.Scope}) [{connection.Id}]");
            using (var context = GetContext())
            {
                IQueryable <Event> dbEvents = context.Events;
                if (Sessions.TryGetValue(connection.Id, out var eventId))
                {
                    dbEvents = dbEvents.Where(x => x.Id == eventId);
                }
                if (String.Equals(request.BaseObject.ToString(), RootDN.ToString(), StringComparison.OrdinalIgnoreCase))
                {
                    if (request.Scope == SearchScope.BaseObject)
                    {
                        //search root
                        var attributes = GetRootDSE().GetAttributes(request.Attributes, request.TypesOnly);
                        var result     = request.Result(RootDN, attributes.ToArray(), new LdapControl[0]);
                        return(new[] { result });
                    }
                    else
                    {
                        //search events
                        var events = await SearchEventAsync(dbEvents, request, connection, cancellationToken);

                        var results = events.ToList();

                        if (request.Scope == SearchScope.WholeSubtree)
                        {
                            //include extensions
                            var dbExtensions = SearchEvent(dbEvents, connection).Join(context.Extensions, x => x.Id, x => x.EventId, (x, y) => y);
                            var extension    = await SearchExtensionAsync(dbExtensions, request, cancellationToken);

                            if (request.SizeLimit > 0)
                            {
                                extension = extension.Take(request.SizeLimit - results.Count);
                            }
                            results.AddRange(extension);
                        }
                        return(results);
                    }
                }
                else
                {
                    var rdns = request.BaseObject.RDNs;
                    if (rdns.Count <= 2 || rdns.Count > 4)
                    {
                        return(new LdapRequestMessage[0]);
                    }

                    //search extensions
                    IQueryable <Extension> query = SearchEvent(dbEvents, connection).Join(context.Extensions, x => x.Id, x => x.EventId, (x, y) => y);

                    if (rdns.Count >= 3)
                    {
                        var eventName = rdns[rdns.Count - 3].Values[0].Value;
                        if (rdns.Count == 3 && request.Scope == SearchScope.BaseObject)
                        {
                            //get event
                            var events = await SearchEventAsync(dbEvents.Where(x => x.Name == eventName), request, connection, cancellationToken);

                            return(events.ToList());
                        }
                        query = query.Where(x => x.Event.Name == eventName);
                    }

                    if (rdns.Count == 4)
                    {
                        if (request.Scope != SearchScope.BaseObject)
                        {
                            return(new LdapRequestMessage[0]);
                        }

                        var extension = rdns[0].Values[0].Value;
                        query = query.Where(x => x.Number == extension);
                    }

                    if (Sessions.TryGetValue(connection.Id, out eventId))
                    {
                        query = query.Where(x => x.EventId == eventId);
                    }
                    var result = await SearchExtensionAsync(query, request, cancellationToken);

                    return(result);
                }
            }
        }