Password Change form for all users
This commit is contained in:
		| @@ -21,6 +21,7 @@ use App::Netdisco::Web::AdminTask; | ||||
| use App::Netdisco::Web::TypeAhead; | ||||
| use App::Netdisco::Web::PortControl; | ||||
| use App::Netdisco::Web::Statistics; | ||||
| use App::Netdisco::Web::Password; | ||||
|  | ||||
| sub _load_web_plugins { | ||||
|   my $plugin_list = shift; | ||||
|   | ||||
| @@ -29,38 +29,38 @@ hook 'before' => sub { | ||||
| }; | ||||
|  | ||||
| get qr{^/(?:login(?:/denied)?)?} => sub { | ||||
|     template 'index', { return_url => params->{return_url} }; | ||||
|     template 'index', { return_url => param('return_url') }; | ||||
| }; | ||||
|  | ||||
| # override default login_handler so we can log access in the database | ||||
| post '/login' => sub { | ||||
|     my $mode = (request->is_ajax ? 'API' : 'Web'); | ||||
|     my ($success, $realm) = authenticate_user( | ||||
|         params->{username}, params->{password} | ||||
|         param('username'), param('password') | ||||
|     ); | ||||
|  | ||||
|     if ($success) { | ||||
|         session logged_in_user => params->{username}; | ||||
|         session logged_in_user => param('username'); | ||||
|         session logged_in_user_realm => $realm; | ||||
|  | ||||
|         schema('netdisco')->resultset('UserLog')->create({ | ||||
|           username => session('logged_in_user'), | ||||
|           userip => request->remote_address, | ||||
|           event => "Login ($mode)", | ||||
|           details => params->{return_url}, | ||||
|           details => param('return_url'), | ||||
|         }); | ||||
|  | ||||
|         return if request->is_ajax; | ||||
|         redirect params->{return_url}; | ||||
|         redirect param('return_url'); | ||||
|     } | ||||
|     else { | ||||
|         session->destroy; | ||||
|  | ||||
|         schema('netdisco')->resultset('UserLog')->create({ | ||||
|           username => params->{username}, | ||||
|           username => param('username'), | ||||
|           userip => request->remote_address, | ||||
|           event => "Login Failure ($mode)", | ||||
|           details => params->{return_url}, | ||||
|           details => param('return_url'), | ||||
|         }); | ||||
|  | ||||
|         if (request->is_ajax) { | ||||
| @@ -69,7 +69,7 @@ post '/login' => sub { | ||||
|         else { | ||||
|             vars->{login_failed}++; | ||||
|             forward uri_for('/login'), | ||||
|               { login_failed => 1, return_url => params->{return_url} }, | ||||
|               { login_failed => 1, return_url => param('return_url') }, | ||||
|               { method => 'GET' }; | ||||
|         } | ||||
|     } | ||||
|   | ||||
							
								
								
									
										51
									
								
								Netdisco/lib/App/Netdisco/Web/Password.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								Netdisco/lib/App/Netdisco/Web/Password.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| package App::Netdisco::Web::Password; | ||||
|  | ||||
| use Dancer ':syntax'; | ||||
| use Dancer::Plugin::DBIC; | ||||
| use Dancer::Plugin::Auth::Extensible; | ||||
| use Dancer::Plugin::Passphrase; | ||||
|  | ||||
| use Digest::MD5 (); | ||||
|  | ||||
| sub _make_password { | ||||
|   my $pass = (shift || passphrase->generate_random); | ||||
|   if (setting('safe_password_store')) { | ||||
|       return passphrase($pass)->generate; | ||||
|   } | ||||
|   else { | ||||
|       return Digest::MD5::md5_hex($pass), | ||||
|   } | ||||
| } | ||||
|  | ||||
| sub _bail { | ||||
|     var('passchange_failed' => 1); | ||||
|     return template 'password.tt'; | ||||
| } | ||||
|  | ||||
| any ['get', 'post'] => '/password' => require_login sub { | ||||
|     my $old = param('old'); | ||||
|     my $new = param('new'); | ||||
|     my $confirm = param('confirm'); | ||||
|  | ||||
|     if (request->is_post) { | ||||
|         unless ($old and $new and $confirm and ($new eq $confirm)) { | ||||
|             return _bail(); | ||||
|         } | ||||
|  | ||||
|         my ($success, $realm) = authenticate_user( | ||||
|             session('logged_in_user'), $old | ||||
|         ); | ||||
|         return _bail() if not $success; | ||||
|  | ||||
|         my $user = schema('netdisco')->resultset('User') | ||||
|           ->find({username => session('logged_in_user')}); | ||||
|         return _bail() if not $user; | ||||
|  | ||||
|         $user->update({password => _make_password($new)}); | ||||
|         var('passchange_ok' => 1); | ||||
|     } | ||||
|  | ||||
|     template 'password.tt'; | ||||
| }; | ||||
|  | ||||
| true; | ||||
		Reference in New Issue
	
	Block a user