secureCodeBox/secureCodeBox

View on GitHub

Showing 515 of 515 total issues

Similar blocks of code found in 3 locations. Consider refactoring.
Open

        else if(smbVersion >= 3) {
          scriptFindings.push({
            name: "SMB Protocol Version Finding v"+smbVersion,
            description: `Port ${host.openPorts[0].port} is ${host.openPorts[0].state} using SMB protocol with version: ` + smbVersion,
            category: 'SMB',
Severity: Major
Found in scanners/nmap/parser/parser.js and 2 other locations - About 5 hrs to fix
scanners/nmap/parser/parser.js on lines 194..226
scanners/nmap/parser/parser.js on lines 205..226

Duplicated Code

Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

Tuning

This issue has a mass of 141.

We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

Refactorings

Further Reading

Similar blocks of code found in 3 locations. Consider refactoring.
Open

        else if(smbVersion >= 2 && smbVersion < 3) {
          scriptFindings.push({
            name: "SMB Protocol Version Finding v"+smbVersion,
            description: `Port ${host.openPorts[0].port} is ${host.openPorts[0].state} using SMB protocol with an old version: `+ smbVersion,
            category: 'SMB',
Severity: Major
Found in scanners/nmap/parser/parser.js and 2 other locations - About 5 hrs to fix
scanners/nmap/parser/parser.js on lines 194..226
scanners/nmap/parser/parser.js on lines 216..226

Duplicated Code

Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

Tuning

This issue has a mass of 141.

We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

Refactorings

Further Reading

Similar blocks of code found in 3 locations. Consider refactoring.
Open

        if(smbVersion > 0 && smbVersion < 2) {
          scriptFindings.push({
            name: "SMB Dangerous Protocol Version Finding v"+smbVersion,
            description: `Port ${host.openPorts[0].port} is ${host.openPorts[0].state} using SMB protocol with an old version: ` + smbVersion,
            category: 'SMB',
Severity: Major
Found in scanners/nmap/parser/parser.js and 2 other locations - About 5 hrs to fix
scanners/nmap/parser/parser.js on lines 205..226
scanners/nmap/parser/parser.js on lines 216..226

Duplicated Code

Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

Tuning

This issue has a mass of 141.

We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

Refactorings

Further Reading

Similar blocks of code found in 2 locations. Consider refactoring.
Open

  it("ANDs together results from multiple different limiter classes", () => {
    annotations = {
      "scope.cascading.securecodebox.io/domains": "example.com",
      "scope.cascading.securecodebox.io/cidr4": "127.0.0.1/8",
      "scope.cascading.securecodebox.io/cidr6":
Severity: Major
Found in hooks/cascading-scans/hook/scope-limiter.test.js and 1 other location - About 5 hrs to fix
hooks/cascading-scans/hook/scope-limiter.test.js on lines 987..1014

Duplicated Code

Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

Tuning

This issue has a mass of 137.

We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

Refactorings

Further Reading

Similar blocks of code found in 2 locations. Consider refactoring.
Open

  it("ANDs together results from multiple different limiter classes and fails if one fails", () => {
    annotations = {
      "scope.cascading.securecodebox.io/domains": "example.com",
      "scope.cascading.securecodebox.io/cidr4": "8.8.8.8/8",
      "scope.cascading.securecodebox.io/cidr6":
Severity: Major
Found in hooks/cascading-scans/hook/scope-limiter.test.js and 1 other location - About 5 hrs to fix
hooks/cascading-scans/hook/scope-limiter.test.js on lines 1016..1043

Duplicated Code

Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

Tuning

This issue has a mass of 137.

We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

Refactorings

Further Reading

Similar blocks of code found in 2 locations. Consider refactoring.
Open

test("Should Not Match Multiple 'and' Rules", async () => {
  const finding: Finding = {
    name: "test finding",
    description: "test finding description",
    location: "hostname",
Severity: Major
Found in hooks/notification/hook/hook.test.ts and 1 other location - About 4 hrs to fix
hooks/notification/hook/hook.test.ts on lines 111..144

Duplicated Code

Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

Tuning

This issue has a mass of 134.

We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

Refactorings

Further Reading

Similar blocks of code found in 2 locations. Consider refactoring.
Open

test("Should Match Multiple 'and' Rules", async () => {
  const finding: Finding = {
    name: "test finding",
    description: "test finding description",
    location: "hostname",
Severity: Major
Found in hooks/notification/hook/hook.test.ts and 1 other location - About 4 hrs to fix
hooks/notification/hook/hook.test.ts on lines 146..179

Duplicated Code

Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

Tuning

This issue has a mass of 134.

We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

Refactorings

Further Reading

File hook.ts has 367 lines of code (exceeds 250 allowed). Consider refactoring.
Open

// SPDX-FileCopyrightText: the secureCodeBox authors
//
// SPDX-License-Identifier: Apache-2.0

import {
Severity: Minor
Found in hooks/cascading-scans/hook/hook.ts - About 4 hrs to fix

    Function isInScope has 119 lines of code (exceeds 25 allowed). Consider refactoring.
    Open

    export function isInScope(
      scopeLimiter: ScopeLimiter,
      scanAnnotations: V1ObjectMeta["annotations"],
      finding: Finding,
      scopeLimiterAliases: ScopeLimiterAliases
    Severity: Major
    Found in hooks/cascading-scans/hook/scope-limiter.ts - About 4 hrs to fix

      Method ScanReconciler.createJobForHook has 143 lines of code (exceeds 50 allowed). Consider refactoring.
      Open

      func (r *ScanReconciler) createJobForHook(hookName string, hookSpec *executionv1.ScanCompletionHookSpec, scan *executionv1.Scan, cliArgs []string) (string, error) {
          ctx := context.Background()
      
          serviceAccountName := "scan-completion-hook"
          if hookSpec.ServiceAccountName != nil {
      Severity: Major
      Found in operator/controllers/execution/scans/hook_reconciler.go - About 4 hrs to fix

        Method ServiceScanReconciler.Reconcile has 140 lines of code (exceeds 50 allowed). Consider refactoring.
        Open

        func (r *ServiceScanReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
            log := r.Log
        
            log.V(8).Info("Something happened to a service", "service", req.Name, "namespace", req.Namespace)
        
        
        Severity: Major
        Found in auto-discovery/kubernetes/controllers/service_scan_controller.go - About 4 hrs to fix

          Method ServiceScanReconciler.Reconcile has a Cognitive Complexity of 45 (exceeds 20 allowed). Consider refactoring.
          Open

          func (r *ServiceScanReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
              log := r.Log
          
              log.V(8).Info("Something happened to a service", "service", req.Name, "namespace", req.Namespace)
          
          
          Severity: Minor
          Found in auto-discovery/kubernetes/controllers/service_scan_controller.go - About 4 hrs to fix

          Cognitive Complexity

          Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.

          A method's cognitive complexity is based on a few simple rules:

          • Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
          • Code is considered more complex for each "break in the linear flow of the code"
          • Code is considered more complex when "flow breaking structures are nested"

          Further reading

          Identical blocks of code found in 2 locations. Consider refactoring.
          Open

            await k8sApi.patchNamespacedCustomObjectStatus(
              "execution.securecodebox.io",
              "v1",
              namespace,
              "scans",
          Severity: Major
          Found in hook-sdk/nodejs/hook-wrapper.js and 1 other location - About 4 hrs to fix
          parser-sdk/nodejs/parser-wrapper.js on lines 64..88

          Duplicated Code

          Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

          Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

          When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

          Tuning

          This issue has a mass of 122.

          We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

          The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

          If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

          See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

          Refactorings

          Further Reading

          Identical blocks of code found in 2 locations. Consider refactoring.
          Open

              await k8sApi.patchNamespacedCustomObjectStatus(
                "execution.securecodebox.io",
                "v1",
                namespace,
                "scans",
          Severity: Major
          Found in parser-sdk/nodejs/parser-wrapper.js and 1 other location - About 4 hrs to fix
          hook-sdk/nodejs/hook-wrapper.js on lines 108..132

          Duplicated Code

          Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

          Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

          When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

          Tuning

          This issue has a mass of 122.

          We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

          The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

          If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

          See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

          Refactorings

          Further Reading

          Similar blocks of code found in 3 locations. Consider refactoring.
          Open

          test("Should Create MS Teams Notifier", async () => {
            const chan: NotificationChannel = {
              name: "slack",
              type: NotifierType.MS_TEAMS,
              template: "template",
          Severity: Major
          Found in hooks/notification/hook/NotifierFactory.test.ts and 2 other locations - About 4 hrs to fix
          hooks/notification/hook/NotifierFactory.test.ts on lines 65..78
          hooks/notification/hook/NotifierFactory.test.ts on lines 96..110

          Duplicated Code

          Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

          Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

          When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

          Tuning

          This issue has a mass of 122.

          We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

          The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

          If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

          See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

          Refactorings

          Further Reading

          Similar blocks of code found in 3 locations. Consider refactoring.
          Open

          test("Should Create Trello Notifier", async () => {
            const chan: NotificationChannel = {
              name: "trello",
              type: NotifierType.TRELLO,
              template: "template",
          Severity: Major
          Found in hooks/notification/hook/NotifierFactory.test.ts and 2 other locations - About 4 hrs to fix
          hooks/notification/hook/NotifierFactory.test.ts on lines 65..78
          hooks/notification/hook/NotifierFactory.test.ts on lines 80..94

          Duplicated Code

          Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

          Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

          When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

          Tuning

          This issue has a mass of 122.

          We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

          The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

          If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

          See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

          Refactorings

          Further Reading

          Similar blocks of code found in 3 locations. Consider refactoring.
          Open

          test("Should Create Slack Notifier", async () => {
            const chan: NotificationChannel = {
              name: "slack",
              type: NotifierType.SLACK,
              template: "template",
          Severity: Major
          Found in hooks/notification/hook/NotifierFactory.test.ts and 2 other locations - About 4 hrs to fix
          hooks/notification/hook/NotifierFactory.test.ts on lines 80..94
          hooks/notification/hook/NotifierFactory.test.ts on lines 96..110

          Duplicated Code

          Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

          Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

          When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

          Tuning

          This issue has a mass of 122.

          We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

          The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

          If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

          See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

          Refactorings

          Further Reading

          Similar blocks of code found in 2 locations. Consider refactoring.
          Open

          test("parses result file for tls-v1-0.badssl.com:1010 correctly", async () => {
            const fileContent = JSON.parse(
              await readFile(__dirname + "/__testFiles__/tls-v1-0.badssl.com_1010.json", {
                encoding: "utf8",
              })
          Severity: Major
          Found in scanners/sslyze/parser/parser.test.js and 1 other location - About 4 hrs to fix
          scanners/sslyze/parser/parser.test.js on lines 12..64

          Duplicated Code

          Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

          Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

          When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

          Tuning

          This issue has a mass of 121.

          We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

          The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

          If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

          See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

          Refactorings

          Further Reading

          Similar blocks of code found in 2 locations. Consider refactoring.
          Open

          test("parses result file for www.securecodebox.io correctly", async () => {
            const fileContent = JSON.parse(
              await readFile(__dirname + "/__testFiles__/www.securecodebox.io.json", {
                encoding: "utf8",
              })
          Severity: Major
          Found in scanners/sslyze/parser/parser.test.js and 1 other location - About 4 hrs to fix
          scanners/sslyze/parser/parser.test.js on lines 66..169

          Duplicated Code

          Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

          Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

          When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

          Tuning

          This issue has a mass of 121.

          We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

          The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

          If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

          See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

          Refactorings

          Further Reading

          Similar blocks of code found in 2 locations. Consider refactoring.
          Open

          func getPredicatesForEnabledPerResource(client client.Client, log logr.Logger) predicate.Predicate {
              return predicate.Funcs{
                  CreateFunc: func(event event.CreateEvent) bool {
                      if val, ok := event.Object.GetAnnotations()["auto-discovery.securecodebox.io/enabled"]; ok && val == "true" {
                          return true
          Severity: Major
          Found in auto-discovery/kubernetes/pkg/util/filter.go and 1 other location - About 4 hrs to fix
          auto-discovery/kubernetes/pkg/util/filter.go on lines 150..177

          Duplicated Code

          Duplicated code can lead to software that is hard to understand and difficult to change. The Don't Repeat Yourself (DRY) principle states:

          Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

          When you violate DRY, bugs and maintenance problems are sure to follow. Duplicated code has a tendency to both continue to replicate and also to diverge (leaving bugs as two similar implementations differ in subtle ways).

          Tuning

          This issue has a mass of 325.

          We set useful threshold defaults for the languages we support but you may want to adjust these settings based on your project guidelines.

          The threshold configuration represents the minimum mass a code block must have to be analyzed for duplication. The lower the threshold, the more fine-grained the comparison.

          If the engine is too easily reporting duplication, try raising the threshold. If you suspect that the engine isn't catching enough duplication, try lowering the threshold. The best setting tends to differ from language to language.

          See codeclimate-duplication's documentation for more information about tuning the mass threshold in your .codeclimate.yml.

          Refactorings

          Further Reading

          Severity
          Category
          Status
          Source
          Language