Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions App/Server/clsRequestHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -447,10 +447,11 @@ clsRequestHandler::stuResult clsRequestHandler::run(

bool IsRenewed = false;
QString NewToken = Authentication::renewExpiredJWT(
JWT,
RemoteIP,
IsRenewed
);
*APICALLBOOM,
JWT,
RemoteIP,
IsRenewed
);

BearerToken = NewToken;

Expand Down
311 changes: 212 additions & 99 deletions Interfaces/AAA/Accounting_Defs.hpp

Large diffs are not rendered by default.

19 changes: 11 additions & 8 deletions Interfaces/AAA/Accounting_Interfaces.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
* @author Kambiz Zandi <kambizzandi@gmail.com>
*/

#include "intfAccountingBasedModule.h"
//#include "intfAccountingBasedModule.h"
#include "PrivHelpers.h"
#include "Accounting_Interfaces.h"
#include "Interfaces/AAA/Authorization.h"
Expand Down Expand Up @@ -453,13 +453,16 @@ ORMSelectQuery intfAccountSaleables::makeSelectQuery(INTFAPICALLBOOM_IMPL &APICA

QVariant IMPL_ORMGET_ANONYMOUSE(intfAccountSaleables) {
clsCondition ExtraFilters = {};
// if (Authorization::hasPriv(APICALLBOOM_PARAM, this->privOn(EHTTP_GET, this->moduleBaseName())) == false)
// ExtraFilters
// .setCond({ tblAccountSaleablesBase::Fields::slbAvailableFromDate, enuConditionOperator::LessEqual, DBExpression::NOW() })
// .andCond(clsCondition({ tblAccountSaleablesBase::Fields::slbAvailableToDate, enuConditionOperator::Null })
// .orCond({ tblAccountSaleablesBase::Fields::slbAvailableToDate, enuConditionOperator::GreaterEqual,
// DBExpression::DATE_ADD(DBExpression::NOW(), 15, enuDBExpressionIntervalUnit::MINUTE) })
// );
if (Authorization::hasPriv(APICALLBOOM_PARAM, this->privOn(EHTTP_GET, this->moduleBaseName())) == false)
ExtraFilters
.setCond(clsCondition({ tblAccountSaleablesBase::Fields::slbAvailableFromDate, enuConditionOperator::Null })
.orCond({ tblAccountSaleablesBase::Fields::slbAvailableFromDate, enuConditionOperator::LessEqual,
DBExpression::NOW() })
)
.andCond(clsCondition({ tblAccountSaleablesBase::Fields::slbAvailableToDate, enuConditionOperator::Null })
.orCond({ tblAccountSaleablesBase::Fields::slbAvailableToDate, enuConditionOperator::GreaterEqual,
DBExpression::DATE_ADD(DBExpression::NOW(), 15, enuDBExpressionIntervalUnit::MINUTE) })
);

constexpr quint16 CACHE_TIME = 0; //15 * 60;

Expand Down
6 changes: 4 additions & 2 deletions Interfaces/AAA/Authentication.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
namespace Targoman::API::AAA::Authentication {

stuActiveAccount login(
INTFAPICALLBOOM_IMPL &APICALLBOOM_PARAM,
const QString& _ip,
const QString& _login,
const QString& _pass,
Expand All @@ -54,7 +55,7 @@ stuActiveAccount login(
.toJson(true)
.object();

return PrivHelpers::processUserObject(UserInfo, {}/*, _services*/);
return PrivHelpers::processUserObject(APICALLBOOM_PARAM, UserInfo, {}/*, _services*/);
}

/*
Expand All @@ -72,6 +73,7 @@ stuActiveAccount updatePrivs(const QString& _ip, const QString& _ssid, const QSt
*/

QString renewExpiredJWT(
INTFAPICALLBOOM_IMPL &APICALLBOOM_PARAM,
INOUT TAPI::JWT_t &_JWTPayload,
const QString &_ip,
/*OUT*/ bool &_isRenewed
Expand Down Expand Up @@ -149,7 +151,7 @@ QString renewExpiredJWT(
{ "iIssuance", JWT.issuedAt() },
}).toJson(true).object();

stuActiveAccount ActiveAccount = PrivHelpers::processUserObject(UserInfo, {}/*, Services*/);
stuActiveAccount ActiveAccount = PrivHelpers::processUserObject(APICALLBOOM_PARAM, UserInfo, {}/*, Services*/);

_JWTPayload["iat"] = ActiveAccount.Privs["Issuance"];
_JWTPayload["privs"] = ActiveAccount.Privs["privs"];
Expand Down
2 changes: 2 additions & 0 deletions Interfaces/AAA/Authentication.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ struct stuOAuthInfo {
};

extern Targoman::API::AAA::stuActiveAccount login(
INTFAPICALLBOOM_DECL &APICALLBOOM_PARAM,
const QString &_ip,
const QString &_login,
const QString &_pass,
Expand All @@ -61,6 +62,7 @@ extern Targoman::API::AAA::stuActiveAccount login(

//extern Targoman::API::AAA::stuActiveAccount updatePrivs(const QString &_ip, const QString &_ssid, const QString &_requiredServices);
extern QString renewExpiredJWT(
INTFAPICALLBOOM_DECL &APICALLBOOM_PARAM,
INOUT TAPI::JWT_t &_JWTPayload,
// const QString &_jwt,
const QString &_ip,
Expand Down
128 changes: 66 additions & 62 deletions Interfaces/AAA/PrivHelpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,64 +27,12 @@
#include "Interfaces/Common/QtTypes.hpp"
#include "QtCUrl.h"
#include "clsJWT.hpp"
#include "intfAccountingBasedModule.h"
//#include "intfAccountingBasedModule.h"

namespace Targoman::API::AAA {

using namespace DBManager;

stuActiveAccount PrivHelpers::digestPrivileges(
const QJsonArray& _privs,
quint64 _usrID
// const QStringList& _services
) {
QJsonObject Privs;

// foreach (auto Service, _services)
// if (serviceAccounting(Service) == nullptr)
// throw exHTTPBadRequest("Service " + Service + " was not registered.");

qint64 MinTTL = LLONG_MAX;
foreach (auto Priv, _privs) {
QJsonObject PrivObj = Priv.toObject();
for (auto PrivIter = PrivObj.begin();
PrivIter != PrivObj.end();
++PrivIter
) {
if (PrivIter.key() == "ALL"
// || _services.contains("ALL")
// || _services.contains(PrivIter.key())
) {
Privs = Targoman::Common::mergeJsonObjects(Privs, PrivIter);

if (PrivIter.key() != "ALL") {
Targoman::API::AAA::stuActiveCredit ActiveAccount = serviceAccounting(PrivIter.key())->activeAccountObject(_usrID);
if (ActiveAccount.TTL) {



///@TODO: VERY IMPORTANT fix toJson(false)
Privs = Targoman::Common::mergeJsonObjects(Privs, QJsonObject({ { PrivIter.key(), ActiveAccount.toJson(/*false*/) } }).begin());



if (ActiveAccount.TTL > 0 && ActiveAccount.TTL < MinTTL)
MinTTL = ActiveAccount.TTL;
}
}
}
}
}

if (Privs.contains("ALL") == false) {
// foreach (auto Service, _services)
// if (Privs.contains(Service) == false)
// throw exAuthorization("Not enough privileges to access <"+Service+">");
}

return { MinTTL, Privs };
}

bool PrivHelpers::hasPrivBase(const QJsonObject& _privs, const QString& _requiredAccess, bool _isSelf) {
QStringList AccessItemParts = _requiredAccess.split(":");
QJsonObject CurrCheckingPriv = _privs;
Expand Down Expand Up @@ -173,21 +121,77 @@ QVariant PrivHelpers::getPrivValue(const QJsonObject& _privs, const QString& _se
return CurrCheckingPriv;
}

stuActiveAccount PrivHelpers::digestPrivileges(
INTFAPICALLBOOM_IMPL &APICALLBOOM_PARAM,
const QJsonArray &_privs
// quint64 _usrID
// const QStringList& _services
) {
QJsonObject Privs;

// foreach (auto Service, _services)
// if (serviceAccounting(Service) == nullptr)
// throw exHTTPBadRequest("Service " + Service + " was not registered.");

qint64 MinTTL = LLONG_MAX;

foreach (auto Priv, _privs) {
QJsonObject PrivObj = Priv.toObject();

for (auto PrivIter = PrivObj.begin();
PrivIter != PrivObj.end();
++PrivIter
) {
Privs = Targoman::Common::mergeJsonObjects(Privs, PrivIter);

/*
if (PrivIter.key() == "ALL"
// || _services.contains("ALL")
// || _services.contains(PrivIter.key())
) {
Privs = Targoman::Common::mergeJsonObjects(Privs, PrivIter);

if (PrivIter.key() != "ALL") {
Targoman::API::AAA::stuActiveCredit ActiveAccount = serviceAccounting(PrivIter.key())->activeAccountObject(APICALLBOOM_PARAM, _usrID);
if (ActiveAccount.TTL) {

///@TODO: VERY IMPORTANT fix toJson(false)
Privs = Targoman::Common::mergeJsonObjects(Privs, QJsonObject({ { PrivIter.key(), ActiveAccount.toJson(false) } }).begin());

if (ActiveAccount.TTL > 0 && ActiveAccount.TTL < MinTTL)
MinTTL = ActiveAccount.TTL;
}
}
}
*/
}
}

if (Privs.contains("ALL") == false) {
// foreach (auto Service, _services)
// if (Privs.contains(Service) == false)
// throw exAuthorization("Not enough privileges to access <"+Service+">");
}

return { MinTTL, Privs };
}

stuActiveAccount PrivHelpers::processUserObject(
QJsonObject& _userObj,
const QStringList& _requiredAccess
INTFAPICALLBOOM_IMPL &APICALLBOOM_PARAM,
QJsonObject &_userObj,
const QStringList &_requiredAccess
// const QStringList& _services
) {
if (_userObj.contains(DBM_SPRESULT_ROWS))
_userObj = _userObj[DBM_SPRESULT_ROWS].toArray().at(0).toObject();

if (_userObj.size()) {
stuActiveAccount ActiveAccount =
PrivHelpers::digestPrivileges(
_userObj[AAACommonItems::privs].toArray(),
static_cast<quint64>(_userObj[AAACommonItems::usrID].toDouble())
// _services
);
stuActiveAccount ActiveAccount = PrivHelpers::digestPrivileges(
APICALLBOOM_PARAM,
_userObj[AAACommonItems::privs].toArray()
// static_cast<quint64>(_userObj[AAACommonItems::usrID].toDouble())
// _services
);

_userObj[AAACommonItems::privs] = PrivHelpers::confirmPrivilegeBase(ActiveAccount.Privs, _requiredAccess);

Expand All @@ -197,7 +201,7 @@ stuActiveAccount PrivHelpers::processUserObject(
return { -1, _userObj };
}

QByteArray PrivHelpers::getURL(const QString& _url) {
QByteArray PrivHelpers::getURL(const QString &_url) {

QtCUrl CUrl;
CUrl.setTextCodec("UTF-8");
Expand Down
6 changes: 4 additions & 2 deletions Interfaces/AAA/PrivHelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ class PrivHelpers{
static QVariant getPrivValue(const QJsonObject& _privs, const QString& _selector, const QVariant &_defIfNotFoundAndAllIsDefined = {});

static stuActiveAccount processUserObject(
INTFAPICALLBOOM_DECL &APICALLBOOM_PARAM,
QJsonObject& _userObj,
const QStringList& _requiredAccess = {}
// const QStringList& _services = {}
Expand All @@ -58,8 +59,9 @@ class PrivHelpers{

private:
static stuActiveAccount digestPrivileges(
const QJsonArray& _privs,
quint64 _usrID
INTFAPICALLBOOM_DECL &APICALLBOOM_PARAM,
const QJsonArray &_privs
// quint64 _usrID
// const QStringList& _services
);
};
Expand Down
Loading