Skip to content

Merging to release-5.8: [TT-11975] Lack of clear error message during failed import when API definition is not valid (#7077) #7086

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged

Conversation

buger
Copy link
Member

@buger buger commented May 28, 2025

User description

TT-11975 Lack of clear error message during failed import when API definition is not valid (#7077)

User description

TT-11975
Summary Lack of clear error message during failed import when API definition is not valid
Type Bug Bug
Status In Dev
Points N/A
Labels codilime_refined, customer_bug, jira_escalated

Description

The system fails to properly validate and provide clear feedback when
there's a mismatch between security schemes and security requirements in
an OpenAPI description. Instead of returning a helpful validation error,
the application crashes with a nil pointer dereference in the security
extraction process, resulting in a generic 500 error.

Related Issue

Motivation and Context

How This Has Been Tested

Screenshots (if appropriate)

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing
    functionality to change)
  • Refactoring or add test (improvements in base code or adds test
    coverage to functionality)

Checklist

  • I ensured that the documentation is up to date
  • I explained why this PR updates go.mod in detail with reasoning
    why it's required
  • I would like a code coverage CI quality gate exception and have
    explained why

PR Type

Bug fix, Tests


Description

  • Added explicit validation for OAS security requirements.

  • Improved error messages for missing security schemes.

  • Prevented nil pointer dereference during OAS import.

  • Introduced comprehensive unit tests for security validation.


Changes walkthrough 📝

Relevant files
Bug fix
oas.go
Add OAS security requirements validation and error handling

apidef/oas/oas.go

  • Added Validate method to OAS for enhanced validation.
  • Implemented validateSecurity to check security requirements.
  • Improved error messages for missing security schemes.
  • Prevented application crash on invalid security configuration.
  • +35/-0   
    Tests
    oas_test.go
    Add tests for OAS security validation and error reporting

    apidef/oas/oas_test.go

  • Added unit tests for OAS security validation logic.
  • Covered scenarios for missing, incomplete, and valid security schemes.
  • Ensured error messages are tested for clarity and accuracy.
  • +164/-0 

    Need help?
  • Type /help how to
  • ... in the comments thread for any questions about PR-Agent
    usage.

  • Check out the documentation
    for more information.

  • PR Type

    Bug fix, Tests


    Description

    • Added explicit validation for OAS security requirements.

    • Improved error messages for missing security schemes.

    • Prevented nil pointer dereference during OAS import.

    • Introduced comprehensive unit tests for security validation.


    Changes walkthrough 📝

    Relevant files
    Bug fix
    oas.go
    Add OAS security requirements validation and error handling

    apidef/oas/oas.go

  • Added a new Validate method to the OAS struct for enhanced validation.
  • Implemented validateSecurity to check for missing security schemes in
    OAS security requirements.
  • Improved error messages for missing or incomplete security schemes.
  • Prevented application crashes due to nil pointer dereference in
    security extraction.
  • +35/-0   
    Tests
    oas_test.go
    Add tests for OAS security validation and error reporting

    apidef/oas/oas_test.go

  • Added unit tests for OAS security validation logic.
  • Covered scenarios for missing, incomplete, and valid security schemes.
  • Ensured error messages are tested for clarity and accuracy.
  • +164/-0 

    Need help?
  • Type /help how to ... in the comments thread for any questions about PR-Agent usage.
  • Check out the documentation for more information.
  • …definition is not valid (#7077)
    
    ### **User description**
    <details open>
    <summary><a href="https://tyktech.atlassian.net/browse/TT-11975"
    title="TT-11975" target="_blank">TT-11975</a></summary>
      <br />
      <table>
        <tr>
          <th>Summary</th>
    <td>Lack of clear error message during failed import when API definition
    is not valid</td>
        </tr>
        <tr>
          <th>Type</th>
          <td>
    <img alt="Bug"
    src="https://tyktech.atlassian.net/rest/api/2/universal_avatar/view/type/issuetype/avatar/10303?size=medium"
    />
            Bug
          </td>
        </tr>
        <tr>
          <th>Status</th>
          <td>In Dev</td>
        </tr>
        <tr>
          <th>Points</th>
          <td>N/A</td>
        </tr>
        <tr>
          <th>Labels</th>
    <td><a
    href="https://tyktech.atlassian.net/issues?jql=project%20%3D%20TT%20AND%20labels%20%3D%20codilime_refined%20ORDER%20BY%20created%20DESC"
    title="codilime_refined">codilime_refined</a>, <a
    href="https://tyktech.atlassian.net/issues?jql=project%20%3D%20TT%20AND%20labels%20%3D%20customer_bug%20ORDER%20BY%20created%20DESC"
    title="customer_bug">customer_bug</a>, <a
    href="https://tyktech.atlassian.net/issues?jql=project%20%3D%20TT%20AND%20labels%20%3D%20jira_escalated%20ORDER%20BY%20created%20DESC"
    title="jira_escalated">jira_escalated</a></td>
        </tr>
      </table>
    </details>
    <!--
      do not remove this marker as it will break jira-lint's functionality.
      added_by_jira_lint
    -->
    
    ---
    
    <!-- Provide a general summary of your changes in the Title above -->
    
    ## Description
    
    The system fails to properly validate and provide clear feedback when
    there's a mismatch between security schemes and security requirements in
    an OpenAPI description. Instead of returning a helpful validation error,
    the application crashes with a nil pointer dereference in the security
    extraction process, resulting in a generic 500 error.
    
    ## Related Issue
    
    <!-- This project only accepts pull requests related to open issues. -->
    <!-- If suggesting a new feature or change, please discuss it in an
    issue first. -->
    <!-- If fixing a bug, there should be an issue describing it with steps
    to reproduce. -->
    <!-- OSS: Please link to the issue here. Tyk: please create/link the
    JIRA ticket. -->
    
    ## Motivation and Context
    
    <!-- Why is this change required? What problem does it solve? -->
    
    ## How This Has Been Tested
    
    <!-- Please describe in detail how you tested your changes -->
    <!-- Include details of your testing environment, and the tests -->
    <!-- you ran to see how your change affects other areas of the code,
    etc. -->
    <!-- This information is helpful for reviewers and QA. -->
    
    ## Screenshots (if appropriate)
    
    ## Types of changes
    
    <!-- What types of changes does your code introduce? Put an `x` in all
    the boxes that apply: -->
    
    - [x] Bug fix (non-breaking change which fixes an issue)
    - [ ] New feature (non-breaking change which adds functionality)
    - [ ] Breaking change (fix or feature that would cause existing
    functionality to change)
    - [ ] Refactoring or add test (improvements in base code or adds test
    coverage to functionality)
    
    ## Checklist
    
    <!-- Go over all the following points, and put an `x` in all the boxes
    that apply -->
    <!-- If there are no documentation updates required, mark the item as
    checked. -->
    <!-- Raise up any additional concerns not covered by the checklist. -->
    
    - [ ] I ensured that the documentation is up to date
    - [ ] I explained why this PR updates go.mod in detail with reasoning
    why it's required
    - [ ] I would like a code coverage CI quality gate exception and have
    explained why
    
    
    ___
    
    ### **PR Type**
    Bug fix, Tests
    
    
    ___
    
    ### **Description**
    - Added explicit validation for OAS security requirements.
    
    - Improved error messages for missing security schemes.
    
    - Prevented nil pointer dereference during OAS import.
    
    - Introduced comprehensive unit tests for security validation.
    
    
    ___
    
    
    
    ### **Changes walkthrough** 📝
    <table><thead><tr><th></th><th align="left">Relevant
    files</th></tr></thead><tbody><tr><td><strong>Bug
    fix</strong></td><td><table>
    <tr>
      <td>
        <details>
    <summary><strong>oas.go</strong><dd><code>Add OAS security requirements
    validation and error handling</code></dd></summary>
    <hr>
    
    apidef/oas/oas.go
    
    <li>Added <code>Validate</code> method to OAS for enhanced
    validation.<br> <li> Implemented <code>validateSecurity</code> to check
    security requirements.<br> <li> Improved error messages for missing
    security schemes.<br> <li> Prevented application crash on invalid
    security configuration.
    
    
    </details>
    
    
      </td>
    <td><a
    href="https://github.com/TykTechnologies/tyk/pull/7077/files#diff-80279b1d59499a41a77ff7a16a6e2c9b9b785a4fd1326c351da6884c867658d7">+35/-0</a>&nbsp;
    &nbsp; </td>
    
    </tr>
    </table></td></tr><tr><td><strong>Tests</strong></td><td><table>
    <tr>
      <td>
        <details>
    <summary><strong>oas_test.go</strong><dd><code>Add tests for OAS
    security validation and error reporting</code></dd></summary>
    <hr>
    
    apidef/oas/oas_test.go
    
    <li>Added unit tests for OAS security validation logic.<br> <li> Covered
    scenarios for missing, incomplete, and valid security schemes.<br> <li>
    Ensured error messages are tested for clarity and accuracy.
    
    
    </details>
    
    
      </td>
    <td><a
    href="https://github.com/TykTechnologies/tyk/pull/7077/files#diff-74029ee88132d30d6478c96a35f8bb2200e0c8e6f42f2c9b147dc6bb7ce74644">+164/-0</a>&nbsp;
    </td>
    
    </tr>
    </table></td></tr></tr></tbody></table>
    
    ___
    
    > <details> <summary> Need help?</summary><li>Type <code>/help how to
    ...</code> in the comments thread for any questions about PR-Agent
    usage.</li><li>Check out the <a
    href="https://qodo-merge-docs.qodo.ai/usage-guide/">documentation</a>
    for more information.</li></details>
    
    (cherry picked from commit 53d3a57)
    @buger buger enabled auto-merge (squash) May 28, 2025 09:32
    Copy link
    Contributor

    API Changes

    --- prev.txt	2025-05-28 09:33:02.779191313 +0000
    +++ current.txt	2025-05-28 09:32:58.616196775 +0000
    @@ -3596,6 +3596,11 @@
     func (s *OAS) UpdateServers(apiURL, oldAPIURL string)
         UpdateServers sets or updates the first servers URL if it matches oldAPIURL.
     
    +func (s *OAS) Validate(ctx context.Context, opts ...openapi3.ValidationOption) error
    +    Validate validates OAS document by calling openapi3.T.Validate() function.
    +    In addition, it validates Security Requirement section and it's requirements
    +    by calling OAS.validateSecurity() function.
    +
     type OAuth struct {
     	// Enabled activates the OAuth middleware.
     	//

    Copy link
    Contributor

    PR Reviewer Guide 🔍

    Here are some key observations to aid the review process:

    🎫 Ticket compliance analysis ✅

    7077 - Fully compliant

    Compliant requirements:

    • When importing an OpenAPI (OAS) definition with invalid or mismatched security requirements, the system should provide a clear, actionable error message.
    • The application should not crash (e.g., nil pointer dereference) if there is a mismatch between security schemes and security requirements.
    • The error message should indicate what is missing or misconfigured in the OAS security section.
    • Validation logic should explicitly check for the presence of required security schemes referenced in security requirements.
    • Comprehensive unit tests should cover scenarios for missing, incomplete, and valid security schemes, and verify error messages.
    ⏱️ Estimated effort to review: 2 🔵🔵⚪⚪⚪
    🧪 PR contains tests
    🔒 No security concerns identified
    ⚡ Recommended focus areas for review

    Error Message Clarity

    The new error messages for missing security schemes should be reviewed for clarity and usefulness to end users, ensuring they are actionable and not overly technical.

    	return errors.New("No components or security schemes present in OAS")
    }
    
    for _, requirement := range s.Security {
    	for key := range requirement {
    		if _, ok := s.Components.SecuritySchemes[key]; !ok {
    			errorMsg := fmt.Sprintf("Missing required Security Scheme '%s' in Components.SecuritySchemes. "+
    				"For more information please visit https://swagger.io/specification/#security-requirement-object",
    				key)
    			return errors.New(errorMsg)
    		}
    	}
    Validation Logic Coverage

    The new validateSecurity logic should be checked to ensure it covers all edge cases, such as multiple security requirements and partial scheme definitions.

    func (s *OAS) validateSecurity() error {
    	if len(s.Security) == 0 {
    		return nil
    	}
    
    	if s.Components == nil || s.Components.SecuritySchemes == nil || len(s.Components.SecuritySchemes) == 0 {
    		return errors.New("No components or security schemes present in OAS")
    	}
    
    	for _, requirement := range s.Security {
    		for key := range requirement {
    			if _, ok := s.Components.SecuritySchemes[key]; !ok {
    				errorMsg := fmt.Sprintf("Missing required Security Scheme '%s' in Components.SecuritySchemes. "+
    					"For more information please visit https://swagger.io/specification/#security-requirement-object",
    					key)
    				return errors.New(errorMsg)
    			}
    		}
    	}
    
    	return nil
    }

    Copy link
    Contributor

    PR Code Suggestions ✨

    Explore these optional code suggestions:

    CategorySuggestion                                                                                                                                    Impact
    General
    Standardize error message for missing scheme

    The error message for missing security schemes includes a trailing period and a URL,
    which may hinder test assertions that expect a specific error prefix. Consider
    removing the period and URL from the error message to ensure consistency with test
    expectations.

    apidef/oas/oas.go [466-470]

    -errorMsg := fmt.Sprintf("Missing required Security Scheme '%s' in Components.SecuritySchemes. "+
    -	"For more information please visit https://swagger.io/specification/#security-requirement-object",
    -	key)
    +errorMsg := fmt.Sprintf("Missing required Security Scheme '%s' in Components.SecuritySchemes", key)
     return errors.New(errorMsg)
    Suggestion importance[1-10]: 8

    __

    Why: This suggestion aligns the error message with test expectations and removes unnecessary details, which directly improves test reliability and clarity of error reporting. It addresses a potential source of brittle or failing tests, making it an important fix.

    Medium
    Possible issue
    Preserve error semantics when joining errors

    If both validationErr and securityErr are nil, errors.Join will return nil as
    expected. However, if only one is non-nil, errors.Join will still return a wrapped
    error, which may not be desirable for error handling and comparison. Consider
    returning the non-nil error directly if only one exists, to preserve error
    semantics.

    apidef/oas/oas.go [449]

    -return errors.Join(validationErr, securityErr)
    +if validationErr != nil && securityErr != nil {
    +    return errors.Join(validationErr, securityErr)
    +}
    +if validationErr != nil {
    +    return validationErr
    +}
    +return securityErr
    Suggestion importance[1-10]: 7

    __

    Why: This suggestion improves error handling by returning the original error when only one exists, preserving error semantics and making error comparison and handling more predictable. This is a moderate but meaningful improvement to code quality and maintainability.

    Medium

    Copy link

    @buger buger merged commit 480628f into release-5.8 May 28, 2025
    30 of 38 checks passed
    @buger buger deleted the merge/release-5.8/53d3a57ae81eabd82445fd8b81f884a4d9058378 branch May 28, 2025 09:56
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Projects
    None yet
    Development

    Successfully merging this pull request may close these issues.

    2 participants