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
13 changes: 3 additions & 10 deletions Interfaces/Server/QJWT.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -235,22 +235,15 @@ void QJWT::verifyJWT(

//-- check actor type -----
_jwtTokenActorType = enuTokenActorType::USER;

if (_jWTPayload.contains("typ"))
_jwtTokenActorType = enuTokenActorType::toEnum(_jWTPayload["typ"].toString());

if ((_jwtTokenActorType == enuTokenActorType::USER) && (_tokenAllowUSER == false))
// if (TokenType != _acceptableActorType)
throw exHTTPForbidden(QString("Token type `%1` not acceptable by this module. expected: USER")
.arg(enuTokenActorType::toStr(_jwtTokenActorType))
// .arg(enuTokenActorType::toStr(_acceptableActorType))
);
throw exHTTPForbidden("Token type `USER` not acceptable by this module. expected: API");

if ((_jwtTokenActorType == enuTokenActorType::API) && (_tokenAllowAPI == false))
// if (TokenType != _acceptableActorType)
throw exHTTPForbidden(QString("Token type `%1` not acceptable by this module. expected: API")
.arg(enuTokenActorType::toStr(_jwtTokenActorType))
// .arg(enuTokenActorType::toStr(_acceptableActorType))
);
throw exHTTPForbidden("Token type `API` not acceptable by this module. expected: USER");

//-- check client ip -----
// if (_jWTPayload.contains("prv")) {
Expand Down
60 changes: 59 additions & 1 deletion Modules/Account/functionalTest/testAccount.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1463,7 +1463,8 @@ private slots:
}
}

//token
// token
//----------------------------------------------------------------
void apitoken_request() {
QT_TRY {
QVariant Result = this->callUserAPI(
Expand Down Expand Up @@ -1770,6 +1771,63 @@ private slots:
}
}

void apitoken_addservices_empty() {
QT_TRY {
QVariant Result = this->callUserAPI(
RESTClientHelper::enuHTTPMethod::POST,
"Account/APITokens/addServices",
{},
{
{ "token", this->TokenJWT },
});

QVERIFY(Result.isValid());

} QT_CATCH (const std::exception &exp) {
QTest::qFail(exp.what(), __FILE__, __LINE__);
}
}

void apitoken_addservices() {
QT_TRY {
QVariant Result = this->callUserAPI(
RESTClientHelper::enuHTTPMethod::POST,
"Account/APITokens/addServices",
{},
{
{ "token", this->TokenJWT },
{ "services", QStringList({
"MT"
}) },
});

QVERIFY(Result.isValid());

} QT_CATCH (const std::exception &exp) {
QTest::qFail(exp.what(), __FILE__, __LINE__);
}
}

void apitoken_addservices_same_again() {
QT_TRY {
QVariant Result = this->callUserAPI(
RESTClientHelper::enuHTTPMethod::POST,
"Account/APITokens/addServices",
{},
{
{ "token", this->TokenJWT },
{ "services", QStringList({
"MT"
}) },
});

QVERIFY(Result.isValid());

} QT_CATCH (const std::exception &exp) {
QTest::qFail(exp.what(), __FILE__, __LINE__);
}
}

void get_tokens() {
QT_TRY {
QVariant Result = callUserAPI(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ BEGIN
END IF;

IF iLogin = 1 THEN
SET vSessionGUID = SUBSTRING(dev_CommonFuncs.guid(NULL), 1, 32);
SET vSessionGUID = SUBSTRING({{dbprefix}}CommonFuncs.guid(NULL), 1, 32);

INSERT
INTO tblActiveSessions
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
/* Migration File: m20221003_122240_AAA_fix_non_created_def_wallet.sql */
/* CAUTION: don't forget to use {{dbprefix}} for schemas */

USE `{{dbprefix}}{{Schema}}`;

ALTER TABLE `tblUserWallets`
ADD INDEX `wal_usrID` (`wal_usrID`);

ALTER TABLE `tblUserWallets`
DROP INDEX `wal_usrID_walName__InvalidatedAt`;

ALTER TABLE `tblUserWallets`
ADD walUniqueMD5 char(32) AS
(MD5(CONCAT_WS('X',
wal_usrID,
IF(walDefault, '1:DEFAULT', walName),
_InvalidatedAt
)))
UNIQUE;

INSERT INTO tblUserWallets(
wal_usrID,
walDefault,
walCreatedBy_usrID
)
SELECT tblUser.usrID
, 1
, tblUser.usrID
FROM tblUser
LEFT JOIN (
SELECT *
FROM tblUserWallets
WHERE tblUserWallets.walDefault = 1
) tblUserWallets
ON tblUserWallets.wal_usrID = tblUser.usrID
WHERE tblUserWallets.walID IS NULL
;

DROP TRIGGER IF EXISTS `trg_tblUser_after_insert`;
DELIMITER //
CREATE TRIGGER `trg_tblUser_after_insert` AFTER INSERT ON `tblUser` FOR EACH ROW BEGIN
INSERT IGNORE INTO tblUserWallets(
wal_usrID,
walDefault,
walCreatedBy_usrID
)
VALUES (
NEW.usrID,
1,
NEW.usrID
);

END//
DELIMITER ;

DROP PROCEDURE IF EXISTS `spSignup`;
DELIMITER //
CREATE PROCEDURE `spSignup`(
IN `iBy` CHAR(1),
IN `iLogin` VARCHAR(50),
IN `iPass` CHAR(32),
IN `iRole` VARCHAR(50),
IN `iIP` VARCHAR(50),
IN `iName` VARCHAR(100),
IN `iFamily` VARCHAR(100),
IN `iSpecialPrivs` VARCHAR(5000),
IN `iMaxSessions` INT,
IN `iCreatorUserID` BIGINT UNSIGNED,
IN `iEnableEmailAlerts` TINYINT,
IN `iEnableSMSAlerts` TINYINT,
IN `iResendApprovalTTLSecs` BIGINT UNSIGNED,
IN `iExpireApprovalTTLSecs` BIGINT UNSIGNED,
IN `iUserLanguage` CHAR(2),
OUT `oUserID` BIGINT UNSIGNED
)
BEGIN
DECLARE vRoleID BIGINT UNSIGNED;
DECLARE vInnerRolID BIGINT;
DECLARE vSessionGUID CHAR(32);
DECLARE vErr VARCHAR(500);

DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1 vErr = MESSAGE_TEXT;

ROLLBACK;

INSERT INTO tblActionLogs
SET tblActionLogs.atlBy_usrID = 1,
tblActionLogs.atlType = 'Signup.Error',
tblActionLogs.atlDescription = JSON_OBJECT(
"err", vErr,
"iBy", iBy,
"iLogin", iLogin,
"iPass", iPass,
"iRole", iRole,
"iIP", iIP,
"iName", iName,
"iFamily", iFamily,
"iSpecialPrivs", iSpecialPrivs,
"iMaxSessions", iMaxSessions,
"iCreatorUserID", iCreatorUserID
)
;

RESIGNAL;
END;

DECLARE EXIT HANDLER FOR 1062
BEGIN
ROLLBACK;

SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '409:Already registered.';
END;

CALL {{dbprefix}}Common.spLogDebug('AAA', 'signup');

SELECT tblRoles.rolID
INTO vRoleID
FROM tblRoles
WHERE tblRoles.rolName = iRole
AND (tblRoles.rolSignupAllowedIPs IS NULL
OR tblRoles.rolSignupAllowedIPs LIKE CONCAT("%,',iIP,',%"))
;

IF ISNULL(vRoleID) THEN
SIGNAL SQLSTATE '45403'
SET MESSAGE_TEXT = "403:Role not found or is not allowed to signup from this IP";
END IF;

/****************************************/
START TRANSACTION;
/****************************************/

-- invalidate last removed user
UPDATE tblUser
SET _InvalidatedAt = UNIX_TIMESTAMP()
WHERE _InvalidatedAt = 0
AND usrStatus = 'R'
AND (
(IFNULL(IF(iBy = 'E', iLogin, NULL), '') <> '' AND IFNULL(usrEmail, '') = IF(iBy = 'E', iLogin, NULL))
OR (IFNULL(IF(iBy = 'M', iLogin, NULL), '') <> '' AND IFNULL(usrMobile, '') = IF(iBy = 'M', iLogin, NULL))
)
;

IF ((iPass IS NULL) OR (TRIM(iPass) = '')) THEN
SET iPass = NULL; -- 'NOT_SET'
ELSE
SET iPass = LOWER(TRIM(iPass));
END IF;

INSERT INTO tblUser
SET tblUser.usrName = iName,
tblUser.usrFamily = iFamily,
tblUser.usrEmail = IF(iBy = 'E', iLogin, NULL),
tblUser.usrMobile = IF(iBy = 'M', iLogin, NULL),
tblUser.usrPass = iPass,
tblUser.usr_rolID = vRoleID,
tblUser.usrSpecialPrivs = iSpecialPrivs,
tblUser.usrMaxSessions = iMaxSessions,
tblUser.usrCreatedBy_usrID = IFNULL(iCreatorUserID, 1),
tblUser.usrEnableEmailAlerts = iEnableEmailAlerts,
tblUser.usrEnableSMSAlerts = iEnableSMSAlerts,
tblUser.usrLanguage = iUserLanguage
;

SET oUserID = LAST_INSERT_ID();

CALL spApproval_Request(
/* iBy */ iBy,
/* iKey */ iLogin,
/* iUserID */ oUserID,
/* iPass */ NULL,
/* iSalt */ NULL,
/* iThrowIfPassNotSet */ 0,
/* iResendApprovalTTLSecs */ iResendApprovalTTLSecs,
/* iExpireApprovalTTLSecs */ iExpireApprovalTTLSecs,
/* iUserLanguage */ iUserLanguage
);
/*
moved to trigger:
INSERT INTO tblUserWallets
SET tblUserWallets.wal_usrID = oUserID,
tblUserWallets.walName = 'Default',
tblUserWallets.walDefault = 1,
tblUserWallets.walCreatedBy_usrID = IFNULL(iCreatorUserID, 1)
;
*/
INSERT INTO tblActionLogs
SET tblActionLogs.atlBy_usrID = oUserID,
tblActionLogs.atlType = 'UserCreated'
;

COMMIT;
END//
DELIMITER ;
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/* Migration File: m20221004_093344_AAA_update_tokenbin_after_token_update.sql */
/* CAUTION: don't forget to use {{dbprefix}} for schemas */

USE `{{dbprefix}}{{Schema}}`;

DROP TRIGGER IF EXISTS `trg_tblAPIToken_after_update`;
DELIMITER //
CREATE TRIGGER `trg_tblAPIToken_after_update` AFTER UPDATE ON `tblAPITokens` FOR EACH ROW BEGIN
DECLARE Changes JSON DEFAULT JSON_OBJECT("aptID", OLD.aptID);

IF NEW.aptToken != OLD.aptToken THEN SET Changes = JSON_MERGE_PATCH(Changes, JSON_OBJECT("aptToken", OLD.aptToken)); END IF;
IF NEW.apt_usrID != OLD.apt_usrID THEN SET Changes = JSON_MERGE_PATCH(Changes, JSON_OBJECT("apt_usrID", OLD.apt_usrID)); END IF;
IF NEW.aptLang != OLD.aptLang THEN SET Changes = JSON_MERGE_PATCH(Changes, JSON_OBJECT("aptLang", OLD.aptLang)); END IF;
IF NEW.aptValidateIP != OLD.aptValidateIP THEN SET Changes = JSON_MERGE_PATCH(Changes, JSON_OBJECT("aptValidateIP", OLD.aptValidateIP)); END IF;
IF NEW.aptExtraPrivileges != OLD.aptExtraPrivileges THEN SET Changes = JSON_MERGE_PATCH(Changes, JSON_OBJECT("aptExtraPrivileges", OLD.aptExtraPrivileges)); END IF;
IF NEW.aptExpiryDate != OLD.aptExpiryDate THEN SET Changes = JSON_MERGE_PATCH(Changes, JSON_OBJECT("aptExpiryDate", OLD.aptExpiryDate)); END IF;
IF NEW.aptStatus != OLD.aptStatus THEN SET Changes = JSON_MERGE_PATCH(Changes, JSON_OBJECT("aptStatus", OLD.aptStatus)); END IF;

IF JSON_LENGTH(Changes) > 0 THEN
INSERT INTO tblActionLogs
SET tblActionLogs.atlBy_usrID = NEW.aptUpdatedBy_usrID,
tblActionLogs.atlType = "tblAPIToken",
tblActionLogs.atlDescription = Changes
;
END IF;

IF NEW.aptToken != OLD.aptToken THEN
UPDATE tblTokenBin
SET tkbTokenMD5 = MD5(NEW.aptToken)
WHERE tkbTokenMD5 = MD5(OLD.aptToken)
;
END IF;

END//
DELIMITER ;
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/* Migration File: m20221004_094508_AAA_improve_services.sql */
/* CAUTION: don't forget to use {{dbprefix}} for schemas */

USE `{{dbprefix}}{{Schema}}`;

ALTER TABLE `tblService`
ADD COLUMN `svcHasSaleable` BIT DEFAULT 0 AFTER `svcCancelVoucherItemEndPoint`,
ADD COLUMN `svcDesc` TEXT NULL AFTER `svcHasSaleable`;
Loading