mirror of
https://github.com/Bubka/2FAuth.git
synced 2025-05-29 06:27:33 +02:00
Update OTP generation to work with new TwoFAccount model
This commit is contained in:
parent
783fc82fc9
commit
8baa2156a8
@ -16,16 +16,14 @@ class OTP
|
|||||||
* @param Boolean $isPreview Prevent updating storage in case of HOTP preview
|
* @param Boolean $isPreview Prevent updating storage in case of HOTP preview
|
||||||
* @return an array that represent the totp code
|
* @return an array that represent the totp code
|
||||||
*/
|
*/
|
||||||
public static function generate($uri, $isPreview = false)
|
public static function generate($twofaccount, $isPreview = false)
|
||||||
{
|
{
|
||||||
|
|
||||||
$otp = OTP::get($uri);
|
|
||||||
|
|
||||||
if( get_class($otp) === 'OTPHP\TOTP' ) {
|
if( $twofaccount->otpType === 'totp' ) {
|
||||||
|
|
||||||
$currentPosition = time();
|
$currentPosition = time();
|
||||||
$PeriodCount = floor($currentPosition / $otp->getPeriod()); //nombre de période de x s depuis T0 (x=30 par défaut)
|
$PeriodCount = floor($currentPosition / $twofaccount->totpPeriod); //nombre de période de x s depuis T0 (x=30 par défaut)
|
||||||
$currentPeriodStartAt = $PeriodCount * $otp->getPeriod();
|
$currentPeriodStartAt = $PeriodCount * $twofaccount->totpPeriod;
|
||||||
$positionInCurrentPeriod = $currentPosition - $currentPeriodStartAt;
|
$positionInCurrentPeriod = $currentPosition - $currentPeriodStartAt;
|
||||||
|
|
||||||
// For memo :
|
// For memo :
|
||||||
@ -33,24 +31,22 @@ class OTP
|
|||||||
// $remainingTime = $nextOtpAt - time()
|
// $remainingTime = $nextOtpAt - time()
|
||||||
|
|
||||||
return $totp = [
|
return $totp = [
|
||||||
'otp' => $otp->now(),
|
'otp' => $twofaccount->token(),
|
||||||
'position' => $positionInCurrentPeriod
|
'position' => $positionInCurrentPeriod
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// It's a HOTP
|
// It's a HOTP
|
||||||
$hotp = [
|
$hotp = [
|
||||||
'otp' => $otp->at($otp->getCounter()),
|
'otp' => $twofaccount->token(),
|
||||||
'counter' => $otp->getCounter()
|
'counter' => $twofaccount->hotpCounter
|
||||||
];
|
];
|
||||||
|
|
||||||
// now we update the counter for the next OTP generation
|
// now we update the counter for the next OTP generation
|
||||||
$otp->setParameter( 'counter', $otp->getcounter() + 1 );
|
$twofaccount->increaseCounter();
|
||||||
$hotp['nextUri'] = urldecode($otp->getProvisioningUri());
|
$hotp['nextUri'] = $twofaccount->uri;
|
||||||
|
|
||||||
if( !$isPreview ) {
|
if( !$isPreview ) {
|
||||||
$twofaccount = \App\TwoFAccount::where('uri', $uri)->first();
|
|
||||||
$twofaccount->uri = $hotp['nextUri'];
|
|
||||||
$twofaccount->save();
|
$twofaccount->save();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,27 +55,4 @@ class OTP
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* check if the provided uri is a valid OTP uri
|
|
||||||
*
|
|
||||||
* @param \App\TwoFAccount $twofaccount
|
|
||||||
* @return \Illuminate\Http\Response
|
|
||||||
*/
|
|
||||||
public static function get(String $uri) {
|
|
||||||
|
|
||||||
try {
|
|
||||||
return Factory::loadFromProvisioningUri($uri);
|
|
||||||
}
|
|
||||||
catch (AssertionFailedException $exception) {
|
|
||||||
$error = \Illuminate\Validation\ValidationException::withMessages([
|
|
||||||
'qrcode' => __('errors.response.no_valid_otp')
|
|
||||||
]);
|
|
||||||
|
|
||||||
throw $error;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -99,16 +99,19 @@ class TwoFAccountController extends Controller
|
|||||||
{
|
{
|
||||||
$isPreview = false;
|
$isPreview = false;
|
||||||
|
|
||||||
if( is_int($request->data) ) {
|
if( $request->id ) {
|
||||||
$twofaccount = TwoFAccount::FindOrFail($request->data);
|
// The request data is the Id of the account
|
||||||
$uri = $twofaccount->uri;
|
$twofaccount = TwoFAccount::FindOrFail($request->id);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$uri = $request->data;
|
// The request data is supposed to be a valid uri
|
||||||
$isPreview = true;
|
$twofaccount = new TwoFAccount;
|
||||||
|
$twofaccount->populateFromUri($request->uri);
|
||||||
|
|
||||||
|
$isPreview = true; // HOTP generated for preview (in the Create form) will not have its counter updated
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json(OTP::generate($uri, $isPreview), 200);
|
return response()->json(OTP::generate($twofaccount, $isPreview ? true : false), 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@
|
|||||||
|
|
||||||
getTOTP: function() {
|
getTOTP: function() {
|
||||||
|
|
||||||
this.axios.post('/api/twofaccounts/otp', {data: this.id ? this.id : this.internal_uri }).then(response => {
|
this.axios.post('/api/twofaccounts/otp', { id: this.id, uri: this.internal_uri }).then(response => {
|
||||||
let spacePosition = Math.ceil(response.data.otp.length / 2);
|
let spacePosition = Math.ceil(response.data.otp.length / 2);
|
||||||
|
|
||||||
this.otp = response.data.otp.substr(0, spacePosition) + " " + response.data.otp.substr(spacePosition);
|
this.otp = response.data.otp.substr(0, spacePosition) + " " + response.data.otp.substr(spacePosition);
|
||||||
@ -143,7 +143,7 @@
|
|||||||
|
|
||||||
getHOTP: function() {
|
getHOTP: function() {
|
||||||
|
|
||||||
this.axios.post('/api/twofaccounts/otp', {data: this.id ? this.id : this.internal_uri }).then(response => {
|
this.axios.post('/api/twofaccounts/otp', { id: this.id, uri: this.internal_uri }).then(response => {
|
||||||
let spacePosition = Math.ceil(response.data.otp.length / 2);
|
let spacePosition = Math.ceil(response.data.otp.length / 2);
|
||||||
|
|
||||||
this.otp = response.data.otp.substr(0, spacePosition) + " " + response.data.otp.substr(spacePosition)
|
this.otp = response.data.otp.substr(0, spacePosition) + " " + response.data.otp.substr(spacePosition)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user