浏览代码

Fixed the people search to handle extended and double byte characters to search for. Bug#1038307

rkeil 8 年之前
父节点
当前提交
4861d3b98b

+ 22 - 8
src/main/angular/src/services/people.service.ts

@@ -21,7 +21,7 @@
  */
 
 
-import { isString, IHttpService, ILogService, IPromise, IQService } from 'angular';
+import { isString, IHttpService, ILogService, IPromise, IQService, IWindowService } from 'angular';
 import { IPerson } from '../models/person.model';
 import IPwmService from './pwm.service';
 import OrgChartData from '../models/orgchart-data.model';
@@ -38,11 +38,22 @@ export interface IPeopleService {
 }
 
 export default class PeopleService implements IPeopleService {
-    static $inject = ['$http', '$log', '$q', 'PwmService' ];
+    PWM_GLOBAL: any;
+
+    static $inject = ['$http', '$log', '$q', 'PwmService', '$window' ];
     constructor(private $http: IHttpService,
                 private $log: ILogService,
                 private $q: IQService,
-                private pwmService: IPwmService) {}
+                private pwmService: IPwmService,
+                $window: IWindowService)
+    {
+        if ($window['PWM_GLOBAL']) {
+            this.PWM_GLOBAL = $window['PWM_GLOBAL'];
+        }
+        else {
+            this.$log.warn('PWM_GLOBAL is not defined on window');
+        }
+    }
 
     autoComplete(query: string): IPromise<IPerson[]> {
         return this.search(query, { 'includeDisplayName': true })
@@ -151,12 +162,15 @@ export default class PeopleService implements IPeopleService {
     search(query: string, params?: any): IPromise<SearchResult> {
         // Deferred object used for aborting requests. See promise.service.ts for more information
         let httpTimeout = this.$q.defer();
-
+        let formID = encodeURIComponent('&pwmFormID=' + this.PWM_GLOBAL['pwmFormID']);
+        // Search window references to PWM_GLOBAL and PWM_MAIN add by legacy PWM code
         let request = this.$http
-            .get(this.pwmService.getServerUrl('search', params), {
-                cache: true,
-                params: { username: query },
-                timeout: httpTimeout.promise
+            .post(this.pwmService.getServerUrl('search') + '&pwmFormID=' + this.PWM_GLOBAL['pwmFormID'], {
+                timeout: httpTimeout.promise,
+                username: query,
+                pwmFormID: formID
+            }, {
+                headers: {'Content-Type': 'multipart/form-data'},
             });
 
         let promise = request.then(

+ 15 - 2
src/main/java/password/pwm/http/servlet/peoplesearch/PeopleSearchServlet.java

@@ -61,7 +61,7 @@ public abstract class PeopleSearchServlet extends ControlledPwmServlet {
     private static final String PARAM_USERKEY = "userKey";
 
     public enum PeopleSearchActions implements ProcessAction {
-        search(HttpMethod.GET),
+        search(HttpMethod.POST),
         detail(HttpMethod.GET),
         photo(HttpMethod.GET),
         clientData(HttpMethod.GET),
@@ -136,11 +136,24 @@ public abstract class PeopleSearchServlet extends ControlledPwmServlet {
     )
             throws ChaiUnavailableException, PwmUnrecoverableException, IOException, ServletException
     {
-        final String username = pwmRequest.readParameterAsString("username", PwmHttpRequestWrapper.Flag.BypassValidation);
+        String username = "";
+        final String postString = pwmRequest.readRequestBodyAsString();
+        final String[] parser = postString.split(",");
+
+        for(int i = 0; i < parser.length; i++)
+        {
+            if(parser[i].contains("username"))
+            {
+                final String[] value = parser[i].split(":");
+                username = value[1].replace("\"", "");
+                break;
+            }
+        }
         final boolean includeDisplayName = pwmRequest.readParameterAsBoolean("includeDisplayName");
 
         // if not in cache, build results from ldap
         final PeopleSearchDataReader peopleSearchDataReader = new PeopleSearchDataReader(pwmRequest);
+
         final SearchResultBean searchResultBean = peopleSearchDataReader.makeSearchResultBean(username, includeDisplayName);
         searchResultBean.setFromCache(false);
         final RestResultBean restResultBean = new RestResultBean(searchResultBean);