factorio: Fix the fetch script (#17741)

This commit is contained in:
Svein Ove Aas 2016-08-14 23:47:00 +01:00 committed by Robin Gloster
parent 226cba764f
commit cbe8832cd7
2 changed files with 18 additions and 7 deletions

View File

@ -1,4 +1,4 @@
{ stdenv, curl, cacert { stdenv, curl, xidel, cacert
# Begin download parameters # Begin download parameters
, username ? "" , username ? ""
, password ? "" , password ? ""
@ -18,7 +18,7 @@
stdenv.mkDerivation { stdenv.mkDerivation {
name = "factorio.tar.gz"; name = "factorio.tar.gz";
buildInputs = [ curl ]; buildInputs = [ curl xidel ];
inherit url loginUrl username password cacert; inherit url loginUrl username password cacert;

View File

@ -9,23 +9,34 @@ curl="curl \
--max-redirs 20 \ --max-redirs 20 \
--retry 3 \ --retry 3 \
--cacert $cacert/etc/ssl/certs/ca-bundle.crt \ --cacert $cacert/etc/ssl/certs/ca-bundle.crt \
-b cookies \
-c cookies \
$curlOpts \ $curlOpts \
$NIX_CURL_FLAGS" $NIX_CURL_FLAGS"
# We don't want the password to be on any program's argv, as it may be # We don't want the password to be on any program's argv, as it may be
# visible in /proc. Writing it to file with echo should be safe, since # visible in /proc. Writing it to file with echo should be safe, since
# it's a shell builtin. # it's a shell builtin.
echo "password=$password" > password echo -n "$password" > password
# Might as well hide the username as well. # Might as well hide the username as well.
echo "username-or-email=$username" > username echo -n "$username" > username
# Get a CSRF token.
csrf=$($curl $loginUrl | xidel - -e '//input[@id="csrf_token"]/@value')
# Log in. We don't especially care about the result, but let's check if login failed. # Log in. We don't especially care about the result, but let's check if login failed.
$curl -c cookies -d @username -d @password $loginUrl -D headers > /dev/null $curl --data-urlencode csrf_token="$csrf" \
--data-urlencode username_or_email@username \
--data-urlencode password@password \
-d action=Login \
$loginUrl -D headers > /dev/null
if grep -q 'Location: /' headers; then if grep -q 'Location: https://' headers; then
# Now download. We need --insecure for this, but the sha256 should cover us. # Now download. We need --insecure for this, but the sha256 should cover us.
$curl -b cookies --insecure --location $url > $out $curl --insecure --location $url > $out
set +x
else else
set +x
echo 'Login failed' echo 'Login failed'
echo 'Please set username and password with config.nix,' echo 'Please set username and password with config.nix,'
echo 'or /etc/nix/nixpkgs-config.nix if on NixOS.' echo 'or /etc/nix/nixpkgs-config.nix if on NixOS.'