コード例 #1
0
class AnalysisSet(jsl.Document):
    class Options(object):
        definition_id = "analysis_set"
        description = "Set of named component analyses"

    digests = jsl.DictField(additional_properties=True)
    security_issues = jsl.DictField(additional_properties=True)
    source_licenses = jsl.DictField(additional_properties=True)
    crypto_algorithms = jsl.DictField(additional_properties=True)
    languages = jsl.DictField(additional_properties=True)
    binary_data = jsl.DictField(additional_properties=True)
    static_analysis = jsl.DictField(additional_properties=True)
    metadata = jsl.DictField(additional_properties=True)
    github_details = jsl.DictField(additional_properties=True)
    redhat_downstream = jsl.DictField(additional_properties=True)
    blackduck = jsl.Var({
        lambda v: v == ROLE_v1_0_1 or v >= ROLE_v1_1_1:
        jsl.DictField(additional_properties=True)
    })
    with jsl.Scope(lambda v: v >= ROLE_v1_1_2) as added_in_v1_1_2:
        added_in_v1_1_2.dependency_snapshot = jsl.DictField(
            additional_properties=True)
    with jsl.Scope(lambda v: v >= ROLE_v1_1_3) as added_in_v1_1_3:
        added_in_v1_1_3.code_metrics = jsl.DictField(
            additional_properties=True)
コード例 #2
0
ファイル: v7_9.py プロジェクト: willemdh/detection-rules
class ApiSchema79(ApiSchema78):
    """Schema for siem rule in API format."""

    STACK_VERSION = "7.9"
    RULE_TYPES = ApiSchema78.RULE_TYPES + [THRESHOLD]

    author = jsl.ArrayField(jsl.StringField(default="Elastic"), required=True, min_items=1)
    building_block_type = jsl.StringField(required=False)
    exceptions_list = jsl.ArrayField(required=False)
    license = jsl.StringField(required=True, default="Elastic License")
    risk_score_mapping = jsl.ArrayField(jsl.DocumentField(RiskScoreMapping), required=False, min_items=1)
    rule_name_override = jsl.StringField(required=False)
    severity_mapping = jsl.ArrayField(jsl.DocumentField(SeverityMapping), required=False, min_items=1)
    timestamp_override = jsl.StringField(required=False)

    type = jsl.StringField(enum=RULE_TYPES, required=True)

    # there might be a bug in jsl that requires us to redefine these here
    query_scope = ApiSchema78.query_scope
    saved_id_scope = ApiSchema78.saved_id_scope
    ml_scope = ApiSchema78.ml_scope

    with jsl.Scope(THRESHOLD) as threshold_scope:
        threshold_scope.index = jsl.ArrayField(jsl.StringField(), required=False)
        # this is not required per the API but we will enforce it here
        threshold_scope.language = jsl.StringField(enum=['kuery', 'lucene'], required=True, default='kuery')
        threshold_scope.query = jsl.StringField(required=True)
        threshold_scope.type = jsl.StringField(enum=[THRESHOLD], required=True, default=THRESHOLD)
        threshold_scope.threshold = jsl.DocumentField(ThresholdMapping, required=True)

    with jsl.Scope(jsl.DEFAULT_ROLE) as default_scope:
        default_scope.type = type
コード例 #3
0
class ComponentInfo(jsl.Document):
    class Options:
        description = "Information about a single component"
        definition_id = "component_info"

    blackduck_details = jsl.DocumentField(BlackduckDetails, as_ref=True, required=True)
    cve_details = jsl.ArrayField(jsl.DocumentField(CVEDetail, as_ref=True), required=True)
    ecosystem = jsl.StringField(required=True)
    github_details = jsl.DocumentField(GithubDetails, as_ref=True, required=True)
    id = jsl.StringField(required=True)
    latest_version = jsl.OneOfField([jsl.StringField(), jsl.NullField()], required=True)
    licenses = jsl.ArrayField(jsl.StringField(), required=True)
    name = jsl.StringField(required=True)
    package_dependents_count = jsl.NumberField(required=True)
    version = jsl.StringField(required=True)

    with jsl.Scope(lambda v: v >= ROLE_v1_1_0) as added_in_v1_1_0:
        added_in_v1_1_0.dependents_count = jsl.NumberField(required=True)

    with jsl.Scope(lambda v: v >= ROLE_v1_2_0) as added_in_v1_2_0:
        added_in_v1_2_0.relative_usage = jsl.StringField(required=True)

    with jsl.Scope(lambda v: v >= ROLE_v2_0_0) as added_in_v2_0_0:
        added_in_v2_0_0.redhat_usage = jsl.DocumentField(RedHatUsage, as_ref=True, required=True)

    with jsl.Scope(lambda v: v >= ROLE_v2_0_3) as added_in_v2_0_3:
        added_in_v2_0_3.metadata = jsl.DocumentField(ComponentMetadata, as_ref=True, required=True)
コード例 #4
0
class StackAnalysisReport(jsl.Document):
    """Class with the schema definition based on JSL domain specific language."""
    class Options:
        """A container for options."""

        description = "Stack analysis report with aggregated data"
        definition_id = "stack_analysis_report"

    with jsl.Scope(lambda v: v >= ROLE_v2_0_0) as v2_0_0:
        v2_0_0.manifest_name = jsl.StringField(required=True)
        v2_0_0.ecosystem = jsl.StringField(required=True)
        v2_0_0.cvss = jsl.NumberField(required=True)
        v2_0_0.popularity = jsl.DocumentField(Popularity,
                                              as_ref=True,
                                              Required=True)
        v2_0_0.usage = jsl.DocumentField(Usage, as_ref=True, Required=True)
    with jsl.Scope(lambda v: v >= ROLE_v2_0_2) as v2_0_2:
        v2_0_2.recommendation = jsl.DocumentField(Recommendation, as_ref=True)
    with jsl.Scope(lambda v: v >= ROLE_v2_0_3) as added_in_v2_0_3:
        added_in_v2_0_3.metadata = jsl.DocumentField(Metadata,
                                                     as_ref=True,
                                                     required=True)

    analyzed_components = jsl.NumberField(required=True)
    total_security_issues = jsl.NumberField(required=True)
    total_licenses = jsl.NumberField(required=True)
    components_with_security_issues = jsl.ArrayField(jsl.StringField(),
                                                     required=True)
    distinct_licenses = jsl.ArrayField(jsl.StringField(), required=True)
    components = jsl.ArrayField(jsl.DocumentField(ComponentInfo, as_ref=True),
                                required=True)
コード例 #5
0
class StackAnalysisResponse(JSLSchemaBase):
    """Class with the schema definition based on JSL domain specific language."""
    class Options:
        """A container for options."""

        description = "Stack analysis"
        definition_id = "stack_analysis"

    with jsl.Scope(lambda v: v < ROLE_v2_0_1) as before_v2_0_1:
        before_v2_0_1.status = jsl.StringField(
            enum=["FINISHED", "FAILED", "INPROGRESS"], required=True)
    with jsl.Scope(lambda v: v >= ROLE_v2_0_1) as since_v2_0_1:
        since_v2_0_1.status = jsl.StringField(enum=["success"], required=True)
    submitted_at = jsl.DateTimeField(required=True)
    started_at = jsl.DateTimeField(required=True)
    finished_at = jsl.DateTimeField(required=True)
    request_id = jsl.StringField(required=True)
    with jsl.Scope(lambda v: v < ROLE_v2_1_0) as removed_in_v2_1_0:
        removed_in_v2_1_0.analyses_result = jsl.ArrayField(jsl.StringField(),
                                                           required=True)
    with jsl.Scope(lambda v: v == ROLE_v1_0_0 or v == ROLE_v1_1_0 or v ==
                   ROLE_v1_2_0) as upto_v1_2_0:
        upto_v1_2_0.result = jsl.DocumentField(StackAnalysisResult,
                                               required=True)
    with jsl.Scope(lambda v: v >= ROLE_v2_0_0) as added_in_v2_0_0:
        added_in_v2_0_0.result = jsl.ArrayField(jsl.DocumentField(
            StackAnalysisReport, as_ref=True),
                                                required=True)
コード例 #6
0
class CVEImpact(jsl.Document):
    class Options(object):
        definition_id = "cve_impact"

    with jsl.Scope(ROLE_v1_0_0) as v1:
        v1.availability = jsl.StringField(enum=["NONE", "LOW", "HIGH"], required=True)
    with jsl.Scope(ROLE_v2_0_0) as v2:
        v2.availability = jsl.StringField(enum=["NONE", "PARTIAL", "COMPLETE"], required=True)
    confidentiality = jsl.StringField(enum=["NONE", "PARTIAL", "COMPLETE"], required=True)
    integrity = jsl.StringField(enum=["NONE", "PARTIAL", "COMPLETE"], required=True)
コード例 #7
0
class CVEAccess(jsl.Document):
    class Options(object):
        definition_id = "cve_access"

    authentication = jsl.StringField(enum=["NONE", "SINGLE", "MULTIPLE"], required=True)
    complexity = jsl.StringField(enum=["LOW", "MEDIUM", "HIGH"], required=True)
    with jsl.Scope(ROLE_v1_0_0) as v1:
        v1.vector = jsl.StringField(enum=["NETWORK", "ADJACENT NETWORK", "LOCAL"], required=True)
    with jsl.Scope(ROLE_v2_0_0) as v2:
        v2.vector = jsl.StringField(enum=["NETWORK", "ADJACENT_NETWORK", "LOCAL"], required=True)
コード例 #8
0
class ApiSchema78(BaseApiSchema):
    """Schema for siem rule in API format."""

    STACK_VERSION = "7.8"
    RULE_TYPES = [MACHINE_LEARNING, SAVED_QUERY, QUERY]

    actions = jsl.ArrayField(required=False)
    description = jsl.StringField(required=True)
    # api defaults to false if blank
    enabled = jsl.BooleanField(default=False, required=False)
    # _ required since `from` is a reserved word in python
    from_ = jsl.StringField(required=False, default='now-6m', name='from')
    false_positives = jsl.ArrayField(jsl.StringField(), required=False)
    filters = jsl.ArrayField(jsl.DocumentField(Filters))
    interval = jsl.StringField(pattern=INTERVAL_PATTERN, default='5m', required=False)
    max_signals = jsl.IntField(minimum=1, required=False, default=100)  # cap a max?
    meta = jsl.DictField(required=False)
    name = jsl.StringField(required=True)
    note = MarkdownField(required=False)
    # output_index =jsl.StringField(required=False)  # this is NOT allowed!
    references = jsl.ArrayField(jsl.StringField(), required=False)
    risk_score = jsl.IntField(minimum=0, maximum=100, required=True, default=21)
    severity = jsl.StringField(enum=['low', 'medium', 'high', 'critical'], default='low', required=True)
    tags = jsl.ArrayField(jsl.StringField(), required=False)
    throttle = jsl.StringField(required=False)
    timeline_id = jsl.StringField(required=False)
    timeline_title = jsl.StringField(required=False)
    to = jsl.StringField(required=False, default='now')

    type = jsl.StringField(enum=[MACHINE_LEARNING, QUERY, SAVED_QUERY], required=True)
    threat = jsl.ArrayField(jsl.DocumentField(Threat), required=False, min_items=1)

    with jsl.Scope(MACHINE_LEARNING) as ml_scope:
        ml_scope.anomaly_threshold = jsl.IntField(required=True, minimum=0)
        ml_scope.machine_learning_job_id = jsl.StringField(required=True)
        ml_scope.type = jsl.StringField(enum=[MACHINE_LEARNING], required=True, default=MACHINE_LEARNING)

    with jsl.Scope(SAVED_QUERY) as saved_id_scope:
        saved_id_scope.index = jsl.ArrayField(jsl.StringField(), required=False)
        saved_id_scope.saved_id = jsl.StringField(required=True)
        saved_id_scope.type = jsl.StringField(enum=[SAVED_QUERY], required=True, default=SAVED_QUERY)

    with jsl.Scope(QUERY) as query_scope:
        query_scope.index = jsl.ArrayField(jsl.StringField(), required=False)
        # this is not required per the API but we will enforce it here
        query_scope.language = jsl.StringField(enum=['kuery', 'lucene'], required=True, default='kuery')
        query_scope.query = jsl.StringField(required=True)
        query_scope.type = jsl.StringField(enum=[QUERY], required=True, default=QUERY)

    with jsl.Scope(jsl.DEFAULT_ROLE) as default_scope:
        default_scope.type = type
コード例 #9
0
class NpmShrinkwrap(jsl.Document):
    class Options(object):
        definition_id = "npm_shrinkwrap"
        description = "npm-shrinkwrap description"

    name = jsl.StringField()
    version = jsl.StringField()
    npm_shrinkwrap_version = jsl.StringField()
    node_version = jsl.StringField()
    with jsl.Scope(lambda v: v in (ROLE_v1_0_1, ROLE_v1_1_0)) as v1_0_1_v1_1_0:
        v1_0_1_v1_1_0.resolved_dependencies = jsl.ArrayField(jsl.StringField())
    with jsl.Scope(lambda v: v >= ROLE_v2_0_0) as since_v2_0_0:
        since_v2_0_0.dependencies = jsl.ArrayField(jsl.StringField())
        since_v2_0_0._system = jsl.StringField()
コード例 #10
0
class LicenseDetailsPre30(jsl.Document):
    class Options(object):
        definition_id = "license_details_pre_3_0"

    with jsl.Scope(ROLE_v1_0_0) as v1_0_0:
        v1_0_0.count = jsl.StringField(
            description="Number of occurrences of this variant", required=True)
    with jsl.Scope(ROLE_v2_0_0) as v2_0_0:
        v2_0_0.count = jsl.NumberField(
            description="Number of occurrences of this variant", required=True)
    license_name = jsl.StringField(
        description="Common name of the detected license", required=True)
    variant_id = jsl.StringField(
        description="Specific license variant detected", required=True)
コード例 #11
0
class GithubDetail(jsl.Document):
    """JSL schema for Github worker results details."""
    class Options(object):
        """JSL schema for Github worker results details."""

        definition_id = "github_extracted_details"
        description = "Details of Github inspection"

    # we don't mandate any of these fields, because they may not be present
    forks_count = jsl.IntField()
    last_year_commits = jsl.DocumentField(GithubLastYearCommits, as_ref=True)
    open_issues_count = jsl.IntField()
    stargazers_count = jsl.IntField()
    subscribers_count = jsl.IntField()
    with removed_in(ROLE_v2_0_0) as until_v2_0_0:
        until_v2_0_0.updated_issues = jsl.DocumentField(GithubUpdatedIssues,
                                                        as_ref=True)
        until_v2_0_0.updated_pull_requests = jsl.DocumentField(
            GithubUpdatedPullRequests, as_ref=True)
    with added_in(ROLE_v1_0_2) as since_v1_0_2:
        since_v1_0_2.contributors_count = jsl.IntField()
    with jsl.Scope(ROLE_v1_0_3) as v1_0_3:
        v1_0_3.topics = jsl.ArrayField(jsl.StringField(), required=True)
    with added_in(ROLE_v1_0_4) as since_v1_0_4:
        since_v1_0_4.topics = jsl.ArrayField(jsl.StringField())
    with added_in(ROLE_v2_0_1) as since_v2_0_1:
        since_v2_0_1.license = jsl.DictField()
    with added_in(ROLE_v2_0_2) as since_v2_0_2:
        since_v2_0_2.updated_on = jsl.StringField(required=True)
コード例 #12
0
 class SimilarityAnalysis(jsl.Document):
     class Options:
         description = "Stack Similarity Analysis Result"
         definition_id = "stack_similarity_analysis"
     missing_packages = jsl.ArrayField(jsl.StringField(), required=True)
     version_mismatch = jsl.ArrayField(jsl.StringField(), required=True)
     with jsl.Scope(lambda v: v >= ROLE_v2_1_4) as v2_1_4:
         v2_1_4.missing_downstream_component = jsl.ArrayField(jsl.StringField(), required=True)
コード例 #13
0
def added_in(role):
    """Provide helper for schema fields added in a particular version.

    Example:

       with added_in(ROLE_v2_0_0) as since_v2_0:
           since_v2_0.new_field_name = ...
    """
    return jsl.Scope(lambda v: v >= role)
コード例 #14
0
def removed_in(role):
    """Provide helper for schema fields removed in a particular version.

    Example:

       with removed_in(ROLE_v2_0_0) as before_v2_0:
           before_v2_0.old_field_name = ...
    """
    return jsl.Scope(lambda v: v < role)
コード例 #15
0
class GithubDetails(jsl.Document):
    class Options:
        description = "Github information for a single component"
        definition_id = "component_github_info"

    forks_count = jsl.NumberField(required=True)
    stargazers_count = jsl.NumberField(required=True)
    with jsl.Scope(lambda v: v >= ROLE_v2_0_0) as v2_0_0:
        v2_0_0.issues = jsl.DocumentField(GithubMetrics, as_ref=True, required=True)
        v2_0_0.pull_requests = jsl.DocumentField(GithubMetrics, as_ref=True, required=True)
コード例 #16
0
class LockFile(jsl.Document):
    class Options(object):
        definition_id = "metadata_lockfile"
        description = "Dependency lock file description"

    runtime = jsl.StringField()
    version = jsl.StringField()
    dependencies = jsl.ArrayField(
        jsl.DocumentField(LockedDependency, as_ref=True))
    with jsl.Scope(lambda v: v >= ROLE_v3_0_0) as since_v3_0_0:
        since_v3_0_0.name = jsl.StringField()
コード例 #17
0
class GithubUpdatedPullRequests(GithubUpdatedIssues):
    class Options(object):
        definition_id = "github_pull_requests_details"
        description = "Details of updated Github pull requests"

    with jsl.Scope(ROLE_v1_0_0) as v1_0_0:
        v1_0_0.open = jsl.IntField(required=True)
        v1_0_0.closed = jsl.IntField(required=True)
    with added_in(ROLE_v1_0_1) as since_v1_0_1:
        since_v1_0_1.year = jsl.DocumentField(GithubItemsByTime, as_ref=True)
        since_v1_0_1.month = jsl.DocumentField(GithubItemsByTime, as_ref=True)
コード例 #18
0
 class SimilarStacks(jsl.Document):
     class Options:
         description = "Stack Similarity Information"
         definition_id = "stack_similarity_information"
     analysis = jsl.DocumentField(SimilarityAnalysis, as_ref=True, required=True)
     similarity = jsl.NumberField(required=True)
     stack_id = jsl.NumberField(required=True)
     uri = jsl.StringField(required=True)
     with jsl.Scope(lambda v: v >= ROLE_v2_1_4) as v2_1_4:
         v2_1_4.source = jsl.StringField(required=True)
         v2_1_4.usage = jsl.NumberField(required=True)
         v2_1_4.original_score = jsl.NumberField(required=True)
コード例 #19
0
    class SimilarityAnalysis(jsl.Document):
        """Class with the schema definition based on JSL domain specific language."""
        class Options:
            """A container for options."""

            description = "Stack Similarity Analysis Result"
            definition_id = "stack_similarity_analysis"

        missing_packages = jsl.ArrayField(jsl.StringField(), required=True)
        version_mismatch = jsl.ArrayField(jsl.StringField(), required=True)
        with jsl.Scope(lambda v: v >= ROLE_v2_1_4) as v2_1_4:
            v2_1_4.missing_downstream_component = jsl.ArrayField(
                jsl.StringField(), required=True)
コード例 #20
0
ファイル: v7_10.py プロジェクト: willemdh/detection-rules
class ApiSchema710(ApiSchema79):
    """Schema for siem rule in API format."""

    STACK_VERSION = "7.10"
    RULE_TYPES = ApiSchema79.RULE_TYPES + [EQL]

    type = jsl.StringField(enum=RULE_TYPES, required=True)

    # there might be a bug in jsl that requires us to redefine these here
    query_scope = ApiSchema79.query_scope
    saved_id_scope = ApiSchema79.saved_id_scope
    ml_scope = ApiSchema79.ml_scope
    threshold_scope = ApiSchema79.threshold_scope

    with jsl.Scope(EQL) as eql_scope:
        eql_scope.index = jsl.ArrayField(jsl.StringField(), required=False)
        eql_scope.query = jsl.StringField(required=True)
        eql_scope.language = jsl.StringField(enum=[EQL], required=True, default=EQL)
        eql_scope.type = jsl.StringField(enum=[EQL], required=True)

    with jsl.Scope(jsl.DEFAULT_ROLE) as default_scope:
        default_scope.type = type
コード例 #21
0
class GithubUpdatedIssues(jsl.Document):
    """JSL schema for Details of updated Github issues."""
    class Options(object):
        """JSL schema for Details of updated Github issues."""

        definition_id = "github_issues_details"
        description = "Details of updated Github issues"

    with jsl.Scope(ROLE_v1_0_0) as v1_0_0:
        v1_0_0.open = jsl.IntField(required=True)
        v1_0_0.closed = jsl.IntField(required=True)
    with added_in(ROLE_v1_0_1) as since_v1_0_1:
        since_v1_0_1.year = jsl.DocumentField(GithubItemsByTime, as_ref=True)
        since_v1_0_1.month = jsl.DocumentField(GithubItemsByTime, as_ref=True)
コード例 #22
0
class GithubDetails(jsl.Document):
    """Class with the schema definition based on JSL domain specific language."""
    class Options:
        """A container for options."""

        description = "Github information for a single component"
        definition_id = "component_github_info"

    forks_count = jsl.NumberField(required=True)
    stargazers_count = jsl.NumberField(required=True)
    with jsl.Scope(lambda v: v >= ROLE_v2_0_0) as v2_0_0:
        v2_0_0.issues = jsl.DocumentField(GithubMetrics,
                                          as_ref=True,
                                          required=True)
        v2_0_0.pull_requests = jsl.DocumentField(GithubMetrics,
                                                 as_ref=True,
                                                 required=True)
コード例 #23
0
    class SimilarStacks(jsl.Document):
        """Class with the schema definition based on JSL domain specific language."""
        class Options:
            """A container for options."""

            description = "Stack Similarity Information"
            definition_id = "stack_similarity_information"

        analysis = jsl.DocumentField(SimilarityAnalysis,
                                     as_ref=True,
                                     required=True)
        similarity = jsl.NumberField(required=True)
        stack_id = jsl.NumberField(required=True)
        uri = jsl.StringField(required=True)
        with jsl.Scope(lambda v: v >= ROLE_v2_1_4) as v2_1_4:
            v2_1_4.source = jsl.StringField(required=True)
            v2_1_4.usage = jsl.NumberField(required=True)
            v2_1_4.original_score = jsl.NumberField(required=True)
コード例 #24
0
class DownstreamUsageSummary(jsl.Document):
    class Options(object):
        definition_id = "downstream_usage_summary"

    package_names = jsl.ArrayField(jsl.StringField(), required=True)
    # Brew query integration
    registered_srpms = jsl.ArrayField(jsl.DocumentField(SRPMRecord,
                                                        as_ref=True),
                                      required=True)
    # Pulp CDN query integration
    with jsl.Scope(ROLE_v1_0_0) as v1:
        v1.published_in = jsl.ArrayField(jsl.StringField(), required=True)
    with added_in(ROLE_v2_1_0) as since_v2_1:
        since_v2_1.all_rhn_channels = jsl.ArrayField(jsl.StringField(),
                                                     required=True)
        since_v2_1.all_rhsm_content_sets = jsl.ArrayField(jsl.StringField(),
                                                          required=True)
    with added_in(ROLE_v2_2_0) as since_v2_2:
        since_v2_2.all_rhsm_product_names = jsl.ArrayField(jsl.StringField(),
                                                           required=True)
    with added_in(ROLE_v2_2_1) as since_v2_2_1:
        since_v2_2_1.rh_mvn_matched_versions = jsl.ArrayField(
            jsl.StringField(), required=True)
コード例 #25
0
ファイル: schema.py プロジェクト: bb8758/detection-rules
class SiemRuleApiSchema(jsl.Document):
    """Schema for siem rule in API format."""

    actions = jsl.ArrayField(required=False)
    author = jsl.ArrayField(jsl.StringField(default="Elastic"),
                            required=True,
                            min_items=1)
    building_block_type = jsl.StringField(required=False)
    description = jsl.StringField(required=True)
    # api defaults to false if blank
    enabled = jsl.BooleanField(default=False, required=False)
    exceptions_list = jsl.ArrayField(required=False)
    # _ required since `from` is a reserved word in python
    from_ = jsl.StringField(required=False, default='now-6m', name='from')
    false_positives = jsl.ArrayField(jsl.StringField(), required=False)
    filters = jsl.ArrayField(jsl.DocumentField(Filters))
    interval = jsl.StringField(pattern=INTERVAL_PATTERN,
                               default='5m',
                               required=False)
    license = jsl.StringField(required=True, default="Elastic License")
    max_signals = jsl.IntField(minimum=1, required=False,
                               default=100)  # cap a max?
    meta = jsl.DictField(required=False)
    name = jsl.StringField(required=True)
    note = jsl.StringField(required=False)
    # output_index = jsl.StringField(required=False)  # this is NOT allowed!
    references = jsl.ArrayField(jsl.StringField(), required=False)
    risk_score = jsl.IntField(minimum=0,
                              maximum=100,
                              required=True,
                              default=21)
    risk_score_mapping = jsl.ArrayField(jsl.DocumentField(RiskScoreMapping),
                                        required=False,
                                        min_items=1)
    rule_id = jsl.StringField(pattern=UUID_PATTERN, required=True)
    rule_name_override = jsl.StringField(required=False)
    severity = jsl.StringField(enum=['low', 'medium', 'high', 'critical'],
                               default='low',
                               required=True)
    severity_mapping = jsl.ArrayField(jsl.DocumentField(SeverityMapping),
                                      required=False,
                                      min_items=1)
    # saved_id - type must be 'saved_query' to allow this or else it is forbidden
    tags = jsl.ArrayField(jsl.StringField(), required=False)
    throttle = jsl.StringField(required=False)
    timeline_id = jsl.StringField(required=False)
    timeline_title = jsl.StringField(required=False)
    timestamp_override = jsl.StringField(required=False)
    to = jsl.StringField(required=False, default='now')
    # require this to be always validated with a role
    # type = jsl.StringField(enum=[MACHINE_LEARNING, QUERY, SAVED_QUERY], required=True)
    threat = jsl.ArrayField(jsl.DocumentField(Threat),
                            required=False,
                            min_items=1)

    with jsl.Scope(MACHINE_LEARNING) as ml_scope:
        ml_scope.anomaly_threshold = jsl.IntField(required=True, minimum=0)
        ml_scope.machine_learning_job_id = jsl.StringField(required=True)
        ml_scope.type = jsl.StringField(enum=[MACHINE_LEARNING],
                                        required=True,
                                        default=MACHINE_LEARNING)

    with jsl.Scope(QUERY) as query_scope:
        query_scope.index = jsl.ArrayField(jsl.StringField(), required=False)
        # this is not required per the API but we will enforce it here
        query_scope.language = jsl.StringField(enum=['kuery', 'lucene'],
                                               required=True,
                                               default='kuery')
        query_scope.query = jsl.StringField(required=True)
        query_scope.type = jsl.StringField(enum=[QUERY],
                                           required=True,
                                           default=QUERY)

    with jsl.Scope(SAVED_QUERY) as saved_id_scope:
        saved_id_scope.index = jsl.ArrayField(jsl.StringField(),
                                              required=False)
        saved_id_scope.saved_id = jsl.StringField(required=True)
        saved_id_scope.type = jsl.StringField(enum=[SAVED_QUERY],
                                              required=True,
                                              default=SAVED_QUERY)
コード例 #26
0
        description = "Blackduck information for a single component"
        definition_id = "component_blackduck_info"

    license = jsl.ArrayField(jsl.DocumentField(BlackduckLicenseDetails, as_ref=True))
    security = jsl.ArrayField(jsl.DocumentField(BlackduckSecurityDetails, as_ref=True))


class CVEDetail(jsl.Document):
    class Options:
        description = "Information about one CVE for a single component"
        definition_id = "component_cve_info"

    cvss = jsl.NumberField(required=True)
    id = jsl.StringField(required=True)

with jsl.Scope(lambda v: v >= ROLE_v2_0_0) as v2_0_0:
    class Month(jsl.Document):
        class Options:
            description = "GitHub Last Month Metrics"
            definition_id = "github_last_month_metrics"
        opened = jsl.NumberField(required=True)
        closed = jsl.NumberField(required=True)

    class Year(jsl.Document):
        class Options:
            description = "GitHub Last Year Metrics"
            definition_id = "github_last_year_metrics"
        opened = jsl.NumberField(required=True)
        closed = jsl.NumberField(required=True)

    class GithubMetrics(jsl.Document):
コード例 #27
0
class MetadataDict(jsl.Document):
    """JSL schema for generic metadata dict in details list."""

    class Options(object):
        """JSL schema for generic metadata dict in details list."""

        definition_id = "details_metadata"
        description = "generic metadata dict in details list"

    # some of these may be missing in some ecosystem, so no required=True
    author = jsl.OneOfField([jsl.StringField(), jsl.NullField()])
    bug_reporting = jsl.OneOfField([jsl.StringField(), jsl.NullField()])
    code_repository = jsl.OneOfField(
        [jsl.DocumentField(CodeRepository, as_ref=True), jsl.NullField()]
    )

    with removed_in(ROLE_v3_2_0) as removed_in_v3_2_0:
        removed_in_v3_2_0.declared_license = jsl.OneOfField([jsl.StringField(), jsl.NullField()])
    with added_in(ROLE_v3_2_0) as added_in_v3_2_0:
        added_in_v3_2_0.declared_licenses = jsl.OneOfField([jsl.ArrayField(jsl.StringField()),
                                                            jsl.NullField()])

    dependencies = jsl.OneOfField(
        [jsl.ArrayField(jsl.StringField()), jsl.NullField()]
    )
    description = jsl.OneOfField([jsl.StringField(), jsl.NullField()])
    devel_dependencies = jsl.OneOfField(
        [jsl.ArrayField(jsl.StringField()), jsl.NullField()]
    )
    # engines are NPM thingie and can contain lots of various keys
    # so we just allow pretty much anything in that dict
    engines = jsl.OneOfField(
        [jsl.DictField(additional_properties=True), jsl.NullField()]
    )
    files = jsl.OneOfField(
        [jsl.ArrayField(jsl.StringField()), jsl.NullField()]
    )
    git_head = jsl.OneOfField([jsl.StringField(), jsl.NullField()])
    homepage = jsl.OneOfField([jsl.StringField(), jsl.NullField()])
    keywords = jsl.OneOfField(
        [jsl.ArrayField(jsl.StringField()), jsl.NullField()]
    )

    # metadata is a rubygems thing and can contain arbitrary key/value pairs
    metadata = jsl.OneOfField(
        [jsl.DictField(additional_properties=True), jsl.NullField()]
    )
    name = jsl.OneOfField([jsl.StringField(), jsl.NullField()])
    platform = jsl.OneOfField([jsl.StringField(), jsl.NullField()])
    readme = jsl.OneOfField([jsl.StringField(), jsl.NullField()])
    scripts = jsl.OneOfField(
        [jsl.DictField(additional_properties=True), jsl.NullField()]
    )
    version = jsl.OneOfField([jsl.StringField(), jsl.NullField()])

    with jsl.Scope(lambda v: v in (ROLE_v1_0_1, ROLE_v1_1_0)) as v1_0_1_v1_1_0:
        v1_0_1_v1_1_0.npm_shrinkwrap = jsl.OneOfField(
            [jsl.DocumentField(NpmShrinkwrap, as_ref=True), jsl.NullField()])
    with jsl.Scope(lambda v: v < ROLE_v1_1_0) as before_v1_1_0:
        before_v1_1_0.maintainers = jsl.OneOfField(
                    [jsl.ArrayField(jsl.DocumentField(Maintainer, as_ref=True)), jsl.NullField()])
    with added_in(ROLE_v1_1_0) as since_v1_1_0:
        since_v1_1_0.contributors = jsl.OneOfField(
                    [jsl.ArrayField(jsl.StringField()), jsl.NullField()])
        since_v1_1_0.maintainers = jsl.OneOfField(
                    [jsl.ArrayField(jsl.StringField()), jsl.NullField()])
    with jsl.Scope(ROLE_v2_0_0) as v2_0_0:
        v2_0_0._system = jsl.StringField()
    with jsl.Scope(lambda v: ROLE_v2_1_0 <= v < ROLE_v3_0_0) as since_v2_1_0:
        since_v2_1_0._bayesian_dependency_tree_lock = jsl.OneOfField([
            jsl.DocumentField(LockFile, as_ref=True), jsl.NullField()
        ])
    with added_in(ROLE_v2_1_1) as since_v2_1_1:
        since_v2_1_1._tests_implemented = jsl.BooleanField()
    with added_in(ROLE_v3_0_0) as since_v3_0_0:
        since_v3_0_0.ecosystem = jsl.StringField()
        since_v3_0_0._dependency_tree_lock = jsl.OneOfField([
            jsl.DocumentField(LockFile, as_ref=True), jsl.NullField()
        ])
    with added_in(ROLE_v3_1_1) as since_v3_1_1:
        since_v3_1_1.path = jsl.OneOfField(
            [jsl.StringField(), jsl.NullField()],
            required=False
        )
コード例 #28
0
class MercatorResult(JSLSchemaBaseWithRelease):
    """JSL schema for Mercator worker results."""

    class Options(object):
        """JSL schema for Mercator worker results."""

        definition_id = "metadata"
        description = "Result of Mercator worker"

    # TODO: Any ideas how to reuse MetadataDict here ?
    with jsl.Scope(lambda v: v in (ROLE_v1_0_1, ROLE_v1_1_0)) as v1_0_1_v1_1_0:
        v1_0_1_v1_1_0.npm_shrinkwrap = jsl.OneOfField(
            [jsl.DocumentField(NpmShrinkwrap, as_ref=True), jsl.NullField()])
    with jsl.Scope(lambda v: v < ROLE_v1_1_0) as before_v1_1_0:
        before_v1_1_0.maintainers = jsl.OneOfField(
            [jsl.ArrayField(jsl.DocumentField(Maintainer, as_ref=True)), jsl.NullField()])
    with jsl.Scope(ROLE_v1_1_0) as v1_1_0:
        v1_1_0.contributors = jsl.OneOfField(
            [jsl.ArrayField(jsl.StringField()), jsl.NullField()])
        v1_1_0.maintainers = jsl.OneOfField(
            [jsl.ArrayField(jsl.StringField()), jsl.NullField()])
    with jsl.Scope(lambda v: v < ROLE_v2_0_0) as before_v2_0_0:
        # some of these may be missing in some ecosystem, so no required=True
        before_v2_0_0.author = jsl.OneOfField([jsl.StringField(), jsl.NullField()])
        before_v2_0_0.bug_reporting = jsl.OneOfField([jsl.StringField(), jsl.NullField()])
        before_v2_0_0.code_repository = jsl.OneOfField(
            [jsl.DocumentField(CodeRepository, as_ref=True), jsl.NullField()]
        )
        before_v2_0_0.declared_license = jsl.OneOfField(
            [jsl.StringField(), jsl.NullField()]
        )
        before_v2_0_0.dependencies = jsl.OneOfField(
            [jsl.ArrayField(jsl.StringField()), jsl.NullField()]
        )
        before_v2_0_0.description = jsl.OneOfField([jsl.StringField(), jsl.NullField()])
        before_v2_0_0.devel_dependencies = jsl.OneOfField(
            [jsl.ArrayField(jsl.StringField()), jsl.NullField()]
        )
        # engines are NPM thingie and can contain lots of various keys
        # so we just allow pretty much anything in that dict
        before_v2_0_0.engines = jsl.OneOfField(
            [jsl.DictField(additional_properties=True), jsl.NullField()]
        )
        before_v2_0_0.files = jsl.OneOfField(
            [jsl.ArrayField(jsl.StringField()), jsl.NullField()]
        )
        before_v2_0_0.git_head = jsl.OneOfField([jsl.StringField(), jsl.NullField()])
        before_v2_0_0.homepage = jsl.OneOfField([jsl.StringField(), jsl.NullField()])
        before_v2_0_0.keywords = jsl.OneOfField(
            [jsl.ArrayField(jsl.StringField()), jsl.NullField()]
        )

        before_v2_0_0.maintainers = jsl.OneOfField(
                [jsl.ArrayField(jsl.StringField()), jsl.NullField()])

        # metadata is a rubygems thing and can contain arbitrary key/value pairs
        before_v2_0_0.metadata = jsl.OneOfField(
            [jsl.DictField(additional_properties=True), jsl.NullField()]
                )
        before_v2_0_0.name = jsl.OneOfField([jsl.StringField(), jsl.NullField()])
        before_v2_0_0.platform = jsl.OneOfField([jsl.StringField(), jsl.NullField()])
        before_v2_0_0.readme = jsl.OneOfField([jsl.StringField(), jsl.NullField()])

        before_v2_0_0.scripts = jsl.OneOfField(
            [jsl.DictField(additional_properties=True), jsl.NullField()]
        )
        before_v2_0_0.version = jsl.OneOfField([jsl.StringField(), jsl.NullField()])


# 2.0.0

    with jsl.Scope(ROLE_v2_0_0) as v2_0_0:
        v2_0_0.details = jsl.ArrayField(jsl.OneOfField(
            [jsl.DocumentField(MetadataDict, as_ref=True),
             jsl.DocumentField(NpmShrinkwrap, as_ref=True)]
        ))

# 2.1.0
    with added_in(ROLE_v2_1_0) as since_v2_1_0:
        since_v2_1_0.details = jsl.ArrayField(jsl.DocumentField(MetadataDict, as_ref=True))

# 3.1.0
    with added_in(ROLE_v3_1_0) as since_v3_1:
        since_v3_1.status = jsl.StringField(enum=["success", "error"], required=True)
        since_v3_1.summary = jsl.ArrayField(jsl.StringField(), required=True)