Changeset 3636 in main


Ignore:
Timestamp:
03/14/12 14:11:49 (10 years ago)
Author:
Garth Braithwaite
Message:

java and view webapp - vulnerability - added black list filter mechanism, and query builder user input field validation. Removed the query_module.js as it is not used. Added the new generic model map stuff.

Location:
branches/2.1/src/main
Files:
14 added
2 deleted
9 edited

Legend:

Unmodified
Added
Removed
  • branches/2.1/src/main/java/org/ibisph/user/springsecurity/CreateUserDetailsAndLogUserPreAuthenticationProcessingFilter.java

    r3547 r3636  
    1414import org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter;
    1515 
     16import org.ibisph.querydefinition.xmlmodel.AbstractQueryDefinition;
    1617import org.ibisph.user.service.UserLog;
    1718import org.ibisph.util.StrLib;
     
    3738  extends RequestHeaderAuthenticationFilter 
    3839{
     40  protected static org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(AbstractQueryDefinition.class);
    3941
    4042  protected String userDetailsSessionName = "user";
     
    120122    String fullname = request.getHeader(this.fullnameRequestHeaderKey);
    121123    String email    = request.getHeader(this.emailAddressRequestHeaderKey);
    122     if(!StrLib.isSomething(username )) return(null);
     124
     125    if(!StrLib.isSomething(username) && (this.authorityRequestHeaderName != null)) {
     126      logger.warn(".getPreAuthenticatedPrincipal - null username.  Fullname: {}, email: {}", fullname, email);
     127      return(null);
     128    }
    123129
    124130    if(this.convertUsernameToLowerCase) username = username.toLowerCase();
  • branches/2.1/src/main/webapps/ibisph-admin/WEB-INF/web.xml

    r3529 r3636  
    535535                <!-- Inactive timeout value for a user's session.  Value is in minutes. -->
    536536                <session-timeout>30</session-timeout>
     537
     538                <!-- Servlet 3.0 value (Tomcat7) that makes it more difficult for browser scripting
     539                to steal the user's session id
     540                <cookie-config>
     541                        <http-only>true</http-only>
     542                </cookie-config>
     543                -->
    537544        </session-config>
    538545
  • branches/2.1/src/main/webapps/ibisph-view/WEB-INF/config/spring/indicator.xml

    r3536 r3636  
    3535                <constructor-arg value="Introduction.xml"/>
    3636        </bean>
    37         <bean id="Indicator.PublishedIndicatorProfiles.XML.SystemID" class="org.ibisph.systemid.FileSystemID">  <!-- used by indicator indexes -->
     37        <bean id="Indicator.PublishedIndicatorProfiles.XML.SystemID" class="org.ibisph.systemid.FileSystemID"> 
    3838                <constructor-arg ref="Common.Context.Servlet.RootPath"/>
    3939                <constructor-arg value="xml/indicator/published_profiles.xml"/>
  • branches/2.1/src/main/webapps/ibisph-view/WEB-INF/web.xml

    r3596 r3636  
    405405                <!-- Inactive timeout value for a user's session.  Value is in minutes. -->
    406406                <session-timeout>30</session-timeout>
     407
     408                <!-- Servlet 3.0 value (Tomcat7) that makes it more difficult for browser scripting
     409                to steal the user's session id
     410                <cookie-config>
     411                        <http-only>true</http-only>
     412                </cookie-config>
     413                -->
    407414        </session-config>
    408415
  • branches/2.1/src/main/webapps/ibisph-view/js/InputSelectionsControl.js

    r3529 r3636  
    110110
    111111
    112 
    113 
    114 
    115112        // If the auto advance to next section user preference option is set and
    116113        // there are not any sub selections then check to see if the entire selection
    117114        // chain consists of single, radio selections.  If so, then auto advance to
    118115        // the next section.
    119 this.nextSectionRadioCode = function(selectorElementIDSuffix)
    120 {
    121 
    122 
    123 /* next step is substring( current ID suffix, 1, indexof('.') -1) + 1 */
    124 
    125 
    126         if( isSelectionPreference("AUTO_ADVANCE_NEXT_SECTION") && !subSelectionsShown)
    127         {
    128                 var radioInput = true;          // flag for radio type input.
    129                 var rootLevel  = false;         // flag for if at the top root level.
    130                 do
     116        this.nextSectionRadioCode = function(selectorElementIDSuffix)
     117        {
     118
     119                /* next step is substring( current ID suffix, 1, indexof('.') -1) + 1 */
     120                if( isSelectionPreference("AUTO_ADVANCE_NEXT_SECTION") && !subSelectionsShown)
    131121                {
    132                         // If sub level then (contains a ".") then go up one level.
    133                         rootLevel = selectionsID.indexOf(".") == -1;   
    134                         if(!rootLevel)
    135                         {
    136                                 radioInput = (getElementByID(selectionsID.replace(objectContext.selectionsIDPrefix, SELECTOR_ID_PREFIX)).type == "radio");
    137                                 selectionsID = getParentSelectionsID(selectionsID);
    138                         }
    139                 }
    140                 while (!rootLevel && radioInput);
    141 
    142                 // if we get to the root level and still radio input then goto the next section.
    143                 if(rootLevel && radioInput) nextSection(selectionsID);
    144         }
     122                        var radioInput = true;          // flag for radio type input.
     123                        var rootLevel  = false;         // flag for if at the top root level.
     124                        do
     125                        {
     126                                // If sub level then (contains a ".") then go up one level.
     127                                rootLevel = selectionsID.indexOf(".") == -1;   
     128                                if(!rootLevel)
     129                                {
     130                                        radioInput = (getElementByID(selectionsID.replace(objectContext.selectionsIDPrefix, SELECTOR_ID_PREFIX)).type == "radio");
     131                                        selectionsID = getParentSelectionsID(selectionsID);
     132                                }
     133                        }
     134                        while (!rootLevel && radioInput);
     135
     136                        // if we get to the root level and still radio input then goto the next section.
     137                        if(rootLevel && radioInput) nextSection(selectionsID);
     138                }
    145139        } //~~~~~~~~~~~~~~~~~~~~~~~ End of Function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    146140
    147141
    148 // handles advancing the next section.  First get the base suffix so we can
    149 // increment the value (e.g. next section/section).  Hide the current selections
    150 // if preference set.  Next show the selections section and try to set the focus
    151 // to the first input field. 
    152 this.nextSection = function(currentSelectionsID)
    153 {
    154         var currentSuffix = objectContext.getIDNumberSuffix(currentSelectionsID);
    155         i = currentSuffix.indexOf(".");         // returns -1 if not found
    156         if(i != -1) currentSuffix = currentSuffix.substring(0,i);
    157                
    158         // if flag to hide current
    159         if(isSelectionPreference("SHOW_SECTIONS", "CURRENT_ONLY")) hideByID(objectContext.selectionsIDPrefix + currentSuffix);
    160         var nextSectionIDSuffix = (1*currentSuffix)+1;  // mult to make sure it's numeric then add 1 to the current section
    161         selectSection(objectContext.selectionIDPrefix + nextSectionIDSuffix);
    162         var firstSelector = getElementByID(SELECTOR_ID_PREFIX + nextSectionIDSuffix + ".1");
    163         if(firstSelector != null) firstSelector.focus();
     142        // handles advancing the next section.  First get the base suffix so we can
     143        // increment the value (e.g. next section/section).  Hide the current selections
     144        // if preference set.  Next show the selections section and try to set the focus
     145        // to the first input field. 
     146        this.nextSection = function(currentSelectionsID)
     147        {
     148                var currentSuffix = objectContext.getIDNumberSuffix(currentSelectionsID);
     149                i = currentSuffix.indexOf(".");         // returns -1 if not found
     150                if(i != -1) currentSuffix = currentSuffix.substring(0,i);
     151                       
     152                // if flag to hide current
     153                if(isSelectionPreference("SHOW_SECTIONS", "CURRENT_ONLY")) hideByID(objectContext.selectionsIDPrefix + currentSuffix);
     154                var nextSectionIDSuffix = (1*currentSuffix)+1;  // mult to make sure it's numeric then add 1 to the current section
     155                selectSection(objectContext.selectionIDPrefix + nextSectionIDSuffix);
     156                var firstSelector = getElementByID(SELECTOR_ID_PREFIX + nextSectionIDSuffix + ".1");
     157                if(firstSelector != null) firstSelector.focus();
    164158        } //~~~~~~~~~~~~~~~~~~~~~~~ End of Function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    165159
  • branches/2.1/src/main/webapps/ibisph-view/xslt/html/query/module/builder/Page.xslt

    r3615 r3636  
    106106                                        selections.initializeSelectionContainers();
    107107                                        //(new EnhancedElement(finishStepElementContainerID)).setDisplayBlock();
     108
     109                                        registerInputOnChangeValidation();
    108110                                }
    109111                        }
     
    143145                                selections.clearAllNonSelectedSelections();
    144146
     147                                if(isAnyFreeTextInputInvalid()) return;
     148                               
    145149                                // submit the page's form contents...
    146150                                document.form.submit();
     
    154158                        // and understand to reset the page as it was prior to submitting?
    155159                        window.onbeforeunload = function() {}
     160
     161                        function registerInputOnChangeValidation()
     162                        {
     163                                var inputElements = document.getElementsByTagName("input");
     164                                for(var i in inputElements)
     165                                {
     166                                        if("text" == inputElements[i].type)
     167                                        {
     168                                                inputElements[i].onchange = validateFreeTextInput;
     169                                        }
     170                                }
     171                        } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End of Function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     172
     173                        function isAnyFreeTextInputInvalid()
     174                        {
     175                                var inputElements = document.getElementsByTagName("input");
     176                                for(var i in inputElements)
     177                                {
     178                                        if(("text" == inputElements[i].type)
     179                                                && (0 < inputElements[i].value.length)
     180                                                && isFreeTextInputInvalid(inputElements[i]))
     181                                        {
     182                                                alert("A value you entered contains an invalid character.  You must fix this issue before you are permiited to submit the query.  See the selection's help to see what is valid.");
     183                                                inputElements[i].focus();
     184                                                return(true);
     185                                        }
     186                                }
     187                                return(false);
     188                        } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End of Function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     189
     190                        function validateFreeTextInput()
     191                        {
     192                                if(isFreeTextInputInvalid(this))
     193                                {
     194                                        alert("The value you just entered contains an invalid character.  See the selection's help to see what is valid.");
     195                                        this.focus();
     196                                }
     197                        } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End of Function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     198
     199                        // probably should do white list validation which would include only:
     200                        // a-z0-9[.0-9], 0-9[.0-9], .0-9, <, >, +, =, ","
     201                        function isFreeTextInputInvalid(element)
     202                        {
     203                                return(element.value.match(/[`~!@#\$%^&\*\(\)\_\\\[\]\{\}\"\'\:\;\/\?\|a-z]+/i) );
     204                        } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End of Function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    156205
    157206                        // ]]>
Note: See TracChangeset for help on using the changeset viewer.