Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 10 additions & 5 deletions lib/solidpod.dart
Original file line number Diff line number Diff line change
Expand Up @@ -107,21 +107,26 @@ export 'src/solid/utils/misc.dart'
deleteExternalFile,
deleteFile,
deleteLogIn,
filenameToResourceUrl,
getWebId,
getDataDirPath,
getAppNameVersion,
getFileUrl,
getDirUrl,
getTokensForResource,
getDateTime,
getEncKeyPath,
logoutPod,
setAppDirName,
generateDefaultFolders,
generateDefaultFiles,
initPod;

/// Utility functions for generating resource URLs

export 'src/solid/utils/get_url_helper.dart'
show filenameToResourceUrl, getFileUrl, getDirUrl;

/// Utility functions for generating resources at POD initialisation

export 'src/solid/utils/init_pod_gen_resources.dart'
show generateDefaultFolders, generateCustomFolders, generateDefaultFiles;

/// Change security key popup widget

export 'src/widgets/change_key_dialog.dart';
Expand Down
1 change: 1 addition & 0 deletions lib/src/solid/api/grant_permission_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import 'package:solidpod/src/solid/api/rest_api.dart';
import 'package:solidpod/src/solid/constants/common.dart';
import 'package:solidpod/src/solid/constants/schema.dart';
import 'package:solidpod/src/solid/constants/web_acl.dart';
import 'package:solidpod/src/solid/utils/get_url_helper.dart';
import 'package:solidpod/src/solid/utils/misc.dart';
import 'package:solidpod/src/solid/utils/permission.dart';

Expand Down
1 change: 1 addition & 0 deletions lib/src/solid/api/rest_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ import 'package:rdflib/rdflib.dart';
import 'package:solidpod/src/solid/constants/common.dart';
import 'package:solidpod/src/solid/utils/authdata_manager.dart';
import 'package:solidpod/src/solid/utils/exceptions.dart';
import 'package:solidpod/src/solid/utils/get_url_helper.dart';
import 'package:solidpod/src/solid/utils/key_manager.dart';
import 'package:solidpod/src/solid/utils/misc.dart';

Expand Down
1 change: 1 addition & 0 deletions lib/src/solid/api/revoke_permission_api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import 'package:solidpod/src/solid/api/rest_api.dart';
import 'package:solidpod/src/solid/constants/common.dart';
import 'package:solidpod/src/solid/constants/schema.dart';
import 'package:solidpod/src/solid/constants/web_acl.dart';
import 'package:solidpod/src/solid/utils/get_url_helper.dart';
import 'package:solidpod/src/solid/utils/misc.dart';
import 'package:solidpod/src/solid/utils/permission.dart';

Expand Down
1 change: 1 addition & 0 deletions lib/src/solid/chk_exists_and_has_acl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import 'package:solidpod/src/solid/api/common_permission.dart';
import 'package:solidpod/src/solid/api/rest_api.dart';
import 'package:solidpod/src/solid/constants/common.dart';
import 'package:solidpod/src/solid/solid_func_call_status.dart';
import 'package:solidpod/src/solid/utils/get_url_helper.dart';
import 'package:solidpod/src/solid/utils/misc.dart';

/// Check [fileName] exists and has the associated ACL file. Requires user
Expand Down
2 changes: 2 additions & 0 deletions lib/src/solid/common_func.dart
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ import 'package:solidpod/src/solid/constants/common.dart';
import 'package:solidpod/src/solid/constants/schema.dart' show appsTerms;
import 'package:solidpod/src/solid/utils/alert.dart';
import 'package:solidpod/src/solid/utils/exceptions.dart';
import 'package:solidpod/src/solid/utils/get_url_helper.dart';
import 'package:solidpod/src/solid/utils/init_pod_gen_resources.dart';
import 'package:solidpod/src/solid/utils/misc.dart';
import 'package:solidpod/src/solid/utils/rdf.dart' show parseTTLMap;

Expand Down
1 change: 1 addition & 0 deletions lib/src/solid/get_resources.dart
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import 'package:flutter/material.dart' hide Key;
import 'package:solidpod/src/solid/api/rest_api.dart';
import 'package:solidpod/src/solid/constants/common.dart';
import 'package:solidpod/src/solid/utils/exceptions.dart';
import 'package:solidpod/src/solid/utils/get_url_helper.dart';
import 'package:solidpod/src/solid/utils/misc.dart';

/// Get the list of files created by the user in their POD by querying the data directory of the POD.
Expand Down
1 change: 1 addition & 0 deletions lib/src/solid/grant_permission.dart
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import 'package:solidpod/src/solid/constants/web_acl.dart';
import 'package:solidpod/src/solid/models/log_entry.dart';
import 'package:solidpod/src/solid/solid_func_call_status.dart';
import 'package:solidpod/src/solid/utils/exceptions.dart';
import 'package:solidpod/src/solid/utils/get_url_helper.dart';
import 'package:solidpod/src/solid/utils/key_helper.dart' show RecipientPubKey;
import 'package:solidpod/src/solid/utils/key_manager.dart' show KeyManager;
import 'package:solidpod/src/solid/utils/misc.dart';
Expand Down
1 change: 1 addition & 0 deletions lib/src/solid/read_permission.dart
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ library;

import 'dart:core';

import 'package:solidpod/src/solid/utils/get_url_helper.dart';
import 'package:solidpod/src/solid/utils/misc.dart';
import 'package:solidpod/src/solid/utils/permission.dart';

Expand Down
1 change: 1 addition & 0 deletions lib/src/solid/read_pod.dart
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import 'package:encrypter_plus/encrypter_plus.dart';
import 'package:solidpod/src/solid/api/rest_api.dart';
import 'package:solidpod/src/solid/constants/common.dart';
import 'package:solidpod/src/solid/constants/path_type.dart';
import 'package:solidpod/src/solid/utils/data_encryption.dart';
import 'package:solidpod/src/solid/utils/exceptions.dart';
import 'package:solidpod/src/solid/utils/key_helper.dart';
import 'package:solidpod/src/solid/utils/key_inheritance.dart';
Expand Down
1 change: 1 addition & 0 deletions lib/src/solid/revoke_permission.dart
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import 'package:solidpod/src/solid/constants/common.dart';
import 'package:solidpod/src/solid/constants/web_acl.dart';
import 'package:solidpod/src/solid/models/log_entry.dart';
import 'package:solidpod/src/solid/solid_func_call_status.dart';
import 'package:solidpod/src/solid/utils/get_url_helper.dart';
import 'package:solidpod/src/solid/utils/misc.dart';
import 'package:solidpod/src/solid/utils/permission.dart';

Expand Down
1 change: 1 addition & 0 deletions lib/src/solid/revoke_permission_to_deleted_file.dart
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import 'package:solidpod/src/solid/api/rest_api.dart';
import 'package:solidpod/src/solid/api/revoke_permission_api.dart';
import 'package:solidpod/src/solid/models/log_entry.dart';
import 'package:solidpod/src/solid/solid_func_call_status.dart';
import 'package:solidpod/src/solid/utils/get_url_helper.dart';
import 'package:solidpod/src/solid/utils/misc.dart';

/// Revoke permissions to non-existent [fileName] (ie already deleted)
Expand Down
1 change: 1 addition & 0 deletions lib/src/solid/shared_resources.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import 'package:solidpod/src/solid/api/common_permission.dart';
import 'package:solidpod/src/solid/api/rest_api.dart';
import 'package:solidpod/src/solid/utils/authdata_manager.dart';
import 'package:solidpod/src/solid/utils/exceptions.dart';
import 'package:solidpod/src/solid/utils/get_url_helper.dart';
import 'package:solidpod/src/solid/utils/misc.dart';
import 'package:solidpod/src/solid/utils/rdf.dart';

Expand Down
45 changes: 45 additions & 0 deletions lib/src/solid/utils/data_encryption.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/// Data encryption utility functions used across the package.
///
///
/// Copyright (C) 2026, Software Innovation Institute, ANU.
///
/// Licensed under the MIT License (the "License").
///
/// License: https://choosealicense.com/licenses/mit/.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
///
/// Authors: Anushka Vidanage

library;

import 'package:encrypter_plus/encrypter_plus.dart';

/// Encrypt data using AES with the specified key
String encryptData(String data, Key key, IV iv, {AESMode mode = AESMode.sic}) =>
Encrypter(AES(key, mode: mode)).encrypt(data, iv: iv).base64;

/// Decrypt a ciphertext value
String decryptData(
String encData,
Key key,
IV iv, {
AESMode mode = AESMode.sic,
}) =>
Encrypter(AES(key, mode: mode)).decrypt(Encrypted.from64(encData), iv: iv);
149 changes: 149 additions & 0 deletions lib/src/solid/utils/get_url_helper.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
/// Get URLs related utility functions used across the package.
///
///
/// Copyright (C) 2026, Software Innovation Institute, ANU.
///
/// Licensed under the MIT License (the "License").
///
/// License: https://choosealicense.com/licenses/mit/.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
///
/// Authors: Anushka Vidanage, Dawei Chen

library;

import 'dart:convert';

import 'package:crypto/crypto.dart';

import 'package:solidpod/src/solid/constants/common.dart';
import 'package:solidpod/src/solid/utils/authdata_manager.dart';
import 'package:solidpod/src/solid/utils/misc.dart';

/// Generate unique ID for the resource URL
/// In order for the ID to be unique across all webIDs and no one can
/// reverse engineer the resource being shared we also use receiver webId
/// in the ID generation process
String getUniqueIdResUrl(String resourceUrl, String receiverWebId) {
return sha256.convert(utf8.encode(resourceUrl + receiverWebId)).toString();
}

/// From a given resource path [resourcePath] create its URL
/// [resourcePath] should be relative to the POD, e.g., `myapp/data/abc.ttl`.
/// [isFile] should be true if the resource is a file, otherwise false if it
/// is a directory.
/// [webId] (optionally) specifies the resource's POD (could be external).
/// returns the full resource URL

Future<String> _getResourceUrl(
String resourcePath, {
required bool isFile,
String? webId,
}) async {
final wId = webId ?? await AuthDataManager.getWebId();

assert(wId != null);
assert(wId!.contains(profCard));

final resourceUrl = wId!.replaceAll(profCard, resourcePath);

if (!isFile && !resourceUrl.endsWith('/')) {
return '$resourceUrl/';
}

return resourceUrl;
}

/// Create the URL for a file
Future<String> getFileUrl(String filePath, {String? webId}) async =>
await _getResourceUrl(filePath, isFile: true, webId: webId);

/// Create the URL for a directory (container)
Future<String> getDirUrl(String dirPath, {String? webId}) async =>
await _getResourceUrl(dirPath, isFile: false, webId: webId);

/// Get resource Url from a filename, with different options for how
/// the filename is provided. If [isExternalRes] or [isFileUrl] is
/// set to true, the filename is already the resource url and is
/// returned unchanged.
///
/// Parameters:
/// - [fileName] - name of file of interest.
/// - [isFile] - flag describing whether the resources is a file or not.
/// If false the [fileName] is a directory. (Default: true).
/// - [isFilePath] - flag describing whether [fileName] includes the
/// directory data path. (Default: false).
/// - [isFileUrl] - flag describing whether [fileName] is the url of the
/// file. (Default: false).
/// - [isExternalRes] - flag describing whether the file is an external
/// file shared with the user. In which case the [fileName] should be
/// the full URL of the file. (Default: false).

Future<String> filenameToResourceUrl({
required String fileName,
bool isFile = true,
bool isFileUrl = false,
bool isExternalRes = false,
}) async {
final String resourceUrl;
final String filePath;

// Note: external resources always specified by url
if (isExternalRes) {
isFileUrl = true;
}

// If not already a url, get url
if (!isExternalRes && !isFileUrl) {
// Get the file path
// Ensure path uses correct path separators and
// has app data dir prepended.
filePath = await normalizeFilePath(fileName, null);

// Get the url of the resource by prepending the
// user = owner webID (excluding profCard)
if (isFile) {
resourceUrl = await getFileUrl(filePath);
} else {
resourceUrl = await getDirUrl(filePath);
}
} else {
// Use fileName, fileName already the resource url
resourceUrl = fileName;
}

return resourceUrl;
}

/// Derive external POD inherited parent directory url from the resource url
/// and parent directory path
String getExtDirUrl(String resourceUrl, String dirPath) {
int pathIndex = resourceUrl.indexOf(dirPath);

String dirUrl = '';
if (pathIndex != -1) {
dirUrl = resourceUrl.substring(0, pathIndex + dirPath.length);
if (!dirUrl.endsWith('/')) {
dirUrl += '/';
}
}

return dirUrl;
}
Loading
Loading