mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 00:02:59 -04:00 
			
		
		
		
	Add option to use paged LDAP search when synchronizing users (#3895)
This commit is contained in:
		
							parent
							
								
									7467ff3d94
								
							
						
					
					
						commit
						501fb228e6
					
				| @ -25,6 +25,8 @@ type AuthenticationForm struct { | |||||||
| 	AttributeSurname              string | 	AttributeSurname              string | ||||||
| 	AttributeMail                 string | 	AttributeMail                 string | ||||||
| 	AttributesInBind              bool | 	AttributesInBind              bool | ||||||
|  | 	UsePagedSearch                bool | ||||||
|  | 	SearchPageSize                int | ||||||
| 	Filter                        string | 	Filter                        string | ||||||
| 	AdminFilter                   string | 	AdminFilter                   string | ||||||
| 	IsActive                      bool | 	IsActive                      bool | ||||||
|  | |||||||
| @ -42,6 +42,7 @@ type Source struct { | |||||||
| 	AttributeSurname  string // Surname attribute | 	AttributeSurname  string // Surname attribute | ||||||
| 	AttributeMail     string // E-mail attribute | 	AttributeMail     string // E-mail attribute | ||||||
| 	AttributesInBind  bool   // fetch attributes in bind context (not user) | 	AttributesInBind  bool   // fetch attributes in bind context (not user) | ||||||
|  | 	SearchPageSize    uint32 // Search with paging page size | ||||||
| 	Filter            string // Query filter to validate entry | 	Filter            string // Query filter to validate entry | ||||||
| 	AdminFilter       string // Query filter to check if user is admin | 	AdminFilter       string // Query filter to check if user is admin | ||||||
| 	Enabled           bool   // if this source is disabled | 	Enabled           bool   // if this source is disabled | ||||||
| @ -269,6 +270,11 @@ func (ls *Source) SearchEntry(name, passwd string, directBind bool) *SearchResul | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // UsePagedSearch returns if need to use paged search | ||||||
|  | func (ls *Source) UsePagedSearch() bool { | ||||||
|  | 	return ls.SearchPageSize > 0 | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // SearchEntries : search an LDAP source for all users matching userFilter | // SearchEntries : search an LDAP source for all users matching userFilter | ||||||
| func (ls *Source) SearchEntries() []*SearchResult { | func (ls *Source) SearchEntries() []*SearchResult { | ||||||
| 	l, err := dial(ls) | 	l, err := dial(ls) | ||||||
| @ -298,7 +304,12 @@ func (ls *Source) SearchEntries() []*SearchResult { | |||||||
| 		[]string{ls.AttributeUsername, ls.AttributeName, ls.AttributeSurname, ls.AttributeMail}, | 		[]string{ls.AttributeUsername, ls.AttributeName, ls.AttributeSurname, ls.AttributeMail}, | ||||||
| 		nil) | 		nil) | ||||||
| 
 | 
 | ||||||
| 	sr, err := l.Search(search) | 	var sr *ldap.SearchResult | ||||||
|  | 	if ls.UsePagedSearch() { | ||||||
|  | 		sr, err = l.SearchWithPaging(search, ls.SearchPageSize) | ||||||
|  | 	} else { | ||||||
|  | 		sr, err = l.Search(search) | ||||||
|  | 	} | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Error(4, "LDAP Search failed unexpectedly! (%v)", err) | 		log.Error(4, "LDAP Search failed unexpectedly! (%v)", err) | ||||||
| 		return nil | 		return nil | ||||||
|  | |||||||
| @ -1352,6 +1352,8 @@ auths.attribute_name = First Name Attribute | |||||||
| auths.attribute_surname = Surname Attribute | auths.attribute_surname = Surname Attribute | ||||||
| auths.attribute_mail = Email Attribute | auths.attribute_mail = Email Attribute | ||||||
| auths.attributes_in_bind = Fetch Attributes in Bind DN Context | auths.attributes_in_bind = Fetch Attributes in Bind DN Context | ||||||
|  | auths.use_paged_search = Use paged search | ||||||
|  | auths.search_page_size = Page size | ||||||
| auths.filter = User Filter | auths.filter = User Filter | ||||||
| auths.admin_filter = Admin Filter | auths.admin_filter = Admin Filter | ||||||
| auths.ms_ad_sa = MS AD Search Attributes | auths.ms_ad_sa = MS AD Search Attributes | ||||||
|  | |||||||
| @ -1138,6 +1138,16 @@ function initAdmin() { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     function onUsePagedSearchChange() { | ||||||
|  |         if ($('#use_paged_search').prop('checked')) { | ||||||
|  |             $('.search-page-size').show() | ||||||
|  |                 .find('input').attr('required', 'required'); | ||||||
|  |         } else { | ||||||
|  |             $('.search-page-size').hide() | ||||||
|  |                 .find('input').removeAttr('required'); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     function onOAuth2Change() { |     function onOAuth2Change() { | ||||||
|         $('.open_id_connect_auto_discovery_url, .oauth2_use_custom_url').hide(); |         $('.open_id_connect_auto_discovery_url, .oauth2_use_custom_url').hide(); | ||||||
|         $('.open_id_connect_auto_discovery_url input[required]').removeAttr('required'); |         $('.open_id_connect_auto_discovery_url input[required]').removeAttr('required'); | ||||||
| @ -1191,7 +1201,7 @@ function initAdmin() { | |||||||
|     // New authentication
 |     // New authentication
 | ||||||
|     if ($('.admin.new.authentication').length > 0) { |     if ($('.admin.new.authentication').length > 0) { | ||||||
|         $('#auth_type').change(function () { |         $('#auth_type').change(function () { | ||||||
|             $('.ldap, .dldap, .smtp, .pam, .oauth2, .has-tls').hide(); |             $('.ldap, .dldap, .smtp, .pam, .oauth2, .has-tls .search-page-size').hide(); | ||||||
| 
 | 
 | ||||||
|             $('.ldap input[required], .dldap input[required], .smtp input[required], .pam input[required], .oauth2 input[required], .has-tls input[required]').removeAttr('required'); |             $('.ldap input[required], .dldap input[required], .smtp input[required], .pam input[required], .oauth2 input[required], .has-tls input[required]').removeAttr('required'); | ||||||
| 
 | 
 | ||||||
| @ -1223,9 +1233,13 @@ function initAdmin() { | |||||||
|             if (authType == '2' || authType == '5') { |             if (authType == '2' || authType == '5') { | ||||||
|                 onSecurityProtocolChange() |                 onSecurityProtocolChange() | ||||||
|             } |             } | ||||||
|  |             if (authType == '2') { | ||||||
|  |                 onUsePagedSearchChange(); | ||||||
|  |             } | ||||||
|         }); |         }); | ||||||
|         $('#auth_type').change(); |         $('#auth_type').change(); | ||||||
|         $('#security_protocol').change(onSecurityProtocolChange); |         $('#security_protocol').change(onSecurityProtocolChange); | ||||||
|  |         $('#use_paged_search').change(onUsePagedSearchChange); | ||||||
|         $('#oauth2_provider').change(onOAuth2Change); |         $('#oauth2_provider').change(onOAuth2Change); | ||||||
|         $('#oauth2_use_custom_url').change(onOAuth2UseCustomURLChange); |         $('#oauth2_use_custom_url').change(onOAuth2UseCustomURLChange); | ||||||
|     } |     } | ||||||
| @ -1234,6 +1248,9 @@ function initAdmin() { | |||||||
|         var authType = $('#auth_type').val(); |         var authType = $('#auth_type').val(); | ||||||
|         if (authType == '2' || authType == '5') { |         if (authType == '2' || authType == '5') { | ||||||
|             $('#security_protocol').change(onSecurityProtocolChange); |             $('#security_protocol').change(onSecurityProtocolChange); | ||||||
|  |             if (authType == '2') { | ||||||
|  |                 $('#use_paged_search').change(onUsePagedSearchChange); | ||||||
|  |             } | ||||||
|         } else if (authType == '6') { |         } else if (authType == '6') { | ||||||
|             $('#oauth2_provider').change(onOAuth2Change); |             $('#oauth2_provider').change(onOAuth2Change); | ||||||
|             $('#oauth2_use_custom_url').change(onOAuth2UseCustomURLChange); |             $('#oauth2_use_custom_url').change(onOAuth2UseCustomURLChange); | ||||||
|  | |||||||
| @ -91,6 +91,10 @@ func NewAuthSource(ctx *context.Context) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func parseLDAPConfig(form auth.AuthenticationForm) *models.LDAPConfig { | func parseLDAPConfig(form auth.AuthenticationForm) *models.LDAPConfig { | ||||||
|  | 	var pageSize uint32 | ||||||
|  | 	if form.UsePagedSearch { | ||||||
|  | 		pageSize = uint32(form.SearchPageSize) | ||||||
|  | 	} | ||||||
| 	return &models.LDAPConfig{ | 	return &models.LDAPConfig{ | ||||||
| 		Source: &ldap.Source{ | 		Source: &ldap.Source{ | ||||||
| 			Name:              form.Name, | 			Name:              form.Name, | ||||||
| @ -107,6 +111,7 @@ func parseLDAPConfig(form auth.AuthenticationForm) *models.LDAPConfig { | |||||||
| 			AttributeSurname:  form.AttributeSurname, | 			AttributeSurname:  form.AttributeSurname, | ||||||
| 			AttributeMail:     form.AttributeMail, | 			AttributeMail:     form.AttributeMail, | ||||||
| 			AttributesInBind:  form.AttributesInBind, | 			AttributesInBind:  form.AttributesInBind, | ||||||
|  | 			SearchPageSize:    pageSize, | ||||||
| 			Filter:            form.Filter, | 			Filter:            form.Filter, | ||||||
| 			AdminFilter:       form.AdminFilter, | 			AdminFilter:       form.AdminFilter, | ||||||
| 			Enabled:           true, | 			Enabled:           true, | ||||||
|  | |||||||
| @ -91,6 +91,16 @@ | |||||||
| 						<input id="attribute_mail" name="attribute_mail" value="{{$cfg.AttributeMail}}" placeholder="e.g. mail" required> | 						<input id="attribute_mail" name="attribute_mail" value="{{$cfg.AttributeMail}}" placeholder="e.g. mail" required> | ||||||
| 					</div> | 					</div> | ||||||
| 					{{if .Source.IsLDAP}} | 					{{if .Source.IsLDAP}} | ||||||
|  | 						<div class="inline field"> | ||||||
|  | 							<div class="ui checkbox"> | ||||||
|  | 								<label for="use_paged_search"><strong>{{.i18n.Tr "admin.auths.use_paged_search"}}</strong></label> | ||||||
|  | 								<input id="use_paged_search" name="use_paged_search" type="checkbox" {{if $cfg.UsePagedSearch}}checked{{end}}> | ||||||
|  | 							</div> | ||||||
|  | 						</div> | ||||||
|  | 						<div class="field required search-page-size{{if not $cfg.UsePagedSearch}} hide{{end}}"> | ||||||
|  | 							<label for="search_page_size">{{.i18n.Tr "admin.auths.search_page_size"}}</label> | ||||||
|  | 							<input id="search_page_size" name="search_page_size" value="{{if $cfg.UsePagedSearch}}{{$cfg.SearchPageSize}}{{end}}"> | ||||||
|  | 						</div> | ||||||
| 						<div class="inline field"> | 						<div class="inline field"> | ||||||
| 							<div class="ui checkbox"> | 							<div class="ui checkbox"> | ||||||
| 								<label><strong>{{.i18n.Tr "admin.auths.attributes_in_bind"}}</strong></label> | 								<label><strong>{{.i18n.Tr "admin.auths.attributes_in_bind"}}</strong></label> | ||||||
|  | |||||||
| @ -62,4 +62,14 @@ | |||||||
| 		<label for="attribute_mail">{{.i18n.Tr "admin.auths.attribute_mail"}}</label> | 		<label for="attribute_mail">{{.i18n.Tr "admin.auths.attribute_mail"}}</label> | ||||||
| 		<input id="attribute_mail" name="attribute_mail" value="{{.attribute_mail}}" placeholder="e.g. mail"> | 		<input id="attribute_mail" name="attribute_mail" value="{{.attribute_mail}}" placeholder="e.g. mail"> | ||||||
| 	</div> | 	</div> | ||||||
|  | 	<div class="ldap inline field {{if not (eq .type 2)}}hide{{end}}"> | ||||||
|  | 		<div class="ui checkbox"> | ||||||
|  | 			<label for="use_paged_search"><strong>{{.i18n.Tr "admin.auths.use_paged_search"}}</strong></label> | ||||||
|  | 			<input id="use_paged_search" name="use_paged_search" class="use-paged-search" type="checkbox" {{if .use_paged_search}}checked{{end}}> | ||||||
|  | 		</div> | ||||||
|  | 	</div> | ||||||
|  | 	<div class="ldap field search-page-size required {{if or (not (eq .type 2)) (not .use_paged_search)}}hide{{end}}"> | ||||||
|  | 		<label for="search_page_size">{{.i18n.Tr "admin.auths.search_page_size"}}</label> | ||||||
|  | 		<input id="search_page_size" name="search_page_size" value="{{.search_page_size}}"> | ||||||
|  | 	</div> | ||||||
| </div> | </div> | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user