summary refs log tree commit diff
path: root/bin/sup.sh
diff options
context:
space:
mode:
Diffstat (limited to 'bin/sup.sh')
-rw-r--r--bin/sup.sh116
1 files changed, 115 insertions, 1 deletions
diff --git a/bin/sup.sh b/bin/sup.sh
index b7f28bc7..32e282d1 100644
--- a/bin/sup.sh
+++ b/bin/sup.sh
@@ -10,6 +10,16 @@ generate() {
 copy() {
 	printf '%s' "$1" | pbcopy
 }
+unwrap() {
+	sed '
+		:x
+		/=$/ {
+			N
+			s/=\n//g
+			bx
+		}
+	'
+}
 
 asciinema() {
 	echo 'Fetching CSRF token...'
@@ -100,6 +110,39 @@ discogs() {
 	open 'https://discogs.com/login'
 }
 
+gitea() {
+	echo 'Fetching CSRF token...'
+	csrf=$(
+		curl -Ss "${giteaBase}/user/forgot_password" |
+		sed -n 's/.*name="_csrf" value="\([^"]*\)".*/\1/p'
+	)
+	echo 'Submitting form...'
+	curl -Ss -X POST \
+		-F "email=${email}" -F "_csrf=${csrf}" \
+		"${giteaBase}/user/forgot_password" \
+		>/dev/null
+	echo 'Waiting for email...'
+	code=$(
+		git fetch-email -i -M Trash \
+			-F "${giteaFrom}" -T "${email}" -S 'Recover your account' |
+		unwrap | sed -n 's/.*code=3D\(.*\)/\1/p' | head -n 1
+	)
+	echo 'Fetching CSRF token...'
+	csrf=$(
+		curl -Ss "${giteaBase}/user/recover_account" |
+		sed -n 's/.*name="_csrf" value="\([^"]*\)".*/\1/p'
+	)
+	password=$(generate)
+	echo 'Setting password...'
+	curl -Ss -X POST \
+		-F "_csrf=${csrf}" -F "code=${code}" \
+		-F "password=${password}" \
+		"${giteaBase}/user/recover_account" \
+		>/dev/null
+	copy "${password}"
+	open "${giteaBase}/user/login"
+}
+
 liberapay() {
 	echo 'Fetching CSRF token...'
 	csrf=$(
@@ -141,7 +184,7 @@ lobsters() {
 		git fetch-email -i -M Trash \
 			-F "${lobstersFrom}" -T "${email}" \
 			-S 'Reset your password' |
-		sed -n 's|^https://.*[?]token=\(.*\)|\1|p'
+		sed -n 's|^https://.*[?]token=\([^&]*\).*|\1|p'
 	)
 	echo 'Fetching CSRF token...'
 	csrf=$(
@@ -160,6 +203,77 @@ lobsters() {
 	open "${lobstersBase}/login"
 }
 
+lwn() {
+	username=$email
+	echo 'Submitting form...'
+	curl -Ss -X POST -F "username=${username}" \
+		'https://lwn.net/Login/MailPWLink' \
+		>/dev/null
+	echo 'Waiting for email...'
+	key=$(
+		git fetch-email -i -M Trash \
+			-F 'lwn@lwn.net' -S 'A link to set your LWN.net password' |
+		sed -n 's|.*/Login/SetPassword/.*/\(.*\)|\1|p'
+	)
+	echo 'Retrieving UID...'
+	uid=$(
+		curl -Ss "https://lwn.net/Login/SetPassword/${username}/${key}" |
+		sed -n 's/.*name="uid" value="\([^"]*\)".*/\1/p'
+	)
+	password=$(generate)
+	echo 'Setting password...'
+	curl -Ss -X POST \
+		-F "uid=${uid}" -F "key=${key}" \
+		-F "new1=${password}" -F "new2=${password}" \
+		'https://lwn.net/Login/DoSetPassword' \
+		>/dev/null
+	copy "${password}"
+	open 'https://lwn.net/Login/'
+}
+
+patreon() {
+	readonly patreonAPI='https://www.patreon.com/api'
+	echo 'Submitting form...'
+	curl -Ss -X POST -d @- \
+		-H 'Content-Type: application/vnd.api+json' \
+		"${patreonAPI}/auth/forgot-password?json-api-version=1.0" <<-EOF
+		{"data":{"email":"${email}"}}
+		EOF
+	echo 'Waiting for email...'
+	url=$(
+		git fetch-email -i -M Trash \
+			-F 'password@patreon.com' -T "${email}" \
+			-S 'Patreon Password Reset' |
+		unwrap |
+		grep -o -m 1 'https://email[.]mailgun[.]patreon[.]com/.*'
+	)
+	echo 'Fetching token...'
+	location=$(curl -ISs --url "${url}" | grep -i '^Location: ' | tr -d '\r')
+	u=$(echo "${location}" | sed 's/.*[?&]u=\([^&]*\).*/\1/')
+	sec=$(echo "${location}" | sed 's/.*[?&]sec=\([^&]*\).*/\1/')
+	password=$(generate)
+	echo 'Setting password...'
+	curl -Ss -X POST -d @- \
+		-H 'Content-Type: application/vnd.api+json' \
+		"${patreonAPI}/auth/forgot-password/change?json-api-version=1.0" <<-EOF
+		{
+			"data":{
+				"user_id":"${u}",
+				"security_token":"${sec}",
+				"password":"${password}"
+			}
+		}
+		EOF
+	copy "${password}"
+	open 'https://www.patreon.com/login'
+}
+
+tildegit() {
+	giteaBase='https://tildegit.org'
+	giteaFrom='git@tildegit.org'
+	gitea
+}
+
 tildenews() {
 	lobstersBase='https://tilde.news'
 	lobstersFrom='nobody@tilde.news'