def page_retrieve_get(request): show_immediately = convert_bool(request.GET.get('show', False)) sc = SecretController.SecretController() uniqhash = request.matchdict['uuid'] try: secret, plaintext = sc.decrypt_secret(uniqhash) except SecretExpiredException: return HTTPFound(location=request.route_url('expired')) # parse the secret's metadata and generate some friendly texts expiry = (secret.expiry_time - datetime.datetime.now()).total_seconds() days = expiry / 86400 hours = ((expiry / 86400) - (expiry // 86400)) * 24 friendly_time = '~approximately {} day(s) and {:.1f} hour(s)'.format(int(days), hours) if secret.flag_unlimited_reads: friendly_clicks = 'unlimited' elif secret.lifetime_reads == 1: friendly_clicks = '1 view' else: friendly_clicks = '{}'.format(secret.lifetime_reads) return { 'vc': ViewController.ViewController(request), 'show_immediately': show_immediately, 'secret': secret, 'plaintext': plaintext, 'friendly_clicks': friendly_clicks, 'friendly_time': friendly_time, 'needs_highlight': secret.flag_needs_highlight, }
def api_secret_post(request): sc = SecretController.SecretController() maxhours = sc.is_inrangeor(val=request.GET.get('maximum_hours', 0), rmin=1, rmax=168, become=4) maxviews = sc.is_inrangeor(val=request.GET.get('maximum_views', 0), rmin=1, rmax=100, become=2) flag_unlimited = convert_bool(request.GET.get('set_unlimited_views', False)) flag_early_expire = convert_bool(request.GET.get('set_early_expire', True)) flag_needs_highlight = convert_bool(request.GET.get('set_needs_highlight', False)) if flag_unlimited: maxviews = -1 try: data = bytes(request.POST.get('data').file.read()) except: data = bytes(request.POST.get('data'), 'utf-8') expiry = datetime.datetime.now() + datetime.timedelta(hours=maxhours) secret, uuid = sc.create_secret(expiry_time=expiry, lifetime_reads=maxviews, needs_highlight=flag_needs_highlight, early_delete=flag_early_expire, plaintext=data) return { "status": 200, "msg": "OK", "data": { "uuid": uuid.decode('utf-8'), "host": request.host, "browser_uri": "/retrieve/{0}".format(uuid.decode('utf-8')), "api_uri": "/api/v1/secret/{0}".format(uuid.decode('utf-8')), } }
def api_secretuuid_get(request): ac = ApiController.ApiController() flag_dataonly = convert_bool(request.GET.get('data', False)) flag_metaonly = convert_bool(request.GET.get('meta', False)) mime = request.GET.get('mime', False) if mime: flag_dataonly = True # these are mutually exclusive if flag_dataonly and flag_metaonly: return ac.set_props(status='INVALID', data=['data','meta']) uuid = request.matchdict.get('uuid', None) sc = SecretController.SecretController() try: secret, plaintext = sc.decrypt_secret(uuid, metaonly=flag_metaonly) except SecretExpiredException: if flag_dataonly: request.response.body = b'' request.response.status = '404 Not Found' if mime: request.response.content_type = mime else: request.response.content_type = 'application/octet-stream' return request.response return ac.set_props(status='OK', http=404, data=None) if secret.flag_unlimited_reads: remaining_reads = -1 can_unlimited_reads = True else: can_unlimited_reads = False remaining_reads = secret.lifetime_reads if secret.flag_delete_early: can_early_expire = True if flag_metaonly: stored_data = '<not retrieved>' else: try: stored_data = plaintext.decode('utf-8') except UnicodeDecodeError: stored_data = plaintext if flag_dataonly: try: request.response.body = bytes(stored_data.encode('utf-8')) except AttributeError: request.response.body = bytes(stored_data) request.response.status = '200 OK' if mime: request.response.content_type = mime else: request.response.content_type = 'application/octet-stream' return request.response else: return ac.set_props(status='OK', data={ 'expiry_time': str(secret.expiry_time), 'remaining_reads': remaining_reads, 'can_early_expire': can_early_expire, 'can_unlimited_reads': can_unlimited_reads, 'datasize': secret.datasize, 'stored_data': stored_data, })