From 65ba4893d48b0c9d30d01afa40f6ad19b239709c Mon Sep 17 00:00:00 2001 From: Thomas Schwery Date: Tue, 14 Sep 2010 10:51:22 +0200 Subject: [PATCH] Tags are semi-ok, error msg correct, security against exploration --- gopher.pl | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/gopher.pl b/gopher.pl index a5936ee..26c0fae 100644 --- a/gopher.pl +++ b/gopher.pl @@ -36,6 +36,8 @@ die "Unable to open port: $! \n" unless $socket; drop_privileges('nobody'); +our %tags_entries; + while (1) { my $listen_socket = $socket->accept(); my $thr = threads->create(\&connection_thread, $listen_socket); @@ -50,18 +52,23 @@ sub connection_thread { my $directory = $_; $directory =~ s/^blog\///; + $directory =~ s/[.\/]//g; $directory = $basedir . "/" . $directory; + $directory =~ s/\/$//; if (-f $directory) { $listen_socket->send(send_blog_entry($directory)); } else { my $header = generate_header($directory); my $blog_entries = list_blog_entries($directory); + my $tags_entries = list_entries_by_tag($directory); $listen_socket->send($header . "\r\n"); $listen_socket->send("\r\n"); $listen_socket->send("i----- Blog entries ---------------\tfake\tfake\t0\r\n"); $listen_socket->send($blog_entries . "\r\n"); + $listen_socket->send("i----- Blog entries by tags---------------\tfake\tfake\t0\r\n"); + $listen_socket->send($tags_entries . "\r\n"); $listen_socket->send("\r\n.\r\n"); } @@ -82,7 +89,7 @@ sub generate_header { $message .= "i" . $_ . "\tfake\tfake\t0\r\n"; } close FILE; - $message .= "0About this gopher server\theader\tlocalhost\t" . $port . "\r\n"; + $message .= "0About this gopher server\theader\t" . $server . "\t" . $port . "\r\n"; return $message; } @@ -107,7 +114,7 @@ sub filter_content { sub list_blog_entries { my ($blog_dir) = @_; unless (opendir(IMD, $blog_dir)) { - die("Fuck you all ..."); + die("Requested file or directory not readable : $blog_dir "); } my @files = readdir(IMD); closedir(IMD); @@ -119,11 +126,23 @@ sub list_blog_entries { return join("\r\n", @files); } +sub list_entries_by_tag { + my $entries; + foreach my $tag (sort keys %tags_entries) { + $entries .= "i----- " . $tag . " ---------------\tfake\tfake\t0\r\n"; + foreach my $entry ($tags_entries{$tag}) { + my ($entry_dir, $entry_name) = split '/',$entry; + $entries .= map_blog_entry($entry_name, $entry_dir) . "\r\n"; + } + } + return $entries; +} + sub sort_entry_line { my $a_date = $2 if ($a =~ m/^0(\[.*\]\s)?(.*?)\s*-.*$/); my $b_date = $2 if ($b =~ m/^0(\[.*\]\s)?(.*?)\s*-.*$/); - return str2time($a_date) <=> str2time($b_date); + return -(str2time($a_date) <=> str2time($b_date)); } sub read_entry_file { @@ -141,6 +160,12 @@ sub read_entry_file { } close ENTRY; + my @tag_list = split ',',$tags; + + foreach my $tag (@tag_list) { + $tags_entries{$tag} = $entry_file; + } + my $time = str2time($date_file); my $date = time2str("%o %h %Y", $time); return "[" . $tags . "] " . $date . " - " . $subject if($tags);