github.com/git-lfs/git-lfs@v2.5.2+incompatible/t/t-credentials.sh (about)

     1  #!/usr/bin/env bash
     2  
     3  . "$(dirname "$0")/testlib.sh"
     4  
     5  ensure_git_version_isnt $VERSION_LOWER "2.3.0"
     6  
     7  begin_test "credentails with url-specific helper skips askpass"
     8  (
     9    set -e
    10  
    11    reponame="url-specific-helper"
    12    setup_remote_repo "$reponame"
    13  
    14    clone_repo "$reponame" "$reponame"
    15    git config credential.useHttpPath false
    16    git config credential.helper ""
    17    git config credential.$GITSERVER.helper "lfstest"
    18  
    19    git lfs track "*.dat"
    20    echo "hello" > a.dat
    21  
    22    git add .gitattributes a.dat
    23    git commit -m "initial commit"
    24  
    25    # askpass is skipped
    26    GIT_ASKPASS="lfs-bad-cmd" GIT_TRACE=1 git push origin master 2>&1 | tee push.log
    27  
    28    [ "0" -eq "$(grep "filling with GIT_ASKPASS" push.log | wc -l)" ]
    29  )
    30  end_test
    31  
    32  begin_test "credentials without useHttpPath, with bad path password"
    33  (
    34    set -e
    35  
    36    reponame="no-httppath-bad-password"
    37    setup_remote_repo "$reponame"
    38  
    39    printf "path:wrong" > "$CREDSDIR/127.0.0.1--$reponame"
    40  
    41    clone_repo "$reponame" without-path
    42    git config credential.useHttpPath false
    43    git checkout -b without-path
    44  
    45    git lfs track "*.dat" 2>&1 | tee track.log
    46    grep "Tracking \"\*.dat\"" track.log
    47  
    48    printf "a" > a.dat
    49    git add a.dat
    50    git add .gitattributes
    51    git commit -m "add a.dat"
    52  
    53    GIT_TRACE=1 git push origin without-path 2>&1 | tee push.log
    54    grep "Uploading LFS objects: 100% (1/1), 1 B" push.log
    55  
    56    echo "approvals:"
    57    [ "1" -eq "$(cat push.log | grep "creds: git credential approve" | wc -l)" ]
    58    echo "fills:"
    59    [ "1" -eq "$(cat push.log | grep "creds: git credential fill" | wc -l)" ]
    60  
    61    echo "credential calls have no path:"
    62    credcalls="$(grep "creds: git credential" push.log)"
    63    [ "0" -eq "$(echo "$credcalls" | grep "no-httppath-bad-password" | wc -l)" ]
    64    expected="$(echo "$credcalls" | wc -l)"
    65    [ "$expected" -eq "$(printf "$credcalls" | grep '", "")' | wc -l)" ]
    66  )
    67  end_test
    68  
    69  begin_test "credentials with url-specific useHttpPath, with bad path password"
    70  (
    71    set -e
    72  
    73    reponame="url-specific-httppath-bad-password"
    74    setup_remote_repo "$reponame"
    75  
    76    printf "path:wrong" > "$CREDSDIR/127.0.0.1--$reponame"
    77  
    78    clone_repo "$reponame" with-url-specific-path
    79    git config credential.$GITSERVER.useHttpPath false
    80    git config lfs.locksverify false
    81    git checkout -b without-path
    82  
    83    git lfs track "*.dat" 2>&1 | tee track.log
    84    grep "Tracking \"\*.dat\"" track.log
    85  
    86    printf "a" > a.dat
    87    git add a.dat
    88    git add .gitattributes
    89    git commit -m "add a.dat"
    90  
    91    GIT_TRACE=1 git push origin without-path 2>&1 | tee push.log
    92    grep "Uploading LFS objects: 100% (1/1), 1 B" push.log
    93  
    94    echo "approvals:"
    95    [ "1" -eq "$(cat push.log | grep "creds: git credential approve" | wc -l)" ]
    96    echo "fills:"
    97    [ "1" -eq "$(cat push.log | grep "creds: git credential fill" | wc -l)" ]
    98  )
    99  end_test
   100  
   101  begin_test "credentials with useHttpPath, with wrong password"
   102  (
   103    set -e
   104  
   105    reponame="httppath-bad-password"
   106    setup_remote_repo "$reponame"
   107  
   108    printf "path:wrong" > "$CREDSDIR/127.0.0.1--$reponame"
   109  
   110    clone_repo "$reponame" with-path-wrong-pass
   111    git checkout -b with-path-wrong-pass
   112  
   113    git lfs track "*.dat" 2>&1 | tee track.log
   114    grep "Tracking \"\*.dat\"" track.log
   115  
   116    contents="a"
   117    contents_oid=$(calc_oid "$contents")
   118  
   119    printf "$contents" > a.dat
   120    git add a.dat
   121    git add .gitattributes
   122    git commit -m "add a.dat"
   123  
   124    GIT_TRACE=1 git push origin with-path-wrong-pass 2>&1 | tee push.log
   125    [ "0" = "$(grep -c "Uploading LFS objects: 100% (1/1), 0 B" push.log)" ]
   126    echo "approvals:"
   127    [ "0" -eq "$(cat push.log | grep "creds: git credential approve" | wc -l)" ]
   128    echo "fills:"
   129    [ "2" -eq "$(cat push.log | grep "creds: git credential fill" | wc -l)" ]
   130  )
   131  end_test
   132  
   133  begin_test "credentials with useHttpPath, with correct password"
   134  (
   135    set -e
   136  
   137    reponame="$(basename "$0" ".sh")"
   138    setup_remote_repo "$reponame"
   139  
   140    printf "path:$reponame" > "$CREDSDIR/127.0.0.1--$reponame"
   141  
   142    clone_repo "$reponame" with-path-correct-pass
   143    git checkout -b with-path-correct-pass
   144  
   145    git lfs track "*.dat" 2>&1 | tee track.log
   146    grep "Tracking \"\*.dat\"" track.log
   147  
   148    # creating new branch does not re-send any objects existing on other
   149    # remote branches anymore, generate new object, different from prev tests
   150    contents="b"
   151    contents_oid=$(calc_oid "$contents")
   152  
   153    printf "$contents" > b.dat
   154    git add b.dat
   155    git add .gitattributes
   156    git commit -m "add b.dat"
   157  
   158    GIT_TRACE=1 git push origin with-path-correct-pass 2>&1 | tee push.log
   159    grep "Uploading LFS objects: 100% (1/1), 1 B" push.log
   160    echo "approvals:"
   161    [ "1" -eq "$(cat push.log | grep "creds: git credential approve" | wc -l)" ]
   162    echo "fills:"
   163    [ "1" -eq "$(cat push.log | grep "creds: git credential fill" | wc -l)" ]
   164    echo "credential calls have path:"
   165    credcalls="$(grep "creds: git credential" push.log)"
   166    [ "0" -eq "$(echo "$credcalls" | grep '", "")' | wc -l)" ]
   167    expected="$(echo "$credcalls" | wc -l)"
   168    [ "$expected" -eq "$(printf "$credcalls" | grep "t-credentials" | wc -l)" ]
   169  )
   170  end_test
   171  
   172  begin_test "git credential"
   173  (
   174    set -e
   175  
   176    printf "git:server" > "$CREDSDIR/credential-test.com"
   177    printf "git:path" > "$CREDSDIR/credential-test.com--some-path"
   178  
   179    mkdir empty
   180    cd empty
   181    git init
   182  
   183    echo "protocol=http
   184  host=credential-test.com
   185  path=some/path" | GIT_TERMINAL_PROMPT=0 git credential fill > cred.log
   186    cat cred.log
   187  
   188    expected="protocol=http
   189  host=credential-test.com
   190  path=some/path
   191  username=git
   192  password=path"
   193  
   194    [ "$expected" = "$(cat cred.log)" ]
   195  
   196    git config credential.useHttpPath false
   197  
   198    echo "protocol=http
   199  host=credential-test.com" | GIT_TERMINAL_PROMPT=0 git credential fill > cred.log
   200    cat cred.log
   201  
   202    expected="protocol=http
   203  host=credential-test.com
   204  username=git
   205  password=server"
   206    [ "$expected" = "$(cat cred.log)" ]
   207  
   208    echo "protocol=http
   209  host=credential-test.com
   210  path=some/path" | GIT_TERMINAL_PROMPT=0 git credential fill > cred.log
   211    cat cred.log
   212  
   213    expected="protocol=http
   214  host=credential-test.com
   215  username=git
   216  password=server"
   217  
   218    [ "$expected" = "$(cat cred.log)" ]
   219  )
   220  end_test
   221  
   222  
   223  if [[ $(uname) == *"MINGW"* ]]; then
   224    NETRCFILE="$HOME/_netrc"
   225  else
   226    NETRCFILE="$HOME/.netrc"
   227  fi
   228  
   229  
   230  begin_test "credentials from netrc"
   231  (
   232    set -e
   233  
   234    printf "machine localhost\nlogin netrcuser\npassword netrcpass\n" >> "$NETRCFILE"
   235    echo $HOME
   236    echo "GITSERVER $GITSERVER"
   237    cat $NETRCFILE
   238  
   239    # prevent prompts on Windows particularly
   240    export SSH_ASKPASS=
   241  
   242    reponame="netrctest"
   243    setup_remote_repo "$reponame"
   244  
   245    clone_repo "$reponame" repo
   246  
   247    # Need a remote named "localhost" or 127.0.0.1 in netrc will interfere with the other auth
   248    git remote add "netrc" "$(echo $GITSERVER | sed s/127.0.0.1/localhost/)/netrctest"
   249    git lfs env
   250  
   251    git lfs track "*.dat"
   252    echo "push a" > a.dat
   253    git add .gitattributes a.dat
   254    git commit -m "add a.dat"
   255  
   256    GIT_TRACE=1 git lfs push netrc master 2>&1 | tee push.log
   257    grep "Uploading LFS objects: 100% (1/1), 7 B" push.log
   258    echo "any git credential calls:"
   259    [ "0" -eq "$(cat push.log | grep "git credential" | wc -l)" ]
   260  )
   261  end_test
   262  
   263  begin_test "credentials from netrc with unknown keyword"
   264  (
   265    set -e
   266  
   267    printf "machine localhost\nlogin netrcuser\nnot-a-key something\npassword netrcpass\n" >> "$NETRCFILE"
   268    echo $HOME
   269    echo "GITSERVER $GITSERVER"
   270    cat $NETRCFILE
   271  
   272    # prevent prompts on Windows particularly
   273    export SSH_ASKPASS=
   274  
   275    reponame="netrctest"
   276    setup_remote_repo "$reponame"
   277  
   278    clone_repo "$reponame" repo2
   279  
   280    # Need a remote named "localhost" or 127.0.0.1 in netrc will interfere with the other auth
   281    git remote add "netrc" "$(echo $GITSERVER | sed s/127.0.0.1/localhost/)/netrctest"
   282    git lfs env
   283  
   284    git lfs track "*.dat"
   285    echo "push a" > a.dat
   286    git add .gitattributes a.dat
   287    git commit -m "add a.dat"
   288  
   289    GIT_TRACE=1 git lfs push netrc master 2>&1 | tee push.log
   290    grep "Uploading LFS objects: 100% (1/1), 7 B" push.log
   291    echo "any git credential calls:"
   292    [ "0" -eq "$(cat push.log | grep "git credential" | wc -l)" ]
   293  )
   294  end_test
   295  
   296  begin_test "credentials from netrc with bad password"
   297  (
   298    set -e
   299  
   300    printf "machine localhost\nlogin netrcuser\npassword badpass\n" >> "$NETRCFILE"
   301    echo $HOME
   302    echo "GITSERVER $GITSERVER"
   303    cat $NETRCFILE
   304  
   305    # prevent prompts on Windows particularly
   306    export SSH_ASKPASS=
   307  
   308    reponame="netrctest"
   309    setup_remote_repo "$reponame"
   310  
   311    clone_repo "$reponame" repo3
   312  
   313    # Need a remote named "localhost" or 127.0.0.1 in netrc will interfere with the other auth
   314    git remote add "netrc" "$(echo $GITSERVER | sed s/127.0.0.1/localhost/)/netrctest"
   315    git lfs env
   316  
   317    git lfs track "*.dat"
   318    echo "push a" > a.dat
   319    git add .gitattributes a.dat
   320    git commit -m "add a.dat"
   321  
   322    git push netrc master 2>&1 | tee push.log
   323    [ "0" = "$(grep -c "Uploading LFS objects: 100% (1/1), 7 B" push.log)" ]
   324  )
   325  end_test
   326  
   327  begin_test "credentials from lfs.url"
   328  (
   329    set -e
   330  
   331    reponame="requirecreds-lfsurl"
   332    setup_remote_repo "$reponame"
   333    clone_repo "$reponame" "$reponame"
   334  
   335    git lfs track "*.dat"
   336    echo "push a" > a.dat
   337    git add .gitattributes a.dat
   338    git commit -m "add a.dat"
   339  
   340    echo "bad push"
   341    git lfs env
   342    git lfs push origin master 2>&1 | tee push.log
   343    grep "Uploading LFS objects:   0% (0/1), 0 B" push.log
   344  
   345    echo "good push"
   346    gitserverhost=$(echo "$GITSERVER" | cut -d'/' -f3)
   347    git config lfs.url http://requirecreds:pass@$gitserverhost/$reponame.git/info/lfs
   348    git lfs env
   349    git lfs push origin master 2>&1 | tee push.log
   350    grep "Uploading LFS objects:   0% (0/1), 0 B" push.log
   351  
   352    echo "bad fetch"
   353    rm -rf .git/lfs/objects
   354    git config lfs.url http://$gitserverhost/$reponame.git/info/lfs
   355    git lfs env
   356    git lfs fetch --all 2>&1 | tee fetch.log
   357    grep "Downloading LFS objects:   0% (0/1), 0 B" fetch.log
   358  
   359    echo "good fetch"
   360    rm -rf .git/lfs/objects
   361    git config lfs.url http://requirecreds:pass@$gitserverhost/$reponame.git/info/lfs
   362    git lfs env
   363    git lfs fetch --all 2>&1 | tee fetch.log
   364    grep "Downloading LFS objects: 100% (1/1), 7 B" fetch.log
   365  )
   366  end_test
   367  
   368  begin_test "credentials from remote.origin.url"
   369  (
   370    set -e
   371  
   372    reponame="requirecreds-remoteurl"
   373    setup_remote_repo "$reponame"
   374    clone_repo "$reponame" "$reponame"
   375  
   376    git lfs track "*.dat"
   377    echo "push b" > b.dat
   378    git add .gitattributes b.dat
   379    git commit -m "add b.dat"
   380  
   381    echo "bad push"
   382    git lfs env
   383    git lfs push origin master 2>&1 | tee push.log
   384    grep "Uploading LFS objects:   0% (0/1), 0 B" push.log
   385  
   386    echo "good push"
   387    gitserverhost=$(echo "$GITSERVER" | cut -d'/' -f3)
   388    git config remote.origin.url http://requirecreds:pass@$gitserverhost/$reponame.git
   389    git lfs env
   390    git lfs push origin master 2>&1 | tee push.log
   391    grep "Uploading LFS objects: 100% (1/1), 7 B" push.log
   392  
   393    echo "bad fetch"
   394    rm -rf .git/lfs/objects
   395    git config remote.origin.url http://$gitserverhost/$reponame.git
   396    git lfs env
   397    git lfs fetch --all 2>&1 | tee fetch.log
   398    # Missing authentication causes `git lfs fetch` to fail before the progress
   399    # meter is printed to the TTY.
   400  
   401    echo "good fetch"
   402    rm -rf .git/lfs/objects
   403    git config remote.origin.url http://requirecreds:pass@$gitserverhost/$reponame.git
   404    git lfs env
   405    git lfs fetch --all 2>&1 | tee fetch.log
   406    grep "Downloading LFS objects: 100% (1/1), 7 B" fetch.log
   407  )
   408  end_test