Procházet zdrojové kódy

use TPSGI's generic routing handlers

George Baugh před 5 měsíci
rodič
revize
be8afba2a2

+ 9 - 1
lib/TCMS.pm

@@ -43,7 +43,6 @@ use Trog::FileHandler;
 
 # Troglodyne philosophy - simple as possible
 
-# Wrap app to return *our* error handler instead of Plack::Util::run_app's
 my $cur_query = {};
 
 # Build routes
@@ -130,6 +129,15 @@ sub build_routes {
     return [%routes_adj];
 }
 
+# Override the generic error handler to look spiffy
+sub generic_route ( $rname, $code, $title, $query ) {
+    $query->{code} = $code;
+    $query->{route} //= $rname;
+    $query->{title}    = $title;
+    $query->{template} = "$rname.tx";
+    return Trog::Routes::HTML::index($query);
+}
+
 our @routes  = @{ build_routes() };
 our %aliases = aliases();
 

+ 26 - 85
lib/Trog/Routes/HTML.pm

@@ -389,65 +389,6 @@ sub _build_social_meta ( $query, $title ) {
     return ( $default_tags, $meta_desc, $meta_tags );
 }
 
-=head1 ADMIN ROUTES
-
-These are things that issue returns other than 200, and are not directly accessible by users via any defined route.
-
-=head2 notfound, forbidden, badrequest
-
-Implements the 4XX status codes.  Override templates named the same for theming this.
-
-=cut
-
-sub _generic_route ( $rname, $code, $title, $query ) {
-    $query->{code} = $code;
-    $query->{route} //= $rname;
-    $query->{title}    = $title;
-    $query->{template} = "$rname.tx";
-    return Trog::Routes::HTML::index($query);
-}
-
-sub notfound (@args) {
-    return _generic_route( 'notfound', 404, "Return to sender, Address unknown", @args );
-}
-
-sub forbidden (@args) {
-    return _generic_route( 'forbidden', 403, "STAY OUT YOU RED MENACE", @args );
-}
-
-sub badrequest (@args) {
-    return _generic_route( 'badrequest', 400, "Bad Request", @args );
-}
-
-sub toolong (@args) {
-    return _generic_route( 'toolong', 419, "URI too long", @args );
-}
-
-sub error (@args) {
-    return _generic_route( 'error', 500, "Internal Server Error", @args );
-}
-
-=head2 redirect, redirect_permanent, see_also
-
-Redirects to the provided page.
-
-=cut
-
-sub redirect ($to) {
-    INFO("redirect: $to");
-    return [ 302, [ "Location" => $to, "Content-Length" => 0 ], [''] ];
-}
-
-sub redirect_permanent ($to) {
-    INFO("permanent redirect: $to");
-    return [ 301, [ "Location" => $to, "Content-Length" => 0 ], [''] ];
-}
-
-sub see_also ($to) {
-    INFO("see also: $to");
-    return [ 303, [ "Location" => $to, "Content-Length" => 0 ], [''] ];
-}
-
 =head1 NORMAL ROUTES
 
 These are expected to either return a 200, or redirect to something which does.
@@ -521,7 +462,7 @@ sub login ($query) {
     $query->{to} = '/config' if List::Util::any { $query->{to} eq $_ } qw{/login /logout};
     if ( $query->{user} ) {
         DEBUG("Login by $query->{user}, redirecting to $query->{to}");
-        return see_also( $query->{to} );
+        return $query->{tpsgi}->see_also( $query->{to} );
     }
 
     #Check and see if we have no users.  If so we will just accept whatever creds are passed.
@@ -669,8 +610,8 @@ Renders the configuration page, or redirects you back to the login page.
 =cut
 
 sub config ( $query = {} ) {
-    return see_also('/login')                    unless $query->{user};
-    return Trog::Routes::HTML::forbidden($query) unless grep { $_ eq 'admin' } @{ $query->{user_acls} };
+    return $query->{tpsgi}->see_also('/login')                    unless $query->{user};
+    return $query->{tpsgi}->forbidden($query) unless grep { $_ eq 'admin' } @{ $query->{user_acls} };
 
     $query->{failure} //= -1;
 
@@ -745,10 +686,10 @@ sub do_resetpass ($query) {
     my $user = $query->{username};
 
     # User Does not exist
-    return Trog::Routes::HTML::forbidden($query) if !Trog::Auth::user_exists($user);
+    return $query->{tpsgi}->forbidden($query) if !Trog::Auth::user_exists($user);
 
     # User exists, but is not logged in this session
-    return Trog::Routes::HTML::forbidden($query) if !$query->{user} && Trog::Auth::user_has_session($user);
+    return $query->{tpsgi}->forbidden($query) if !$query->{user} && Trog::Auth::user_has_session($user);
 
     my $token   = Trog::Utils::uuid();
     my $newpass = $query->{password} // Trog::Utils::uuid();
@@ -757,7 +698,7 @@ sub do_resetpass ($query) {
 
     # If the user is logged in, just do the deed, otherwise send them the token in an email
     if ( $query->{user} ) {
-        return see_also("/api/auth_change_request/$token");
+        return $query->{tpsgi}->see_also("/api/auth_change_request/$token");
     }
     Trog::Email::contact(
         $user,
@@ -765,17 +706,17 @@ sub do_resetpass ($query) {
         "$query->{domain}: Password reset URL for $user",
         { uri => "$query->{scheme}://$query->{domain}/api/auth_change_request/$token", template => 'password_reset.tx' }
     );
-    return see_also("/processed");
+    return $query->{tpsgi}->see_also("/processed");
 }
 
 sub do_totp_clear ($query) {
     my $user = $query->{username};
 
     # User Does not exist
-    return Trog::Routes::HTML::forbidden($query) if !Trog::Auth::user_exists($user);
+    return $query->{tpsgi}->forbidden($query) if !Trog::Auth::user_exists($user);
 
     # User exists, but is not logged in this session
-    return Trog::Routes::HTML::forbidden($query) if !$query->{user} && Trog::Auth::user_has_session($user);
+    return $query->{tpsgi}->forbidden($query) if !$query->{user} && Trog::Auth::user_has_session($user);
 
     my $token = Trog::Utils::uuid();
     my $res   = Trog::Auth::add_change_request( type => 'clear_totp', user => $user, token => $token );
@@ -783,7 +724,7 @@ sub do_totp_clear ($query) {
 
     # If the user is logged in, just do the deed, otherwise send them the token in an email
     if ( $query->{user} ) {
-        return see_also("/api/auth_change_request/$token");
+        return $query->{tpsgi}->see_also("/api/auth_change_request/$token");
     }
     Trog::Email::contact(
         $user,
@@ -791,7 +732,7 @@ sub do_totp_clear ($query) {
         "$query->{domain}: Password reset URL for $user",
         { uri => "$query->{scheme}://$query->{domain}/api/auth_change_request/$token", template => 'totp_reset.tx' }
     );
-    return see_also("/processed");
+    return $query->{tpsgi}->see_also("/processed");
 }
 
 sub _get_series ( $edit = 0 ) {
@@ -863,8 +804,8 @@ Clone a theme by copying a directory.
 =cut
 
 sub themeclone ($query) {
-    return see_also('/login')                    unless $query->{user};
-    return Trog::Routes::HTML::forbidden($query) unless grep { $_ eq 'admin' } @{ $query->{user_acls} };
+    return $query->{tpsgi}->see_also('/login')                    unless $query->{user};
+    return $query->{tpsgi}->forbidden($query) unless grep { $_ eq 'admin' } @{ $query->{user_acls} };
 
     my ( $theme, $newtheme ) = ( $query->{theme}, $query->{newtheme} );
 
@@ -877,7 +818,7 @@ sub themeclone ($query) {
         $query->{failure} = 0;
         $query->{message} = "Successfully cloned theme '$theme' as '$newtheme'.";
     }
-    return see_also('/config');
+    return $query->{tpsgi}->see_also('/config');
 }
 
 =head2 post_save
@@ -932,8 +873,8 @@ Saves / updates new users.
 =cut
 
 sub profile ($query) {
-    return see_also('/login')                    unless $query->{user};
-    return Trog::Routes::HTML::forbidden($query) unless grep { $_ eq 'admin' } @{ $query->{user_acls} };
+    return $query->{tpsgi}->see_also('/login')                    unless $query->{user};
+    return $query->{tpsgi}->forbidden($query) unless grep { $_ eq 'admin' } @{ $query->{user_acls} };
 
     # Find the user's post and edit it
     state $data;
@@ -976,14 +917,14 @@ deletes posts.
 =cut
 
 sub post_delete ($query) {
-    return see_also('/login')                    unless $query->{user};
-    return Trog::Routes::HTML::forbidden($query) unless grep { $_ eq 'admin' } @{ $query->{user_acls} };
+    return $query->{tpsgi}->see_also('/login')                    unless $query->{user};
+    return $query->{tpsgi}->forbidden($query) unless grep { $_ eq 'admin' } @{ $query->{user_acls} };
 
     state $data;
     $data //= Trog::Data->new(Trog::Config::get());
 
     $data->delete($query) and die "Could not delete post";
-    return see_also( $query->{to} );
+    return $query->{tpsgi}->see_also( $query->{to} );
 }
 
 =head2 series
@@ -1068,7 +1009,7 @@ sub users ($query) {
     $display_name = URI::Escape::uri_unescape($display_name);
 
     my $username = Trog::Auth::display2username($display_name);
-    return notfound($query) unless $username;
+    return $query->{tpsgi}->notfound($query) unless $username;
 
     $query->{username} //= $username;
     push( @{ $query->{user_acls} }, 'public' );
@@ -1144,7 +1085,7 @@ sub posts ( $query, $direct = 0 ) {
     }
 
     if ( !$is_admin ) {
-        return notfound($query) unless @posts;
+        return $query->{tpsgi}->notfound($query) unless @posts;
     }
 
     # Set the eTag so that we don't get a re-fetch
@@ -1560,8 +1501,8 @@ Basically a thin wrapper around Pod::Html.
 =cut
 
 sub manual ($query) {
-    return see_also('/login')                    unless $query->{user};
-    return Trog::Routes::HTML::forbidden($query) unless grep { $_ eq 'admin' } @{ $query->{user_acls} };
+    return $query->{tpsgi}->see_also('/login')                    unless $query->{user};
+    return $query->{tpsgi}->forbidden($query) unless grep { $_ eq 'admin' } @{ $query->{user_acls} };
 
     require Pod::Html;
     require Capture::Tiny;
@@ -1576,7 +1517,7 @@ sub manual ($query) {
         $found = $libdir if -f "$libdir/$infile";
         last if $found;
     }
-    return notfound($query) unless $found;
+    return $query->{tpsgi}->notfound($query) unless $found;
 
     my $content = capture { Pod::Html::pod2html( qw{--podpath=lib --podroot=.}, "--infile=$found/$infile" ) };
 
@@ -1606,8 +1547,8 @@ sub processed ($query) {
 }
 
 sub metrics ($query) {
-    return see_also('/login')                    unless $query->{user};
-    return Trog::Routes::HTML::forbidden($query) unless grep { $_ eq 'admin' } @{ $query->{user_acls} };
+    return $query->{tpsgi}->see_also('/login')                    unless $query->{user};
+    return $query->{tpsgi}->forbidden($query) unless grep { $_ eq 'admin' } @{ $query->{user_acls} };
 
     $query->{failure} //= -1;
 

+ 0 - 3
www/templates/html/500.tx

@@ -1,3 +0,0 @@
-: include "components/header.tx";
-: include "index.tx";
-: include "components/footer.tx"

+ 0 - 0
www/templates/html/components/badrequest.tx → www/templates/html/components/400.tx


+ 0 - 0
www/templates/html/components/forbidden.tx → www/templates/html/components/403.tx


+ 0 - 0
www/templates/html/components/notfound.tx → www/templates/html/components/404.tx


+ 0 - 0
www/templates/html/components/toolong.tx → www/templates/html/components/419.tx


+ 0 - 0
www/templates/html/components/error.tx → www/templates/html/components/500.tx