mirror of
https://github.com/router-for-me/Cli-Proxy-API-Management-Center.git
synced 2026-08-31 02:05:31 +08:00
fix(auth-files): validate aliases case-insensitively
This commit is contained in:
@@ -28,6 +28,7 @@ import type {
|
||||
DiagramLine,
|
||||
SourceNode,
|
||||
} from './ModelMappingDiagramTypes';
|
||||
import { hasModelAliasConflict } from './aliasValidation';
|
||||
import styles from './ModelMappingDiagram.module.scss';
|
||||
|
||||
export interface ModelMappingDiagramProps {
|
||||
@@ -489,7 +490,12 @@ export const ModelMappingDiagram = forwardRef<ModelMappingDiagramRef, ModelMappi
|
||||
setAddAliasError(t('oauth_model_alias.diagram_please_enter_alias'));
|
||||
return;
|
||||
}
|
||||
if (aliasNodes.some((a) => a.alias === trimmed)) {
|
||||
if (
|
||||
hasModelAliasConflict(
|
||||
aliasNodes.map((alias) => alias.alias),
|
||||
trimmed
|
||||
)
|
||||
) {
|
||||
setAddAliasError(t('oauth_model_alias.diagram_alias_exists'));
|
||||
return;
|
||||
}
|
||||
@@ -514,7 +520,13 @@ export const ModelMappingDiagram = forwardRef<ModelMappingDiagramRef, ModelMappi
|
||||
setRenameState(null);
|
||||
return;
|
||||
}
|
||||
if (aliasNodes.some((a) => a.alias === trimmed)) {
|
||||
if (
|
||||
hasModelAliasConflict(
|
||||
aliasNodes.map((alias) => alias.alias),
|
||||
trimmed,
|
||||
renameState?.oldAlias
|
||||
)
|
||||
) {
|
||||
setRenameError(t('oauth_model_alias.diagram_alias_exists'));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
const normalizeModelAliasKey = (value: string): string => value.trim().toLowerCase();
|
||||
|
||||
export function hasModelAliasConflict(
|
||||
aliases: string[],
|
||||
candidate: string,
|
||||
excludedAlias?: string
|
||||
): boolean {
|
||||
const candidateKey = normalizeModelAliasKey(candidate);
|
||||
if (!candidateKey) return false;
|
||||
|
||||
let excluded = false;
|
||||
return aliases.some((alias) => {
|
||||
if (!excluded && excludedAlias !== undefined && alias === excludedAlias) {
|
||||
excluded = true;
|
||||
return false;
|
||||
}
|
||||
return normalizeModelAliasKey(alias) === candidateKey;
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
import { describe, expect, test } from 'bun:test';
|
||||
import { hasModelAliasConflict } from '../src/components/modelAlias/aliasValidation';
|
||||
|
||||
describe('model alias validation', () => {
|
||||
test('checks aliases case-insensitively while excluding the renamed node', () => {
|
||||
expect(hasModelAliasConflict(['Foo'], ' foo ')).toBe(true);
|
||||
expect(hasModelAliasConflict(['Foo'], 'foo', 'Foo')).toBe(false);
|
||||
expect(hasModelAliasConflict(['Foo', 'Bar'], 'FOO', 'Bar')).toBe(true);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user