added on local at 2026-07-01 16:00:59
| 1 | #!/usr/bin/perl | |
| 2 | use strict; use warnings; | |
| 3 | use lib '/var/www/vhosts/3dshawn.com/abforge.3dshawn.com'; | |
| 4 | use CGI; use MODS::Template; use MODS::DBConnect; use MODS::Login; | |
| 5 | use MODS::ABForge::Config; use MODS::ABForge::Wrapper; use MODS::ABForge::Sites; | |
| 6 | use Digest::SHA qw(sha256_hex); | |
| 7 | my $q=CGI->new; my $auth=MODS::Login->new; my $wrap=MODS::ABForge::Wrapper->new; my $tfile=MODS::Template->new; | |
| 8 | my $cfg=MODS::ABForge::Config->new; my $db=MODS::DBConnect->new; my $sites=MODS::ABForge::Sites->new; my $DB=$cfg->settings('database_name'); | |
| 9 | my $userinfo=$auth->login_verify(); print "Status: 302 Found\nLocation: /login.cgi\n\n" and exit unless $userinfo; | |
| 10 | my $form=$q->Vars; my $dbh=$db->db_connect(); | |
| 11 | my @sites_list=$sites->list_for_user($dbh, $DB, $userinfo->{user_id}); | |
| 12 | my $new_secret = ''; | |
| 13 | if ($q->request_method eq 'POST' && $form->{create}) { | |
| 14 | my @c=('a'..'z','A'..'Z','0'..'9'); my $secret='abk_live_'; $secret .= $c[int(rand @c)] for 1..32; | |
| 15 | my $hash=sha256_hex($secret); my $prefix=substr($secret,0,8); | |
| 16 | my $label = $form->{label}; $label =~ s/[\\']/\\$&/g; $label = substr($label, 0, 120); | |
| 17 | $db->db_readwrite($dbh, "INSERT INTO ${DB}.api_keys (user_id, label, key_prefix, key_hash, created_at) VALUES (".$userinfo->{user_id}.", '$label', '$prefix', '$hash', NOW())", $ENV{SCRIPT_NAME}, __LINE__); | |
| 18 | $new_secret = $secret; | |
| 19 | } | |
| 20 | if ($form->{revoke}) { | |
| 21 | $db->db_readwrite($dbh, "UPDATE ${DB}.api_keys SET revoked_at=NOW() WHERE id=".int($form->{revoke})." AND user_id=".$userinfo->{user_id}, $ENV{SCRIPT_NAME}, __LINE__); | |
| 22 | } | |
| 23 | my @keys=$db->db_readwrite_multiple($dbh, "SELECT id, label, key_prefix, revoked_at, last_used_at, created_at FROM ${DB}.api_keys WHERE user_id=".$userinfo->{user_id}." ORDER BY created_at DESC", $ENV{SCRIPT_NAME}, __LINE__); | |
| 24 | foreach my $k (@keys) { $k->{is_active} = $k->{revoked_at} ? 0 : 1; } | |
| 25 | $db->db_disconnect($dbh); | |
| 26 | print "Content-Type: text/html\n\n"; | |
| 27 | my $body=join('',$tfile->template('abforge_api_keys.html',{ | |
| 28 | new_secret=>$new_secret, has_new=>$new_secret?1:0, keys=>\@keys, has_keys=>scalar(@keys)?1:0, | |
| 29 | }, $userinfo)); | |
| 30 | $wrap->render({userinfo=>$userinfo, page_key=>'api', title=>'API Keys', body=>$body, sites=>\@sites_list}); |