Add missing file.

        Patch by fu. 

diffs (125 lines):

diff -r e49268dcb070 -r 3d6b9b44d272 cgi-bin/DW/Controller/Interface/S2.pm
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/cgi-bin/DW/Controller/Interface/S2.pm     Tue Jul 06 02:34:20 2010 +0800
@@ -0,0 +1,121 @@
+#!/usr/bin/perl
+#
+# DW::Controller::Interface::S2
+#
+# This controller is for the s2 interface
+#
+# Authors:
+#      Afuna <[email protected]>
+#
+# Copyright (c) 2010 by Dreamwidth Studios, LLC.
+#
+# This program is free software; you may redistribute it and/or modify it under
+# the same terms as Perl itself. For a copy of the license, please reference
+# 'perldoc perlartistic' or 'perldoc perlgpl'.
+#
+
+package DW::Controller::Interface::S2;
+
+use strict;
+use warnings;
+use DW::Routing;
+
+# handle, even with no id, so that we can present an informative error message
+DW::Routing->register_regex( '^/interface/s2(?:/(\d+)?)?$', 
\&interface_handler, app => 1, format => 'plain' );
+
+# handles menu nav pages
+sub interface_handler {
+    my $r = DW::Request->get;
+    my $method = $r->method;
+
+    my $layerid = int( $_[0]->subpatterns->[0] || 0 ) || '';
+    return error( $r, $r->NOT_FOUND, 'No layerid', 'Must provide the layerid, 
e.g., /interface/s2/1234' )
+        unless $layerid;
+
+    my $lay = LJ::S2::load_layer( $layerid );
+    return error( $r, $r->NOT_FOUND, 'Layer not found', "There is no layer 
with id '$layerid' at this site" )
+        unless $lay;
+
+    LJ::auth_digest( $r );
+
+    my $remote = LJ::get_remote();
+    return error( $r, $r->HTTP_UNAUTHORIZED, 'Unauthorized', "You must send 
your $LJ::SITENAME username and password or a valid session cookie\n" )
+        unless $remote;
+
+    my $layeru = LJ::load_userid( $lay->{userid} );
+    return error( $r, $r->SERVER_ERROR, "Error", "Unable to find layer owner" )
+        unless $layeru;
+
+    if ( $method eq 'GET' ) {
+        return error( $r, $r->FORBIDDEN, 'Forbidden', "You are not authorized 
to retrieve this layer" )
+            unless $layeru->user eq "system" || $remote->can_manage( $layeru );
+
+        my $layerinfo = {};
+        LJ::S2::load_layer_info( $layerinfo, [ $layerid ] );
+        my $srcview = exists $layerinfo->{$layerid}->{source_viewable} ? 
$layerinfo->{$layerid}->{source_viewable} : 1;
+
+        # Disallow retrieval of protected system layers
+        return error( $r, $r->FORBIDDEN, 'Forbidden', "The requested layer is 
restricted" )
+            if $layeru->user eq "system" && ! $srcview;
+
+        my $s2code = LJ::S2::load_layer_source( $layerid );
+        $r->content_type( "application/x-danga-s2-layer" );
+        $r->print( $s2code );
+
+        return $r->OK;
+    } elsif ( $method eq 'PUT' ) {
+        return error( $r, $r->FORBIDDEN, 'Forbidden', 'You are not authorized 
to edit this layer' )
+            unless $remote->can_manage( $layeru );
+
+        return error( $r, $r->FORBIDDEN, 'Forbidden', 'Your account type is 
not allowed to edit layers' )
+            unless $remote->can_create_s2_styles;
+
+        # Read in the entity body to get the source
+        my $len = $r->header_in( "Content-length" ) + 0;
+
+        return error( $r, $r->HTTP_BAD_REQUEST, 'Bad Request', 'Supply S2 
layer code in the request entity body and set Content-length' )
+            unless $len;
+
+        return error( $r, $r->HTTP_UNSUPPORTED_MEDIA_TYPE, 'Unsupported Media 
Type', 'Request body must be of type application/x-danga-s2-layer' )
+            unless lc( $r->header_in( 'Content-type' ) ) eq 
'application/x-danga-s2-layer';
+
+        my $s2code;
+        $r->read( $s2code, $len );
+
+        my $error = "";
+        LJ::S2::layer_compile( $lay, \$error, { s2ref => \$s2code } );
+
+        if ( $error ) {
+            error( $r, $r->HTTP_INTERNAL_SERVER_ERROR, "Layer Compile Error", 
"An error was encountered while compiling the layer." );
+
+            ## Strip any absolute paths
+            $error =~ s/LJ::.+//s;
+            $error =~ s!, .+?(src/s2|cgi-bin)/!, !g;
+
+            $r->print( $error );
+            return $r->OK;
+        } else {
+            $r->status_line( "201 Compiled and Saved" );
+            $r->header_out( Location => "$LJ::SITEROOT/interface/s2/$layerid" 
);
+            $r->print( "Compiled and Saved\nThe layer was uploaded 
successfully.\n" );
+
+            return $r->OK;
+        }
+    } else {
+        # Return 'method not allowed' so that we can add methods in future
+        # and clients will get a sensible error from old servers.
+        return error( $r, $r->HTTP_METHOD_NOT_ALLOWED, 'Method Not Allowed', 
'Only GET and PUT are supported for this resource' );
+    }
+}
+
+sub error {
+    my ( $r, $code, $string, $long ) = @_;
+    
+    $r->status_line( "$code $string" );
+    $r->print( "$string\n$long\n" );
+
+    # Tell Apache OK so it won't try to handle the error
+    return $r->OK;
+}
+
+1;
_______________________________________________
dw-changelog mailing list
[email protected]
http://lists.dwscoalition.org/mailman/listinfo/dw-changelog

Reply via email to