Changeset 33241
- Timestamp:
- 2019-06-27T12:50:54+12:00 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
main/trunk/greenstone3/src/java/org/greenstone/gsdl3/core/URLFilter.java
r33212 r33241 77 77 protected static final String SYSTEM_SUBACTION_DEACTIVATE = "deactivate"; 78 78 79 // if we are showing terms and conditions to user, this remembers who has accepted already 79 // if we are showing terms and conditions to user, this remembers who has 80 // accepted already 80 81 protected Hashtable<String, UserTimer> verifiedUserMap = null; 81 82 protected static final int verifiedUserTimeout = 24 * 60 * 60 * 1000; … … 103 104 HttpServletRequest hRequest = ((HttpServletRequest) request); 104 105 HttpSession hSession = hRequest.getSession(); 105 String session_id = hSession.getId();106 106 ServletContext context = hSession.getServletContext(); 107 107 … … 116 116 return; 117 117 } 118 logger.error("in do Filter: "+url); 119 118 120 119 // Run security checks on files requested from a collection's index/assoc folder 121 120 if (url.contains(ASSOCIATED_FILE_PATH)) { 121 // we need to do security checking here in case the documents are private 122 // or if there is a terms and conditions page to be shown. 123 // Also, assoc files urls now contain the library name in them. 124 // e.g. greenstone3/library/sites/localsite/collect/collname/index/assoc/Hashxxx/doc.pdf 125 // so they are not a true link to a file. We remove the 126 // 'library' then forward the request to the new url. 127 securityCheckAssocFiles(url, hRequest, response); 128 return; 129 } 130 131 // if we are asking for an interface file, and it doesn't exist, then 132 // try loading up the interfaceConfig file to find out what the base 133 // interface was, then try looking in that interface for the file. 134 if (url.contains(INTERFACE_PATH)) 135 { 136 String fileURL = url.replaceFirst(context.getContextPath(), ""); 137 File requestedFile = new File(context.getRealPath(fileURL)); 138 139 if (!requestedFile.exists()) { 140 String baseURL = getFileInBaseInterface(fileURL, context); 141 if (baseURL != null) { 142 File baseInterfaceFile = new File(context.getRealPath(baseURL)); 143 if (baseInterfaceFile.exists()) { 144 request.getRequestDispatcher(baseURL).forward(request, response); 145 // ServletOutputStream out = response.getOutputStream(); 146 // out.write(FileUtils.readFileToByteArray(baseInterfaceFile)); 147 // out.flush(); 148 // out.close(); 149 return; 150 } 151 } 152 } 153 } 154 else 155 { 156 ArrayList<String> keywords = new ArrayList<String>(); 157 keywords.add(PAGE_PATH); 158 keywords.add(BROWSE_PATH); 159 keywords.add(SEARCH_PATH); 160 keywords.add(DOCUMENT_PATH); 161 //If we have a jsessionid on the end of our URL we want to ignore it 162 int index; 163 if ((index = url.indexOf(";jsessionid")) != -1) 164 { 165 url = url.substring(0, index); 166 } 167 String[] segments = url.split("/"); 168 for (int i = 0; i < segments.length; i++) 169 { 170 String[] additionalParameters = null; 171 String[] defaultParamValues = null; 172 //COLLECTION 173 if (segments[i].equals(COLLECTION_PATH) && (i + 1) < segments.length) { 174 int j=i+1; 175 while(j+1 < segments.length && !keywords.contains(segments[j+1])) { 176 j++; 177 } 178 179 if (j>i+1) { 180 // we had a group part 181 String [] groups = Arrays.copyOfRange(segments, i+1, j); 182 String group = StringUtils.join(groups, "/"); 183 gRequest.setParameter(GSParams.GROUP, group); 184 } 185 gRequest.setParameter(GSParams.COLLECTION, segments[j]); 186 } 187 // GROUP 188 else if(segments[i].equals(GROUP_PATH) && (i + 1) < segments.length) 189 { 190 // assume for now, no other path parts for group links 191 int j= segments.length - 1; 192 String group; 193 if (j==i+1) { 194 group = segments[j]; 195 } else { 196 String [] groups = Arrays.copyOfRange(segments, i+1, j+1); 197 group = StringUtils.join(groups, "/"); 198 } 199 gRequest.setParameter(GSParams.GROUP, group); 200 gRequest.setParameter(GSParams.ACTION, "p"); 201 gRequest.setParameter(GSParams.SUBACTION, "home"); 202 203 } 204 //DOCUMENT 205 else if (segments[i].equals(DOCUMENT_PATH) && (i + 1) < segments.length) 206 { 207 gRequest.setParameter(GSParams.DOCUMENT, segments[i + 1]); 208 209 additionalParameters = new String[] { GSParams.ACTION }; 210 defaultParamValues = new String[] { "d" }; 211 if ((i+2) < segments.length && segments[i+2].equals("print")) { 212 gRequest.setParameter(GSParams.SUBACTION, "print"); 213 gRequest.setParameter("ed", "1"); 214 215 } 216 217 } 218 //PAGE 219 else if (segments[i].equals(PAGE_PATH) && (i + 1) < segments.length) 220 { 221 gRequest.setParameter(GSParams.SUBACTION, segments[i + 1]); 222 223 additionalParameters = new String[] { GSParams.ACTION }; 224 defaultParamValues = new String[] { "p" }; 225 } 226 //SYSTEM 227 else if (segments[i].equals(SYSTEM_PATH) && (i + 1) < segments.length) 228 { 229 String sa = segments[i + 1]; 230 if (sa.equals(SYSTEM_SUBACTION_CONFIGURE) || sa.equals(SYSTEM_SUBACTION_RECONFIGURE)) 231 { 232 sa = "c"; 233 } 234 else if (sa.equals(SYSTEM_SUBACTION_ACTIVATE)) 235 { 236 sa = "a"; 237 } 238 else if (sa.equals(SYSTEM_SUBACTION_DEACTIVATE)) 239 { 240 sa = "d"; 241 } 242 243 if (sa.equals("c") && (i + 2) < segments.length) 244 { 245 gRequest.setParameter(GSParams.SYSTEM_CLUSTER, segments[i + 2]); 246 } 247 248 if (sa.equals("a") && (i + 2) < segments.length) 249 { 250 gRequest.setParameter(GSParams.SYSTEM_MODULE_TYPE, "collection"); 251 gRequest.setParameter(GSParams.SYSTEM_MODULE_NAME, segments[i + 2]); 252 } 253 254 if (sa.equals("d") && (i + 2) < segments.length) 255 { 256 gRequest.setParameter(GSParams.SYSTEM_CLUSTER, segments[i + 2]); 257 } 258 259 gRequest.setParameter(GSParams.SUBACTION, sa); 260 261 additionalParameters = new String[] { GSParams.ACTION }; 262 defaultParamValues = new String[] { "s" }; 263 } 264 //ADMIN 265 else if (segments[i].equals("admin") && (i + 1) < segments.length) 266 { 267 String pageName = segments[i + 1]; 268 269 gRequest.setParameter("s1.authpage", pageName); 270 271 additionalParameters = new String[] { GSParams.ACTION, GSParams.REQUEST_TYPE, GSParams.SUBACTION, GSParams.SERVICE }; 272 defaultParamValues = new String[] { "g", "r", "authen", "Authentication" }; 273 } 274 //BROWSE 275 else if (segments[i].equals(BROWSE_PATH) && (i + 1) < segments.length) 276 { 277 String cl = ""; 278 for (int j = 1; (i + j) < segments.length; j++) 279 { 280 String currentSegment = segments[i + j].replace("CL", "").replace("cl", ""); 281 if (currentSegment.contains(".")) 282 { 283 String[] subsegments = currentSegment.split("\\."); 284 for (String subsegment : subsegments) 285 { 286 subsegment = subsegment.replace("CL", "").replace("cl", ""); 287 288 if (cl.length() > 0) 289 { 290 cl += "."; 291 } 292 293 if (subsegment.length() > 0) 294 { 295 cl += subsegment; 296 } 297 } 298 continue; 299 } 300 if (!currentSegment.matches("^(CL|cl)?\\d+$")) 301 { 302 continue; 303 } 304 305 if (cl.length() > 0) 306 { 307 cl += "."; 308 } 309 310 cl += currentSegment; 311 } 312 313 gRequest.setParameter("cl", "CL" + cl); 314 315 additionalParameters = new String[] { GSParams.ACTION, GSParams.REQUEST_TYPE, GSParams.SERVICE }; 316 defaultParamValues = new String[] { "b", "s", "ClassifierBrowse" }; 317 } 318 //QUERY 319 else if (segments[i].equals(SEARCH_PATH)) 320 { 321 String serviceName = ""; 322 if ((i + 1) < segments.length) 323 { 324 serviceName = segments[i + 1]; 325 gRequest.setParameter("s", serviceName); 326 327 additionalParameters = new String[] { GSParams.ACTION, GSParams.SUBACTION, GSParams.REQUEST_TYPE }; 328 defaultParamValues = new String[] { "q", "", "d" }; 329 } 330 if ((i + 2) < segments.length) 331 { 332 if (serviceName.equals("TextQuery") || serviceName.equals("RawQuery")) 333 { 334 335 gRequest.setParameter("s1.query", segments[i + 2]); 336 } 337 else if (serviceName.equals("FieldQuery")) 338 { 339 gRequest.setParameter("s1.fqv", segments[i + 2]); 340 } 341 else if (serviceName.equals("AdvancedFieldQuery")) 342 { 343 gRequest.setParameter("s1.fqv", segments[i + 2]); 344 } 345 } 346 } 347 if (additionalParameters != null) 348 { 349 for (int j = 0; j < additionalParameters.length; j++) 350 { 351 if (gRequest.getParameter(additionalParameters[j]) == null) 352 { 353 gRequest.setParameter(additionalParameters[j], defaultParamValues[j]); 354 } 355 } 356 } 357 } 358 } 359 360 chain.doFilter(gRequest, response); 361 } 362 363 private boolean isURLRestricted(String url) 364 { 365 for (String restrictedURL : _restrictedURLs) 366 { 367 if (url.matches(".*" + restrictedURL + ".*")) 368 { 369 return true; 370 } 371 } 372 373 return false; 374 } 375 376 private String getFileInBaseInterface(String fileURL, ServletContext context) { 377 int interfaceNameStart = fileURL.indexOf(INTERFACE_PATH) + INTERFACE_PATH.length(); 378 int interfaceNameEnd = fileURL.indexOf("/", interfaceNameStart); 379 String interfaceName = fileURL.substring(interfaceNameStart, interfaceNameEnd); 380 String interfacesDir = fileURL.substring(0, interfaceNameStart); 381 File interfaceConfigFile = new File(context.getRealPath(interfacesDir + interfaceName + "/interfaceConfig.xml")); 382 383 if (interfaceConfigFile.exists()) { 122 384 123 // now we need to get library name from the path, which is like 385 Document interfaceConfigDoc = XMLConverter.getDOM(interfaceConfigFile); 386 387 String baseInterface = interfaceConfigDoc.getDocumentElement().getAttribute("baseInterface"); 388 if (baseInterface.length() > 0) 389 { 390 return fileURL.replace("/" + interfaceName + "/", "/" + baseInterface + "/"); 391 } 392 } 393 return null; 394 } 395 396 397 private void securityCheckAssocFiles(String url, HttpServletRequest request, ServletResponse response) throws IOException, ServletException { 398 HttpSession session = request.getSession(); 399 String session_id = session.getId(); 400 ServletContext context = session.getServletContext(); 401 402 // now we need to get library name from the path, which is like 124 403 // /greenstone3/library/sites/localsite/collect/collname/index/assoc/... 125 404 String library_name = url.replaceFirst(context.getContextPath(), ""); … … 255 534 // if got here have no groups that we need to belong to 256 535 // do we have human verify thing? 257 if (verifiable_file ) {258 // we are asking for the main document - lets check human verify536 if (verifiable_file && !securityResponse.getAttribute(GSXML.VERIFY_ATT).equals("") ) { 537 // we are asking for the main document, and we have been asked to verify the user 259 538 logger.error("KATH verifiable file is true"); 260 if (!securityResponse.getAttribute(GSXML.VERIFY_ATT).equals("")) { 261 // have we done the test previously? 262 boolean already_verified = false; 539 540 // have we done the test previously? 541 boolean already_verified = false; 542 String hmvf_response = request.getParameter(GSParams.VERIFIED); 543 if (hmvf_response != null && hmvf_response.equals("0")) { 544 // force the t&c 545 } else { 263 546 if (verifiedUserMap == null) { 264 547 // we haven't done this at all, set up the map … … 272 555 } 273 556 logger.error("KATH already verified = "+already_verified); 274 557 275 558 if (!already_verified) { 276 559 // have we just done the test? 277 String hmvf_response = gRequest.getParameter(GSParams.VERIFIED);560 //String hmvf_response = request.getParameter(GSParams.VERIFIED); 278 561 // hmvf param will be set by form if the verify page was submitted 279 562 if (hmvf_response != null && hmvf_response.equals("1")) { 280 563 logger.error("user has submitted the form, check recaptcha response"); 281 564 if (!securityResponse.getAttribute(GSXML.SITE_KEY_ATT).equals("")) { 282 String recaptcha_response = gRequest.getParameter(Authentication.RECAPTCHA_RESPONSE_PARAM);565 String recaptcha_response = request.getParameter(Authentication.RECAPTCHA_RESPONSE_PARAM); 283 566 String secret_key = securityResponse.getAttribute(GSXML.SECRET_KEY_ATT); 284 567 int result = Authentication.verifyRecaptcha(secret_key, recaptcha_response); … … 286 569 if (result == Authentication.NO_ERROR) { 287 570 logger.error("RECAPTCHA SUCCESS, hopefully going to the document"); 288 571 already_verified = true; 289 572 290 573 } else { … … 294 577 String new_url = context.getContextPath()+"/"+ library_name+"?a=p&sa=error&c="+collection+"&ec=recap_fail"; 295 578 ((HttpServletResponse)response).sendRedirect(new_url); 296 579 297 580 return; 298 581 } 299 300 // store the fact that user has verified 301 UserTimer timer = new UserTimer(verifiedUserTimeout, session_id); 302 verifiedUserMap.put(session_id, timer); 303 timer.start(); 582 583 304 584 305 585 } 306 307 } else { 308 // hmvf param is not set - we haven't shown them the form yet 309 // we need to display the verify page 310 logger.error("KATH display verify page"); 311 //String new_url = context.getContextPath()+"/"+ context.getAttribute("LibraryName")+"?a=p&sa=verify&c="+collection+"&url="+url; 312 String new_url = context.getContextPath()+"/"+ library_name+"?a=p&sa=verify&c="+collection+"&url="+url; 313 ((HttpServletResponse)response).sendRedirect(new_url); 314 return; 315 } 586 already_verified = true; 587 // store the fact that user has verified 588 UserTimer timer = new UserTimer(verifiedUserTimeout, session_id); 589 verifiedUserMap.put(session_id, timer); 590 timer.start(); 591 592 } // hmvf = 1 316 593 } 317 } // end if we are asked to verify it 318 } // end if verifiable file 594 } 595 if (!already_verified) { 596 // hmvf param is not set - we haven't shown them the form yet 597 // or we have been asked to force the T&C 598 // we need to display the verify page 599 logger.error("KATH display verify page"); 600 //String new_url = context.getContextPath()+"/"+ context.getAttribute("LibraryName")+"?a=p&sa=verify&c="+collection+"&url="+url; 601 String new_url = context.getContextPath()+"/"+ library_name+"?a=p&sa=verify&c="+collection+"&url="+url; 602 ((HttpServletResponse)response).sendRedirect(new_url); 603 return; 604 } 605 } // end if verifiable file && need to verify 319 606 320 607 … … 330 617 331 618 return; 332 } 333 else if (url.contains(INTERFACE_PATH)) 334 { 335 String fileURL = url.replaceFirst(context.getContextPath(), ""); 336 File requestedFile = new File(context.getRealPath(fileURL)); 337 338 if (!requestedFile.exists()) 339 { 340 int interfaceNameStart = fileURL.indexOf(INTERFACE_PATH) + INTERFACE_PATH.length(); 341 int interfaceNameEnd = fileURL.indexOf("/", interfaceNameStart); 342 String interfaceName = fileURL.substring(interfaceNameStart, interfaceNameEnd); 343 String interfacesDir = fileURL.substring(0, interfaceNameStart); 344 File interfaceConfigFile = new File(context.getRealPath(interfacesDir + interfaceName + "/interfaceConfig.xml")); 345 346 if (interfaceConfigFile.exists()) 347 { 348 Document interfaceConfigDoc = XMLConverter.getDOM(interfaceConfigFile); 349 350 String baseInterface = interfaceConfigDoc.getDocumentElement().getAttribute("baseInterface"); 351 if (baseInterface.length() > 0) 352 { 353 File baseInterfaceFile = new File(context.getRealPath(fileURL.replace("/" + interfaceName + "/", "/" + baseInterface + "/"))); 354 if (baseInterfaceFile.exists()) 355 { 356 ServletOutputStream out = response.getOutputStream(); 357 out.write(FileUtils.readFileToByteArray(baseInterfaceFile)); 358 out.flush(); 359 out.close(); 360 return; 361 } 362 } 363 } 364 } 365 } 366 else 367 { 368 ArrayList<String> keywords = new ArrayList<String>(); 369 keywords.add(PAGE_PATH); 370 keywords.add(BROWSE_PATH); 371 keywords.add(SEARCH_PATH); 372 keywords.add(DOCUMENT_PATH); 373 //If we have a jsessionid on the end of our URL we want to ignore it 374 int index; 375 if ((index = url.indexOf(";jsessionid")) != -1) 376 { 377 url = url.substring(0, index); 378 } 379 String[] segments = url.split("/"); 380 for (int i = 0; i < segments.length; i++) 381 { 382 String[] additionalParameters = null; 383 String[] defaultParamValues = null; 384 //COLLECTION 385 if (segments[i].equals(COLLECTION_PATH) && (i + 1) < segments.length) { 386 int j=i+1; 387 while(j+1 < segments.length && !keywords.contains(segments[j+1])) { 388 j++; 389 } 390 391 if (j>i+1) { 392 // we had a group part 393 String [] groups = Arrays.copyOfRange(segments, i+1, j); 394 String group = StringUtils.join(groups, "/"); 395 gRequest.setParameter(GSParams.GROUP, group); 396 } 397 gRequest.setParameter(GSParams.COLLECTION, segments[j]); 398 } 399 // GROUP 400 else if(segments[i].equals(GROUP_PATH) && (i + 1) < segments.length) 401 { 402 // assume for now, no other path parts for group links 403 int j= segments.length - 1; 404 String group; 405 if (j==i+1) { 406 group = segments[j]; 407 } else { 408 String [] groups = Arrays.copyOfRange(segments, i+1, j+1); 409 group = StringUtils.join(groups, "/"); 410 } 411 gRequest.setParameter(GSParams.GROUP, group); 412 gRequest.setParameter(GSParams.ACTION, "p"); 413 gRequest.setParameter(GSParams.SUBACTION, "home"); 414 415 } 416 //DOCUMENT 417 else if (segments[i].equals(DOCUMENT_PATH) && (i + 1) < segments.length) 418 { 419 gRequest.setParameter(GSParams.DOCUMENT, segments[i + 1]); 420 421 additionalParameters = new String[] { GSParams.ACTION }; 422 defaultParamValues = new String[] { "d" }; 423 if ((i+2) < segments.length && segments[i+2].equals("print")) { 424 gRequest.setParameter(GSParams.SUBACTION, "print"); 425 gRequest.setParameter("ed", "1"); 426 427 } 428 429 } 430 //PAGE 431 else if (segments[i].equals(PAGE_PATH) && (i + 1) < segments.length) 432 { 433 gRequest.setParameter(GSParams.SUBACTION, segments[i + 1]); 434 435 additionalParameters = new String[] { GSParams.ACTION }; 436 defaultParamValues = new String[] { "p" }; 437 } 438 //SYSTEM 439 else if (segments[i].equals(SYSTEM_PATH) && (i + 1) < segments.length) 440 { 441 String sa = segments[i + 1]; 442 if (sa.equals(SYSTEM_SUBACTION_CONFIGURE) || sa.equals(SYSTEM_SUBACTION_RECONFIGURE)) 443 { 444 sa = "c"; 445 } 446 else if (sa.equals(SYSTEM_SUBACTION_ACTIVATE)) 447 { 448 sa = "a"; 449 } 450 else if (sa.equals(SYSTEM_SUBACTION_DEACTIVATE)) 451 { 452 sa = "d"; 453 } 454 455 if (sa.equals("c") && (i + 2) < segments.length) 456 { 457 gRequest.setParameter(GSParams.SYSTEM_CLUSTER, segments[i + 2]); 458 } 459 460 if (sa.equals("a") && (i + 2) < segments.length) 461 { 462 gRequest.setParameter(GSParams.SYSTEM_MODULE_TYPE, "collection"); 463 gRequest.setParameter(GSParams.SYSTEM_MODULE_NAME, segments[i + 2]); 464 } 465 466 if (sa.equals("d") && (i + 2) < segments.length) 467 { 468 gRequest.setParameter(GSParams.SYSTEM_CLUSTER, segments[i + 2]); 469 } 470 471 gRequest.setParameter(GSParams.SUBACTION, sa); 472 473 additionalParameters = new String[] { GSParams.ACTION }; 474 defaultParamValues = new String[] { "s" }; 475 } 476 //ADMIN 477 else if (segments[i].equals("admin") && (i + 1) < segments.length) 478 { 479 String pageName = segments[i + 1]; 480 481 gRequest.setParameter("s1.authpage", pageName); 482 483 additionalParameters = new String[] { GSParams.ACTION, GSParams.REQUEST_TYPE, GSParams.SUBACTION, GSParams.SERVICE }; 484 defaultParamValues = new String[] { "g", "r", "authen", "Authentication" }; 485 } 486 //BROWSE 487 else if (segments[i].equals(BROWSE_PATH) && (i + 1) < segments.length) 488 { 489 String cl = ""; 490 for (int j = 1; (i + j) < segments.length; j++) 491 { 492 String currentSegment = segments[i + j].replace("CL", "").replace("cl", ""); 493 if (currentSegment.contains(".")) 494 { 495 String[] subsegments = currentSegment.split("\\."); 496 for (String subsegment : subsegments) 497 { 498 subsegment = subsegment.replace("CL", "").replace("cl", ""); 499 500 if (cl.length() > 0) 501 { 502 cl += "."; 503 } 504 505 if (subsegment.length() > 0) 506 { 507 cl += subsegment; 508 } 509 } 510 continue; 511 } 512 if (!currentSegment.matches("^(CL|cl)?\\d+$")) 513 { 514 continue; 515 } 516 517 if (cl.length() > 0) 518 { 519 cl += "."; 520 } 521 522 cl += currentSegment; 523 } 524 525 gRequest.setParameter("cl", "CL" + cl); 526 527 additionalParameters = new String[] { GSParams.ACTION, GSParams.REQUEST_TYPE, GSParams.SERVICE }; 528 defaultParamValues = new String[] { "b", "s", "ClassifierBrowse" }; 529 } 530 //QUERY 531 else if (segments[i].equals(SEARCH_PATH)) 532 { 533 String serviceName = ""; 534 if ((i + 1) < segments.length) 535 { 536 serviceName = segments[i + 1]; 537 gRequest.setParameter("s", serviceName); 538 539 additionalParameters = new String[] { GSParams.ACTION, GSParams.SUBACTION, GSParams.REQUEST_TYPE }; 540 defaultParamValues = new String[] { "q", "", "d" }; 541 } 542 if ((i + 2) < segments.length) 543 { 544 if (serviceName.equals("TextQuery") || serviceName.equals("RawQuery")) 545 { 546 547 gRequest.setParameter("s1.query", segments[i + 2]); 548 } 549 else if (serviceName.equals("FieldQuery")) 550 { 551 gRequest.setParameter("s1.fqv", segments[i + 2]); 552 } 553 else if (serviceName.equals("AdvancedFieldQuery")) 554 { 555 gRequest.setParameter("s1.fqv", segments[i + 2]); 556 } 557 } 558 } 559 if (additionalParameters != null) 560 { 561 for (int j = 0; j < additionalParameters.length; j++) 562 { 563 if (gRequest.getParameter(additionalParameters[j]) == null) 564 { 565 gRequest.setParameter(additionalParameters[j], defaultParamValues[j]); 566 } 567 } 568 } 569 } 570 } 571 572 chain.doFilter(gRequest, response); 573 } 574 575 private boolean isURLRestricted(String url) 576 { 577 for (String restrictedURL : _restrictedURLs) 578 { 579 if (url.matches(".*" + restrictedURL + ".*")) 580 { 581 return true; 582 } 583 } 584 585 return false; 586 } 619 } 620 621 622 587 623 588 624 private String queryMRforDOCID(MessageRouter gsRouter, String collection, String assocfiledir) {
Note:
See TracChangeset
for help on using the changeset viewer.