mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-12-19 10:47:23 +01:00
Compare commits
1 Commits
mermaid@11
...
sidv/neste
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6359ab504f |
@@ -893,17 +893,6 @@ describe('Sequence diagram', () => {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should handle bidirectional arrows with autonumber', () => {
|
|
||||||
imgSnapshotTest(`
|
|
||||||
sequenceDiagram
|
|
||||||
autonumber
|
|
||||||
participant A
|
|
||||||
participant B
|
|
||||||
A<<->>B: This is a bidirectional message
|
|
||||||
A->B: This is a normal message`);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should support actor links and properties when not mirrored EXPERIMENTAL: USE WITH CAUTION', () => {
|
it('should support actor links and properties when not mirrored EXPERIMENTAL: USE WITH CAUTION', () => {
|
||||||
//Be aware that the syntax for "properties" is likely to be changed.
|
//Be aware that the syntax for "properties" is likely to be changed.
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
> **addDirective**(`directive`): `void`
|
> **addDirective**(`directive`): `void`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/config.ts:188](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.ts#L188)
|
Defined in: [packages/mermaid/src/config.ts:202](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.ts#L202)
|
||||||
|
|
||||||
Pushes in a directive to the configuration
|
Pushes in a directive to the configuration
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
> **reset**(`config`): `void`
|
> **reset**(`config`): `void`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/config.ts:221](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.ts#L221)
|
Defined in: [packages/mermaid/src/config.ts:235](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.ts#L235)
|
||||||
|
|
||||||
## reset
|
## reset
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
# Function: sanitize()
|
# Function: sanitize()
|
||||||
|
|
||||||
> **sanitize**(`options`): `void`
|
> **sanitize**(`options`, `path`): `void`
|
||||||
|
|
||||||
Defined in: [packages/mermaid/src/config.ts:146](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.ts#L146)
|
Defined in: [packages/mermaid/src/config.ts:146](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/config.ts#L146)
|
||||||
|
|
||||||
@@ -31,6 +31,10 @@ options in-place
|
|||||||
|
|
||||||
The potential setConfig parameter
|
The potential setConfig parameter
|
||||||
|
|
||||||
|
### path
|
||||||
|
|
||||||
|
`string`\[] = `[]`
|
||||||
|
|
||||||
## Returns
|
## Returns
|
||||||
|
|
||||||
`void`
|
`void`
|
||||||
|
|||||||
@@ -1,11 +1,5 @@
|
|||||||
# mermaid
|
# mermaid
|
||||||
|
|
||||||
## 11.10.1
|
|
||||||
|
|
||||||
### Patch Changes
|
|
||||||
|
|
||||||
- [#6886](https://github.com/mermaid-js/mermaid/pull/6886) [`e0b45c2`](https://github.com/mermaid-js/mermaid/commit/e0b45c2d2b41c2a9038bf87646fa3ccd7560eb20) Thanks [@darshanr0107](https://github.com/darshanr0107)! - fix: Handle arrows correctly when auto number is enabled
|
|
||||||
|
|
||||||
## 11.10.0
|
## 11.10.0
|
||||||
|
|
||||||
### Minor Changes
|
### Minor Changes
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "mermaid",
|
"name": "mermaid",
|
||||||
"version": "11.10.1",
|
"version": "11.10.0",
|
||||||
"description": "Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.",
|
"description": "Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"module": "./dist/mermaid.core.mjs",
|
"module": "./dist/mermaid.core.mjs",
|
||||||
|
|||||||
@@ -34,6 +34,92 @@ describe('when working with site config', () => {
|
|||||||
expect(cfg.fontSize).toBe(config_0.fontSize);
|
expect(cfg.fontSize).toBe(config_0.fontSize);
|
||||||
expect(cfg.securityLevel).toBe(config_0.securityLevel);
|
expect(cfg.securityLevel).toBe(config_0.securityLevel);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should respect nested secure keys when applying directives', () => {
|
||||||
|
const config_0: MermaidConfig = {
|
||||||
|
fontFamily: 'foo-font',
|
||||||
|
themeVariables: {
|
||||||
|
fontSize: 16,
|
||||||
|
fontFamily: 'default-font',
|
||||||
|
},
|
||||||
|
secure: [
|
||||||
|
...configApi.defaultConfig.secure!,
|
||||||
|
'themeVariables.fontSize',
|
||||||
|
'themeVariables.fontFamily',
|
||||||
|
],
|
||||||
|
};
|
||||||
|
configApi.setSiteConfig(config_0);
|
||||||
|
const directive: MermaidConfig = {
|
||||||
|
fontFamily: 'baf',
|
||||||
|
themeVariables: {
|
||||||
|
fontSize: 24, // shouldn't be changed
|
||||||
|
fontFamily: 'new-font', // shouldn't be changed
|
||||||
|
primaryColor: '#ff0000', // should be allowed
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const cfg: MermaidConfig = configApi.updateCurrentConfig(config_0, [directive]);
|
||||||
|
expect(cfg.fontFamily).toEqual(directive.fontFamily);
|
||||||
|
expect(cfg.themeVariables!.fontSize).toBe(config_0.themeVariables!.fontSize);
|
||||||
|
expect(cfg.themeVariables!.fontFamily).toBe(config_0.themeVariables!.fontFamily);
|
||||||
|
expect(cfg.themeVariables!.primaryColor).toBe(directive.themeVariables!.primaryColor);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle deeply nested secure keys', () => {
|
||||||
|
const config_0: MermaidConfig = {
|
||||||
|
flowchart: {
|
||||||
|
nodeSpacing: 50,
|
||||||
|
rankSpacing: 50,
|
||||||
|
curve: 'basis',
|
||||||
|
htmlLabels: true,
|
||||||
|
useMaxWidth: true,
|
||||||
|
diagramPadding: 8,
|
||||||
|
},
|
||||||
|
secure: [
|
||||||
|
...configApi.defaultConfig.secure!,
|
||||||
|
'flowchart.nodeSpacing',
|
||||||
|
'flowchart.rankSpacing',
|
||||||
|
],
|
||||||
|
};
|
||||||
|
configApi.setSiteConfig(config_0);
|
||||||
|
const directive: MermaidConfig = {
|
||||||
|
flowchart: {
|
||||||
|
nodeSpacing: 100, // shouldn't be changed
|
||||||
|
rankSpacing: 100, // shouldn't be changed
|
||||||
|
curve: 'linear', // should be allowed
|
||||||
|
htmlLabels: false, // should be allowed
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const cfg: MermaidConfig = configApi.updateCurrentConfig(config_0, [directive]);
|
||||||
|
expect(cfg.flowchart!.nodeSpacing).toBe(config_0.flowchart!.nodeSpacing);
|
||||||
|
expect(cfg.flowchart!.rankSpacing).toBe(config_0.flowchart!.rankSpacing);
|
||||||
|
expect(cfg.flowchart!.curve).toBe(directive.flowchart!.curve);
|
||||||
|
expect(cfg.flowchart!.htmlLabels).toBe(directive.flowchart!.htmlLabels);
|
||||||
|
expect(cfg.flowchart!.diagramPadding).toBe(config_0.flowchart!.diagramPadding);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle mixed top-level and nested secure keys', () => {
|
||||||
|
const config_0: MermaidConfig = {
|
||||||
|
fontFamily: 'foo-font',
|
||||||
|
themeVariables: {
|
||||||
|
fontSize: 16,
|
||||||
|
primaryColor: '#000000',
|
||||||
|
},
|
||||||
|
secure: [...configApi.defaultConfig.secure!, 'fontFamily', 'themeVariables.fontSize'],
|
||||||
|
};
|
||||||
|
configApi.setSiteConfig(config_0);
|
||||||
|
const directive: MermaidConfig = {
|
||||||
|
fontFamily: 'new-font', // shouldn't be changed
|
||||||
|
themeVariables: {
|
||||||
|
fontSize: 24, // shouldn't be changed
|
||||||
|
primaryColor: '#ff0000', // should be allowed
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const cfg: MermaidConfig = configApi.updateCurrentConfig(config_0, [directive]);
|
||||||
|
expect(cfg.fontFamily).toBe(config_0.fontFamily);
|
||||||
|
expect(cfg.themeVariables!.fontSize).toBe(config_0.themeVariables!.fontSize);
|
||||||
|
expect(cfg.themeVariables!.primaryColor).toBe(directive.themeVariables!.primaryColor);
|
||||||
|
});
|
||||||
|
|
||||||
it('should allow setting partial options', () => {
|
it('should allow setting partial options', () => {
|
||||||
const defaultConfig = configApi.getConfig();
|
const defaultConfig = configApi.getConfig();
|
||||||
|
|
||||||
|
|||||||
@@ -143,17 +143,29 @@ export const getConfig = (): MermaidConfig => {
|
|||||||
*
|
*
|
||||||
* @param options - The potential setConfig parameter
|
* @param options - The potential setConfig parameter
|
||||||
*/
|
*/
|
||||||
export const sanitize = (options: any) => {
|
export const sanitize = (options: any, path: string[] = []) => {
|
||||||
if (!options) {
|
if (!options) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Checking that options are not in the list of excluded options
|
// Checking that options are not in the list of excluded options
|
||||||
['secure', ...(siteConfig.secure ?? [])].forEach((key) => {
|
['secure', ...(siteConfig.secure ?? [])].forEach((secureKey) => {
|
||||||
if (Object.hasOwn(options, key)) {
|
const securePath = secureKey.split('.');
|
||||||
// DO NOT attempt to print options[key] within `${}` as a malicious script
|
|
||||||
// can exploit the logger's attempt to stringify the value and execute arbitrary code
|
// Check if current path matches the secure key path
|
||||||
log.debug(`Denied attempt to modify a secure key ${key}`, options[key]);
|
if (path.length >= securePath.length - 1) {
|
||||||
delete options[key];
|
const targetKey = securePath[securePath.length - 1];
|
||||||
|
const pathSuffix = path.slice(-(securePath.length - 1));
|
||||||
|
const pathPrefix = securePath.slice(0, -1);
|
||||||
|
|
||||||
|
const isMatch =
|
||||||
|
securePath.length === 1 ? path.length === 0 : pathSuffix.join('.') === pathPrefix.join('.');
|
||||||
|
|
||||||
|
if (isMatch && Object.hasOwn(options, targetKey)) {
|
||||||
|
const fullPath = path.length > 0 ? `${path.join('.')}.${secureKey}` : secureKey;
|
||||||
|
log.debug(`Denied attempt to modify a secure key ${fullPath}`, options[targetKey]);
|
||||||
|
delete options[targetKey];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -163,6 +175,7 @@ export const sanitize = (options: any) => {
|
|||||||
delete options[key];
|
delete options[key];
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Check that there no attempts of xss, there should be no tags at all in the directive
|
// Check that there no attempts of xss, there should be no tags at all in the directive
|
||||||
// blocking data urls as base64 urls can contain svg's with inline script tags
|
// blocking data urls as base64 urls can contain svg's with inline script tags
|
||||||
Object.keys(options).forEach((key) => {
|
Object.keys(options).forEach((key) => {
|
||||||
@@ -174,8 +187,9 @@ export const sanitize = (options: any) => {
|
|||||||
) {
|
) {
|
||||||
delete options[key];
|
delete options[key];
|
||||||
}
|
}
|
||||||
if (typeof options[key] === 'object') {
|
if (typeof options[key] === 'object' && options[key] !== null) {
|
||||||
sanitize(options[key]);
|
// Recursively sanitize nested objects with updated path
|
||||||
|
sanitize(options[key], [...path, key]);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -476,29 +476,7 @@ const drawMessage = async function (diagram, msgModel, lineStartY: number, diagO
|
|||||||
|
|
||||||
// add node number
|
// add node number
|
||||||
if (sequenceVisible || conf.showSequenceNumbers) {
|
if (sequenceVisible || conf.showSequenceNumbers) {
|
||||||
const isBidirectional =
|
line.attr('marker-start', 'url(' + url + '#sequencenumber)');
|
||||||
type === diagObj.db.LINETYPE.BIDIRECTIONAL_SOLID ||
|
|
||||||
type === diagObj.db.LINETYPE.BIDIRECTIONAL_DOTTED;
|
|
||||||
|
|
||||||
if (isBidirectional) {
|
|
||||||
const SEQUENCE_NUMBER_RADIUS = 6;
|
|
||||||
|
|
||||||
if (startx < stopx) {
|
|
||||||
line.attr('x1', startx + 2 * SEQUENCE_NUMBER_RADIUS);
|
|
||||||
} else {
|
|
||||||
line.attr('x1', startx + SEQUENCE_NUMBER_RADIUS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
diagram
|
|
||||||
.append('line')
|
|
||||||
.attr('x1', startx)
|
|
||||||
.attr('y1', lineStartY)
|
|
||||||
.attr('x2', startx)
|
|
||||||
.attr('y2', lineStartY)
|
|
||||||
.attr('stroke-width', 0)
|
|
||||||
.attr('marker-start', 'url(' + url + '#sequencenumber)');
|
|
||||||
|
|
||||||
diagram
|
diagram
|
||||||
.append('text')
|
.append('text')
|
||||||
.attr('x', startx)
|
.attr('x', startx)
|
||||||
|
|||||||
@@ -1,11 +1,5 @@
|
|||||||
# mermaid
|
# mermaid
|
||||||
|
|
||||||
## 11.10.1
|
|
||||||
|
|
||||||
### Patch Changes
|
|
||||||
|
|
||||||
- [#6886](https://github.com/mermaid-js/mermaid/pull/6886) [`e0b45c2`](https://github.com/mermaid-js/mermaid/commit/e0b45c2d2b41c2a9038bf87646fa3ccd7560eb20) Thanks [@darshanr0107](https://github.com/darshanr0107)! - fix: Handle arrows correctly when auto number is enabled
|
|
||||||
|
|
||||||
## 11.10.0
|
## 11.10.0
|
||||||
|
|
||||||
### Minor Changes
|
### Minor Changes
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@mermaid-js/tiny",
|
"name": "@mermaid-js/tiny",
|
||||||
"version": "11.10.1",
|
"version": "11.10.0",
|
||||||
"description": "Tiny version of mermaid",
|
"description": "Tiny version of mermaid",
|
||||||
"type": "commonjs",
|
"type": "commonjs",
|
||||||
"main": "./dist/mermaid.tiny.js",
|
"main": "./dist/mermaid.tiny.js",
|
||||||
|
|||||||
Reference in New Issue
Block a user