2009-05-05 11 views
12

मैंने गिट और गिटोसिस स्थापित किया है और मुझे एक चेक जोड़ने की जरूरत है कि उपयोगकर्ता नाम को भंडार में धक्का दिया जाता है।गिट/गिटोसिस: उपयोगकर्ता नाम और ईमेल की वैधता की जांच कैसे करें?

मुझे लगता है कि प्री-प्राप्त हुक यह जगह रखने के लिए सही हुक है, लेकिन मैं असली उपयोगकर्ता नाम और ईमेल पता नहीं ढूंढ पा रहा हूं जो गिटोसिस रिपोजिटरी में प्रवेश करता है (गिट कॉन्फ़िगरेशन user.name द्वारा सेट किए गए हैं और गिट कॉन्फ़िगरेशन user.email) पर्यावरण चर से। LOGNAME और USER दोनों 'गिट' हैं। गिटोसिस इस जानकारी का पता कैसे लगाता है और क्या मैं इसे पूर्व-प्राप्त हुक में भी ढूंढ सकता हूं?

उत्तर

9

हम्म, githooks(5) से मैं जो इकट्ठा करता हूं उससे pre-receive हुक stdin पर अपडेट किए गए रेफ को खिलाया जाता है।

#!/bin/sh 

while read old new name; do 
    email=$(git log -1 --pretty=format:%ae $new) 
    # check email 
done 

आप ईमेल पतों की जांच करने की आवश्यकता होगी (हो सकता है डेटा की एक पंक्ति से अधिक) है और उसके अनुसार स्क्रिप्ट बाहर निकलते हैं, अर्थात exit 0 सफलता के लिए और जैसे विफलता के लिए exit 1

+0

ठीक है, कि वास्तव में मेरे सवाल का जवाब लेकिन वास्तव में मेरे सवाल का सही एक नहीं था :(क्या मैं सच में देख रहा है की जरूरत है ईमेल पता गिटोसिस एसएसएच कुंजी से मेल खाने के लिए उपयोग करता है। कारण: हमारे पास एक ऑटोबूल्ड सिस्टम है जिसमें सीमित पहुंच है। हर कोई रिपोजिटरी को लिख सकता है (इसलिए गिटोसिस एक्सेस मदद नहीं करता है), लेकिन केवल कुछ को बनाने की अनुमति है। आइए मान लें कि मुझे बनाने की अनुमति है। किसी और को केवल ईमेल पता (गिट कॉन्फ़िगर उपयोगकर्ता) को बदलने की आवश्यकता है।ईमेल) मेरे लिए और उसे भी पहुंच प्रदान की जाती है। मुझे इसे रोकने के लिए एसएसएच कुंजी की जांच करने के लिए गिटोसिस द्वारा उपयोग किए गए ईमेल पते की जांच करनी होगी। – Makis

+0

मैंने कभी भी गिटोसिस के साथ काम नहीं किया है, इसलिए मैं आपकी मदद नहीं कर सकता, क्षमा करें। – Bombe

+0

क्षमा करें, मैंने परीक्षण किया है और जहां तक ​​मैं कह सकता हूं, यह पूर्व-प्राप्त में काम नहीं करता है, क्योंकि लॉग केवल घटनाओं को आयोजित करता है। – Makis

1

os.environ जोड़ा जा रहा है [ 'WHATVER_USER'] = पर ~ लाइन 202 serve.py चाल करना चाहिए में ...

5

ठीक है, हम काम कर पाने में कामयाब रहे उपयोगकर्ता, ऊपर Bombe के जवाब बहुत मदद की । यह है कि यह कैसे किया गया था:

  • मैं Gitosis/Serve.py, समारोह मुख्य() के लिए [ 'GITOSIS_USER'] = उपयोगकर्ता os.environ को जोड़ कर उसे पुनर्स्थापित।

hooks/pre-receive

#!/usr/bin/perl 

my $user = $ENV{'GITOSIS_USER'}; 

if ($user !~ m/^[^@][email protected][^@]+$/) { 
    print STDERR "Unknown user. Not running under Gitosis?\n"; 
    exit 1; 
} 

my $fail = 0; 

while(<STDIN>) { 
    if (m/^([0-9a-f]+)\s+([0-9a-f]+)\s+(\S+)$/) { 

    my $oldver = $1; 
    my $curver = $2; 
    my $ref = $3; 

    my $ret = open (FH, "-|", "git", "rev-list", '--pretty=format:%H:%ae:%ce',$ 

    if ($ret) { 
     # great and less brakets hidden in HTML: &gt;FH&lt; 
     while (<FH>) { 
     chomp; 
     my $line = $_; 
     if ($_ !~ m/commit /) { 
      my ($rev, $author, $committer) = split(":", $line); 
      if ($author ne $user && $committer ne $user) { 
      print STDERR "Unauthorized commit: $rev\n"; 
      $fail++; 
      } 
     } 
     } 
    } 
    } 
} 

if ($fail) { 
    exit 1; 
} 

exit 0; 

इसका मतलब यह है उपयोगकर्ता नाम gitosis कुंजी अंगूठी के लिए ssh कुंजी बनाने के लिए इस्तेमाल एक के रूप में ही हो गया है:

  • मैं उसके बाद निम्न पूर्व प्राप्त स्क्रिप्ट बनाया।

  • 2

    वह स्क्रिप्ट कई मायनों में टूट गई है। सबसे पहले, खुली() लाइन काट दिया जाता है। मैंने इसे ठीक करने के बाद, स्क्रिप्ट पहली बार एक अनंत लूप में चला गया(), गिट-रेव-सूची को कॉल करने का भी प्रयास नहीं कर रहा था।

    hooks/pre-receive

    #!/usr/bin/perl 
    
    my $user = $ENV{'GITOSIS_USER'}; 
    
    if ($user !~ m/^[^@][email protected][^@]+$/) { 
        print STDERR "Unknown user. Not running under Gitosis?\n"; 
        exit 1; 
    } 
    
    my $fail = 0; 
    
    while(<STDIN>) { 
        if (m/^([0-9a-f]+)\s+([0-9a-f]+)\s+(\S+)$/) { 
    
        my $oldver = $1; 
        my $curver = $2; 
        my $ref = $3; 
    
        my $ret = open (FH, "-|", "git", "rev-list", '-- pretty=format:%H:%ae:%ce',"$oldver..$curver"); 
    
        if ($ret) { 
         while (<FH>) { 
         chomp; 
         my $line = $_; 
         if ($_ !~ m/commit /) { 
          my ($rev, $author, $committer) = split(":", $line); 
          if ($author ne $user && $committer ne $user) { 
          print STDERR "Unauthorized commit: $rev\n"; 
          print STDERR "You must specify Author and Committer.\n"; 
          print STDERR "Specified a/c: $author/$committer\n"; 
          print STDERR "Expected user: $user\n"; 
          $fail++; 
          } 
         } 
         } 
        } 
        } 
    } 
    
    if ($fail) { 
        exit 1; 
    } 
    
    exit 0; 
    

    0

    आप <gitosis-path>/.ssh/authorized_keys की जाँच करें और देख सकते हैं::

    मेरे मित्रों से थोड़ी मदद के साथ

    , मैं यह थोड़ा सजाना करने में कामयाब रहे

    command="gitosis-serve [email protected]",... 
    
    sshd और पाया के लिए

    पढ़ें आदमी : command="command" के बाद आप सार्वजनिक ssh कुंजी के लिए वांछित उपयोगकर्ता नाम सेट करने के लिए environment="NAME=value" विकल्प जोड़ सकते हैं। और Gitosis/Serve.py संपादन आवश्यक है।

    पर्यावरण प्रसंस्करण डिफ़ॉल्ट रूप से अक्षम और PermitUserEnvironment विकल्प के माध्यम से नियंत्रित किया जाता है:

    sudo echo "PermitUserEnvironment yes" >> /etc/ssh/sshd_config 
    
    संबंधित मुद्दे