Bläddra i källkod

Fully implement display names.

George Baugh 2 år sedan
förälder
incheckning
15e8b62e63

+ 39 - 1
bin/migrate6.pl

@@ -18,4 +18,42 @@ sub _dbh {
 
 my $dbh = _dbh();
 
-$dbh->do("ALTER TABLE user ADD COLUMN display_name TEXT DEFAULT NULL;");
+#$dbh->do("ALTER TABLE user ADD COLUMN display_name TEXT DEFAULT NULL;");
+
+# Update all the profile type posts to have correct display names
+use Trog::Auth;
+use JSON::MaybeXS;
+use File::Slurper;
+use URI::Escape;
+use Data::Dumper;
+
+my $global_changes;
+opendir(my $dh, 'data/files');
+while (my $entry = readdir $dh) {
+	my $fname = "data/files/$entry";
+	next unless -f $fname;
+	my $contents = File::Slurper::read_binary($fname);
+	my $decoded = JSON::MaybeXS::decode_json($contents);
+	next unless List::Util::any { $_->{is_profile} } @$decoded;
+
+	# If the title on the profile post responsds to a username, then let's change that to a display name
+	my $made_changes;
+	foreach my $revision (@$decoded) {
+		my $user = $revision->{title};
+		my $display_name = Trog::Auth::username2display($user);
+		next unless $display_name;
+		print "converting $user to display name $display_name\n";
+		$revision->{title}      = $display_name;
+		$revision->{local_href} = "/users/$display_name";
+		$made_changes = 1;
+	}
+	next unless $made_changes;
+	
+	print "Writing changes to $fname\n";
+	my $encoded = JSON::MaybeXS::encode_json($decoded);
+	File::Slurper::write_binary($fname, $encoded);
+
+	# Next, waste and rebuild the posts index for these user posts
+	$global_changes=1;
+}
+print "Changes made.  Please rebuild the posts index.\n" if $global_changes;

+ 15 - 0
lib/Trog/Auth.pm

@@ -83,6 +83,21 @@ sub email4user ($user) {
     return $rows->[0]{contact_email};
 }
 
+sub display2username ($display_name) {
+    my $dbh  = _dbh();
+    my $rows = $dbh->selectall_arrayref( "SELECT name FROM user WHERE display_name=?", { Slice => {} }, $display_name );
+    return '' unless ref $rows eq 'ARRAY' && @$rows;
+    return $rows->[0]{name};
+}
+
+sub username2display ($name) {
+    my $dbh  = _dbh();
+    my $rows = $dbh->selectall_arrayref( "SELECT display_name FROM user WHERE name=?", { Slice => {} }, $name );
+    return '' unless ref $rows eq 'ARRAY' && @$rows;
+    return $rows->[0]{display_name};
+}
+
+
 =head2 acls4user(STRING username) = ARRAYREF
 
 Return the list of ACLs belonging to the user.

+ 9 - 2
lib/Trog/DataModule.pm

@@ -98,6 +98,7 @@ sub _fixup ( $self, @filtered ) {
         my $subj = $_;
         foreach my $param (qw{href preview video_href audio_href local_href wallpaper}) {
             next unless exists $subj->{$param};
+            #XXX I don't remember what this fixes, but it also breaks things.  URI::Escape usage instead is indicated.
             $subj->{$param} =~ s/ /%20/g;
         }
 
@@ -105,7 +106,12 @@ sub _fixup ( $self, @filtered ) {
         my $is_user_page = List::Util::any { $_ eq 'about' } @{ $subj->{tags} };
         if ( !exists $subj->{local_href} ) {
             $subj->{local_href} = "/posts/$subj->{id}";
-            $subj->{local_href} = "/users/$subj->{user}" if $is_user_page;
+            #XXX this needs to be correctly populated in the form?
+            if ($is_user_page) {
+                my $display_name = $subj->{display_name} || Trog::Auth::username2display($subj->{user});
+                die "No display name for user!" unless $display_name;
+                $subj->{local_href} = "/users/$display_name";
+            }
         }
         if ( !exists $subj->{callback} ) {
             $subj->{callback} = "Trog::Routes::HTML::posts";
@@ -261,7 +267,8 @@ sub add ( $self, @posts ) {
 
         # If this is a user creation post, add in the /user/ route
         if ( $post->{callback} eq 'Trog::Routes::HTML::users' ) {
-            $post->{local_href} = "/users/$post->{user}";
+            $post->{local_href} //= "/users/$post->{display_name}";
+            $post->{title}      //= $post->{display_name};
         }
 
         $post->{local_href} //= "/posts/$post->{id}";

+ 13 - 5
lib/Trog/Routes/HTML.pm

@@ -18,6 +18,7 @@ use IO::Compress::Gzip;
 use Path::Tiny();
 use File::Basename qw{dirname};
 use URI();
+use URI::Escape();
 
 use FindBin::libs;
 
@@ -48,6 +49,7 @@ our $categorybar  = 'categories.tx';
 our %routes = (
     default => {
         callback => \&Trog::Routes::HTML::setup,
+		noindex  => 1,
     },
     '/index' => {
         method   => 'GET',
@@ -508,7 +510,7 @@ sub login ($query) {
 
             # Add a stub user page and the initial series.
             my $dat = Trog::Data->new($conf);
-            _setup_initial_db( $dat, $query->{username} );
+            _setup_initial_db( $dat, $query->{username}, $query->{display_name}, $query->{contact_email} );
 
             # Ensure we stop registering new users
             File::Touch::touch("config/has_users");
@@ -548,7 +550,7 @@ sub login ($query) {
     );
 }
 
-sub _setup_initial_db ( $dat, $user ) {
+sub _setup_initial_db ( $dat, $user, $display_name, $contact_email ) {
     $dat->add(
         {
             "aclname"    => "series",
@@ -601,14 +603,16 @@ sub _setup_initial_db ( $dat, $user ) {
             aliases        => [],
         },
         {
-            title      => $user,
+            title      => $display_name,
             data       => 'Default user',
             preview    => '/img/avatar/humm.gif',
             wallpaper  => '/img/sys/testpattern.jpg',
             tags       => ['about'],
             visibility => 'public',
             acls       => ['admin'],
-            local_href => "/users/$user",
+            local_href => "/users/$display_name",
+			display_name => $display_name,
+			contact_email => $contact_email,
             callback   => "Trog::Routes::HTML::users",
             method     => 'GET',
             user       => $user,
@@ -977,7 +981,11 @@ Implements direct user profile view.
 sub users ($query) {
 
     # Capture the username
-    my ( undef, undef, $username ) = split( /\//, $query->{route} );
+    my ( undef, undef, $display_name ) = split( /\//, $query->{route} );
+	$display_name = URI::Escape::uri_unescape($display_name);
+
+	my $username = Trog::Auth::display2username($display_name);
+	return notfound($query) unless $username;
 
     $query->{username} //= $username;
     push( @{ $query->{user_acls} }, 'public' );

+ 3 - 1
lib/Trog/SQLite/TagIndex.pm

@@ -6,6 +6,7 @@ use warnings;
 no warnings 'experimental';
 use feature qw{signatures};
 
+use URI::Escape;
 use List::Util qw{uniq};
 use Trog::SQLite;
 
@@ -33,7 +34,8 @@ sub routes {
     my $rows = $dbh->selectall_arrayref( "SELECT id, route, method, callback FROM all_routes", { Slice => {} } );
     return () unless ref $rows eq 'ARRAY' && @$rows;
 
-    my %routes = map { $_->{route} => $_ } @$rows;
+    #XXX not sure how this gets escaped going in.
+    my %routes = map { URI::Escape::uri_unescape($_->{route}) => $_ } @$rows;
     return %routes;
 }
 

+ 2 - 2
www/templates/html/components/forms/profile.tx

@@ -25,8 +25,8 @@
     <form class="Submissions" action="/profile" method="POST" enctype="multipart/form-data">
         Username *<br /><input required class="cooltext" type="text" name="username" placeholder="AzureDiamond" value="<: $post.user :>" />
         Password *<br /><input <: $post.user ? '' : 'required' :> class="cooltext" type="password" name="password" placeholder="hunter2" />
-        Display Name *<br /><input  <: $post.user ? '' : 'required' :> class="cooltext" type="text" name="display_name" placeholder="Mr. President" />
-        Contact Email *<br /><input <: $post.user ? '' : 'required' :> class="cooltext" type="text" name="contact_email" placeholder="test@test.test" />
+        Display Name *<br /><input  <: $post.user ? '' : 'required' :> class="cooltext" type="text" name="display_name" placeholder="Mr. President" value="<: $post.display_name :>" />
+        Contact Email *<br /><input <: $post.user ? '' : 'required' :> class="cooltext" type="text" name="contact_email" placeholder="test@test.test" value="<: $post.contact_email :>" />
         Avatar *<br /><input class="cooltext" type="file" name="preview_file" />
         : if ( $post.preview ) {
         <input type="hidden" name="preview" value="<: $post.preview :>" />