From 60f47b04174d016cc86c6e06fdaf0794c3d14216 Mon Sep 17 00:00:00 2001 From: Simeon Simeonov Date: Wed, 7 May 2014 22:28:48 +0200 Subject: Git server / generic client and weechat client completed --- beinc_generic_client.py | 158 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100755 beinc_generic_client.py (limited to 'beinc_generic_client.py') diff --git a/beinc_generic_client.py b/beinc_generic_client.py new file mode 100755 index 0000000..6cffc84 --- /dev/null +++ b/beinc_generic_client.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Blackmore's Enhanced IRC-Notification Collection (BEINC) v1.0 +# Copyright (C) 2013-2014 Simeon Simeonov + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +import argparse +import errno +import getpass +import httplib +import socket +import ssl +import sys +import urllib +import urllib2 + + +__author__ = 'Simeon Simeonov' +__version__ = '1.0' +__license__ = 'GPL3' + + +class ValidHTTPSConnection(httplib.HTTPConnection): + """ + Implements a simple CERT verification functionality + """ + + default_port = httplib.HTTPS_PORT + + def __init__(self, *args, **kwargs): + httplib.HTTPConnection.__init__(self, *args, **kwargs) + + def connect(self): + sock = socket.create_connection((self.host, self.port), + self.timeout, self.source_address) + if self._tunnel_host: + self.sock = sock + self._tunnel() + self.sock = ssl.wrap_socket(sock, + ca_certs=global_beinc_cert_file, + cert_reqs=ssl.CERT_REQUIRED) + + + +class ValidHTTPSHandler(urllib2.HTTPSHandler): + """ + Implements a simple CERT verification functionality + """ + + def https_open(self, req): + return self.do_open(ValidHTTPSConnection, req) + + + +def action_push(args): + """ + """ + try: + post_values = {'title': args.title, + 'message': args.message, + 'password': args.password} + data = urllib.urlencode(post_values) + req = urllib2.Request(args.url, data) + if args.cert: # check for cert validity + global global_beinc_cert_file # ugly hack + global_beinc_cert_file = args.cert + opener = urllib2.build_opener(ValidHTTPSHandler) + response = opener.open(req) + else: # ... or don't + response = urllib2.urlopen(req) + res_code = response.code + if res_code == 200: + print('Server responded: OK') + else: + print('Server responded: {0}'.format(res_code)) + print('Body:\n{0}'.format(response.read())) + response.close() + except urllib2.HTTPError as e: + sys.stderr.write('BEINC-server error ({0} - {1})\n'.format(e.code, e.reason)) + except Exception as e: + sys.stderr.write('BEINC generic client error: {0}\n'.format(e)) + sys.exit(errno.EPERM) + + +def main(): + + parser = argparse.ArgumentParser( + description='The following options are available') + + parser.add_argument('url', + metavar='URL', + type=str, + #dest='url', + #required=True, + help='Destination URL') + + parser.add_argument('-c', '--cert-file', + metavar='FILE', + type=str, + dest='cert', + default='', + help='BEINC CA-cert to check the server-cert against') + + parser.add_argument('-m', '--message', + metavar='MESSAGE', + type=str, + dest='message', + default='BEINC message', + help='BEINC message') + + parser.add_argument('-p', '--password', + metavar='PASSWORD', + type=str, + dest='password', + default='', + help='Password') + + parser.add_argument('-t', '--title', + metavar='TITLE', + type=str, + dest='title', + default='BEINC title', + help='BEINC title') + + parser.add_argument('-v', '--version', + action='version', + version='%(prog)s {0}'.format(__version__), + help='display program-version and exit') + + args = parser.parse_args() + + if not args.password: + try: + args.password = getpass.getpass() + except Exception as e: + sys.stderr.write('Prompt terminated\n') + sys.exit(errno.EACCES) + + action_push(args) + sys.exit(0) + + +if __name__ == '__main__': + main() -- cgit v1.3