handleLogin method

Future<void> handleLogin(
  1. List<String> args, {
  2. bool passwordStdin = false,
})

Implementation

Future<void> handleLogin(List<String> args,
    {bool passwordStdin = false}) async {
  // Email: FILEN_EMAIL env var, else interactive prompt.
  var email = (Platform.environment['FILEN_EMAIL'] ?? '').trim();
  if (email.isEmpty) {
    stdout.write('Email: ');
    email = stdin.readLineSync()?.trim() ?? '';
  }
  if (email.isEmpty) _exit('Email is required (or set FILEN_EMAIL)');

  // Password (most to least secure): --password-stdin, FILEN_PASSWORD env,
  // interactive no-echo prompt.
  final String password;
  final envPassword = Platform.environment['FILEN_PASSWORD'];
  if (passwordStdin) {
    password =
        stdin.readLineSync()?.replaceAll(RegExp(r'[\r\n]+$'), '') ?? '';
  } else if (envPassword != null && envPassword.isNotEmpty) {
    password = envPassword;
  } else {
    stdout.write('Password: ');
    stdin.echoMode = false;
    password =
        (stdin.readLineSync() ?? '').replaceAll(RegExp(r'[\r\n]+$'), '');
    stdin.echoMode = true;
    print('');
  }
  if (password.isEmpty) _exit('Password is required');

  print('\ud83d\udd10 Logging in...');

  try {
    var credentials = await client.login(email, password);
    print('\ud83d\udcc2 Fetching root folder info...');
    client.setAuth(credentials);
    final rootUUID = await client.fetchBaseFolderUUID();
    credentials['baseFolderUUID'] = rootUUID;
    await config.saveCredentials(credentials);
    _printSuccess(credentials);
  } catch (e) {
    final errStr = e.toString();
    if (errStr.contains('enter_2fa') || errStr.contains('wrong_2fa')) {
      // 2FA: FILEN_2FA env var (for automation), else interactive prompt.
      var tfaCode = (Platform.environment['FILEN_2FA'] ?? '').trim();
      if (tfaCode.isEmpty) {
        print('\n\ud83d\udd10 Two-factor authentication required.');
        stdout.write('Enter 2FA code: ');
        tfaCode = stdin.readLineSync()?.trim() ?? '';
      }
      if (tfaCode.isEmpty) _exit('2FA code is required (or set FILEN_2FA)');

      try {
        var credentials =
            await client.login(email, password, twoFactorCode: tfaCode);
        print('\ud83d\udcc2 Fetching root folder info...');
        client.setAuth(credentials);
        final rootUUID = await client.fetchBaseFolderUUID();
        credentials['baseFolderUUID'] = rootUUID;
        await config.saveCredentials(credentials);
        _printSuccess(credentials);
      } catch (e2) {
        _exit('Login failed: ${e2.toString().replaceAll('Exception: ', '')}');
      }
    } else {
      _exit('Login failed: ${errStr.replaceAll('Exception: ', '')}');
    }
  }
}