verify method
Implementation
Future<void> verify() async {
reset();
setState(() {
_isLoading = true;
});
try {
if (widget.delay != null) {
await Future.delayed(Duration(milliseconds: widget.delay!));
}
final challenge = await _fetchChallenge();
final verifyUrl = _getVerifyUrl();
final payload = await _requestVerification(challenge);
if (payload == null) {
throw Exception('Failed to compute solution.');
}
if (challenge.codeChallenge?.image != null &&
challenge.codeChallenge!.image.isNotEmpty) {
if (verifyUrl == null || verifyUrl.isEmpty) {
throw Exception('Received codeChallenge but verifyUrl is not set.');
}
setState(() {
_isCodeRequired = true;
});
final code = await _requestCodeVerification(
challenge.codeChallenge!.image,
_constructUrl(challenge.codeChallenge!.audio, widget.challengeUrl),
challenge.codeChallenge!.length,
);
setState(() {
_isCodeRequired = false;
});
if (code == null) {
throw Exception('Verification code was not entered.');
}
final serverVerification = await _requestServerVerification(
verifyUrl,
payload,
code,
);
if (serverVerification.verified != true) {
throw Exception('Server verification failed.');
}
} else if (verifyUrl != null && verifyUrl.isNotEmpty) {
await _requestServerVerification(verifyUrl, payload, null);
}
setState(() {
_isSolved = true;
});
} catch (e, stack) {
_log('error: $e $stack');
if (widget.onFailed != null) {
widget.onFailed!(e);
}
setState(() {
_errorMessage = AltchaLocalizations.of(context).text('error');
});
} finally {
setState(() {
_isLoading = false;
});
}
}