1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/scripts/getfiles.py Tue Jan 07 19:28:12 2014 +0100
1.3 @@ -0,0 +1,120 @@
1.4 +#!/usr/bin/env python
1.5 +
1.6 +from MoinMessage import *
1.7 +from email.mime.application import MIMEApplication
1.8 +from email.mime.text import MIMEText
1.9 +from email.parser import Parser
1.10 +from os.path import join, exists
1.11 +from os import makedirs
1.12 +import sys
1.13 +
1.14 +def writefile(filename, s):
1.15 + f = open(filename, "wb")
1.16 + try:
1.17 + f.write(s)
1.18 + finally:
1.19 + f.close()
1.20 +
1.21 +if __name__ == "__main__":
1.22 + try:
1.23 + service = sys.argv[1]
1.24 + signer = sys.argv[2]
1.25 + url = sys.argv[3]
1.26 + sender = sys.argv[4]
1.27 + datetime = sys.argv[5]
1.28 + target_dir = sys.argv[6]
1.29 + except IndexError:
1.30 + print >>sys.stderr, """\
1.31 +Need a service key identifier, signing key identifier, the repository URL,
1.32 +sender identifier, the datetime of the last resources retrieved, and the target
1.33 +directory as arguments to this program.
1.34 +"""
1.35 + sys.exit(1)
1.36 +
1.37 + # Bundle files into a message.
1.38 +
1.39 + message = Message()
1.40 +
1.41 + part = MIMEText("\n".join([sender, datetime]), "moinmessage-request")
1.42 + message.add_update(part)
1.43 +
1.44 + # Get the e-mail message itself.
1.45 +
1.46 + message = message.get_payload()
1.47 +
1.48 + # Encrypt, sign and send the message.
1.49 +
1.50 + gpg = GPG()
1.51 + message = gpg.encryptMessage(message, service)
1.52 + message = gpg.signMessage(message, signer)
1.53 + resp = sendMessageForReading(message, url)
1.54 +
1.55 + # Verify, decrypt and unpack the message.
1.56 +
1.57 + try:
1.58 + if not is_signed(message):
1.59 + print >>sys.stderr, "Incoming message was not signed."
1.60 + sys.exit(1)
1.61 +
1.62 + message = Parser().parse(resp)
1.63 + fingerprint, identity, content = gpg.verifyMessage(message)
1.64 +
1.65 + if is_encrypted(content):
1.66 + text = gpg.decryptMessage(content)
1.67 + content = Parser().parsestr(text)
1.68 +
1.69 + except MoinMessageDecodingError:
1.70 + print >>sys.stderr, "Incoming message was improperly encoded."
1.71 + sys.exit(1)
1.72 +
1.73 + except MoinMessageError, exc:
1.74 + print >>sys.stderr, "Incoming message was not verifiable: %s" % exc
1.75 + sys.exit(1)
1.76 +
1.77 + message = Message()
1.78 + message.handle_message(content)
1.79 +
1.80 + for part in message.updates:
1.81 +
1.82 + # Use the "outer" filename to determine a directory for the retrieved
1.83 + # file, even though the eventual filename in the directory may be
1.84 + # different.
1.85 +
1.86 + filename = part["Content-Disposition"]
1.87 + directory, leafname = filename.split("/")
1.88 +
1.89 + # The signed data will have been wrapped in a representation-insensitive
1.90 + # part.
1.91 +
1.92 + data = part.get_payload(decode=True)
1.93 +
1.94 + # The data may be encrypted.
1.95 +
1.96 + try:
1.97 + data = gpg.decryptMessageText(data)
1.98 + except MoinMessageError:
1.99 + print >>sys.stderr, "Message part was not decrypted."
1.100 +
1.101 + # Parse the decoded data.
1.102 +
1.103 + content = Parser().parsestr(data)
1.104 +
1.105 + if content.is_multipart():
1.106 + files = content.get_payload()
1.107 + else:
1.108 + files = [content]
1.109 +
1.110 + # Treat each part of the verified, possibly encrypted message as a file.
1.111 +
1.112 + for file in files:
1.113 + data = file.get_payload(decode=True)
1.114 +
1.115 + realname = file.get("Content-Disposition")
1.116 + filename = join(directory, realname or leafname)
1.117 +
1.118 + dirpath = join(target_dir, directory)
1.119 + if not exists(dirpath):
1.120 + makedirs(dirpath)
1.121 + writefile(join(target_dir, filename), data)
1.122 +
1.123 +# vim: tabstop=4 expandtab shiftwidth=4
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2.2 +++ b/scripts/sendfiles.py Tue Jan 07 19:28:12 2014 +0100
2.3 @@ -0,0 +1,54 @@
2.4 +#!/usr/bin/env python
2.5 +
2.6 +from MoinMessage import Message, GPG, sendMessage
2.7 +from email.mime.application import MIMEApplication
2.8 +from os.path import split
2.9 +import sys
2.10 +
2.11 +def readfile(filename):
2.12 + f = open(filename, "rb")
2.13 + try:
2.14 + return MIMEApplication(f.read())
2.15 + finally:
2.16 + f.close()
2.17 +
2.18 +if __name__ == "__main__":
2.19 + try:
2.20 + recipient = sys.argv[1]
2.21 + signer = sys.argv[2]
2.22 + url = sys.argv[3]
2.23 + args = sys.argv[4:]
2.24 + except IndexError:
2.25 + args = None
2.26 +
2.27 + if not args:
2.28 + print >>sys.stderr, """\
2.29 +Need a recipient key identifier, signing key identifier, the destination URL,
2.30 +and some filenames for transfer as arguments to this program.
2.31 +"""
2.32 + sys.exit(1)
2.33 +
2.34 + # Bundle files into a message.
2.35 +
2.36 + message = Message()
2.37 +
2.38 + for arg in args:
2.39 + part = readfile(arg)
2.40 + part["Content-Disposition"] = split(arg)[-1]
2.41 + part["Update-Action"] = "store"
2.42 + message.add_update(part)
2.43 +
2.44 + # Get the e-mail message itself.
2.45 +
2.46 + message = message.get_payload()
2.47 +
2.48 + # Encrypt, sign and send the message.
2.49 +
2.50 + gpg = GPG()
2.51 + message = gpg.encryptMessage(message, recipient)
2.52 + message = gpg.signMessage(message, signer)
2.53 + resp = sendMessage(message, url)
2.54 +
2.55 + print resp
2.56 +
2.57 +# vim: tabstop=4 expandtab shiftwidth=4