Skip to content

Instantly share code, notes, and snippets.

@bpirkle
Last active January 21, 2024 01:40
Show Gist options
  • Save bpirkle/add6448c1a9dd6795cfb2ed09ef9139c to your computer and use it in GitHub Desktop.
Save bpirkle/add6448c1a9dd6795cfb2ed09ef9139c to your computer and use it in GitHub Desktop.
Example MediaWiki login script, based on https://gist.github.com/AaronSchulz/a859b366701beb7ea2419d7117f1cdff by AaronSchulz but customized for Reading Lists
#!/bin/bash
SITE_URL=$1
USER_NAME=$2
COOKIE_PREFIX=$3
if [[ -z "$SITE_URL" || -z "$USER_NAME" || -z "$COOKIE_PREFIX" ]]; then
echo "wiki_login <api.php url> <username> <site cookie prefix>"
echo "e.g. wiki_login https://localhost/core aaron my_wiki"
exit 1
fi
API_URL="${SITE_URL}/api.php"
REST_URL="${SITE_URL}/rest.php"
echo "Getting (logged-out) session cookies and corresponding CSRF token..."
curl -s -i --insecure -a "${API_URL}?action=query&meta=tokens&type=login&format=json" | grep --color=always -e "^" -e "logintoken" -e "${COOKIE_PREFIX}_session"
echo
read -p "Enter ${COOKIE_PREFIX}_session from response cookies: " WEB_SESSION
read -p "Enter logintoken from response body (include backslashes): " LOGIN_TOKEN
echo "Checking if (logged-out) session persists (no set-cookie header should appear below)..."
curl -s -i --insecure -b "${COOKIE_PREFIX}_session=${WEB_SESSION}" -a "${API_URL}?action=query&meta=siteinfo&siprop=dbrepllag&sishowalldb=&format=json" | grep --color=always -e "set-cookie:"
echo
echo "...(no set-cookie header for ${COOKIE_PREFIX}_session should appear above)"
read -s -p "Enter user password: " USER_PASS
echo
echo "Getting (logged-in) session cookies via login..."
curl -s -i --insecure -b "${COOKIE_PREFIX}_session=${WEB_SESSION}" -X POST -H "content-type: application/x-www-form-urlencoded" -a "${API_URL}?action=clientlogin&format=json" --data-urlencode "username=${USER_NAME}" --data-urlencode "password=${USER_PASS}" --data-urlencode "logintoken=${LOGIN_TOKEN}" --data-urlencode "loginreturnurl=https://localhost/no_client_site_needed.php" | grep --color=always -e "^" -e "${COOKIE_PREFIX}_session" -e "${COOKIE_PREFIX}UserID" -e "${COOKIE_PREFIX}UserName"
echo
echo "...(a set-cookie header for session, UserID, and UserName should appear above)"
echo
read -p "Enter ${COOKIE_PREFIX}_session from response cookies: " WEB_SESSION
read -p "Enter ${COOKIE_PREFIX}UserID from response cookies: " WEB_SESSION_USERID
read -p "Enter ${COOKIE_PREFIX}UserName from response cookies: " WEB_SESSION_USERNAME
echo
# Test with api.php watchlistraw endpoint
echo "Getting logged-in user watchlist info..."
curl -s -i --insecure -b "${COOKIE_PREFIX}_session=${WEB_SESSION}" -b "${COOKIE_PREFIX}UserID=${WEB_SESSION_USERID}" -b "${COOKIE_PREFIX}UserName=${WEB_SESSION_USERNAME}" -a "${API_URL}?action=query&list=watchlistraw&format=json"
echo
echo "Getting (logged-in) session CRSF token..."
curl -s -i --insecure -b "${COOKIE_PREFIX}_session=${WEB_SESSION}" -b "${COOKIE_PREFIX}UserID=${WEB_SESSION_USERID}" -b "${COOKIE_PREFIX}UserName=${WEB_SESSION_USERNAME}" -a "${API_URL}?action=query&meta=tokens&type=csrf&format=json" | grep --color=always -e "^" -e "csrftoken" -e "${COOKIE_PREFIX}_session"
echo
read -p "Enter csrftoken from response (include slashes): " CSRF_TOKEN
echo
# Test with rest.php endpoint. Print the curl commands for easy manual reuse.
echo "Setting up Reading Lists..."
EMPTY_DATA="{\"token\":\"${CSRF_TOKEN}\\\"}"
LIST_DATA="{\"token\":\"${CSRF_TOKEN}\\\",\"name\":\"planets\",\"description\":\"planets of the solar system\"}"
#LIST_DATA="{\"token\":\"${CSRF_TOKEN}\\\",\"name\":\"PlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanetsPlanets\",\"description\":\"Planets of the solar system\"}"
LIST_DATA_2="{\"token\":\"${CSRF_TOKEN}\\\",\"name\":\"Planets\",\"description\":\"Planets of the solar system\"}"
LIST_ENTRY_DATA="{\"token\":\"${CSRF_TOKEN}\\\",\"project\":\"http://default.mediawiki.mwdd.localhost/\",\"title\":\"Earth\"}"
set -x
# Ensure we are starting from a clean state. This will harmlessly fail if reading lists are not already set up for this user.
curl -s -i --insecure -X POST -b "${COOKIE_PREFIX}_session=${WEB_SESSION}" -b "${COOKIE_PREFIX}UserID=${WEB_SESSION_USERID}" -b "${COOKIE_PREFIX}UserName=${WEB_SESSION_USERNAME}" -a "${REST_URL}/readinglists/v0/teardown?csrf_token=${CSRF_TOKEN}\\" -H "Content-Type: application/json" --data "${EMPTY_DATA}"
echo
# Set up reading lists for this user. This will create a default list.
curl -s -i --insecure -X POST -b "${COOKIE_PREFIX}_session=${WEB_SESSION}" -b "${COOKIE_PREFIX}UserID=${WEB_SESSION_USERID}" -b "${COOKIE_PREFIX}UserName=${WEB_SESSION_USERNAME}" -a "${REST_URL}/readinglists/v0/setup?csrf_token=${CSRF_TOKEN}\\" -H "Content-Type: application/json" --data "${EMPTY_DATA}"
echo
# Retrieve the new default list
curl -s -i --insecure -b "${COOKIE_PREFIX}_session=${WEB_SESSION}" -b "${COOKIE_PREFIX}UserID=${WEB_SESSION_USERID}" -b "${COOKIE_PREFIX}UserName=${WEB_SESSION_USERNAME}" -a "${REST_URL}/readinglists/v0/lists"
echo
# Create a new non-default list
curl -s -i --insecure -X POST -b "${COOKIE_PREFIX}_session=${WEB_SESSION}" -b "${COOKIE_PREFIX}UserID=${WEB_SESSION_USERID}" -b "${COOKIE_PREFIX}UserName=${WEB_SESSION_USERNAME}" -a "${REST_URL}/readinglists/v0/lists?csrf_token=${CSRF_TOKEN}\\" -H "Content-Type: application/json" --data "${LIST_DATA}"
echo
read -p "Enter new list id from response JSON: " NEW_LIST_ID
# Modify the new non-default list
curl -s -i --insecure -X PUT -b "${COOKIE_PREFIX}_session=${WEB_SESSION}" -b "${COOKIE_PREFIX}UserID=${WEB_SESSION_USERID}" -b "${COOKIE_PREFIX}UserName=${WEB_SESSION_USERNAME}" -a "${REST_URL}/readinglists/v0/lists/${NEW_LIST_ID}?csrf_token=${CSRF_TOKEN}\\" -H "Content-Type: application/json" --data "${LIST_DATA_2}"
echo
# Retrieve both lists
curl -s -i --insecure -b "${COOKIE_PREFIX}_session=${WEB_SESSION}" -b "${COOKIE_PREFIX}UserID=${WEB_SESSION_USERID}" -b "${COOKIE_PREFIX}UserName=${WEB_SESSION_USERNAME}" -a "${REST_URL}/readinglists/v0/lists"
echo
# Retrieve lists with a limit of 1
curl -s -i --insecure -b "${COOKIE_PREFIX}_session=${WEB_SESSION}" -b "${COOKIE_PREFIX}UserID=${WEB_SESSION_USERID}" -b "${COOKIE_PREFIX}UserName=${WEB_SESSION_USERNAME}" -a "${REST_URL}/readinglists/v0/lists?limit=1"
echo
# Add an entry to the non-default list
curl -s -i --insecure -X POST -b "${COOKIE_PREFIX}_session=${WEB_SESSION}" -b "${COOKIE_PREFIX}UserID=${WEB_SESSION_USERID}" -b "${COOKIE_PREFIX}UserName=${WEB_SESSION_USERNAME}" -a "${REST_URL}/readinglists/v0/lists/${NEW_LIST_ID}/entries?csrf_token=${CSRF_TOKEN}\\" -H "Content-Type: application/json" --data "${LIST_ENTRY_DATA}"
echo
# List the entry we just added
curl -s -i --insecure -b "${COOKIE_PREFIX}_session=${WEB_SESSION}" -b "${COOKIE_PREFIX}UserID=${WEB_SESSION_USERID}" -b "${COOKIE_PREFIX}UserName=${WEB_SESSION_USERNAME}" -a "${REST_URL}/readinglists/v0/lists/${NEW_LIST_ID}/entries"
echo
read -p "Enter new list entry id from response JSON: " NEW_LIST_ENTRY_ID
# Retrieve only lists containing pages by a specific title
curl -s -i --insecure -b "${COOKIE_PREFIX}_session=${WEB_SESSION}" -b "${COOKIE_PREFIX}UserID=${WEB_SESSION_USERID}" -b "${COOKIE_PREFIX}UserName=${WEB_SESSION_USERNAME}" -a "${REST_URL}/readinglists/v0/lists/pages/http%3A%2F%2Fdefault%2Emediawiki%2Emwdd%2Elocalhost%2F/Earth"
echo
# Retrieve only changes since a certain time (for this call, this should be all changes to both lists)
curl -s -i --insecure -b "${COOKIE_PREFIX}_session=${WEB_SESSION}" -b "${COOKIE_PREFIX}UserID=${WEB_SESSION_USERID}" -b "${COOKIE_PREFIX}UserName=${WEB_SESSION_USERNAME}" -a "${REST_URL}/readinglists/v0/lists/changes/since/2024-01-01T00%3A00%3A00Z"
echo
# Deletes the entry we just added
curl -s -i --insecure -X DELETE -b "${COOKIE_PREFIX}_session=${WEB_SESSION}" -b "${COOKIE_PREFIX}UserID=${WEB_SESSION_USERID}" -b "${COOKIE_PREFIX}UserName=${WEB_SESSION_USERNAME}" -a "${REST_URL}/readinglists/v0/lists/${NEW_LIST_ID}/entries/${NEW_LIST_ENTRY_ID}?csrf_token=${CSRF_TOKEN}\\" -H "Content-Type: application/json" --data "${EMPTY_DATA}"
echo
# Confirm the entry is gone
curl -s -i --insecure -b "${COOKIE_PREFIX}_session=${WEB_SESSION}" -b "${COOKIE_PREFIX}UserID=${WEB_SESSION_USERID}" -b "${COOKIE_PREFIX}UserName=${WEB_SESSION_USERNAME}" -a "${REST_URL}/readinglists/v0/lists/${NEW_LIST_ID}/entries"
echo
# Delete new non-default list
curl -s -i --insecure -X DELETE -b "${COOKIE_PREFIX}_session=${WEB_SESSION}" -b "${COOKIE_PREFIX}UserID=${WEB_SESSION_USERID}" -b "${COOKIE_PREFIX}UserName=${WEB_SESSION_USERNAME}" -a "${REST_URL}/readinglists/v0/lists/${NEW_LIST_ID}?csrf_token=${CSRF_TOKEN}\\" -H "Content-Type: application/json" --data "${EMPTY_DATA}"
echo
# Confirm the list is gone
curl -s -i --insecure -b "${COOKIE_PREFIX}_session=${WEB_SESSION}" -b "${COOKIE_PREFIX}UserID=${WEB_SESSION_USERID}" -b "${COOKIE_PREFIX}UserName=${WEB_SESSION_USERNAME}" -a "${REST_URL}/readinglists/v0/lists"
echo
# Tear down lists
curl -s -i --insecure -X POST -b "${COOKIE_PREFIX}_session=${WEB_SESSION}" -b "${COOKIE_PREFIX}UserID=${WEB_SESSION_USERID}" -b "${COOKIE_PREFIX}UserName=${WEB_SESSION_USERNAME}" -a "${REST_URL}/readinglists/v0/teardown?csrf_token=${CSRF_TOKEN}\\" -H "Content-Type: application/json" --data "${EMPTY_DATA}"
set +x
echo
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment