Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
04f0499
Merge pull request #7546 from Countly/anna/master
ar2rsawseen May 7, 2026
fbd743c
chore(deps): bump geoip-lite from 2.0.1 to 2.0.2
dependabot[bot] May 8, 2026
ea740f5
Merge pull request #7549 from Countly/dependabot/npm_and_yarn/geoip-l…
ar2rsawseen May 8, 2026
0a2d2b7
docs(changelog): 📚 add user profile dot encoding fix to changelog
davidecavaliere May 8, 2026
823723c
[security] Fix Fortify-flagged path traversal, XSS, and info-leak issues
ar2rsawseen May 7, 2026
12a2681
[security] Address PR review comments
ar2rsawseen May 7, 2026
db1b708
Merge pull request #7547 from Countly/claude/strange-archimedes-c050c8
ar2rsawseen May 11, 2026
06f82fe
Merge branch 'master' into fix/changelog-user-profile-dot-encoding
davidecavaliere May 11, 2026
7279167
chore(deps): bump slackapi/slack-github-action in the actions group
dependabot[bot] May 11, 2026
6194d16
Merge pull request #7554 from Countly/dependabot/github_actions/actio…
ar2rsawseen May 11, 2026
4a40314
chore(deps-dev): bump lint-staged from 17.0.2 to 17.0.4
dependabot[bot] May 11, 2026
9eaaad9
Merge branch 'master' into fix/changelog-user-profile-dot-encoding
davidecavaliere May 11, 2026
086db49
Merge pull request #7553 from Countly/dependabot/npm_and_yarn/lint-st…
ar2rsawseen May 11, 2026
9c2b30c
chore(deps): bump semver from 7.7.4 to 7.8.0
dependabot[bot] May 11, 2026
0fb9794
Merge pull request #7552 from Countly/dependabot/npm_and_yarn/semver-…
ar2rsawseen May 11, 2026
0ff42b5
chore(deps): bump fast-xml-builder from 1.1.5 to 1.2.0 in /plugins/push
dependabot[bot] May 8, 2026
bc68b9e
Merge pull request #7551 from Countly/dependabot/npm_and_yarn/plugins…
ar2rsawseen May 11, 2026
2d32805
Update CHANGELOG for version 25.03.X fixes
Cookiezaurs May 11, 2026
919f746
Merge pull request #7556 from Countly/Cookiezaurs-patch-6
Cookiezaurs May 11, 2026
be6b5ef
chore(deps): bump countly-sdk-nodejs from 24.10.3 to 24.10.4
dependabot[bot] May 12, 2026
114330f
Merge pull request #7558 from Countly/dependabot/npm_and_yarn/countly…
ar2rsawseen May 12, 2026
cf285e4
chore(deps): bump puppeteer from 24.43.0 to 24.43.1
dependabot[bot] May 12, 2026
d34d7e2
Merge pull request #7557 from Countly/dependabot/npm_and_yarn/puppete…
ar2rsawseen May 12, 2026
a33ef24
chore(deps): bump @protobufjs/utf8 from 1.1.0 to 1.1.1 in /plugins/push
dependabot[bot] May 12, 2026
58ab81b
Merge pull request #7560 from Countly/dependabot/npm_and_yarn/plugins…
ar2rsawseen May 13, 2026
96c52df
chore(deps-dev): bump cypress from 15.14.2 to 15.15.0 in /ui-tests
dependabot[bot] May 13, 2026
9c01bd2
Merge pull request #7562 from Countly/dependabot/npm_and_yarn/ui-test…
ar2rsawseen May 13, 2026
b327bf0
Update CHANGELOG.md for version 25.03.X fixes
ar2rsawseen May 12, 2026
1ce62aa
docs: fix changelog typos and complete dbviewer M-11 entry
ar2rsawseen May 12, 2026
933f582
Merge pull request #7559 from Countly/ar2rsawseen-patch-70
ar2rsawseen May 13, 2026
4c4196b
chore(deps): bump xlsx-write-stream from 1.0.3 to 1.0.4
dependabot[bot] May 13, 2026
b689d93
Merge pull request #7561 from Countly/dependabot/npm_and_yarn/xlsx-wr…
ar2rsawseen May 13, 2026
5a34a00
cooldown badge changes
coskunaydinoglu May 14, 2026
891e9c6
Update CHANGELOG.md
coskunaydinoglu May 14, 2026
886c408
Merge branch 'master' into fix/changelog-user-profile-dot-encoding
davidecavaliere May 14, 2026
5289ee4
Merge pull request #7550 from Countly/fix/changelog-user-profile-dot-…
davidecavaliere May 14, 2026
ee06c3d
Update CHANGELOG.md
coskunaydinoglu May 14, 2026
771e257
Update CHANGELOG.md
coskunaydinoglu May 14, 2026
73c1f93
chore(deps): bump systeminformation from 5.31.1 to 5.31.6 in /ui-tests
dependabot[bot] May 13, 2026
7f72cd7
Merge pull request #7564 from Countly/dependabot/npm_and_yarn/ui-test…
ar2rsawseen May 14, 2026
76a825d
chore(deps): bump protobufjs from 7.5.5 to 7.5.8 in /plugins/push
dependabot[bot] May 13, 2026
5b8d59d
Merge pull request #7563 from Countly/dependabot/npm_and_yarn/plugins…
ar2rsawseen May 14, 2026
abcd330
Merge branch 'master' into cognito-body-parser-fix
coskunaydinoglu May 14, 2026
2dbad18
Merge branch 'master' into journey-cooldown-ui-changes
coskunaydinoglu May 14, 2026
e9b0fe0
Merge pull request #7566 from Countly/journey-cooldown-ui-changes
coskunaydinoglu May 14, 2026
75b3aed
Merge branch 'master' into cognito-body-parser-fix
coskunaydinoglu May 14, 2026
8882cd2
Merge pull request #7567 from Countly/cognito-body-parser-fix
coskunaydinoglu May 14, 2026
7d5cb5c
chore(deps): bump express-rate-limit from 8.5.1 to 8.5.2
dependabot[bot] May 15, 2026
96250ed
Merge pull request #7570 from Countly/dependabot/npm_and_yarn/express…
ar2rsawseen May 15, 2026
e73d241
chore(deps-dev): bump lint-staged from 17.0.4 to 17.0.5
dependabot[bot] May 18, 2026
05548cc
Merge pull request #7571 from Countly/dependabot/npm_and_yarn/lint-st…
ar2rsawseen May 18, 2026
dc5439b
Update CHANGELOG for version 25.03.44
Cookiezaurs May 19, 2026
6050a3b
Merge pull request #7574 from Countly/Cookiezaurs-patch-7
Cookiezaurs May 19, 2026
b3f9d0f
fix(notes): accept numeric color in saveNote schema
davidecavaliere May 19, 2026
999c21e
Merge branch 'master' into fix/note_validation_ts
Cookiezaurs May 19, 2026
6e9b629
Merge pull request #7578 from Countly/fix/note_validation_ts
Cookiezaurs May 19, 2026
0b6cea6
Change 'ts' type from empty to 'IntegerString'
Cookiezaurs May 19, 2026
2d555ad
Merge pull request #7579 from Countly/Cookiezaurs-patch-9
Cookiezaurs May 19, 2026
4f3bcf8
chore(deps): bump get-random-values from 4.1.2 to 5.0.0
dependabot[bot] May 18, 2026
c7fee52
Merge pull request #7565 from Countly/dependabot/npm_and_yarn/get-ran…
ar2rsawseen May 20, 2026
08f1972
docs(changelog): note groups findGroups legacy group_id fix under 25.…
davidecavaliere May 21, 2026
9bf0774
Merge pull request #7582 from Countly/fix/groups_legacy_string_group_id
davidecavaliere May 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/release_notice.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
run: echo "$GITHUB_CONTEXT"
- name: Send custom JSON data to Slack workflow
id: slack
uses: slackapi/slack-github-action@v3.0.2
uses: slackapi/slack-github-action@v3.0.3
with:
# This data can be any valid JSON from a previous step in the GitHub Action
webhook: ${{ secrets.SLACK_RELEASE }}
Expand Down
53 changes: 51 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,65 @@

## Version 25.03.X
Fixes:
- [core] Accept numeric color in saveNote schema so graph note create/edit no longer fails validation
- [groups] Tolerate legacy string `group_id` on members in findGroups aggregation so the groups listing, User Management, Alerts and Preset Management pages no longer 400 with MongoDB Location40081 on tenants with pre-2021 data

## Version 25.03.44
Security fixes:
- [alerts] Validate alertConfig.selectedApps against caller's permissions (cross-app metric exfiltration)
- [app_users / logger / compliance-hub] Strip dangerous Mongo operators ($where, $expr, $function, $accumulator) from user-supplied queries
- [app_users] Sanitize user.picture filename before deletion (path traversal)
- [app_users] Scope export download/delete to caller's app_id; reject path-traversal in filenames
- [apps] Replace updateApp/createApp mass-assignment with explicit field allowlist
- [auth] Generate new-member invite prid with crypto.randomBytes (replace predictable HMAC)
- [auth] Handle req.session.regenerate error in token login
- [auth] Replace OTP-equality recaptcha bypass with twoFactorPassed session flag
- [auth] Restrict /login/token/:token to login-purpose tokens; regenerate session id on token login to close fixation
- [cms / system / systemlogs] /i/cms/save_entries, /o/system/plugins, /i/systemlogs restricted to global admins
- [core] Add common.resolvePathInBase helper for safe path containment checks
- [crashes] Add error handlers to crash report streamed responses
- [dashboards] Constrain public screenshot route paths and stream error handling
- [dashboards] Identical response for missing/inaccessible dashboard (no enumeration)
- [dashboards] Require auth + per-widget app permission on /o/dashboards/test; remove the unused endpoint
- [data_migration] Constrain export/import paths to allowed directories; reject path-traversal in target_path, multipart filenames, and exportid (backport of #7491)
- [data] Escape regex metacharacters in sSearch parameters (ReDoS)
- [data] Return 404 (not 500) when event_groups lookup misses
- [dbviewer] Block $graphLookup aggregation stage (cross-collection data exfiltration)
- [dbviewer] Wrap non-admin scope as top-level $and so user-supplied $or/$nor cannot bypass per-tenant filter (cross-tenant data exfiltration)
- [errorlogs] Reject path-traversal in admin log file paths
- [event_groups] Whitelist updatable fields on create/update; scope reads by app_id
- [exports] Add stream error handlers to export download
- [exports] Authorize /o/export/download by task ownership / app_id
- [notes] Bind notes to permission-checked app_id; check edit permissions against the note's stored app_id
- [notes] Enforce saveNote schema validation
- [output] Remove noescape query-string bypass on returnOutput (reflected-XSS via parameter)
- [push] Bind message create/test/update/one/remove/toggle to query-string app_id (cross-app push injection)
- [redirect] Apply SSRF protection (api/utils/ssrf-protection.js) to app.redirect_url outbound requests
- [render] (--disable-web-security) removed from puppeteer
- [reports] Add stream error handlers
- [star-rating] Close stored XSS in feedback widget logo upload/preview; restrict uploads to image MIME types and validate magic bytes (backport of #7532)
- [star-rating] Defense-in-depth on image upload/serve routes
- [system-utility] Harden streamed responses with error handlers
- [tasks] Authorize /i/tasks/{update,delete,name,edit} per task ownership / app admin / global admin
- [users] /users/check/username now requires global admin (parity with email check)

Enterprise Features:
- [journey_engine] Maker checker approver
- [journey_engine] Engagement cooldown information added to journey builder and user profiles

Enterprise Fixes:
- [active_users] Fixed logic to prevent triggering active users calculation if it
- [cognito] Fix crash on GET /clogin/:code when body-parser 2.x leaves req.body undefined on requests with no bodyis already running.
- [drill] Add query hint based on default indexes
- [drill] Add contextual links in drill table for user IDs and crash groups
- [drill] Resolve device IDs to user profiles via server-side redirect endpoint
- [drill] Open crash group and user profile links in new tab
- [drill] Show user-friendly error message when saving a query fails

- [users] Fix MongoDB dot encoding (.) leaking into user profile UI filters, breakdown dropdown, and URLs

## Version 25.03.43
Enterprise Fixes:
- [flow] Optimize timeline period query
- [journey_engine] Maker checker approver

Dependencies:
- Bump follow-redirects from 1.15.11 to 1.16.0
Expand Down
9 changes: 6 additions & 3 deletions api/parts/mgmt/users.js
Original file line number Diff line number Diff line change
Expand Up @@ -904,15 +904,18 @@ usersApi.saveNote = async function(params) {
},
'ts': {
'required': true,
'type': ''
'type': 'IntegerString'
},
'noteType': {
'required': true,
'type': 'String',
},
'color': {
// Frontend (countly.common.notes.js COLOR_TAGS) sends a numeric
// index 1..5. URL query callers may send "5" as a string.
// Mirror the ts handling — IntegerString accepts both.
'required': true,
'type': 'String'
'type': 'IntegerString'
},
'category': {
'required': false,
Expand Down Expand Up @@ -1187,4 +1190,4 @@ usersApi.ackNotification = function(params) {
});
};

module.exports = usersApi;
module.exports = usersApi;
10 changes: 8 additions & 2 deletions api/utils/common.js
Original file line number Diff line number Diff line change
Expand Up @@ -1403,7 +1403,10 @@ common.returnMessage = function(params, returnCode, message, heads, noResult = f
else {
console.error("Output already closed, can't write more");
console.trace();
console.log(params);
// Don't dump the full params object — req.body/req.headers can
// contain credentials, session cookies, or other secrets. Log
// only the pathname (query string can carry api_key/auth_token).
console.log({pathname: params.urlParts && params.urlParts.pathname, apiPath: params.apiPath, qstringKeys: params.qstring && Object.keys(params.qstring)});
}
}
};
Expand Down Expand Up @@ -1485,7 +1488,10 @@ common.returnOutput = function(params, output, noescape, heads) {
else {
console.error("Output already closed, can't write more");
console.trace();
console.log(params);
// Don't dump the full params object — req.body/req.headers can
// contain credentials, session cookies, or other secrets. Log
// only the pathname (query string can carry api_key/auth_token).
console.log({pathname: params.urlParts && params.urlParts.pathname, apiPath: params.apiPath, qstringKeys: params.qstring && Object.keys(params.qstring)});
}
}
};
Expand Down
16 changes: 9 additions & 7 deletions frontend/express/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -479,14 +479,16 @@ Promise.all([plugins.dbConnection(countlyConfig), plugins.dbConnection("countly_
app.use(cookieParser());
//server theme images
app.use(function(req, res, next) {
var urlPath = req.url.replace(countlyConfig.path, "");
var urlPath = req.path.replace(countlyConfig.path, "");
var theme = req.cookies.theme || curTheme;
if (theme && theme.length && (req.url.indexOf(countlyConfig.path + '/images/') === 0 || req.url.indexOf(countlyConfig.path + '/geodata/') === 0)) {
fs.exists(__dirname + '/public/themes/' + theme + urlPath, function(exists) {
if (exists) {
res.sendFile(__dirname + '/public/themes/' + theme + urlPath);
}
else {
if (theme && theme.length && (req.path.indexOf(countlyConfig.path + '/images/') === 0 || req.path.indexOf(countlyConfig.path + '/geodata/') === 0)) {
// Both `theme` (cookie) and `urlPath` (URL) are user-controlled.
// Hand the relative path to res.sendFile with `root` set to
// /public/themes — express normalizes the path and rejects any
// `..` traversal before touching the filesystem. Missing files
// surface via the error callback and fall through to next().
res.sendFile(theme + urlPath, {root: path.resolve(__dirname, 'public/themes')}, function(err) {
if (err) {
next();
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,11 @@
type: String
},

cooldownBadge: {
default: () => ({ show: false }),
type: Object
},

status: {
default: () => ({
label: 'Status',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,18 @@
:tabs="tabs"
/>
<div class="cly-vue-content-builder-header__actions">
<div
v-if="cooldownBadge && cooldownBadge.show"
v-tooltip="cooldownBadge.tooltip"
class="cly-vue-content-builder-header__cooldown-badge"
data-test-id="content-header-cooldown-badge"
>
<cly-status-badge
:label="cooldownBadge.label"
:mode="cooldownBadge.mode"
:show-icon="false"
/>
</div>
<cly-status-badge
v-if="status.show"
class="cly-vue-content-builder-header__badge"
Expand Down
102 changes: 38 additions & 64 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading