feat(ui): add safeguard against accidentally loading non-library workflow as library workflow

This commit is contained in:
psychedelicious
2025-04-04 08:21:03 +11:00
parent 8b3c36c6fa
commit a175a5c252
5 changed files with 15 additions and 5 deletions

View File

@@ -29,7 +29,7 @@ export const useLoadWorkflowFromFile = () => {
const { onSuccess, onError, onCompleted } = options;
try {
const unvalidatedWorkflow = JSON.parse(rawJSON as string);
const validatedWorkflow = await validatedAndLoadWorkflow(unvalidatedWorkflow);
const validatedWorkflow = await validatedAndLoadWorkflow(unvalidatedWorkflow, 'file');
if (!validatedWorkflow) {
reader.abort();

View File

@@ -41,7 +41,7 @@ export const useLoadWorkflowFromImage = () => {
assert(unvalidatedWorkflow !== null, 'No workflow or graph provided');
const validatedWorkflow = await validateAndLoadWorkflow(unvalidatedWorkflow);
const validatedWorkflow = await validateAndLoadWorkflow(unvalidatedWorkflow, 'image');
if (!validatedWorkflow) {
onError?.();

View File

@@ -30,7 +30,7 @@ export const useLoadWorkflowFromLibrary = () => {
try {
const res = await getWorkflow(workflowId).unwrap();
const validatedWorkflow = await validateAndLoadWorkflow(res.workflow);
const validatedWorkflow = await validateAndLoadWorkflow(res.workflow, 'library');
if (!validatedWorkflow) {
onError?.();

View File

@@ -21,7 +21,7 @@ export const useLoadWorkflowFromObject = () => {
) => {
const { onSuccess, onError, onCompleted } = options;
try {
const validatedWorkflow = await validateAndLoadWorkflow(unvalidatedWorkflow);
const validatedWorkflow = await validateAndLoadWorkflow(unvalidatedWorkflow, 'object');
if (!validatedWorkflow) {
onError?.();

View File

@@ -43,7 +43,10 @@ export const useValidateAndLoadWorkflow = () => {
*
* This function catches all errors. It toasts and logs on success and error.
*/
async (unvalidatedWorkflow: unknown): Promise<WorkflowV3 | null> => {
async (
unvalidatedWorkflow: unknown,
origin: 'file' | 'image' | 'object' | 'library'
): Promise<WorkflowV3 | null> => {
try {
const templates = $templates.get();
const { workflow, warnings } = await validateWorkflow({
@@ -54,6 +57,13 @@ export const useValidateAndLoadWorkflow = () => {
checkModelAccess,
});
if (origin !== 'library') {
// Workflow IDs should always map directly to the workflow in the library. If the workflow is loaded from
// some other source, and has an ID, we should remove it to ensure the app does not treat it as a library workflow.
// For example, when saving a workflow, we might accidentally attempt to save instead of save-as.
delete workflow.id;
}
$nodeExecutionStates.set({});
dispatch(workflowLoaded(workflow));
if (!warnings.length) {