Skip to content

Commit

Permalink
Merge pull request #2625 from alicevision/fix/validateSavePermissions
Browse files Browse the repository at this point in the history
[ui] Add Validation for Save file path accessibility
  • Loading branch information
cbentejac authored Dec 23, 2024
2 parents e8d177e + 21b5080 commit faff99f
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 9 deletions.
7 changes: 7 additions & 0 deletions meshroom/ui/components/filepath.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,13 @@ def removeExtension(self, path):
""" Returns the pathname without its extension (.ext)"""
return os.path.splitext(self.asStr(path))[0]

@Slot(str, result=bool)
@Slot(QUrl, result=bool)
def accessible(self, path):
""" Returns whether a path is accessible for the user """
path = self.asStr(path)
return os.path.isdir(self.asStr(path)) and os.access(path, os.R_OK) and os.access(path, os.W_OK)

@Slot(str, result=bool)
@Slot(QUrl, result=bool)
def isFile(self, path):
Expand Down
52 changes: 43 additions & 9 deletions meshroom/ui/qml/Application.qml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,24 @@ Page {
}
}

Component {
id: permissionsDialog

MessageDialog {
title: "Permission Denied"

required property string filepath

preset: "Warning"
text: "The location does not exist or you do not have necessary permissions to save to the provided filepath."
detailedText: "Filepath: " + filepath
helperText: "Please check the location or permissions and try again or choose a different location."

standardButtons: Dialog.Ok
onClosed: destroy()
}
}

function validateFilepathForSave(filepath: string, sourceSaveDialog: Dialog): bool {
/**
* Return true if `filepath` is valid for saving a file to disk.
Expand All @@ -70,19 +88,35 @@ Page {
*/
const emptyFilename = Filepath.basename(filepath).trim() === ".mg";

// Provided filename is valid
if (!emptyFilename) {
return true
// Provided filename is not valid
if (emptyFilename) {
// Instantiate the Warning Dialog with the provided filepath
const warningDialog = invalidFilepathDialog.createObject(root, {"filepath": Filepath.urlToString(filepath)});

// And open the dialog
warningDialog.closed.connect(sourceSaveDialog.open);
warningDialog.open();

return false;
}

// Instantiate the Warning Dialog with the provided filepath
const warningDialog = invalidFilepathDialog.createObject(root, {"filepath": Filepath.urlToString(filepath)});
// Check if the user has access to the directory where the file is to be saved
const hasPermission = Filepath.accessible(Filepath.dirname(filepath));

// Either the directory does not exist or is inaccessible for the user
if (!hasPermission) {
// Intantiate the permissions dialog with the provided filepath
const warningDialog = permissionsDialog.createObject(root, {"filepath": Filepath.urlToString(filepath)});

// And open the dialog
warningDialog.closed.connect(sourceSaveDialog.open);
warningDialog.open();
// Connect and show the dialog
warningDialog.closed.connect(sourceSaveDialog.open);
warningDialog.open();

return false;
}

return false
// Everything is valid
return true;
}

// File dialogs
Expand Down

0 comments on commit faff99f

Please sign in to comment.