handleMount method

Future<void> handleMount(
  1. ArgResults argResults
)

Implementation

Future<void> handleMount(ArgResults argResults) async {
  await _prepareClient();
  final port = int.tryParse(argResults['port'] ?? '8080') ?? 8080;
  final sslCertPath = argResults['ssl-cert'] as String?;
  final sslKeyPath = argResults['ssl-key'] as String?;
  final useSSL = sslCertPath != null && sslKeyPath != null;

  print('\ud83d\udd10 User: ${client.email}');
  print(
      '\ud83c\udf10 Starting WebDAV server on port $port${useSSL ? " (HTTPS)" : ""}...\n');

  try {
    final filenFS = FilenFileSystem(client: client);

    final davConfig = DAVConfig(
      root: filenFS.directory('/'),
      prefix: '/',
      authenticationProvider: BasicAuthenticationProvider.plaintext(
        realm: 'Filen WebDAV',
        users: {'filen': 'filen-webdav'},
      ),
      authorizationProvider: RoleBasedAuthorizationProvider(
        readWriteUsers: {'filen'},
        allowAnonymousRead: false,
      ),
      enableLocking: true,
    );

    final dav = ShelfDAV.withConfig(davConfig);

    HttpServer server;
    if (useSSL) {
      final context = SecurityContext()
        ..useCertificateChain(sslCertPath)
        ..usePrivateKey(sslKeyPath);
      server = await shelf_io.serve(
        dav.handler,
        '0.0.0.0',
        port,
        securityContext: context,
      );
    } else {
      server = await shelf_io.serve(dav.handler, '0.0.0.0', port);
    }

    final protocol = useSSL ? 'https' : 'http';
    print('\u2705 WebDAV server started!');
    print('\ud83d\udce1 URL: $protocol://localhost:$port/');
    print(
        '\ud83d\udce1 Network: $protocol://${await _getLocalIpAddress()}:$port/');
    print('\ud83d\udd10 Auth: filen / filen-webdav');
    if (useSSL) print('\ud83d\udd12 SSL: enabled');
    print('\n\ud83d\uded1 Press Ctrl+C to stop\n');

    ProcessSignal.sigint.watch().listen((_) async {
      print('\n\ud83d\uded1 Shutting down...');
      await server.close(force: true);
      await config.clearWebdavPid();
      print('\u2705 Server stopped.');
      exit(0);
    });

    ProcessSignal.sigterm.watch().listen((_) async {
      await server.close(force: true);
      await config.clearWebdavPid();
      exit(0);
    });
  } catch (e, stackTrace) {
    stderr.writeln('\u274c Failed to start WebDAV server: $e');
    if (debugMode) stderr.writeln(stackTrace);
    await config.clearWebdavPid();
    exit(1);
  }
}