Skip to content

Commit b1dc488

Browse files
committed
feat!: upgrade to lib5 1.0.0-pre.1 and bump all deps incl. rust bridge
1 parent 6b2b4ac commit b1dc488

34 files changed

+1662
-1654
lines changed

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM dart:latest AS builder
1+
FROM dart:stable AS builder
22

33
# Get dependencies
44
RUN \

bin/ffi.io.dart

Lines changed: 0 additions & 12 deletions
This file was deleted.

bin/s5_server.dart

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
1-
import 'dart:async';
21
import 'dart:io';
32

43
import 'package:lib5/util.dart';
54
import 'package:s5_server/crypto/implementation.dart';
5+
import 'package:s5_server/rust/frb_generated.dart';
66
import 'package:tint/tint.dart';
77
import 'package:toml/toml.dart';
88

99
import 'package:s5_server/constants.dart';
1010
import 'package:s5_server/node.dart';
1111
import 'package:s5_server/logger/console.dart';
1212

13-
import 'ffi.io.dart';
14-
1513
void main(List<String> arguments) async {
1614
final isDocker = Platform.environment['DOCKER'] == 'TRUE';
1715

@@ -26,16 +24,12 @@ void main(List<String> arguments) async {
2624
exit(1);
2725
}
2826

29-
final rust = initializeExternalLibrary(
30-
isDocker
31-
? '/app/librust.so'
32-
: (Platform.isWindows ? './rust.dll' : './librust.so'),
33-
);
34-
final crypto = RustCryptoImplementation(rust);
27+
await RustLib.init();
28+
final crypto = RustCryptoImplementation();
3529

3630
final file = File(arguments[0]);
3731
if (!file.existsSync()) {
38-
final seed = crypto.generateRandomBytes(32);
32+
final seed = crypto.generateSecureRandomBytes(32);
3933
file.createSync(recursive: true);
4034
file.writeAsStringSync(
4135
(isDocker ? defaultConfigDocker : defaultConfig).replaceFirst(
@@ -58,16 +52,9 @@ void main(List<String> arguments) async {
5852
final node = S5Node(
5953
config: config,
6054
logger: logger,
61-
rust: rust,
6255
crypto: crypto,
6356
);
64-
65-
runZonedGuarded(
66-
node.start,
67-
(e, st) {
68-
logger.catched(e, st);
69-
},
70-
);
57+
return node.start();
7158
}
7259

7360
const defaultConfig =

flutter_rust_bridge.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
rust_root: rust/
2+
rust_input: crate::api
3+
dart_output: lib/rust
4+
c_output: frb_generated.h
5+
dump_all: true
6+
local: true

lib/accounts/account.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class Account {
1212
required this.isRestricted,
1313
required this.tier,
1414
});
15-
toJson() => {
15+
Map toJson() => {
1616
'id': id,
1717
'createdAt': createdAt,
1818
'email': email,

lib/constants.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
// ! S5 node version
2-
const nodeVersion = '0.14.1';
2+
const nodeVersion = '1.0.0-pre.1';
33

44
// ! default chunk size for hashes
55
const defaultChunkSize = 256 * 1024;
66
const defaultChunkSizeAsPowerOf2 = 18;
77

88
// const magicByteStoredFile = 0x8d;
99

10+
@Deprecated('use directory identifiers with ed25519 key type instead')
11+
const cidTypeResolver = 0x25;

lib/crypto/implementation.dart

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,16 @@ import 'package:cryptography/cryptography.dart';
55
import 'package:lib5/lib5.dart';
66
import 'package:lib5/util.dart';
77

8-
import 'package:s5_server/rust/bridge_definitions.dart';
8+
import 'package:s5_server/rust/api.dart' as rust;
99

1010
class RustCryptoImplementation extends CryptoImplementation {
11-
final Rust rust;
12-
13-
RustCryptoImplementation(this.rust);
11+
RustCryptoImplementation();
1412

1513
final ed25519 = Ed25519();
1614
final _defaultSecureRandom = Random.secure();
1715

1816
@override
19-
Uint8List generateRandomBytes(int length) {
17+
Uint8List generateSecureRandomBytes(int length) {
2018
final bytes = Uint8List(length);
2119

2220
for (var i = 0; i < bytes.length; i++) {
@@ -45,14 +43,14 @@ class RustCryptoImplementation extends CryptoImplementation {
4543

4644
@override
4745
Future<Uint8List> signEd25519({
48-
required KeyPairEd25519 kp,
46+
required KeyPairEd25519 keyPair,
4947
required Uint8List message,
5048
}) async {
5149
final signature = await ed25519.sign(
5250
message,
53-
keyPair: SimpleKeyPairData(kp.extractBytes().sublist(0, 32),
51+
keyPair: SimpleKeyPairData(keyPair.extractBytes().sublist(0, 32),
5452
publicKey: SimplePublicKey(
55-
kp.extractBytes().sublist(32),
53+
keyPair.extractBytes().sublist(32),
5654
type: KeyPairType.ed25519,
5755
),
5856
type: KeyPairType.ed25519),
@@ -62,7 +60,7 @@ class RustCryptoImplementation extends CryptoImplementation {
6260

6361
@override
6462
Future<bool> verifyEd25519({
65-
required Uint8List pk,
63+
required Uint8List publicKey,
6664
required Uint8List message,
6765
required Uint8List signature,
6866
}) async {
@@ -71,7 +69,7 @@ class RustCryptoImplementation extends CryptoImplementation {
7169
signature: Signature(
7270
signature,
7371
publicKey: SimplePublicKey(
74-
pk,
72+
publicKey,
7573
type: KeyPairType.ed25519,
7674
),
7775
),

lib/download/open_read.dart

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import 'package:lib5/util.dart';
1313
import 'package:path/path.dart';
1414

1515
import 'package:s5_server/node.dart';
16+
import 'package:s5_server/rust/api.dart';
1617

1718
final httpClient = Client();
1819

@@ -69,7 +70,7 @@ Stream<List<int>> openRead({
6970

7071
final blake3Hash = await node.crypto.hashBlake3(res.bodyBytes);
7172

72-
final isValid = areBytesEqual(hash.hashBytes, blake3Hash);
73+
final isValid = areBytesEqual(hash.value, blake3Hash);
7374

7475
if (isValid != true) {
7576
throw 'File integrity check failed (BLAKE3)';
@@ -263,7 +264,8 @@ Stream<List<int>> openRead({
263264

264265
if (endPos < (startByte + chunkSize)) {
265266
if ((startByte + chunkSize) > totalSize) {
266-
final end = min(totalEncSize, encStartByte + encChunkSize * 64);
267+
final end =
268+
min(totalEncSize, encStartByte + encChunkSize * 64);
267269
rangeHeader = 'bytes=$encStartByte-${end - 1}';
268270
} else {
269271
rangeHeader =
@@ -288,7 +290,8 @@ Stream<List<int>> openRead({
288290
encChunkSize * (downloadUntilChunkExclusive - chunk);
289291

290292
if ((encStartByte + length) > totalSize) {
291-
final end = min(totalEncSize, encStartByte + encChunkSize * 64);
293+
final end =
294+
min(totalEncSize, encStartByte + encChunkSize * 64);
292295
rangeHeader = 'bytes=$encStartByte-${end - 1}';
293296
} else {
294297
rangeHeader =
@@ -348,12 +351,12 @@ Stream<List<int>> openRead({
348351
0, chunkBytes.length - encryptionMetadata.padding);
349352
}
350353
} else {
351-
final integrityRes = await node.rust.verifyIntegrity(
354+
final integrityRes = await verifyIntegrity(
352355
chunkBytes: chunkBytes,
353-
offset: chunk * chunkSize,
356+
offset: BigInt.from(chunk * chunkSize),
354357
baoOutboardBytes: baoOutboardBytesCache[
355358
storageLocation.location.outboardBytesUrl]!,
356-
blake3Hash: hash.hashBytes,
359+
blake3Hash: U8Array32(hash.value),
357360
);
358361

359362
if (integrityRes != 1) {

lib/http_api/http_api.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@ import 'dart:typed_data';
55

66
import 'package:alfred/alfred.dart';
77
import 'package:base_codecs/base_codecs.dart';
8+
import 'package:filesize/filesize.dart';
89
import 'package:http/http.dart';
910
import 'package:lib5/constants.dart';
11+
import 'package:lib5/identifiers.dart';
1012
import 'package:lib5/lib5.dart';
13+
import 'package:lib5/fs.dart';
1114
import 'package:lib5/node.dart';
1215
import 'package:lib5/util.dart';
1316
import 'package:mime/mime.dart';
@@ -342,7 +345,7 @@ class HttpAPIServer {
342345
}).firstWhere((element) => element[0] == 'hash')[1];
343346

344347
final uploadId = base58BitcoinEncode(
345-
node.crypto.generateRandomBytes(32),
348+
node.crypto.generateSecureRandomBytes(32),
346349
);
347350

348351
final mhash =
@@ -503,7 +506,7 @@ class HttpAPIServer {
503506

504507
final cid = CID.decode(cidStr);
505508

506-
if (cid.type == cidTypeMetadataWebApp || cid.type == cidTypeResolver) {
509+
if (cid.type == cidTypeMetadataDirectory) {
507510
final base32cid = cid.toBase32();
508511
final requestedUri = req.requestedUri;
509512
await res.redirect(
@@ -596,9 +599,6 @@ class HttpAPIServer {
596599

597600
if (cid.type == cidTypeRaw) {
598601
throw 'Raw CIDs do not have metadata';
599-
} else if (cid.type == cidTypeResolver) {
600-
// TODO Support resolver CIDs
601-
throw 'This endpoint does not support resolver CIDs yet';
602602
}
603603

604604
final metadata = await node.downloadMetadata(cid);
@@ -782,7 +782,7 @@ class HttpAPIServer {
782782
final signature = base64UrlNoPaddingDecode(map['signature']!);
783783

784784
await node.registry.set(
785-
SignedRegistryEntry(
785+
RegistryEntry(
786786
pk: pk,
787787
revision: revision,
788788
data: bytes,

lib/http_api/serve_chunked_file.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ Future handleChunkedFile(
138138
res.headers.add('content-length', len.toString());
139139
res.headers.add(
140140
'content-range',
141-
'bytes ' + item.toContentRange(totalSize),
141+
'bytes ${item.toContentRange(totalSize)}',
142142
);
143143
await res.addStream(stream);
144144
completer.complete();

0 commit comments

Comments
 (0)