handleLogin method
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: ', '')}');
}
}
}