diff options
author | Ivan Kohler <ivan@freeside.biz> | 2022-09-07 17:22:51 -0700 |
---|---|---|
committer | Ivan Kohler <ivan@freeside.biz> | 2022-09-07 17:22:51 -0700 |
commit | 26ddb940ad27ce8ac5e87084eeed857a390987bc (patch) | |
tree | 3d6e1c46d8d703a1c6bb63820ab741d6a67ab506 /FS | |
parent | 691de38ac2ca6c54b37feb50e1332bab6268773f (diff) |
google authenticator support, RT#86743
Diffstat (limited to 'FS')
-rw-r--r-- | FS/FS/AuthCookieHandler.pm | 4 | ||||
-rw-r--r-- | FS/FS/Schema.pm | 1 | ||||
-rw-r--r-- | FS/FS/access_user.pm | 40 |
3 files changed, 43 insertions, 2 deletions
diff --git a/FS/FS/AuthCookieHandler.pm b/FS/FS/AuthCookieHandler.pm index 93d8ea6a5..b7d0dbf5b 100644 --- a/FS/FS/AuthCookieHandler.pm +++ b/FS/FS/AuthCookieHandler.pm @@ -13,13 +13,13 @@ sub useragent_ip { } sub authen_cred { - my( $self, $r, $username, $password ) = @_; + my( $self, $r, $username, $password, $totp_code ) = @_; preuser_setup(); my $info = {}; - unless ( FS::Auth->authenticate($username, $password, $info) ) { + unless ( FS::Auth->authenticate($username, $password, $totp_code, $info) ) { warn "failed auth $username from ". $self->useragent_ip($r). "\n"; return undef; } diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm index d88403644..61b793bb4 100644 --- a/FS/FS/Schema.pm +++ b/FS/FS/Schema.pm @@ -5931,6 +5931,7 @@ sub tables_hashref { 'username', 'varchar', '', $char_d, '', '', '_password', 'varchar', 'NULL', $char_d, '', '', '_password_encoding', 'varchar', 'NULL', $char_d, '', '', + 'totp_secret32', 'char', 'NULL', 32, '', '', 'last', 'varchar', 'NULL', $char_d, '', '', 'first', 'varchar', 'NULL', $char_d, '', '', 'user_custnum', 'int', 'NULL', '', '', '', diff --git a/FS/FS/access_user.pm b/FS/FS/access_user.pm index f23aa77f9..270f8bb27 100644 --- a/FS/FS/access_user.pm +++ b/FS/FS/access_user.pm @@ -13,6 +13,7 @@ use FS::agent; use FS::cust_main; use FS::sales; use Carp qw( croak ); +use Auth::GoogleAuth; $DEBUG = 0; $me = '[FS::access_user]'; @@ -239,6 +240,7 @@ sub check { $self->ut_numbern('usernum') || $self->ut_alpha_lower('username') || $self->ut_textn('_password') + || $self->ut_alphan('totp_secret32') || $self->ut_textn('last') || $self->ut_textn('first') || $self->ut_foreign_keyn('user_custnum', 'cust_main', 'custnum') @@ -733,6 +735,44 @@ sub change_password_fields { FS::Auth->auth_class->change_password_fields( @_ ); } +=item google_auth + +=cut + +sub google_auth { + my( $self ) = @_; + my $issuer = FS::Conf->new->config('company_name'). ' Freeside'; + my $label = $issuer. ':'. $self->username; + + Auth::GoogleAuth->new({ + secret => $self->totp_secret32, + issuer => $issuer, + key_id => $label, + }); + +} + +=item set_totp_secret32 + +=cut + +sub set_totp_secret32 { + my( $self ) = @_; + + $self->totp_secret32( $self->google_auth->generate_secret32 ); + $self->replace; +} + +=item totp_qr_code_url + +=cut + +sub totp_qr_code_url { + my( $self ) = @_; + + $self->google_auth->qr_code; +} + =item locale =cut |