Changeset 7005


Ignore:
Timestamp:
14/06/10 10:44:40 (9 years ago)
Author:
mnagni
Message:

Added some regexpr which should protect the SQL from illegal strings passed trough the <term> tag

Location:
TI01-discovery-API/trunk/MEDINDiscoveryService/src/main
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • TI01-discovery-API/trunk/MEDINDiscoveryService/src/main/java/ndg/services/discovery/DiscoveryServiceMEDINSkeleton.java

    r6838 r7005  
    102102 
    103103        public DoSearchReturnDocument doSearch(DoSearchDocument doSearch) { 
    104  
    105104                DoSearchReturnDocument response = DoSearchReturnDocument.Factory.newInstance(); 
    106105                SearchReturnType responseContent = response.addNewDoSearchReturn(); 
    107                 responseContent.setTicketId(doSearch.getDoSearch().getTicketId()); 
    108  
    109106                boolean status = false; 
    110107                String statusMsg = null; 
     
    112109                NdgMessage msg = null; 
    113110 
    114                 SearchCriteria sc = doSearch.getDoSearch().getSearchCriteria(); 
    115                 if (doSearch.getDoSearch().getSearchCriteria() == null 
    116                                 || (sc.getSpatialSearch() == null && sc.getTemporalSearch() == null && (sc.getTermSearchArray() == null || sc 
    117                                                 .getTermSearchArray().length == 0))) { 
    118                         msg = new NdgMessage("empty.searchcriteria", new Object[] {}); 
    119                         statusMsg = DiscoveryBasic.getInstance().getFormatter().getFormattedText(msg); 
    120                 } else { 
    121                         try { 
    122                                 agent = new SearchAgent(doSearch.getDoSearch()); 
    123                                 List<OriginalDocument> result = agent.doSearch(); 
    124                                 SearchType st = doSearch.getDoSearch(); 
    125  
    126                                 RetrieveCriteriaType rct = st.getRetrieveCriteria(); 
    127                                 DiscoveryDictionary.RecordDetail type = DiscoveryDictionary.getRecordDetails(null); 
    128                                 OrderByType[] orderBy = null; 
    129                                 if (rct != null) { 
    130                                         type = DiscoveryDictionary.getRecordDetails(rct.getRecordDetail()); 
    131                                         orderBy = rct.getOrderByArray(); 
     111                try { 
     112                        responseContent.setTicketId(doSearch.getDoSearch().getTicketId()); 
     113                        SearchCriteria sc = doSearch.getDoSearch().getSearchCriteria(); 
     114                        if (doSearch.getDoSearch().getSearchCriteria() == null 
     115                                        || (sc.getSpatialSearch() == null && sc.getTemporalSearch() == null && (sc.getTermSearchArray() == null || sc 
     116                                                        .getTermSearchArray().length == 0))) { 
     117                                msg = new NdgMessage("empty.searchcriteria", new Object[] {}); 
     118                                statusMsg = DiscoveryBasic.getInstance().getFormatter().getFormattedText(msg); 
     119                        } else { 
     120                                try { 
     121                                        agent = new SearchAgent(doSearch.getDoSearch()); 
     122                                        List<OriginalDocument> result = agent.doSearch(); 
     123                                        SearchType st = doSearch.getDoSearch(); 
     124 
     125                                        RetrieveCriteriaType rct = st.getRetrieveCriteria(); 
     126                                        DiscoveryDictionary.RecordDetail type = DiscoveryDictionary.getRecordDetails(null); 
     127                                        OrderByType[] orderBy = null; 
     128                                        if (rct != null) { 
     129                                                type = DiscoveryDictionary.getRecordDetails(rct.getRecordDetail()); 
     130                                                orderBy = rct.getOrderByArray(); 
     131                                        } 
     132 
     133                                        processResult(result, responseContent.addNewDocuments(), type, orderBy); 
     134                                        status = true; 
     135                                } catch (NdgSQLException e) { 
     136                                        statusMsg = logHelper.getBundleMessageAndDoLog(e, Level.ERROR); 
     137                                } catch (ResourceNotAvailable e) { 
     138                                        statusMsg = logHelper.getBundleMessageAndDoLog(e, Level.ERROR); 
     139                                } finally { 
     140                                        int hits = -1; 
     141                                        if (agent != null) { 
     142                                                hits = agent.getHits(); 
     143                                        } 
     144                                        responseContent.setHits(hits); 
     145                                        if (statusMsg == null) { 
     146                                                if (responseContent.getHits() > 0) { 
     147                                                        msg = new NdgMessage("search.successful", new Object[] {}); 
     148                                                } else if (responseContent.getHits() == 0) { 
     149                                                        msg = new NdgMessage("search.no.results", new Object[] {}); 
     150                                                } else { 
     151                                                        msg = new NdgMessage("internal.server.error", new Object[] {}); 
     152                                                } 
     153                                                statusMsg = logHelper.getBundleMessageAndDoLog(msg, Level.DEBUG); 
     154                                        } 
    132155                                } 
    133  
    134                                 processResult(result, responseContent.addNewDocuments(), type, orderBy); 
    135                                 status = true; 
    136                         } catch (NdgSQLException e) { 
    137                                 statusMsg = logHelper.getBundleMessageAndDoLog(e, Level.ERROR); 
    138                         } catch (ResourceNotAvailable e) { 
    139                                 statusMsg = logHelper.getBundleMessageAndDoLog(e, Level.ERROR); 
    140                         } finally { 
    141                                 responseContent.setHits(agent.getHits()); 
    142                                 if (statusMsg == null) { 
    143                                         if (responseContent.getHits() > 0) { 
    144                                                 msg = new NdgMessage("search.successful", new Object[] {}); 
    145                                         } else { 
    146                                                 msg = new NdgMessage("search.no.results", new Object[] {}); 
    147                                         } 
    148                                         statusMsg = logHelper.getBundleMessageAndDoLog(msg, Level.DEBUG); 
    149                                 } 
    150                         } 
    151                 } 
    152                 finalizeSearchReponse(status, statusMsg, responseContent, doSearch); 
     156                        } 
     157                } catch (Exception e) { 
     158 
     159                } finally { 
     160                        finalizeSearchReponse(status, statusMsg, responseContent, doSearch); 
     161                } 
    153162                return response; 
    154163        } 
     
    171180                PresentReturnType responseContent = response.addNewDoPresentReturn(); 
    172181                responseContent.setTicketId(doPresent.getDoPresent().getTicketId()); 
    173                  
     182 
    174183                boolean status = false; 
    175184                String statusMsg = null; 
     
    452461                info.setResourceType(result.getResourceType() != null ? result.getResourceType() : ""); 
    453462                info.setTopicCategory(result.getTopicCategory() != null ? result.getTopicCategory() : ""); 
    454                 info.setDatasetUpdateDate(result.getDatasetMetadataUpdateDate() != null ? result.getDatasetMetadataUpdateDate().toString() : ""); 
     463                info.setDatasetUpdateDate(result.getDatasetMetadataUpdateDate() != null ? result.getDatasetMetadataUpdateDate() 
     464                                .toString() : ""); 
    455465        } 
    456466 
     
    463473                CustomInfo info = type.addNewAdditionalInformation(); 
    464474                fillCustomInfo(info, result); 
    465                 type.setDocument(result.getOriginalDocument());  
     475                type.setDocument(result.getOriginalDocument()); 
    466476        } 
    467477 
     
    471481                type.setAbstract(result.getDatasetAbstract()); 
    472482                type.setSpatialArray(result.getSpatialType().toArray(type.getSpatialArray())); 
    473                 type.setTemporalArray(result.getTemporalType().toArray(type.getTemporalArray()));                
    474                 CustomInfo info = type.addNewAdditionalInformation();            
    475                 fillCustomInfo(info, result);            
     483                type.setTemporalArray(result.getTemporalType().toArray(type.getTemporalArray())); 
     484                CustomInfo info = type.addNewAdditionalInformation(); 
     485                fillCustomInfo(info, result); 
    476486        } 
    477487 
  • TI01-discovery-API/trunk/MEDINDiscoveryService/src/main/java/ndg/services/discovery/model/SearchAgent.java

    r6994 r7005  
    1111import java.util.Comparator; 
    1212import java.util.List; 
     13import java.util.regex.Pattern; 
    1314 
    1415import ndg.common.NdgLogger; 
     
    3940 */ 
    4041public class SearchAgent extends CommonMethods<String> { 
    41  
     42         
     43        /* Terms cannot contain ONLY these single character (do a match) */ 
     44        private final static String regexIllegalCharacters = "[\\'&\\|!\\(\\)-\\+\\\\]";         
     45        private final Pattern illegalCharacters = Pattern.compile(regexIllegalCharacters); 
     46         
     47        /* Terms cannot start using these characters (do a match) */ 
     48        private final static String regexIllegalStart1 = "^([\\'&\\|\\)\\\\\\+])."; 
     49        private final Pattern illegalStart1 = Pattern.compile(regexIllegalStart1); 
     50         
     51        /* Terms cannot start using these characters (do a match) */ 
     52        private final static String regexIllegalStart2 = "^[\\!-][\\'\\&\\|\\\\\\+\\)\\(]"; 
     53        private final Pattern illegalStart2 = Pattern.compile(regexIllegalStart2); 
     54 
     55        /* Terms cannot contain this pattern these characters ['!&|\+-]['&|\+)] */ 
     56        private final static String regexIllegalSequence1 = "[\\'\\!\\&\\|\\\\\\+-][\\'\\&\\|\\\\\\+\\)]";       
     57        private final Pattern illegalSequence1 = Pattern.compile(regexIllegalSequence1); 
     58         
     59        /* Terms cannot contain this pattern these characters ['!\-]['&|\+)] */ 
     60        private final static String regexIllegalSequence2 = "[\\'\\!\\\\\\(][\\'&\\|\\\\\\+\\)]";        
     61        private final Pattern illegalSequence2 = Pattern.compile(regexIllegalSequence2); 
     62         
    4263        private NdgLogger logHelper = DiscoveryBasic.getInstance().getNdgInstance(SearchAgent.class.getName()); 
    4364 
     
    206227                int queryIndex = 0; 
    207228                for (TermSearchType termType : terms) { 
    208                         String term = termType.getTerm(); 
    209                          
    210                         if (term.trim().equals("&") || term.trim().equals("'")) 
     229                        String term = termType.getTerm();                                        
     230                        if (illegalStart1.matcher(term).matches() || illegalStart2.matcher(term).matches() 
     231                                        || illegalCharacters.matcher(term).matches()  
     232                                        || illegalSequence1.matcher(term).find() 
     233                                        || illegalSequence2.matcher(term).find()) 
    211234                                continue; 
    212235                         
  • TI01-discovery-API/trunk/MEDINDiscoveryService/src/main/resources/ndg/common/messages.properties

    r6767 r7005  
    1010present.successful = Successful. 
    1111search.no.results = Search was successful but generated no results. 
     12internal.server.error = Server error. Please report the SOAP query to the administrator 
    1213client.ip = The client ip is {0} 
    1314invalid.list.name = "Invalid list name: please use getListNames to get the valid list names"; 
Note: See TracChangeset for help on using the changeset viewer.