Security transparency

Security Audit

A running self-assessment of forceCalendar's published packages: what ships, what they need from your Content Security Policy, what has gone wrong, and what was done about it.

Package checks refreshed
4 October 2026
core
2.5.7
interface
1.9.1
react
0.3.1
vue
0.3.1

This is not a marketing page. It documents real findings, including open vulnerabilities and their remediation status, and states plainly where the library needs a relaxed policy. Transparency builds more trust than a clean report that hides issues.

Current evidence

What was checked on 4 October

Version-pinned package checks, with the limits of each result stated explicitly. Existing tests can pass while undiscovered bugs remain.

@forcecalendar/core 2.5.7

0 known dependency advisories

26/26 integration test files and declaration checks passed under UTC, including 696 cross-host recurrence fixtures; all 22 published runtime JavaScript files match the tested release source.

repository lockfile, including development dependencies. Lint: 0 errors, 4 warnings.

@forcecalendar/interface 1.9.1

29 affected dev dependencies

298/298 tests in 20 suites and declaration checks passed with published core 2.5.7; all 17 published source JavaScript files match the tested release source.

repository lockfile, including development dependencies. Lint: 0 errors, 12 warnings. Line coverage: 84.08%.

1 distinct advisory in development/test tooling. GHSA-vfj7-8cjw-p6xm. The production-only scan reports 0 affected dependencies.

@forcecalendar/react 0.3.1

0 known dependency advisories

37/37 published-tarball runtime tests with React 19.3.0 and 37/37 with React 18.3.1, both against actual core 2.5.7 and interface 1.9.1; Bundler and NodeNext declarations passed; no rebuild.

original repository lockfile including development dependencies; metadata queried without npm ci. No dedicated lint or benchmark script in the adapter repositories.

@forcecalendar/vue 0.3.1

0 known dependency advisories

33/33 published-tarball runtime tests with Vue 3.5.43 against actual core 2.5.7 and interface 1.9.1; Bundler and NodeNext declarations passed; no rebuild.

original repository lockfile including development dependencies; metadata queried without npm ci. No dedicated lint or benchmark script in the adapter repositories.

Timezone correctness: fix and remaining limits

Known limitations

Core 2.5.7 fixes the recurrence daylight-saving drift in core #195. The fresh UTC suite passes all 26 integration files, including 696 cross-host recurrence fixtures. The 2 October full release-candidate checks remain relevant: the suite passed 26/26 under UTC and Melbourne, but 25/26 under Los Angeles and Kolkata. Published runtime code matches that candidate apart from its version constant. The full cross-host suite was not rerun on 4 October; this refresh does not claim complete timezone correctness.

Scope matters

These are known-advisory scans of development lockfiles, automated tests and registry metadata checks. They are not a new line-by-line security review, penetration test or independent certification. Core/interface source checks and adapter tarball checks are distinguished in the downloadable evidence. Performance results belong to the benchmark report; test durations are not benchmarks. Private and unpublished projects are outside this public snapshot.

Supply chain

What actually ships

Runtime dependency counts and publish provenance for the packages on npm, verified against the registry.

0
Runtime deps · core
0
Runtime deps · interface
4 / 4
Registry attestations present
1 / 4
Dev locks with findings

Zero runtime dependencies

Every dependency is a potential attack vector; the event-stream, ua-parser-js and colors incidents showed that even popular packages get compromised. @forcecalendar/core and @forcecalendar/interface list no dependencies at all, so there is no transitive ordinary dependency tree in either package. Interface declares core as a peer. Host applications still need to audit their resolved peers, and the packages themselves can contain security bugs.

forceCalendar
  • Zero runtime dependencies
  • No transitive dependency tree
  • Publishing and maintainer risks still apply
  • Adapters: framework and calendar peer dependencies
Remaining responsibilities
  • Audit the consuming app and peer dependencies
  • Review package code and publishing workflows
  • Keep development tooling patched
  • Monitor newly disclosed advisories

Verified from the exact npm version manifests listed above. All four omit ordinary runtime dependencies. Interface declares core as a peer; React and Vue declare their framework, core and interface as peers. Peer installations can introduce additional dependencies in a consuming app.

Signed build provenance

Metadata observed

Each pinned npm version exposes an attestation endpoint with a SLSA v1 provenance predicate. Metadata presence is distinct from cryptographic verification. Fresh npm audit signatureschecks verified 83 signatures / 17 attestations for the core 2.5.7 development tree and 529 signatures / 56 attestations for the exactly pinned interface 1.9.1 compatibility fixture. These counts describe installed dependency trees, not four individual release attestations.

Verify it yourself
$ npm view @forcecalendar/core@2.5.7 dist.attestations
$ npm audit signatures

The first prints the attestation URL and provenance predicate type; the second checks the registry signatures and attestations of everything in your lockfile. Substitute interface, react or vue for core.

Dev dependency hygiene

npm audit · 4 October 2026

The interface development lockfile has 29 npm affected-package entries, all tracing to one high-severity braces advisory through Jest tooling. This is one distinct advisory, not 29 separate vulnerabilities. Its production-only scan is clean. Core and adapter development lockfile results are reported in their cards above. A clean consumer install of core 2.5.7, interface 1.9.1 and both 0.3.1 adapters also returned zero known advisories. Dependency scan results do not establish the absence of bugs in package code. The website has its own dependency tree, assessed separately below.

Separate website check

This dashboard has dependencies too

The 4 October 2026 scan reports 5 affected development/build dependencies, all from one high-severity braces advisorythrough Tailwind 3 tooling. The production-only scan reports 0 affected dependencies. These counts are affected-package entries, not distinct vulnerabilities, and do not establish exploitability in this application.

The registry check found no patched braces release. npm suggests a Tailwind 4 major upgrade for most affected paths; no major migration or dependency remediation was performed in this evidence refresh.

The 2 October snapshot preserves the earlier seven-to-zero remediation. Advisory data changes over time: that historical zero is not the current result. The current downloadable evidence includes lockfile hashes, the affected packages and audit scope.

Content Security Policy

What the library needs from your CSP

Previously documented library behavior. Browser CSP and Salesforce deployment checks were not rerun in this package refresh.

script-src 'self'Compatible

No eval(), no new Function(), no inline scripts, no remote code.

style-src 'self'Requires 'unsafe-inline'

The renderers set inline style attributes on cells and events, and the component injects a <style> element into its open shadow root. Every interpolated value passes through escapeHTML() / sanitizeColor(), but hashes and nonces are not supported yet, so under a strict style-src the browser drops the component's styles.

img-src 'self'Compatible

No dynamic image loading from external sources.

connect-src 'self'Compatible

ICS fetch respects connect-src (configurable).

object-src 'none'Compatible

No plugins, embeds, or applets.

base-uri 'self'Compatible

No base tag manipulation.

Documented policy for @forcecalendar/interface

script-src 'self';
style-src 'self' 'unsafe-inline';

Inline style attributes and the shadow-root stylesheet are what need 'unsafe-inline'. The values written into them are escaped and colour-sanitised, so the relaxation does not open a script path, but it is a relaxation and it is listed as one. Hash- or nonce-based styling is not supported yet. @forcecalendar/core is DOM-free and imposes no CSP requirement.

Prohibited patterns

Explicitly avoided throughout the codebase:

eval()
new Function()
document.write()
innerHTML *

* innerHTML is used in @forcecalendar/interface renderers with all user-controlled values escaped before interpolation (finding DOM-001, resolved). The core library is entirely DOM-free.

Earlier assessments reported Salesforce Locker Service compatibility. This refresh did not repeat those deployment checks. The audit website itself uses inline scripts and has a different CSP from the library.

Attack surface

Where a calendar library can be attacked

A calendar library has a specific and bounded attack surface. Each vector below is one that has actually been reported against forceCalendar, with what was done.

8 resolved

Recurrence Expansion / CPU Denial of Service

@forcecalendar/core
Resolved

A spec-valid MONTHLY rule with a signed or lowercase BYDAY value (for example FREQ=MONTHLY;BYDAY=+1MO) was parsed but not recognised by the expansion engines, so the weekday search never terminated. Any expansion path, including events imported from an ICS feed, could block the process indefinitely.

  • Fixed in v2.5.3: BYDAY values are canonicalised and validated at parse time; unknown weekdays are rejected with an error
  • Every weekday search loop in both engines is bounded to seven iterations
  • Regression test expands the affected rule forms inside a child process with a time budget
core#183Resolved in v2.5.3

URL Handling / SSRF (IPv6 literals)

@forcecalendar/core
Resolved

The ICS feed URL guard only understood dotted IPv4 literals and a few IPv6 prefixes. IPv4-mapped IPv6 literals in hexadecimal form, NAT64 addresses and other embedded-IPv4 forms passed validation, and hosts containing a colon skipped the DNS re-check, so importFromURL and subscribe could reach loopback, link-local and other internal addresses.

  • Fixed in v2.5.3: IPv6 literals are parsed in full and judged by the address they denote; mapped, compatible, translated, NAT64 and 6to4 forms are checked as the embedded IPv4 address
  • Loopback, unspecified, link-local, unique-local, site-local, multicast and documentation ranges are refused; unparseable literals fail closed
  • DNS re-check now runs for every non-literal host in Node; redirect targets are validated and their bodies discarded when rejected
  • Known limitation: the DNS-rebinding window between the lookup and the request remains (closing it needs a custom network agent, which conflicts with the zero-dependency constraint)
core#184Resolved in v2.5.3

ICS Parser

@forcecalendar/core
Resolved

The ICS parser processes external .ics files, which are untrusted input by definition. It previously lacked input size limits, which could allow denial of service via crafted files.

  • Fixed in v2.1.21: configurable size limits with safe defaults
  • Maximum input size, line count, and event count enforced
  • Parser is read-only; it cannot execute code or modify system state
core#37Resolved in v2.1.21

URL Handling / SSRF

@forcecalendar/core
Resolved

The ICS fetching mechanism previously accepted URLs pointing to internal network resources. In server-side contexts this created a Server-Side Request Forgery vector.

  • Fixed in v2.1.21: URL validation against private and internal IP ranges
  • Scheme allowlisting restricts fetches to http and https
  • Client-side usage is additionally mitigated by the browser same-origin policy
core#38Resolved in v2.1.21

DOM Rendering / XSS

@forcecalendar/interface
Resolved

The Web Components interface layer renders event data into the DOM. Renderers previously inserted content via innerHTML without escaping, creating a cross-site scripting vector when event data contained untrusted input.

  • Fixed: all user-controlled values are escaped before template interpolation
  • Hardened further in v1.0.60: parseHTML() sanitizes by default, stripping script-capable elements, inline handlers, and javascript: URLs
  • The core library is entirely DOM-free and not affected
interface#39Resolved February 2026; defense-in-depth added in v1.0.60

Recurrence Engine

@forcecalendar/core
Resolved

The recurrence expansion engine processes RFC 5545 RRULE patterns. It previously lacked hard limits on occurrence count, which could cause excessive computation via an algorithmic-complexity attack.

  • Fixed in v2.1.21: hard cap on maxOccurrences prevents unbounded expansion
  • Expansion is CPU-bound only; no I/O or network side effects
  • Can be further isolated in a Web Worker (already supported)
core#56Resolved in v2.1.21

ReDoS in Email Validation

@forcecalendar/core
Resolved

The email validation regex used for organizer and attendee fields was vulnerable to Regular Expression Denial of Service. Crafted input could cause catastrophic backtracking and block the main thread.

  • Fixed in v2.1.22: replaced the vulnerable regex with linear-time validation
  • The new check has O(n) worst-case complexity
  • Affects ICS parsing of ORGANIZER and ATTENDEE fields with mailto: URIs
core#111Resolved in v2.1.22

CI/CD Workflow Permissions

@forcecalendar/core
Resolved

GitHub Actions workflows were using default (write-all) permissions, granting more access than necessary. Overly permissive workflows can be exploited if a dependency or action is compromised.

  • Fixed: explicit least-privilege permissions blocks on all workflows
  • Read-only default with scoped write access only where required
  • Follows GitHub's recommended security hardening for Actions
core#112Resolved
Hardening

Ongoing hardening

Security and stability work between reported findings, newest first.

August 2026

core 2.5.1 – 2.5.2 · interface 1.6.0 – 1.7.0

A CI/CD fix in both publish pipelines, CPU-exhaustion mitigations in the recurrence engine, and a clean sweep of the dev-dependency advisories.

core · interfacepublish workflows
  • Command-injection fix: the release step interpolated the commit message directly into a shell script; it is now passed through an environment variable
  • Both workflows publish with npm provenance; the release-banner step authenticates with a bearer-token secret
  • Dev-dependency trees updated to clear the brace-expansion, js-yaml, nanoid and postcss advisories
@forcecalendar/core2.5.1 – 2.5.2
  • Bounded recurrence expansion: a hard iteration limit (MAX_ITERATIONS_HARD_LIMIT) caps every expansion loop
  • Incremental timezone-transition caches: a far-past DTSTART no longer triggers multi-second rescans (CPU DoS mitigation)
  • Recurrence rule objects are no longer mutated during expansion
  • Occurrence-id resolution is consistent across APIs; hourCycle fix for older ICU builds

Continued hardening (2026)

core 2.1.63 – 2.1.68 · interface 1.0.60
@forcecalendar/core2.1.63 – 2.1.68
  • Hardened ICS import and timezone parsing against malformed input
  • Stabilized search worker indexing, event overlap indexing, and recurring event expansion
@forcecalendar/interface1.0.60
  • parseHTML() now sanitizes by default: strips script-capable elements, inline event handlers, and javascript: URLs
  • Focus trapping fixed inside Shadow DOM; animation waits can no longer hang callers
  • Defensive escaping of colour labels and values in the event form

Critical bug fixes

core 2.1.22

Not direct security vulnerabilities, but correctness bugs in date/time handling can lead to data-integrity issues in production calendar systems. All four shipped in PRs #113–#118 with regression tests.

IssueBugImpactStatus
#107TimezoneManager.parseTimezone() property name mismatchTimezone abbreviations (e.g. PST, EST) could fail to resolveResolved
#108ICSParser VALARM export uses wrong property nameAlarm/reminder data lost during ICS round-trip exportResolved
#109DateUtils.isDST() returns inverted booleanDST detection inverted, causing incorrect time offsetsResolved
#110DateUtils.addHoursWithDST() double-adjusts offsetEvents shifted by double the DST offset during transitionsResolved
Remediation tracker

Public tracked findings

Pulled from GitHub Issues on the server and regenerated hourly. Counts are always shown in full; only the long tail of resolved rows is folded.

46
Findings
46
Resolved
0
Open

@forcecalendar/core

33 findings · 33 resolved · 0 open · 0 not planned
forceCalendar/core issues
IssueFindingSeverityStatusClosed
#29
Fix fuzzy search: tokenize field values before Levenshtein comparison
CriticalResolved21 Feb 2026
#30
Fix RecurrenceEngineV2 byDay format mismatch with RRuleParser
CriticalResolved21 Feb 2026
#32
Fix fuzzy search — Levenshtein compares against entire field value
CriticalResolved20 Mar 2026
#33
Fix RecurrenceEngineV2 byDay format mismatch with RRuleParser
CriticalResolved20 Mar 2026
#37
Add input size limits to ICS parser
CriticalResolved26 Feb 2026
#38
Add SSRF protection to ICS importFromURL
CriticalResolved26 Feb 2026

@forcecalendar/interface

13 findings · 13 resolved · 0 open · 0 not planned
forceCalendar/interface issues
IssueFindingSeverityStatusClosed
#38
Fix innerHTML XSS vectors in view renderers
CriticalResolved21 Feb 2026
#39
Fix innerHTML XSS vectors in view renderers
CriticalResolved24 Feb 2026
#58
StateManager.setState has no prototype pollution protection
CriticalResolved5 Mar 2026
#59
EventBus.matchesPattern is vulnerable to regex injection
CriticalResolved5 Mar 2026
#41
Fix window keydown listener leak in EventForm
HighResolved5 Mar 2026
#43
Fix DOMUtils.trapFocus broken in Shadow DOM
HighResolved6 Jul 2026

Issues labelled type:security, or type:bug with priority:critical / priority:high, from forceCalendar/core and forceCalendar/interface.

Data refreshed · hourly

Methodology

How this page is produced

Audit approach

  1. 1.Automated regression checks — existing core and interface suites; published adapter tarball runtime and declaration checks
  2. 2.Dependency analysis — exact registry manifests, development lockfile npm audit results, and core/interface tree signature checks
  3. 3.Historical findings — previously published security findings and CSP notes retained with their original scope; no new Salesforce or browser CSP validation
  4. 4.Public issue tracking — paginated GitHub label queries, deduplicated by issue number; partial failures remain visible

Additional checks to consider

Listing a tool here does not claim it ran in this refresh. See the evidence above for executed checks.

  • npm audit and npm audit signatures — known vulnerabilities and registry signatures / attestations
  • eslint-plugin-security — static analysis for common security anti-patterns in JavaScript
  • Snyk — continuous vulnerability monitoring and code analysis
  • GitHub Dependabot — automated dependency updates (minimal surface for forceCalendar due to zero runtime deps)

Scope and disclosure

This snapshot covers the four pinned public packages above. The Salesforce LWC wrapper, documentation site, benchmark tooling and private projects are outside the package-security scope. The audit website dependency scan is reported separately. Known-advisory scans cannot establish the absence of code vulnerabilities. This is a self-assessment, not a third-party audit. We encourage independent security researchers to verify these findings. Vulnerabilities should be reported privately through GitHub as described in the security policy, never as a public issue.