81 lines
2.9 KiB
Dart
81 lines
2.9 KiB
Dart
import 'dart:convert';
|
|
import 'dart:io';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:pj_supermarket_cloud/common/utils/app/file_access.dart';
|
|
|
|
void main() {
|
|
final vectors =
|
|
jsonDecode(File('test-vectors/file-upload.json').readAsStringSync())
|
|
as List;
|
|
for (final v in vectors) {
|
|
test('shared upload signature: ${v['target']}', () {
|
|
expect(
|
|
fileUploadCanonical(
|
|
v['target'], v['appId'], v['kid'], v['ts'], v['nonce']),
|
|
v['canonical']);
|
|
expect(
|
|
fileUploadSignature(
|
|
v['target'], v['appId'], v['kid'], v['ts'], v['nonce'], v['key']),
|
|
v['sign']);
|
|
});
|
|
}
|
|
test(
|
|
'upload headers are fresh, target-bound and restricted to owned endpoints',
|
|
() {
|
|
final client = FileAccessClient(
|
|
baseUrl: 'https://files.example/api',
|
|
appId: 'flutter',
|
|
kid: 'v1',
|
|
key: vectors[0]['key'],
|
|
now: () => DateTime.fromMillisecondsSinceEpoch(1793232000000),
|
|
allowedOrigins: ['https://legacy.example']);
|
|
for (final entry in {
|
|
'/admin/sys-file/upload': 'upload',
|
|
'/sys-file/upload': 'upload',
|
|
'/api/admin/sys-file/qn/upload': 'qn-upload',
|
|
'https://legacy.example/admin/sys-file/inner-upload': 'inner-upload'
|
|
}.entries) {
|
|
final headers =
|
|
client.uploadHeaders(entry.key, nonce: vectors[0]['nonce']);
|
|
expect(
|
|
headers['X-File-Signature'],
|
|
fileUploadSignature(entry.value, 'flutter', 'v1', 1793232000,
|
|
vectors[0]['nonce'], vectors[0]['key']));
|
|
}
|
|
final first = client.uploadHeaders('/admin/sys-file/upload'),
|
|
second = client.uploadHeaders('/admin/sys-file/upload');
|
|
expect(first['X-File-Nonce'], isNot(second['X-File-Nonce']));
|
|
expect(first['X-File-Signature'], isNot(second['X-File-Signature']));
|
|
for (final source in [
|
|
'https://other.example/admin/sys-file/upload',
|
|
'https:///admin/sys-file/upload',
|
|
'/admin/user/import',
|
|
'/admin/sys-file/oss/file?fileName=x.jpg',
|
|
'file:///local.png'
|
|
]) {
|
|
expect(client.uploadHeaders(source), isEmpty);
|
|
}
|
|
});
|
|
test(
|
|
'the Java numeric-string clock response corrects upload and image signatures',
|
|
() {
|
|
final client = FileAccessClient(
|
|
baseUrl: 'https://files.example/api',
|
|
appId: 'flutter',
|
|
kid: 'v1',
|
|
key: vectors[0]['key'],
|
|
now: () => DateTime.fromMillisecondsSinceEpoch(1793318400000));
|
|
expect(
|
|
client.synchronizeInfo(
|
|
{'serverTime': '1793232000000', 'ttlSeconds': '1800'}, 0),
|
|
isTrue);
|
|
expect(client.uploadHeaders('/admin/sys-file/upload')['X-File-Timestamp'],
|
|
'1793232000');
|
|
expect(
|
|
Uri.parse(client.url('photo.jpg')).queryParameters['ts'], '1793232000');
|
|
expect(client.synchronizeInfo({'serverTime': 'not-a-time'}, 0), isFalse);
|
|
expect(client.uploadHeaders('/admin/sys-file/upload')['X-File-Timestamp'],
|
|
'1793232000');
|
|
});
|
|
}
|