Ejemplo n.º 1
0
def tx_request(tx, cursor):
    payload = json.loads(tx.payload)
    payload['payment'] = int(payload['payment'])
    payload['dealer_fee'] = int(payload.get('dealer_fee', '0'))

    buyer = models.Account(tx.chain_id, tx.sender, cursor)
    parcel = models.Parcel(tx.chain_id, payload['target'], None, cursor)
    request = models.Request(tx.chain_id, parcel.parcel_id, buyer.address,
                             cursor)

    request.payment = payload['payment']
    request.dealer = payload.get('dealer', None)
    request.dealer_fee = payload['dealer_fee']
    request.extra = json.dumps(payload.get('extra', {}))
    request.save(cursor)
    if tx.sender not in yappers:
        rel = models.RelParcelTx(tx.chain_id, parcel.parcel_id, tx.height,
                                 tx.index)
        rel.save(cursor)

    if request.dealer is not None:
        buyer.balance -= request.dealer_fee
    buyer.balance -= request.payment
    buyer.save(cursor)
    rel = models.RelAccountTx(tx.chain_id, buyer.address, tx.height, tx.index,
                              cursor)
    rel.amount -= request.payment
    rel.save(cursor)
Ejemplo n.º 2
0
def tx_grant(tx, cursor):
    payload = json.loads(tx.payload)

    parcel = models.Parcel(tx.chain_id, payload['target'], None, cursor)
    storage = models.Storage(tx.chain_id, parcel.storage_id, None, cursor)
    host = models.Account(tx.chain_id, storage.owner, cursor)
    owner = models.Account(tx.chain_id, parcel.owner, cursor)
    request = models.Request(tx.chain_id, payload['target'],
                             payload['grantee'], cursor)
    usage = models.Usage(tx.chain_id, payload['target'], payload['grantee'],
                         cursor)

    usage.custody = payload['custody']
    usage.extra = payload.get('extra', '{}')
    usage.save(cursor)

    owner.balance += request.payment
    if request.dealer is not None:
        dealer = models.Account(tx.chain_id, request.dealer, cursor)
        dealer.balance += request.dealer_fee
        dealer.save(cursor)
    owner.balance -= storage.hosting_fee
    owner.save(cursor)

    host.balance += storage.hosting_fee
    host.save(cursor)

    request.delete(cursor)
Ejemplo n.º 3
0
def tx_cancel(tx, cursor):
    payload = json.loads(tx.payload)

    buyer = models.Account(tx.chain_id, tx.sender, cursor)
    request = models.Request(tx.chain_id, payload['target'], tx.sender, cursor)

    buyer.balance += request.payment
    buyer.balance += request.dealer_fee
    buyer.save(cursor)

    request.delete(cursor)
Ejemplo n.º 4
0
def tx_grant(tx, cursor):
    payload = json.loads(tx.payload)

    grantee = ''
    if 'grantee' in payload:
        grantee = payload['grantee']
    elif 'recipient' in payload:
        grantee = payload['recipient']

    parcel = models.Parcel(tx.chain_id, payload['target'], None, cursor)
    storage = models.Storage(tx.chain_id, parcel.storage_id, None, cursor)
    host = models.Account(tx.chain_id, storage.owner, cursor)
    owner = models.Account(tx.chain_id, parcel.owner, cursor)
    # NOTE: This is line is for creating buyer account in s_accounts table. It
    # is necessary to satisfy the foreign key constraint. Even if we create a
    # row for each tx sender, it is not the case for the recipient for
    # `request` or `grant` tx. So, we need to explicitly create a grantee or
    # recipient account in s_accounts table.
    buyer = models.Account(tx.chain_id, grantee, cursor)
    buyer.save(cursor)
    request = models.Request(tx.chain_id, payload['target'], grantee, cursor)
    usage = models.Usage(tx.chain_id, payload['target'], grantee, cursor)

    usage.custody = payload['custody']
    usage.extra = json.dumps(payload.get('extra', {}))
    usage.save(cursor)
    if tx.sender not in yappers:
        rel = models.RelParcelTx(tx.chain_id, parcel.parcel_id, tx.height,
                                 tx.index)
        rel.save(cursor)

    owner.balance += request.payment
    if request.dealer is not None:
        dealer = models.Account(tx.chain_id, request.dealer, cursor)
        dealer.balance += request.dealer_fee
        dealer.save(cursor)
    owner.balance -= storage.hosting_fee
    owner.save(cursor)
    if storage.hosting_fee > 0:
        rel = models.RelAccountTx(tx.chain_id, owner.address, tx.height,
                                  tx.index, cursor)
        rel.amount -= storage.hosting_fee
        rel.save(cursor)

        host.balance += storage.hosting_fee
        host.save(cursor)
        rel = models.RelAccountTx(tx.chain_id, host.address, tx.height,
                                  tx.index, cursor)
        rel.amount += storage.hosting_fee
        rel.save(cursor)

    request.delete(cursor)
Ejemplo n.º 5
0
def tx_cancel(tx, cursor):
    payload = json.loads(tx.payload)

    buyer = models.Account(tx.chain_id, tx.sender, cursor)
    request = models.Request(tx.chain_id, payload['target'], tx.sender, cursor)

    buyer.balance += request.payment
    buyer.balance += request.dealer_fee
    buyer.save(cursor)
    rel = models.RelAccountTx(tx.chain_id, buyer.address, tx.height, tx.index,
                              cursor)
    rel.amount += request.payment + request.dealer_fee
    rel.save(cursor)

    request.delete(cursor)
def handle_request(connection: socket.socket, address, logger, root_dir):
    logger.debug("Connected at %r", address)
    try:
        req = models.Request(connection.recv(1024))
    except IndexError:
        connection.send(b'Non HTTP protocol used')
        connection.close()
        logger.debug("Connection closed")
        return

    is_dir = False
    path = root_dir + urllib.parse.unquote(urllib.parse.urlparse(req.URL).path)
    if path[-1] == '/':
        is_dir = True
        path += 'index.html'

    resp_code = 200
    if not os.path.exists(path):
        if is_dir:
            resp_code = 403
        else:
            resp_code = 404
    if path.find('../') != -1:
        resp_code = 403
    resp: models.Response
    if resp_code == 200 and req.Method in methods:
        size = os.path.getsize(path)
        resp = models.Response(req.Protocol, req.Method, resp_code,
                               mimetypes.guess_type(path)[0], size)
    else:
        resp = models.Response(req.Protocol, req.Method, resp_code)

    logger.debug(resp_code)

    connection.sendall(resp.get_raw_headers())
    if req.Method == 'GET' and resp_code == 200:
        file = open(path, 'rb')

        connection.sendfile(file, 0)
        file.close()
        connection.shutdown(socket.SHUT_RDWR)

    connection.shutdown(socket.SHUT_RDWR)

    logger.debug("Connection closed")
Ejemplo n.º 7
0
def data_put(request):

    if request.method != 'POST':
        return render(request, 'api.html', {})

    r = models.Request()
    r.put()

    data_id = r.key().id()

    # save data to file into gcs, because it size can exceed taskqueue payload capacity (~ 100 Kb)
    store.put("%s" % data_id, zlib.compress(request.POST.get('data', '')))
    taskqueue.add(url=reverse('api_do', None, [], {}),
                  method="POST",
                  params={'key': data_id})
    return redirect(reverse('api_get', None, [], {
        'questid': data_id,
    }))
Ejemplo n.º 8
0
def tx_request(tx, cursor):
    payload = json.loads(tx.payload)
    payload['payment'] = int(payload['payment'])
    payload['dealer_fee'] = int(payload.get('dealer_fee', '0'))

    buyer = models.Account(tx.chain_id, tx.sender, cursor)
    parcel = models.Parcel(tx.chain_id, payload['target'], None, cursor)
    request = models.Request(tx.chain_id, parcel.parcel_id, buyer.address,
                             cursor)

    request.payment = payload['payment']
    request.dealer = payload.get('dealer', None)
    request.dealer_fee = payload['dealer_fee']
    request.extra = payload.get('extra', '{}')
    request.save(cursor)

    if request.dealer is not None:
        buyer.balance -= request.dealer_fee
    buyer.balance -= request.payment
    buyer.save(cursor)
Ejemplo n.º 9
0
def postservice():
    title = request.form['title']
    description = request.form['description']
    target = request.form['target']
    client = request.form['client']
    category = request.form['category']
    rank = request.form['rank']
    # Database
    # req is creating a new constructor object based off the Request Class.
    req = models.Request(title=title,
                         description=description,
                         target=target,
                         client=client,
                         category=category,
                         rank=rank)
    # Adds req to the database session.
    db.session.add(req)
    # Runs the SQL INSERT statement which adds the data to the database.
    db.session.commit()

    return 'post successful'
Ejemplo n.º 10
0
def tx_grant(tx, cursor):
    payload = json.loads(tx.payload)

    parcel = models.Parcel(tx.chain_id, payload['target'], None, cursor)
    storage = models.Storage(tx.chain_id, parcel.storage_id, None, cursor)
    host = models.Account(tx.chain_id, storage.owner, cursor)
    owner = models.Account(tx.chain_id, parcel.owner, cursor)
    request = models.Request(tx.chain_id, payload['target'],
                             payload['grantee'], cursor)
    usage = models.Usage(tx.chain_id, payload['target'], payload['grantee'],
                         cursor)

    usage.custody = payload['custody']
    usage.extra = json.dumps(payload.get('extra', {}))
    usage.save(cursor)
    # rel = models.RelParcelTx(tx.chain_id, parcel.parcel_id, tx.height,
    #                          tx.index, cursor)
    # rel.save(cursor)

    owner.balance += request.payment
    if request.dealer is not None:
        dealer = models.Account(tx.chain_id, request.dealer, cursor)
        dealer.balance += request.dealer_fee
        dealer.save(cursor)
    owner.balance -= storage.hosting_fee
    owner.save(cursor)
    if storage.hosting_fee > 0:
        rel = models.RelAccountTx(tx.chain_id, owner.address, tx.height,
                                  tx.index, cursor)
        rel.amount -= storage.hosting_fee
        rel.save(cursor)

        host.balance += storage.hosting_fee
        host.save(cursor)
        rel = models.RelAccountTx(tx.chain_id, host.address, tx.height,
                                  tx.index, cursor)
        rel.amount += storage.hosting_fee
        rel.save(cursor)

    request.delete(cursor)
Ejemplo n.º 11
0
def notify():
    """
    Notifies a new positive or symptomatic case of COVID-19 and returns a `201 Created` response.

    Returns a `403 Forbidden` response when trying to notify an already reported case.

    Returns a `429 Too many requests` response when getting more than 5 requests per 5 minutes from
    the same remote host.
    """

    form = NotifyForm(request.form)

    if form.validate():
        # Does not allow to override an already reported case.
        already_exists = models.DailyKey.query                                          \
            .filter(models.DailyKey.key.in_(key['value'] for key in form.keys.data))    \
            .count()

        if already_exists > 0:
            return 'Forbidden', 403

        # Does not allow more than 5 requests per IP per hour.
        #
        # We allow a reasonable amount of devices from the same address to notify cases in a short
        # period of time as multiple cases can legitimately originate from the same household or
        # organisation.

        if not request.headers.getlist("X-Forwarded-For"):
            remote_addr = request.remote_addr
        else:
            remote_addr = request.headers.getlist("X-Forwarded-For")[0]

        user_agent = request.headers.get('User-Agent')

        one_hour_ago = datetime.datetime.utcnow() - datetime.timedelta(hours=1)
        prev_reporting_count = models.Request.query                         \
            .filter_by(remote_addr=remote_addr)                             \
            .filter(models.Request.created_at >= one_hour_ago)              \
            .count()

        if prev_reporting_count >= 5:
            return 'Too many requests', 429

        # --

        for key in form.keys.data:
            db_key = models.DailyKey(
                key=key['value'],
                date=key['date'],
                is_tested=form.is_tested.data,
            )
            models.db.session.add(db_key)

        req = models.Request(
            remote_addr=remote_addr,
            user_agent=user_agent,
            comment=form.comment.data,
        )
        models.db.session.add(req)

        models.db.session.commit()

        return 'Created', 201
    else:
        return 'Bad request', 400
Ejemplo n.º 12
0
engine = create_engine('sqlite:///:memory:', echo=True)
Session = sessionmaker(engine)

session = Session()

models.Base.metadata.create_all(engine)

manager = models.Employee(name_last='Supervisor', name_first='Mark')

me = models.Employee(name_last='Rubin',
                     name_first='Benjamin',
                     email='*****@*****.**',
                     manager=manager)
jas = models.Employee(name_last='Doe',
                      name_first='Jane',
                      email='*****@*****.**',
                      manager=manager)
session.add(manager)
session.commit()
session.add_all((me, jas))
session.commit()

req = models.Request(start_date=datetime.now(),
                     end_date=datetime.now(),
                     employee_id=me.id)

session.add(req)
session.commit()

print(me.requests_pending)