From: Jakub Narebski <jnareb@gmail.com>
To: Kacper Kornet <draenog@pld-linux.org>
Cc: git@vger.kernel.org
Subject: [PATCH] gitweb: Improve repository verification
Date: Thu, 19 Apr 2012 18:07:31 +0200 [thread overview]
Message-ID: <201204191807.32410.jnareb@gmail.com> (raw)
In-Reply-To: <201204180136.08570.jnareb@gmail.com>
Bring repository verification in check_export_ok() to standards of
is_git_directory function from setup.c (core git), and validate_headref()
to standards of the same function in path.c,... and a bit more.
validate_headref() replaces check_head_link(); note that the former
requires path to HEAD file, while the late latter path to repository.
Issues of note:
* is_git_directory() in gitweb is a bit stricter: it checks that
"/objects" and "/refs" are directories, and not only 'executable'
permission,
* validate_headref() in gitweb is a bit stricter: it checks that
reference symlink or symref points to starts with "refs/heads/",
and not only with "refs/",
* calls to check_head_link(), all of which were meant to check if
given directory can be a git repository, were replaced by newly
introduced is_git_directory().
This change is preparation for removing "Last change" column from list
of projects, which is currently used also for validating repository.
Suggested-by: Kacper Kornet <draenog@pld-linux.org>
Signed-off-by: Jakub Narebski <jnareb@gmail.com>
---
Here is how such first step could look like...
gitweb/gitweb.perl | 52 ++++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 42 insertions(+), 10 deletions(-)
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index 098e527..767d7a5 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -621,19 +621,51 @@ sub feature_avatar {
return @val ? @val : @_;
}
-# checking HEAD file with -e is fragile if the repository was
-# initialized long time ago (i.e. symlink HEAD) and was pack-ref'ed
-# and then pruned.
-sub check_head_link {
- my ($dir) = @_;
- my $headfile = "$dir/HEAD";
- return ((-e $headfile) ||
- (-l $headfile && readlink($headfile) =~ /^refs\/heads\//));
+# Test if it looks like we're at a git directory.
+# We want to see:
+#
+# - an objects/ directory,
+# - a refs/ directory,
+# - either a HEAD symlink or a HEAD file that is formatted as
+# a proper "ref:", or a regular file HEAD that has a properly
+# formatted sha1 object name.
+#
+# See is_git_directory() in setup.c
+sub is_git_directory {
+ my $dir = shift;
+ return
+ -x "$dir/objects" && -d _ &&
+ -x "$dir/refs" && -d _ &&
+ validate_headref("$dir/HEAD");
+}
+
+# Check HEAD file, that it is either
+#
+# - a "refs/heads/.." symlink, or
+# - a symbolic ref to "refs/heads/..", or
+# - a detached HEAD.
+#
+# See validate_headref() in path.c
+sub validate_headref {
+ my $headfile = shift;
+ if (-l $headfile) {
+ return readlink($headfile) =~ m!^refs/heads/!;
+
+ } elsif (-e _) {
+ open my $fh, '<', $headfile or return;
+ my $line = <$fh>;
+ close $fh or return;
+
+ return
+ $line =~ m!^ref:\s*refs/heads/! || # symref
+ $line =~ m!^[0-9a-z]{40}$!i; # detached HEAD
+ }
+ return;
}
sub check_export_ok {
my ($dir) = @_;
- return (check_head_link($dir) &&
+ return (is_git_directory($dir) &&
(!$export_ok || -e "$dir/$export_ok") &&
(!$export_auth_hook || $export_auth_hook->($dir)));
}
@@ -842,7 +874,7 @@ sub evaluate_path_info {
# find which part of PATH_INFO is project
my $project = $path_info;
$project =~ s,/+$,,;
- while ($project && !check_head_link("$projectroot/$project")) {
+ while ($project && !is_git_directory("$projectroot/$project")) {
$project =~ s,/*[^/]*$,,;
}
return unless $project;
--
1.7.9
next prev parent reply other threads:[~2012-04-19 16:07 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-04-03 13:27 [PATCH] gitweb: Option to omit column with time of the last change Kacper Kornet
2012-04-03 23:12 ` Jakub Narebski
2012-04-04 6:39 ` Kacper Kornet
2012-04-04 14:31 ` Jakub Narebski
2012-04-04 16:22 ` Kacper Kornet
2012-04-14 13:16 ` Jakub Narebski
2012-04-16 10:12 ` Kacper Kornet
2012-04-16 20:06 ` Jakub Narebski
2012-04-16 21:39 ` Kacper Kornet
2012-04-17 23:36 ` Jakub Narebski
2012-04-19 16:07 ` Jakub Narebski [this message]
2012-04-19 18:30 ` [PATCH] gitweb: Improve repository verification Junio C Hamano
2012-04-19 19:46 ` Jakub Narebski
2012-04-21 11:28 ` Jakub Narebski
2012-04-24 17:39 ` [PATCH 1/2] gitweb: Option to omit column with time of the last change Kacper Kornet
2012-04-24 17:41 ` [PATCH 2/2] gitweb: Option to not display information about owner Kacper Kornet
2012-04-26 4:39 ` Junio C Hamano
2012-04-26 15:07 ` Kacper Kornet
2012-04-26 15:53 ` Junio C Hamano
2012-04-26 16:35 ` Kacper Kornet
2012-04-26 16:45 ` [PATCH v2 " Kacper Kornet
2012-04-24 17:36 ` [PATCH] gitweb: Option to omit column with time of the last change Kacper Kornet
2012-04-04 17:14 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201204191807.32410.jnareb@gmail.com \
--to=jnareb@gmail.com \
--cc=draenog@pld-linux.org \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).