Allow generating tokens

This commit is contained in:
Citlali del Rey 2022-11-09 16:27:35 -08:00
parent 1a3096669b
commit 3528837ab4
Signed by: nullobsi
GPG Key ID: 933A1F44222C2634
7 changed files with 78 additions and 6 deletions

View File

@ -9,7 +9,8 @@ WriteMakefile(
'Mojolicious' => '9.27',
'Mojolicious::Plugin::OpenAPI' => '5.07',
'Mojo::Pg' => '4.27',
'DateTime::Format::Pg' => '0.16001'
'DateTime::Format::Pg' => '0.16001',
'Crypt::Random' => '1.25',
},
test => {TESTS => 't/*.t'}
);

View File

@ -75,6 +75,9 @@ sub startup($self) {
$r->post('/auth')->to('Login#auth');
$r->get('/my')->to('Interface#landing');
$r->get('/my/tokens')->to('Interface#token_list');
$r->get('/my/tokens/generate')->to('Interface#gen_token_get');
$r->post('/my/tokens/generate')->to('Interface#gen_token_post');
}
1;

View File

@ -53,4 +53,33 @@ sub token_list($c) {
})
}
sub gen_token_post($c) {
my $uid = $c->session->{uid};
if (!defined $uid) {
return $c->redirect_to("/login");
}
my $v = $c->validation;
return $c->render('interface/generateToken') unless $v->has_data;
$v->required('app_name', 'trim')->size(1,64);
return $c->render('interface/generateToken') if $v->has_error;
my $app_name = $v->param('app_name');
return $c->users->gen_token($uid, $app_name)->then(sub ($res) {
$c->flash(msg => "Your new token is: $res");
return $c->redirect_to('/my/tokens');
});
}
sub gen_token_get($c) {
my $uid = $c->session->{uid};
if (!defined $uid) {
return $c->redirect_to("/login");
}
return $c->render('interface/generateToken');
}
1;

View File

@ -8,9 +8,12 @@ use Net::LDAPS;
sub auth($c) {
my $v = $c->validation;
return $c->render('login/login') unless $v->has_data;
$v->required('username', 'trim')->size(1,32)->like(qr/^([a-z_][a-z0-9_-]*[\$]?)$/);
$v->required('password');
return $c->render('login/login') if $v->has_error;
my $username = $c->param('username');
my $password = $c->param('password');
@ -32,11 +35,6 @@ sub auth($c) {
$c->flash(message => "Logged in.");
$c->redirect_to('/my');
});
$c->render(openapi => {
count => 0,
results => [],
});
}
sub login($c) {

View File

@ -2,6 +2,7 @@ package IpfsUpload::Model::Users;
use strict;
use warnings FATAL => 'all';
use experimental q/signatures/;
use Crypt::Random qw( makerandom_octet );
use Mojo::Base -base, -signatures;
@ -19,6 +20,25 @@ sub token_info_p($self, $token) {
});
}
sub gen_token($self, $uid, $app_name) {
my $size = 512;
my $r = makerandom_octet(Size => $size, Strength => 0);
my $s = unpack "H*", pack "B*", '0' x ( $size%8 ? 8-$size % 8 : 0 ).
unpack "b$size", $r;
return $self->pg->db->insert_p(
'access_token',
{
uid => $uid,
app_name => $app_name,
token => $s,
},
{returning => ['token']}
)->then(sub ($res) {
return $res->hash->{token};
});
}
sub list_tokens($self, $uid) {
return $self->pg->db->select_p('access_token', ['uid', 'app_name', 'id'], {
uid => $uid,
@ -38,4 +58,5 @@ sub getOrMake($self, $username) {
});
}
1;

View File

@ -0,0 +1,12 @@
% layout "default";
% title "Uploads";
<h1>New Token</h1>
%= form_for '/my/tokens/generate' => (method => 'POST') => begin
<p>
%= label_for app_name => 'App name:'
%= text_field 'app_name', id => 'app_name'
</p>
%= submit_button
% end

View File

@ -3,6 +3,14 @@
<h1>Tokens</h1>
<p>Here you can delete or generate tokens.</p>
% if (my $msg = flash 'msg') {
<p>
<b>
%= $msg
</b>
</p>
% }
<table>
<tr>
<th>Token ID</th>