Esempio n. 1
0
    async def management_index(self, request):
        import datetime

        pms = PerformanceMeasurementSystem(enable=request.query.get("pms", False))
        async with self._session(request) as session:
            now = datetime.datetime.now()
            start_date = now - datetime.timedelta(days=28)
            q = (
                select(
                    sqlalchemy.func.date_trunc("day", Change.timestamp).label("dateof"),
                    sqlalchemy.func.count(Change.change).label("totalof"),
                    sqlalchemy.func.count(sqlalchemy.distinct(Change._entity)).label(
                        "uniqueof"
                    ),
                    Entity.identity.label("actionof"),
                )
                .select_from(Change)
                .join(Entity, Entity.entity == Change._entity)
                .filter(Change.timestamp.between(start_date, now))
                .group_by(text("dateof"), Entity.identity)
            )
            async with pms.measure():
                r = await session.execute(q)

            s = collections.defaultdict(
                lambda: {
                    k: {"total": 0, "unique": 0}
                    for k in [
                        "identifier",
                        "account",
                        "order",
                        "challenge",
                        "authorization",
                        "certificate",
                    ]
                }
            )

            for m in r.mappings():
                s[m["dateof"].date()][m["actionof"]].update(
                    {
                        "total": m["totalof"],
                        "unique": m["uniqueof"],
                    }
                )

            statistics = []
            for i in sorted(s.keys(), reverse=True):
                statistics.append(
                    (
                        i,
                        s[i],
                        sum(map(lambda x: x["total"], s[i].values())),
                        sum(map(lambda x: x["unique"], s[i].values())),
                    )
                )
            return {"statistics": statistics, "pms": pms}
Esempio n. 2
0
    async def management_accounts(self, request):
        pms = PerformanceMeasurementSystem(
            enable=request.query.get("pms", False))
        async with self._session(request) as session:
            q = select(sqlalchemy.func.count(Account.account_id))
            async with pms.measure():
                total = (await session.execute(q)).scalars().first()

            q = (select(Account).options(selectinload(Account.orders)).options(
                selectinload(Account.changes).selectinload(
                    Change.entity)).order_by(Account._entity.desc()))

            page = await paginate(session, request, q, "limit", total, pms=pms)

            return {"accounts": page.items, "page": page, "pms": pms}
Esempio n. 3
0
    async def management_order(self, request):
        order = request.match_info["order"]
        pms = PerformanceMeasurementSystem(enable=request.query.get("pms", False))
        changes = []
        async with self._session(request) as session:
            q = (
                select(Order)
                .options(
                    selectinload(Order.account),
                    selectinload(Order.identifiers).options(
                        selectinload(Identifier.authorization).options(
                            selectinload(Authorization.challenges)
                            .selectinload(Challenge.changes)
                            .selectinload(Change.entity),
                            selectinload(Authorization.changes).selectinload(
                                Change.entity
                            ),
                        ),
                        selectinload(Identifier.changes).selectinload(Change.entity),
                    ),
                    selectinload(Order.changes).selectinload(Change.entity),
                    selectinload(Order.certificate)
                    .selectinload(Certificate.changes)
                    .selectinload(Change.entity),
                )
                .filter(Order.order_id == order)
            )
            async with pms.measure():
                r = await session.execute(q)
            o = r.scalars().first()

            changes.extend(o.changes)

        async with pms.measure():

            for i in o.identifiers:
                changes.extend(i.changes)
                changes.extend(i.authorization.changes)
                for c in i.authorization.challenges:
                    changes.extend(c.changes)

            if o.certificate:
                changes.extend(o.certificate.changes)

            changes = sorted(changes, key=lambda x: x.timestamp, reverse=True)

        return {"order": o, "changes": changes, "pms": pms}
Esempio n. 4
0
    async def management_orders(self, request):
        pms = PerformanceMeasurementSystem(
            enable=request.query.get("pms", False))
        async with self._session(request) as session:
            q = select(sqlalchemy.func.count(Order.order_id))
            async with pms.measure():
                total = (await session.execute(q)).scalars().first()

            q = (select(Order).options(
                defer("csr"),
                selectinload(Order.account).options(defer("key")),
                selectinload(Order.identifiers),
                selectinload(Order.changes).options(defer("data"), ),
            ).order_by(Order._entity.desc()))

            page = await paginate(session, request, q, "limit", total)
            return {"orders": page.items, "page": page, "pms": pms}
Esempio n. 5
0
 async def management_account(self, request):
     pms = PerformanceMeasurementSystem(
         enable=request.query.get("pms", False))
     account = request.match_info["account"]
     async with self._session(request) as session:
         q = (select(Account).options(
             selectinload(Account.orders),
             selectinload(Account.changes).selectinload(Change.entity),
         ).filter(Account.account_id == account))
         async with pms.measure():
             a = await session.execute(q)
         a = a.scalars().first()
         return {
             "account": a,
             "orders": a.orders,
             "cryptography": cryptography,
             "pms": pms,
         }
Esempio n. 6
0
    async def management_changes(self, request):
        pms = PerformanceMeasurementSystem(
            enable=request.query.get("pms", False))
        async with self._session(request) as session:
            f = []
            for value in request.query.getall("q", []):
                # JSON Patch query for value regex like
                # FIXME … though ' is taken care of " in q still breaks it but everything below does not work either
                v = sqlalchemy.String().literal_processor(
                    dialect=session._proxied.bind.dialect)(value=value)
                v = v.replace('"', ".")
                f.append(
                    Change.data.op("@@")(sqlalchemy.text(
                        f"'$[*].value like_regex \"{v[1:-1]}\"'::jsonpath")))

                # This text() construct doesn't define a bound parameter named 'n'
                #                f.append(Change.data.op('@@')(
                #                   sqlalchemy.text('\'$[*].value like_regex \"\:n\"\'::jsonpath').bindparams(n=value)))

                # the server expects 0 arguments for this query, 1 was passed
                #                f.append(Change.data.op('@@')(
                #                    sqlalchemy.text('\'$[*].value like_regex ":n"\'::jsonpath').params(n=value)))

                # the resultset is incomplete
                #                f.append(Change.data.op('@@')(
                #                    sqlalchemy.text('\'$[*].value like_regex \"\:n\"\'::jsonpath').params(n=value)))

                # remote host ipaddress cidr query
                try:
                    import ipaddress

                    ipaddress.ip_interface(value)
                    f.append(
                        Change.remote_host.op("<<=")(sqlalchemy.cast(
                            value, sqlalchemy.dialects.postgresql.INET)))
                except ValueError:
                    pass

            q = select(sqlalchemy.func.count(Change.change))
            if f:
                q = q.filter(sqlalchemy.or_(*f))

            async with pms.measure():
                total = (await session.execute(q)).scalars().first()

            q = select(Change).options(
                selectin_polymorphic(Change.entity, [Account]),
                selectinload(
                    Change.entity.of_type(Authorization)).selectinload(
                        Authorization.identifier).selectinload(
                            Identifier.order).selectinload(Order.account),
                selectinload(Change.entity.of_type(Challenge)).selectinload(
                    Challenge.authorization).selectinload(
                        Authorization.identifier).selectinload(
                            Identifier.order).selectinload(Order.account),
                selectinload(Change.entity.of_type(Certificate)).selectinload(
                    Certificate.order).selectinload(Order.account),
                selectinload(Change.entity.of_type(Identifier)).selectinload(
                    Identifier.order).selectinload(Order.account),
                selectinload(Change.entity.of_type(Order)).selectinload(
                    Order.account),
            )
            if f:
                q = q.filter(sqlalchemy.or_(*f))
            q = q.order_by(Change.change.desc())
            if f:
                limit = "limit"
            else:
                limit = Change.change
            page = await paginate(session, request, q, limit, total, pms)

            return {"changes": page.items, "page": page, "pms": pms}