# HG changeset patch # User Paul Boddie # Date 1389119292 -3600 # Node ID 5dc7d4405603c978ff05d17f9bedd8271f7087a0 # Parent 3fe22d86a86d734246d48eb8503602dc4a80d347 Added some Moin-independent scripts for interacting with simple remote services. diff -r 3fe22d86a86d -r 5dc7d4405603 scripts/getfiles.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/getfiles.py Tue Jan 07 19:28:12 2014 +0100 @@ -0,0 +1,120 @@ +#!/usr/bin/env python + +from MoinMessage import * +from email.mime.application import MIMEApplication +from email.mime.text import MIMEText +from email.parser import Parser +from os.path import join, exists +from os import makedirs +import sys + +def writefile(filename, s): + f = open(filename, "wb") + try: + f.write(s) + finally: + f.close() + +if __name__ == "__main__": + try: + service = sys.argv[1] + signer = sys.argv[2] + url = sys.argv[3] + sender = sys.argv[4] + datetime = sys.argv[5] + target_dir = sys.argv[6] + except IndexError: + print >>sys.stderr, """\ +Need a service key identifier, signing key identifier, the repository URL, +sender identifier, the datetime of the last resources retrieved, and the target +directory as arguments to this program. +""" + sys.exit(1) + + # Bundle files into a message. + + message = Message() + + part = MIMEText("\n".join([sender, datetime]), "moinmessage-request") + message.add_update(part) + + # Get the e-mail message itself. + + message = message.get_payload() + + # Encrypt, sign and send the message. + + gpg = GPG() + message = gpg.encryptMessage(message, service) + message = gpg.signMessage(message, signer) + resp = sendMessageForReading(message, url) + + # Verify, decrypt and unpack the message. + + try: + if not is_signed(message): + print >>sys.stderr, "Incoming message was not signed." + sys.exit(1) + + message = Parser().parse(resp) + fingerprint, identity, content = gpg.verifyMessage(message) + + if is_encrypted(content): + text = gpg.decryptMessage(content) + content = Parser().parsestr(text) + + except MoinMessageDecodingError: + print >>sys.stderr, "Incoming message was improperly encoded." + sys.exit(1) + + except MoinMessageError, exc: + print >>sys.stderr, "Incoming message was not verifiable: %s" % exc + sys.exit(1) + + message = Message() + message.handle_message(content) + + for part in message.updates: + + # Use the "outer" filename to determine a directory for the retrieved + # file, even though the eventual filename in the directory may be + # different. + + filename = part["Content-Disposition"] + directory, leafname = filename.split("/") + + # The signed data will have been wrapped in a representation-insensitive + # part. + + data = part.get_payload(decode=True) + + # The data may be encrypted. + + try: + data = gpg.decryptMessageText(data) + except MoinMessageError: + print >>sys.stderr, "Message part was not decrypted." + + # Parse the decoded data. + + content = Parser().parsestr(data) + + if content.is_multipart(): + files = content.get_payload() + else: + files = [content] + + # Treat each part of the verified, possibly encrypted message as a file. + + for file in files: + data = file.get_payload(decode=True) + + realname = file.get("Content-Disposition") + filename = join(directory, realname or leafname) + + dirpath = join(target_dir, directory) + if not exists(dirpath): + makedirs(dirpath) + writefile(join(target_dir, filename), data) + +# vim: tabstop=4 expandtab shiftwidth=4 diff -r 3fe22d86a86d -r 5dc7d4405603 scripts/sendfiles.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/sendfiles.py Tue Jan 07 19:28:12 2014 +0100 @@ -0,0 +1,54 @@ +#!/usr/bin/env python + +from MoinMessage import Message, GPG, sendMessage +from email.mime.application import MIMEApplication +from os.path import split +import sys + +def readfile(filename): + f = open(filename, "rb") + try: + return MIMEApplication(f.read()) + finally: + f.close() + +if __name__ == "__main__": + try: + recipient = sys.argv[1] + signer = sys.argv[2] + url = sys.argv[3] + args = sys.argv[4:] + except IndexError: + args = None + + if not args: + print >>sys.stderr, """\ +Need a recipient key identifier, signing key identifier, the destination URL, +and some filenames for transfer as arguments to this program. +""" + sys.exit(1) + + # Bundle files into a message. + + message = Message() + + for arg in args: + part = readfile(arg) + part["Content-Disposition"] = split(arg)[-1] + part["Update-Action"] = "store" + message.add_update(part) + + # Get the e-mail message itself. + + message = message.get_payload() + + # Encrypt, sign and send the message. + + gpg = GPG() + message = gpg.encryptMessage(message, recipient) + message = gpg.signMessage(message, signer) + resp = sendMessage(message, url) + + print resp + +# vim: tabstop=4 expandtab shiftwidth=4