Skip to content

Instantly share code, notes, and snippets.

@rfk
Created January 12, 2015 23:52
Show Gist options
  • Save rfk/afeff888c3a95732d800 to your computer and use it in GitHub Desktop.
Save rfk/afeff888c3a95732d800 to your computer and use it in GitHub Desktop.
script to delete user data on a sync1.1 storage node
import sys
import base64
import getpass
import hashlib
import urllib2
import optparse
import requests
def email_to_idn(addr):
"""Convert a UTF-8 email address to it's IDN (punycode) equivalent."""
addr = urllib2.unquote(addr).decode('utf-8')
if '@' not in addr:
return addr
prefix, suffix = addr.split('@', 1)
return "%s@%s" % (prefix.encode('idna'), suffix.encode('idna'))
def main(argv):
parser = optparse.OptionParser(usage="usage: %prog [options] username")
parser.add_option("-p", "--password",
help="password for the sync1.1 user account")
parser.add_option("-H", "--host",
help="the sync1.1 hosting the user account")
(options, args) = parser.parse_args(argv)
if len(args) != 1:
parser.error("Incorrect number of arguments")
username = args[0]
if "@" in username:
username = email_to_idn(username).lower()
username = hashlib.sha1(username).digest()
username = base64.b32encode(username).lower()
if options.password is None:
options.password = getpass.getpass()
if options.host is None:
# Do cluster URL discovering against production server.
url = "https://auth.services.mozilla.com/user/1.0/{}/node/weave"
r = requests.get(url.format(username))
r.raise_for_status()
options.host = r.content.strip()
while options.host.endswith("/"):
options.host = options.host[:-1]
url = options.host + "/1.1/{}/storage".format(username)
r = requests.delete(url, auth=(username, options.password), headers={
"X-Confirm-Delete": "1",
})
r.raise_for_status()
print r
return 0
if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment