dev: URLs to files in public directories

Already existing was the functionality to go to puter.local/@username to
access the Public folder belonging to "username". This commit adds the
ability for relative paths such as puter.local/@username/document.md to
access /username/Public/document.md in the suggested app for handling
".md" files.
This commit is contained in:
KernelDeimos
2025-04-28 17:40:02 -04:00
parent 3856ddcc8f
commit 29dbf3a517
+89 -15
View File
@@ -1374,23 +1374,97 @@ async function UIDesktop(options) {
//--------------------------------------------------------------------------------------
const url_paths = window.location.pathname.split('/').filter(element => element);
if (url_paths[0]?.startsWith('@')) {
let username = url_paths[0].substring(1);
const username = url_paths[0].substring(1);
let item_path = '/' + username + '/Public';
// check if username has valid characters
if (!username.match(/^[a-z0-9_]+$/i)) {
UIAlert({
message: 'Invalid username.'
});
} else {
UIWindow({
path: item_path,
title: path.basename(item_path),
icon: await item_icon({ is_dir: true, path: item_path }),
is_dir: true,
app: 'explorer',
});
if ( url_paths.length > 1 ) {
item_path += '/' + url_paths.slice(1).join('/');
}
// GUARD: avoid invalid user directories
{
if (!username.match(/^[a-z0-9_]+$/i)) {
UIAlert({
message: 'Invalid username.'
});
return;
}
}
const stat = await puter.fs.stat(item_path);
console.log('stat result', stat);
// TODO: DRY everything here with open_item. Unfortunately we can't
// use open_item here because it's coupled with UI logic;
// it requires a UIItem element and cannot operate on a
// file path on its own.
if ( ! stat.is_dir ) {
if ( stat.associated_app ) {
launch_app({ name: stat.associated_app.name });
return;
}
const ext_pref =
window.user_preferences[`default_apps${path.extname(item_path).toLowerCase()}`];
if ( ext_pref ) {
launch_app({
name: ext_pref,
file_path: item_path,
});
return;
}
const open_item_meta = await $.ajax({
url: window.api_origin + "/open_item",
type: 'POST',
contentType: "application/json",
data: JSON.stringify({
path: item_path,
}),
headers: {
"Authorization": "Bearer "+window.auth_token
},
statusCode: {
401: function () {
window.logout();
},
},
});
const suggested_apps = open_item_meta?.suggested_apps ?? await window.suggest_apps_for_fsentry({
path: item_path
});
// Note: I'm not adding unzipping logic here. We'll wait until
// we've refactored open_item so that Puter can have a
// properly-reusable open function.
if ( suggested_apps.length !== 0 ) {
launch_app({
name: suggested_apps[0].name,
token: open_item_meta.token,
file_path: item_path,
app_obj: suggested_apps[0],
window_title: path.basename(item_path),
maximized: options.maximized,
file_signature: open_item_meta.signature,
});
return;
}
await UIAlert({
message: 'Cannot find an app to open this file; ' +
'opening directory instead.'
});
item_path = item_path.split('/').slice(0, -1).join('/')
}
UIWindow({
path: item_path,
title: path.basename(item_path),
icon: await item_icon({ is_dir: true, path: item_path }),
is_dir: true,
app: 'explorer',
});
}
}