The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
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;