def render_GET(self, request): macdb = DbHelper() ua = request.requestHeaders.getRawHeaders('User-Agent') if ua != None: ua = ua[0] matchObj = re.match(r'.*? (\(.*?\)) .*', ua) os = None version = None if matchObj: x2 = matchObj.group(1) os = 'win' if (x2.find('Windows') != -1) else 'mac' if ( x2.find('Mac OS') != -1) else None matchObj = re.match(r'.* BitPop/(\d+\.\d+\.\d+\.\d+) .*', ua) # get version if matchObj: version = matchObj.group(1) if version and os: macdb.stats_add(version, os) res = macdb.uncensor_fetch_all() macdb.cleanup() request.setHeader('Content-Type', 'application/json') return json.dumps(res)
def render_GET(self, request): macdb = DbHelper() ua = request.requestHeaders.getRawHeaders('User-Agent') if ua != None: ua = ua[0] matchObj = re.match( r'.*? (\(.*?\)) .*', ua) os = None version = None if matchObj: x2 = matchObj.group(1) os = 'win' if (x2.find('Windows') != -1) else 'mac' if (x2.find('Mac OS') != -1) else None matchObj = re.match( r'.* BitPop/(\d+\.\d+\.\d+\.\d+) .*', ua) # get version if matchObj: version = matchObj.group(1) if version and os: macdb.stats_add(version, os) res = macdb.uncensor_fetch_all() macdb.cleanup() request.setHeader('Content-Type', 'application/json') return json.dumps(res)
def render_POST(self, request): macdb = DbHelper() if not 'action' in request.args: request.setResponseCode(400) return 'Error 400. Bad request.' output = "" if request.args['action'][0] == 'delete': id_ = int(request.args['id'][0]) rec = macdb.uncensorp_fetch_by_id(id_) request.setResponseCode(301) if rec != None: macdb.uncensorp_delete(id_) request.setHeader('Location', self.pathFromRoot + '?msg=' + urllib.quote_plus('Success. Record deleted.')) else: request.setHeader('Location', self.pathFromRoot + '?msg=' + urllib.quote_plus('Error. Record not found.')) elif request.args['action'][0] == 'add': if (not ('domain' in request.args)) or (not ('iso' in request.args)): request.setResponseCode(400) return 'Error 400. Bad request.' insertInfo = { 'domain': request.args['domain'][0], 'iso': request.args['iso'][0] } macdb.uncensorp_insert(insertInfo) request.setResponseCode(301) request.setHeader('Location', self.pathFromRoot + '?msg=' + urllib.quote_plus('Success. Record was added.')) else: request.setResponseCode(400) output = 'Error 400. Bad request.' macdb.cleanup() return output
def render_GET(self, request): gi = pygeoip.GeoIP('GeoIP.dat', pygeoip.MEMORY_CACHE) country_code = gi.country_code_by_addr(request.getHeader('x-forwarded-for')) macdb = DbHelper() res = macdb.uncensorp_fetch_by_iso(country_code) res = { 'domains': [rec['domain'] for rec in res], 'country_code': country_code, 'country_name': pycountry.countries.get(alpha2=country_code).name.encode('utf-8') } macdb.cleanup() request.setHeader('Content-Type', 'application/json') return json.dumps(res)
def render_POST(self, request): if not 'rel_notes' in request.args or not 'rec_id' in request.args: request.setResponseCode(400) # Bad request return "Error: Bad request." macdb = DbHelper() upd = macdb.fetch_by_id(int(request.args['rec_id'][0])) if upd == None: request.setResponseCode(404) # Bad request return "Error: Not found." upd['rel_notes'] = request.args['rel_notes'][0] macdb.update(upd) macdb.cleanup() return """<!DOCTYPE html>
def render_POST(self, request): if not 'rel_notes' in request.args or not 'rec_id' in request.args: request.setResponseCode(400) # Bad request return "Error: Bad request." macdb = DbHelper() upd = macdb.fetch_by_id(int(request.args['rec_id'][0])) if upd == None: request.setResponseCode(404) # Bad request return "Error: Not found." upd['rel_notes'] = request.args['rel_notes'][0]; macdb.update(upd) macdb.cleanup() return """<!DOCTYPE html>
def render_POST(self, request): macdb = DbHelper() if not 'action' in request.args: request.setResponseCode(400) return 'Error 400. Bad request.' output = "" if request.args['action'][0] == 'delete': id_ = int(request.args['id'][0]) rec = macdb.uncensor_fetch_by_id(id_) request.setResponseCode(301) if rec != None: macdb.uncensor_delete(id_) request.setHeader( 'Location', self.pathFromRoot + '?msg=' + urllib.quote_plus('Success. Record deleted.')) else: request.setHeader( 'Location', self.pathFromRoot + '?msg=' + urllib.quote_plus('Error. Record not found.')) elif request.args['action'][0] == 'add': if (not ('srcDomain' in request.args)) or (not ('dstDomain' in request.args)): request.setResponseCode(400) return 'Error 400. Bad request.' insertInfo = { 'srcDomain': request.args['srcDomain'][0], 'dstDomain': request.args['dstDomain'][0] } macdb.uncensor_insert(insertInfo) request.setResponseCode(301) request.setHeader( 'Location', self.pathFromRoot + '?msg=' + urllib.quote_plus('Success. Record was added.')) else: request.setResponseCode(400) output = 'Error 400. Bad request.' macdb.cleanup() return output
def render_GET(self, request): tr = re.compile('.*/(\d*)$') m = re.match(tr, request.path) if len(m.groups()) == 0: request.setResponseCode(400) # Bad request return "Error: Bad request." update_id = m.groups()[0] macdb = DbHelper() upd = macdb.fetch_by_id(int(update_id)) if upd == None: request.setResponseCode(404) # Bad request return "Error: Not found." macdb.delete(int(update_id)) try: activeStream = open(Config.macActiveVersionFile, 'r') try: vt = activeStream.readline().strip(' \t\n\r') finally: activeStream.close() if vt == upd['version']: newLatest = macdb.fetch_latest() if newLatest == None: #delete file os.remove(Config.macActiveVersionFile) else: activeStream = open(Config.macActiveVersionFile, 'w') try: activeStream.write(newLatest['version'] + '\n') finally: activeStream.close() except IOError: pass macdb.cleanup() return """<!DOCTYPE html>
def render_GET(self, request): request.setHeader('Content-Type', 'application/rss+xml') macdb = DbHelper() items = macdb.fetch_several_latest(5) output = """<?xml version="1.0" encoding="utf-8"?> <rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel> <title>BitPop Update Feed</title> <link>""" output += Config.insecureDomain + self.pathFromRoot output += """</link> <description>List of BitPop packages with different versions.</description> <language>en</language>""" if len(items) > 0: for item in items: output += """ <item> <title>Version {0}</title> <description><![CDATA[ {1} ]]></description> <pubDate>{2}</pubDate> <enclosure url="{3}" sparkle:version="{0}" length="{4}" type="application/octet-stream" sparkle:dsaSignature="{5}" /> </item>""".format( item['version'], item['rel_notes'], strftime( "%a, %d %b %Y %H:%M:%S +0000", datetime.utcfromtimestamp(item['pub_ts']).timetuple()), getUpdateURLMac('BitPop-' + item['version'] + '.dmg'), item['dmg_size'], item['dsa_signature']) output += """ </channel> </rss> """ macdb.cleanup() return output
def render_GET(self, request): request.setHeader('Content-Type', 'application/rss+xml') macdb = DbHelper() items = macdb.fetch_several_latest(5) output = """<?xml version="1.0" encoding="utf-8"?> <rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel> <title>BitPop Update Feed</title> <link>""" output += Config.insecureDomain + self.pathFromRoot output += """</link> <description>List of BitPop packages with different versions.</description> <language>en</language>""" if len(items) > 0: for item in items: output += """ <item> <title>Version {0}</title> <description><![CDATA[ {1} ]]></description> <pubDate>{2}</pubDate> <enclosure url="{3}" sparkle:version="{0}" length="{4}" type="application/octet-stream" sparkle:dsaSignature="{5}" /> </item>""".format(item['version'], item['rel_notes'], strftime("%a, %d %b %Y %H:%M:%S +0000", datetime.utcfromtimestamp(item['pub_ts']).timetuple()), getUpdateURLMac('BitPop-' + item['version'] + '.dmg'), item['dmg_size'], item['dsa_signature']) output += """ </channel> </rss> """ macdb.cleanup() return output
def render_GET(self, request): macdb = DbHelper() res = macdb.uncensor_fetch_all() msg = request.args['msg'][0] if 'msg' in request.args else '' output = """<!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="chrome=1"> <title>House of Life Update Manager</title> <!-- CSS: implied media="all" --> <link rel="stylesheet" href="/css/style.css?v=2"> <link rel="stylesheet" href="/css/uncensor_domains.css"> <!-- Load jQuery --> <script type="text/javascript" src="http://www.google.com/jsapi"></script> <script type="text/javascript"> google.load("jquery", "1"); </script> <script type="text/javascript"> function post_to_url(path, params, method) { method = method || "post"; // Set method to post by default, if not specified. // The rest of this code assumes you are not using a library. // It can be made less wordy if you use one. var form = document.createElement("form"); form.setAttribute("method", method); form.setAttribute("action", path); for(var key in params) { var hiddenField = document.createElement("input"); hiddenField.setAttribute("type", "hidden"); hiddenField.setAttribute("name", key); hiddenField.setAttribute("value", params[key]); form.appendChild(hiddenField); } document.body.appendChild(form); form.submit(); } </script> <style type="text/css"> #banner {""" if msg == "": output += """ display:none;""" output += """ } </style> </head> <body> <div id="container"> <header> <h1>Uncensor domains</h1> <p>Copyright © 2011, House of Life Property ltd. All rights reserved.<br /> Copyright © 2011, Crystalnix <[email protected]></p> </header> <div id="main" role="main"> <div id="banner"> %s </div> <p> <a href="javascript:void(0)" onclick="javascript:$('#add_form').show(); return false;">Add domain pair</a> </p> <form id="add_form" style="display:none" method="post"> <label for="srcDomain"> Original domain: <input type="text" id="srcDomain" name="srcDomain" /> </label> <label for="dstDomain"> Domain to redirect to: <input type="text" id="dstDomain" name="dstDomain" /> </label> <input type="hidden" name="action" value="add" /> <input type="Submit" value="Submit" /> </form> <table id="domains"> <thead> <tr><th>Original domain</th> <th>Redirect domain</th> <th>Actions</th> </tr> </thead> <tbody>""" % (msg) if len(res) == 0: output += """ <tr><td colspan="3" style="text-align: center">No domains in database</td></tr>""" ctr = 0 for row in res: output += """ <tr class="{4}"> <td>{0}</td> <td>{1}</td> <td><a href="javascript:if (confirm('Do you really want to delete this record?')) post_to_url('{2}', {{'id': '{3}', 'action':'delete'}})">Delete</a></td> </tr>""".format(row['srcDomain'], row['dstDomain'], self.pathFromRoot, str(row['id']), 'even-row' if ctr % 2 == 0 else 'odd-row') ctr += 1 output += """ </tbody> </table> </div> <footer> </footer> </body> </html> """ macdb.cleanup() return output
def render_GET(self, request): macdb = DbHelper() mainDict = loadJsonAndCheckIfLatestKeyExists(Config.bitpopUpdateInfoFile) bitpopInfo = mainDict['jsonData'] latestExists = mainDict['latestExists'] output = """<!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="chrome=1"> <title>House of Life Update Manager</title> <!-- CSS: implied media="all" --> <link rel="stylesheet" href="/css/style.css?v=2"> </head> <body> <div id="container"> <header> <h1>House of Life Update Manager</h1> <p>Copyright © 2011, House of Life Property ltd. All rights reserved.<br /> Copyright © 2011, Crystalnix <[email protected]></p> </header> <div id="main" role="main"> <section id="win_updates">""" output += """ <h2>BitPop <img src="/img/windows-logo.png" alt="Windows logo" /></h2>""" if not latestExists: output += """ <p>There are no BitPop Windows updates available.</p>""" else: output += """ <p>Latest BitPop version: {0}</p>""".format(bitpopInfo["latest"]) output += """ <h3>Update files</h3> <ul> <li><a href="{0}">full update v{1}</a></li>""".format(getUpdateURL(bitpopInfo['latest']), bitpopInfo['latest']) if bitpopInfo.has_key('delta') and type(bitpopInfo['delta']) == type([]): for deltaFromVersion in bitpopInfo['delta']: output += """ <li><a href="{0}">delta update from v{1}</a></li>""".format( getUpdateURL(bitpopInfo['latest'], deltaFromVersion), deltaFromVersion) output += """ </ul>""" bitpopNewDict = loadJsonAndCheckIfLatestKeyExists(Config.bitpopNewUpdateInfoFile) bitpopNewInfo = bitpopNewDict['jsonData'] bitpopNewLatestExists = bitpopNewDict['latestExists'] if not bitpopNewLatestExists: output += """ <p><a href="{0}">Add new full version installer</a></p>""".format(self.pathFromRoot + '/new_full') else: output += """ <h3>Uploaded new version {0}</h3>""".format(bitpopNewInfo['latest']) if bitpopNewInfo.has_key('delta') and type(bitpopNewInfo['delta']) == type([]): output += """ <ul>""" for newDeltaFrom in bitpopNewInfo['delta']: output += """ <li>delta from {0}</li>""".format(newDeltaFrom) output += """ </ul>""" output += """ <p><a href="{0}">Add new delta update installer</a></p> <p><a href="{1}">Switch to new version ({2})</a></p>""".format( self.pathFromRoot + '/new_delta', self.pathFromRoot + '/switch', bitpopNewInfo['latest']) output += """ <p> <form style="display:none" id="clear_all" method="POST"> <input type="hidden" name="action" value="delete" /> </form> <a href="javascript:void(0)" onclick="(function () { document.getElementById('clear_all').submit();})()"> Clear all updates </a> </p> </section> <section id="mac_updates"> <h2>BitPop <img src="/img/apple-logo.png" alt="Apple logo" /></h2>""" macUpdates = macdb.fetch_several_latest(5) if len(macUpdates) != 0: output += """ <p>Latest BitPop version: {0}</p>""".format(macUpdates[0]["version"]) output += """ <h3>Update files:</h3> <ul>""" activeVersion = None try: activeStream = open(Config.macActiveVersionFile, "r") try: activeVersion = activeStream.readline() finally: activeStream.close() except IOError: pass for upd in macUpdates: output += """ <li><a href="{0}">full update v{1}{2}</a>""".format(getUpdateURLMac(upd['dmg_path']), upd['version'], ' (*)' if upd['version'] == activeVersion else '' ) output += """ <a href="/service/admin/mac/edit/{0}">Edit</a> | <a href="/service/admin/mac/delete/{0}" onclick="javascript: return confirm('Are you sure you want to delete this version?');"> Delete </a>""".format(upd['id']) output += """ </ul>""" # if macUpdates[0]['version'] != activeVersion: # output += """ # <p><a href="{0}">Make latest version active else: output += """ <p>There are no BitPop mac updates available.</p>""" output += """ <p><a href="{0}">Add new version archive</a></p>""".format(self.pathFromRoot + '/mac/new_full') output += """ </section> </div> <footer> </footer> </div> </body> </html>""" macdb.cleanup() return output
def render_GET(self, request): macdb = DbHelper() res = macdb.uncensorp_fetch_all() msg = request.args['msg'][0] if 'msg' in request.args else '' output = """<!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="chrome=1"> <title>House of Life Update Manager</title> <!-- CSS: implied media="all" --> <link rel="stylesheet" href="/css/style.css?v=2"> <link rel="stylesheet" href="/css/uncensor_domains.css"> <!-- Load jQuery --> <script type="text/javascript" src="http://www.google.com/jsapi"></script> <script type="text/javascript"> google.load("jquery", "1"); </script> <script type="text/javascript"> function post_to_url(path, params, method) { method = method || "post"; // Set method to post by default, if not specified. // The rest of this code assumes you are not using a library. // It can be made less wordy if you use one. var form = document.createElement("form"); form.setAttribute("method", method); form.setAttribute("action", path); for(var key in params) { var hiddenField = document.createElement("input"); hiddenField.setAttribute("type", "hidden"); hiddenField.setAttribute("name", key); hiddenField.setAttribute("value", params[key]); form.appendChild(hiddenField); } document.body.appendChild(form); form.submit(); } $(function() { $('#countries').change(function() { if ($('#countries option:selected').val()) { $('#cur_country_icon').attr('src', '/img/gif-flags/' + $('#countries option:selected').val().toLowerCase() + '.gif'); $('#cur_country_icon').show(); } }); }); </script> <style type="text/css"> #banner {""" if msg == "": output += """ display:none;""" output += """ } </style> </head> <body> <div id="container"> <header> <h1>Uncensor Proxy domains</h1> <p>Copyright © 2012, House of Life Property ltd. All rights reserved.<br /> Copyright © 2012, Crystalnix <[email protected]></p> </header> <div id="main" role="main"> <div id="banner"> %s </div> <p> <a href="javascript:void(0)" onclick="javascript:$('#add_form').show(); return false;">Add domain pair</a> </p> <form id="add_form" style="display:none" method="post"> <label for="countries"> Country: <select id="countries" name="iso"> <option value="">Choose from list...</option>""" % (msg) country_list = list(pycountry.countries) for country in country_list: output += '<option value="' + country.alpha2.encode('utf-8') + '">' + country.name.encode('utf-8') + '</option>' output += """ </select> <img id="cur_country_icon" style="display:none" src="/img/gif-flags/us.gif" alt="flag" title="US" /> </label> <label for="domain"> Original domain: <input type="text" id="domain" name="domain" /> </label> <input type="hidden" name="action" value="add" /> <input type="Submit" value="Submit" /> </form> <table id="domains"> <thead> <tr><th>Country</th> <th>Blocked domain</th> <th>Actions</th> </tr> </thead> <tbody>""" if len(res) == 0: output += """ <tr><td colspan="3" style="text-align: center">No domains in database</td></tr>""" ctr = 0 prevCountry = "" for row in res: output += """ <tr class="{5}"> <td><img src="/img/gif-flags/{0}.gif" alt="{1}" /> {1}</td> <td>{2}</td> <td><a href="javascript:if (confirm('Do you really want to delete this record?')) post_to_url('{3}', {{'id': '{4}', 'action':'delete'}})">Delete</a></td> </tr>""".format(row['iso'].lower(), pycountry.countries.get(alpha2=row['iso']).name, row['domain'], self.pathFromRoot, str(row['id']), 'even-row' if ctr % 2 == 0 else 'odd-row') ctr += 1 output += """ </tbody> </table> </div> <footer> </footer> </body> </html> """ macdb.cleanup() return output
def render_GET(self, request): macdb = DbHelper() res = macdb.uncensorp_fetch_all() msg = request.args['msg'][0] if 'msg' in request.args else '' output = """<!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="chrome=1"> <title>House of Life Update Manager</title> <!-- CSS: implied media="all" --> <link rel="stylesheet" href="/css/style.css?v=2"> <link rel="stylesheet" href="/css/uncensor_domains.css"> <!-- Load jQuery --> <script type="text/javascript" src="http://www.google.com/jsapi"></script> <script type="text/javascript"> google.load("jquery", "1"); </script> <script type="text/javascript"> function post_to_url(path, params, method) { method = method || "post"; // Set method to post by default, if not specified. // The rest of this code assumes you are not using a library. // It can be made less wordy if you use one. var form = document.createElement("form"); form.setAttribute("method", method); form.setAttribute("action", path); for(var key in params) { var hiddenField = document.createElement("input"); hiddenField.setAttribute("type", "hidden"); hiddenField.setAttribute("name", key); hiddenField.setAttribute("value", params[key]); form.appendChild(hiddenField); } document.body.appendChild(form); form.submit(); } $(function() { $('#countries').change(function() { if ($('#countries option:selected').val()) { $('#cur_country_icon').attr('src', '/img/gif-flags/' + $('#countries option:selected').val().toLowerCase() + '.gif'); $('#cur_country_icon').show(); } }); }); </script> <style type="text/css"> #banner {""" if msg == "": output += """ display:none;""" output += """ } </style> </head> <body> <div id="container"> <header> <h1>Uncensor Proxy domains</h1> <p>Copyright © 2012, House of Life Property ltd. All rights reserved.<br /> Copyright © 2012, Crystalnix <[email protected]></p> </header> <div id="main" role="main"> <div id="banner"> %s </div> <p> <a href="javascript:void(0)" onclick="javascript:$('#add_form').show(); return false;">Add domain pair</a> </p> <form id="add_form" style="display:none" method="post"> <label for="countries"> Country: <select id="countries" name="iso"> <option value="">Choose from list...</option>""" % (msg) country_list = list(pycountry.countries) for country in country_list: output += '<option value="' + country.alpha2.encode( 'utf-8') + '">' + country.name.encode('utf-8') + '</option>' output += """ </select> <img id="cur_country_icon" style="display:none" src="/img/gif-flags/us.gif" alt="flag" title="US" /> </label> <label for="domain"> Original domain: <input type="text" id="domain" name="domain" /> </label> <input type="hidden" name="action" value="add" /> <input type="Submit" value="Submit" /> </form> <table id="domains"> <thead> <tr><th>Country</th> <th>Blocked domain</th> <th>Actions</th> </tr> </thead> <tbody>""" if len(res) == 0: output += """ <tr><td colspan="3" style="text-align: center">No domains in database</td></tr>""" ctr = 0 prevCountry = "" for row in res: output += """ <tr class="{5}"> <td><img src="/img/gif-flags/{0}.gif" alt="{1}" /> {1}</td> <td>{2}</td> <td><a href="javascript:if (confirm('Do you really want to delete this record?')) post_to_url('{3}', {{'id': '{4}', 'action':'delete'}})">Delete</a></td> </tr>""".format(row['iso'].lower(), pycountry.countries.get(alpha2=row['iso']).name, row['domain'], self.pathFromRoot, str(row['id']), 'even-row' if ctr % 2 == 0 else 'odd-row') ctr += 1 output += """ </tbody> </table> </div> <footer> </footer> </body> </html> """ macdb.cleanup() return output
def render_POST(self, request): macdb = DbHelper() versionRegex = re.compile('^\d+\.\d+\.\d+\.\d+$') if not versionRegex.match(request.args['newVersion'][0]): request.setResponseCode(400) # Bad request return "Error: malformed version number." latest = macdb.fetch_latest() if latest != None and versionCompare(latest['version'], request.args['newVersion'][0]) != -1: request.setResponseCode(400) # Bad request return "Error: version number invalid. Supply version number greater than old version." newRecord = {}; newRecord['version'] = request.args['newVersion'][0] newRecord['dmg_path'] = os.path.join(Config.bitpopDirectory, 'mac', 'BitPop-' + newRecord['version'] + '.dmg') newRecord['dmg_size'] = str(len(request.args['fileToUpload'][0])) outDir = os.path.join(Config.bitpopDirectory, 'mac') if not os.path.exists(outDir): os.mkdir(outDir, 0755) elif not os.path.isdir(outDir): os.remove(outDir) os.mkdir(outDir, 0755) filename = newRecord['dmg_path'] try: outputStream = open(filename, 'wb') try: outputStream.write(request.args['fileToUpload'][0]) finally: outputStream.close() # sha = hashlib.new('sha1') # sha.update(request.args['fileToUpload'][0]) # hash = base64.b64encode(sha.digest()) os.system('openssl dgst -sha1 -binary < "{0}" | openssl dgst -dss1 -sign "dsa_priv.pem" | \ openssl enc -base64 > sig.txt'.format(filename)) sig = open('sig.txt', 'r') try: tsig = sig.readline() finally: sig.close() # md = EVP.MessageDigest('sha1') # md.update(request.args['fileToUpload'][0]) # digest = md.final() # # dsa = DSA.load_key(Config.dsaPrivateKeyFile) # sig = dsa.sign_asn1(digest) newRecord['dsa_signature'] = tsig.strip('\n\r\t ') newRecord['rel_notes'] = request.args['releaseNotes'][0]; macdb.insert(newRecord) activeStream = open(Config.macActiveVersionFile, 'w') try: activeStream.write(newRecord['version'] + "\n") finally: activeStream.close() except IOError: request.setResponseCode(500) # Internal server error return "Error: Internal Server Error. Failed to do some file operation." macdb.cleanup() return "OK. File was successfully uploaded to server."
def render_GET(self, request): tr = re.compile('.*/(\d*)$') m = re.match(tr, request.path) if len(m.groups()) == 0: request.setResponseCode(400) # Bad request return "Error: Bad request." update_id = m.groups()[0] macdb = DbHelper() upd = macdb.fetch_by_id(int(update_id)) macdb.cleanup() if upd == None: request.setResponseCode(404) # Not found return "Error: Record with such id not found." output = """<!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="chrome=1"> <title>House of Life Update Manager</title> <!-- CSS: implied media="all" --> <link rel="stylesheet" href="/css/style.css?v=2"> <!-- Load jQuery --> <script type="text/javascript" src="http://www.google.com/jsapi"></script> <script type="text/javascript"> google.load("jquery", "1"); </script> <!-- Load TinyMCE --> <script type="text/javascript" src="/js/tiny_mce/jquery.tinymce.js"></script> <script type="text/javascript"> $().ready(function() { $('textarea.tinymce').tinymce({ // Location of TinyMCE script script_url : '/js/tiny_mce/tiny_mce.js', // General options theme : "advanced", plugins : "autolink,lists,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,advlist", // Theme options theme_advanced_buttons1 : "save,newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,styleselect,formatselect,fontselect,fontsizeselect", theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,insertdate,inserttime,preview,|,forecolor,backcolor", theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen", theme_advanced_buttons4 : "insertlayer,moveforward,movebackward,absolute,|,styleprops,|,cite,abbr,acronym,del,ins,attribs,|,visualchars,nonbreaking,template,pagebreak", theme_advanced_toolbar_location : "top", theme_advanced_toolbar_align : "left", theme_advanced_statusbar_location : "bottom", theme_advanced_resizing : true, // Example content CSS (should be your site CSS) content_css : "/css/rel_notes.css" //, // Drop lists for link/image/media/template dialogs // template_external_list_url : "lists/template_list.js", // external_link_list_url : "lists/link_list.js", // external_image_list_url : "lists/image_list.js", // media_external_list_url : "lists/media_list.js", // Replace values for the template plugin // template_replace_values : { // username : "******", // staffid : "991234" // } }); }); </script> <!-- /TinyMCE --> </head>""" output += """ <body> <div id="container"> <header> <h1>Edit Release Notes for Mac version</h1> <p>Copyright © 2011, House of Life Property ltd. All rights reserved.<br /> Copyright © 2011, Crystalnix <[email protected]></p> </header> <div id="main" role="main"> <form method="post"> <label for="release_notes_text">Release Notes</label> <textarea class="tinymce" style="height: 400px" name="rel_notes" id="release_notes_text">{0}</textarea> <input type="hidden" name="rec_id" value="{1}" /> <input type="submit" value="Submit" /> </form> </div> <footer> </footer> </body> </html> """.format(cgi.escape(upd['rel_notes']), str(upd['id'])) return output
def render_GET(self, request): macdb = DbHelper() mainDict = loadJsonAndCheckIfLatestKeyExists( Config.bitpopUpdateInfoFile) bitpopInfo = mainDict['jsonData'] latestExists = mainDict['latestExists'] output = """<!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="chrome=1"> <title>House of Life Update Manager</title> <!-- CSS: implied media="all" --> <link rel="stylesheet" href="/css/style.css?v=2"> </head> <body> <div id="container"> <header> <h1>House of Life Update Manager</h1> <p>Copyright © 2011, House of Life Property ltd. All rights reserved.<br /> Copyright © 2011, Crystalnix <[email protected]></p> </header> <div id="main" role="main"> <section id="win_updates">""" output += """ <h2>BitPop <img src="/img/windows-logo.png" alt="Windows logo" /></h2>""" if not latestExists: output += """ <p>There are no BitPop Windows updates available.</p>""" else: output += """ <p>Latest BitPop version: {0}</p>""".format(bitpopInfo["latest"]) output += """ <h3>Update files</h3> <ul> <li><a href="{0}">full update v{1}</a></li>""".format( getUpdateURL(bitpopInfo['latest']), bitpopInfo['latest']) if bitpopInfo.has_key('delta') and type( bitpopInfo['delta']) == type([]): for deltaFromVersion in bitpopInfo['delta']: output += """ <li><a href="{0}">delta update from v{1}</a></li>""".format( getUpdateURL(bitpopInfo['latest'], deltaFromVersion), deltaFromVersion) output += """ </ul>""" bitpopNewDict = loadJsonAndCheckIfLatestKeyExists( Config.bitpopNewUpdateInfoFile) bitpopNewInfo = bitpopNewDict['jsonData'] bitpopNewLatestExists = bitpopNewDict['latestExists'] if not bitpopNewLatestExists: output += """ <p><a href="{0}">Add new full version installer</a></p>""".format( self.pathFromRoot + '/new_full') else: output += """ <h3>Uploaded new version {0}</h3>""".format( bitpopNewInfo['latest']) if bitpopNewInfo.has_key('delta') and type( bitpopNewInfo['delta']) == type([]): output += """ <ul>""" for newDeltaFrom in bitpopNewInfo['delta']: output += """ <li>delta from {0}</li>""".format(newDeltaFrom) output += """ </ul>""" output += """ <p><a href="{0}">Add new delta update installer</a></p> <p><a href="{1}">Switch to new version ({2})</a></p>""".format( self.pathFromRoot + '/new_delta', self.pathFromRoot + '/switch', bitpopNewInfo['latest']) output += """ <p> <form style="display:none" id="clear_all" method="POST"> <input type="hidden" name="action" value="delete" /> </form> <a href="javascript:void(0)" onclick="(function () { document.getElementById('clear_all').submit();})()"> Clear all updates </a> </p> </section> <section id="mac_updates"> <h2>BitPop <img src="/img/apple-logo.png" alt="Apple logo" /></h2>""" macUpdates = macdb.fetch_several_latest(5) if len(macUpdates) != 0: output += """ <p>Latest BitPop version: {0}</p>""".format( macUpdates[0]["version"]) output += """ <h3>Update files:</h3> <ul>""" activeVersion = None try: activeStream = open(Config.macActiveVersionFile, "r") try: activeVersion = activeStream.readline() finally: activeStream.close() except IOError: pass for upd in macUpdates: output += """ <li><a href="{0}">full update v{1}{2}</a>""".format( getUpdateURLMac(upd['dmg_path']), upd['version'], ' (*)' if upd['version'] == activeVersion else '') output += """ <a href="/service/admin/mac/edit/{0}">Edit</a> | <a href="/service/admin/mac/delete/{0}" onclick="javascript: return confirm('Are you sure you want to delete this version?');"> Delete </a>""".format(upd['id']) output += """ </ul>""" # if macUpdates[0]['version'] != activeVersion: # output += """ # <p><a href="{0}">Make latest version active else: output += """ <p>There are no BitPop mac updates available.</p>""" output += """ <p><a href="{0}">Add new version archive</a></p>""".format( self.pathFromRoot + '/mac/new_full') output += """ </section> </div> <footer> </footer> </div> </body> </html>""" macdb.cleanup() return output
def render_POST(self, request): macdb = DbHelper() versionRegex = re.compile('^\d+\.\d+\.\d+\.\d+$') if not versionRegex.match(request.args['newVersion'][0]): request.setResponseCode(400) # Bad request return "Error: malformed version number." latest = macdb.fetch_latest() if latest != None and versionCompare( latest['version'], request.args['newVersion'][0]) != -1: request.setResponseCode(400) # Bad request return "Error: version number invalid. Supply version number greater than old version." newRecord = {} newRecord['version'] = request.args['newVersion'][0] newRecord['dmg_path'] = os.path.join( Config.bitpopDirectory, 'mac', 'BitPop-' + newRecord['version'] + '.dmg') newRecord['dmg_size'] = str(len(request.args['fileToUpload'][0])) outDir = os.path.join(Config.bitpopDirectory, 'mac') if not os.path.exists(outDir): os.mkdir(outDir, 0755) elif not os.path.isdir(outDir): os.remove(outDir) os.mkdir(outDir, 0755) filename = newRecord['dmg_path'] try: outputStream = open(filename, 'wb') try: outputStream.write(request.args['fileToUpload'][0]) finally: outputStream.close() # sha = hashlib.new('sha1') # sha.update(request.args['fileToUpload'][0]) # hash = base64.b64encode(sha.digest()) os.system( 'openssl dgst -sha1 -binary < "{0}" | openssl dgst -dss1 -sign "dsa_priv.pem" | \ openssl enc -base64 > sig.txt'.format(filename)) sig = open('sig.txt', 'r') try: tsig = sig.readline() finally: sig.close() # md = EVP.MessageDigest('sha1') # md.update(request.args['fileToUpload'][0]) # digest = md.final() # # dsa = DSA.load_key(Config.dsaPrivateKeyFile) # sig = dsa.sign_asn1(digest) newRecord['dsa_signature'] = tsig.strip('\n\r\t ') newRecord['rel_notes'] = request.args['releaseNotes'][0] macdb.insert(newRecord) activeStream = open(Config.macActiveVersionFile, 'w') try: activeStream.write(newRecord['version'] + "\n") finally: activeStream.close() except IOError: request.setResponseCode(500) # Internal server error return "Error: Internal Server Error. Failed to do some file operation." macdb.cleanup() return "OK. File was successfully uploaded to server."