示例#1
0
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,
    }
示例#2
0
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')),
        }
    }
示例#3
0
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,
        })