Skip to content
This repository was archived by the owner on Jan 23, 2025. It is now read-only.

Commit 9ecbb1c

Browse files
committed
Merge branch 'dev' of github.com:cloudspokes/tc-api into dev
2 parents 18bccc7 + f545599 commit 9ecbb1c

15 files changed

+206
-43
lines changed

actions/challenges.js

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1039,6 +1039,7 @@ var getChallenge = function (api, connection, dbConnectionMap, isStudio, next) {
10391039
isRelated = false, // This variable represent if the caller is related with challenge.
10401040
isRegistered = false,// This variable represent if the caller is already registered this challenge.
10411041
isCopilotPosting = false,//This variable represent if the challenge is a copilot posting challenge.
1042+
isManager=false,//This variable represent if the caller is a manager.
10421043
copilotDetailedRequirements,
10431044
unified = connection.action === "getChallenge",
10441045
execQuery = function (name) {
@@ -1068,8 +1069,12 @@ var getChallenge = function (api, connection, dbConnectionMap, isStudio, next) {
10681069
return;
10691070
}
10701071

1072+
if (result[0].is_manager) {
1073+
isManager = true;
1074+
}
1075+
10711076
// If the user has the access to the challenge or is a resource for the challenge then he is related with this challenge.
1072-
if (result[0].has_access || result[0].is_related || result[0].is_manager || helper.isAdmin(caller)) {
1077+
if (result[0].has_access || result[0].is_related || isManager || helper.isAdmin(caller)) {
10731078
isRelated = true;
10741079
}
10751080

@@ -1170,6 +1175,13 @@ var getChallenge = function (api, connection, dbConnectionMap, isStudio, next) {
11701175
submissionsViewable: data.submissions_viewable
11711176
};
11721177

1178+
if (!challenge.submissionsViewable && isStudio) {
1179+
// Admin and manager can view submissions anytime
1180+
if (helper.isAdmin(caller) || isManager) {
1181+
challenge.submissionsViewable = true;
1182+
}
1183+
}
1184+
11731185
if (unified) {
11741186
challenge.type = isStudio ? 'design' : 'develop';
11751187
}
@@ -2371,8 +2383,8 @@ var getChallengeResults = function (api, connection, dbConnectionMap, isStudio,
23712383
//Submission Links
23722384
if (isStudio) {
23732385
if (challengeRestrictions.show_submissions) {
2374-
resEl.submissionDownloadLink = api.config.tcConfig.designSubmissionLink + el.submission_id;
2375-
resEl.previewDownloadLink = api.config.tcConfig.designSubmissionLink + el.submission_id + "&sbt=small";
2386+
resEl.submissionDownloadLink = api.config.tcConfig.designSubmissionLink + el.submission_id + api.config.tcConfig.submissionDownloadLinkParams;
2387+
resEl.previewDownloadLink = api.config.tcConfig.designSubmissionLink + el.submission_id + api.config.tcConfig.previewDownloadLinkParams;
23762388
}
23772389
} else {
23782390
resEl.submissionDownloadLink = api.config.tcConfig.submissionLink + el.upload_id;
@@ -2394,7 +2406,7 @@ var getChallengeResults = function (api, connection, dbConnectionMap, isStudio,
23942406
if (isStudio) {
23952407
if (challengeRestrictions.show_submissions) {
23962408
result.finalFixes = _.map(res.finalFixes, function (ff) {
2397-
return api.config.tcConfig.designSubmissionLink + ff.submission_id;
2409+
return api.config.tcConfig.designSubmissionLink + ff.submission_id + api.config.tcConfig.submissionDownloadLinkParams;
23982410
});
23992411
}
24002412
} else {
@@ -3956,7 +3968,7 @@ var getUserSubmissions = function (api, connection, next) {
39563968
submission.download = api.config.tcConfig.submissionLink + item.upload_id;
39573969
delete submission.ranking;
39583970
} else {
3959-
submission.download = api.config.tcConfig.designSubmissionLink + item.submission_id;
3971+
submission.download = api.config.tcConfig.designSubmissionLink + item.submission_id + api.config.tcConfig.submissionDownloadLinkParams;
39603972
}
39613973
return submission;
39623974
});

actions/memberStatistics.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1328,7 +1328,7 @@ var getRecentWinningDesignSubmissions = function (api, connection, dbConnectionM
13281328
submissionDate: element.submission_date,
13291329
viewable: element.viewable.toLowerCase() === "true",
13301330
challengeId: element.challenge_id,
1331-
preview: api.config.tcConfig.designSubmissionLink + element.submission_id + "&sbt=small"
1331+
preview: api.config.tcConfig.designSubmissionLink + element.submission_id + api.config.tcConfig.previewDownloadLinkParams
13321332
};
13331333
if (!winningSubmission.viewable) {
13341334
delete winningSubmission.preview;

actions/srmRoundComponentsAndTerms.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ function checkDefinedNonNegativeInteger(value, name, error, helper) {
5959
* @param callback the callback method
6060
*/
6161
function checkComponents(api, dbConnectionMap, components, callback) {
62-
var helper = api.helper, error = helper.checkArray(components, "components", false), existingComponentDivisionIds = [];
62+
var helper = api.helper, error = helper.checkArray(components, "components", true), existingComponentDivisionIds = [];
6363
if (error) {
6464
callback(error);
6565
return;
@@ -202,7 +202,7 @@ var setRoundComponents = function (api, connection, dbConnectionMap, next) {
202202
var helper = api.helper,
203203
sqlParams = {},
204204
roundId = Number(connection.params.roundId),
205-
components = connection.params.components;
205+
components = connection.params.components || [];
206206

207207
async.waterfall([
208208
function (cb) {
@@ -348,8 +348,8 @@ exports.setRoundComponents = {
348348
name: "setRoundComponents",
349349
description: "Set Round Components",
350350
inputs: {
351-
required: ['roundId', 'components'],
352-
optional: []
351+
required: ['roundId'],
352+
optional: ['components']
353353
},
354354
blockedConnectionTypes: [],
355355
outputExample: {},

apiary.apib

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6144,24 +6144,24 @@ Request
61446144
"submissionDate": "2013-12-04T09:00:05.000Z",
61456145
"placement": 1,
61466146
"points": 360,
6147-
"submissionDownloadLink": "http://studio.topcoder.com/?module=DownloadSubmission&sbmid=123456",
6148-
"previewDownloadLink": "https://studio.topcoder.com/?module=DownloadSubmission&sbmid=123456&sbt=small"
6147+
"submissionDownloadLink": "https://api.topcoder.com/v2/design/download/123456?submissionType=original",
6148+
"previewDownloadLink": "https://api.topcoder.com/v2/design/download/123456?submissionType=preview&submissionImageTypeId=29"
61496149
},
61506150
{
61516151
"handle": "heffan",
61526152
"registrationDate": "2013-12-03T09:00:05.000Z",
61536153
"submissionDate": "2013-12-05T09:00:05.000Z",
61546154
"placement": 2,
61556155
"points": 140,
6156-
"submissionDownloadLink": "http://studio.topcoder.com/?module=DownloadSubmission&sbmid=123457",
6157-
"previewDownloadLink": "https://studio.topcoder.com/?module=DownloadSubmission&sbmid=123457&sbt=small"
6156+
"submissionDownloadLink": "https://api.topcoder.com/v2/design/download/123457?submissionType=original",
6157+
"previewDownloadLink": "https://api.topcoder.com/v2/design/download/123457?submissionType=preview&submissionImageTypeId=29"
61586158
}
61596159
],
61606160
"finalFixes":
61616161
[
6162-
"submissionDownloadLink": "http://studio.topcoder.com/?module=DownloadSubmission&sbmid=123458",
6163-
"submissionDownloadLink": "http://studio.topcoder.com/?module=DownloadSubmission&sbmid=123459",
6164-
"submissionDownloadLink": "http://studio.topcoder.com/?module=DownloadSubmission&sbmid=123460"
6162+
"submissionDownloadLink": "https://api.topcoder.com/v2/design/download/123458?submissionType=original",
6163+
"submissionDownloadLink": "https://api.topcoder.com/v2/design/download/123459?submissionType=original",
6164+
"submissionDownloadLink": "https://api.topcoder.com/v2/design/download/123460?submissionType=original"
61656165
]
61666166
}
61676167

@@ -6591,7 +6591,7 @@ Request
65916591
prize: 1300,
65926592
submissionDate: "2014-02-03T09:30:00.000Z",
65936593
viewable: true
6594-
preview: "https://studio.topcoder.com/?module=DownloadSubmission&sbmid=169728&sbt=small"
6594+
preview: "https://api.topcoder.com/v2/design/download/169728?submissionType=preview&submissionImageTypeId=29"
65956595
},
65966596
{
65976597
contestName: "TC Redesign Lorem Ipsum Dolor sit Amet 2",

config/tc-config.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,12 @@ var config = {
130130

131131
submissionLink: 'https://software.topcoder.com/review/actions/DownloadContestSubmission.do?method=downloadContestSubmission&uid=',
132132
finalFixLink: 'https://software.topcoder.com/review/actions/DownloadFinalFix.do?method=downloadFinalFix&uid=',
133-
designSubmissionLink: 'http://studio.topcoder.com/?module=DownloadSubmission&sbmid=',
133+
designSubmissionLink: 'https://api.topcoder.com/v2/design/download/',
134+
// stores the parameters that need sent to the 'submission' request
135+
submissionDownloadLinkParams: '?submissionType=original',
136+
//stores the parameters that need to be included in the 'preview' request
137+
//29 means small
138+
previewDownloadLinkParams: "?submissionType=preview&submissionImageTypeId=29",
134139

135140
//The name of the folder where to store the submission files.
136141
//Please make sure the directory already exists

deploy/development.bat

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,6 @@ set WATERMARK_FILE_PATH=test/test_files/design_image_file_generator/studio_logo_
9090

9191
set WKHTMLTOIMAGE_COMMAND_PATH=/home/ubuntu/tmp/wkhtmltox-0.12.1/static-build/posix-local/wkhtmltox-0.12.1/bin/wkhtmltoimage
9292
set WKHTMLTOIMAGE_IMAGE_WIDTH=1024
93-
set HIGHLIGHT_STYLE_LINK=http://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/styles/%OVERRIDE_STYLE_NAME%.min.css
93+
set HIGHLIGHT_STYLE_LINK=http://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/styles/%OVERRIDE_STYLE_NAME%.min.css
94+
95+
set JWT_TOKEN_COOKIE_KEY="tcjwt_vm"

deploy/development.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,5 @@ export WATERMARK_FILE_PATH=test/test_files/design_image_file_generator/studio_lo
9696
export WKHTMLTOIMAGE_COMMAND_PATH=/home/ubuntu/tmp/wkhtmltox-0.12.1/static-build/posix-local/wkhtmltox-0.12.1/bin/wkhtmltoimage
9797
export WKHTMLTOIMAGE_IMAGE_WIDTH=1024
9898
export HIGHLIGHT_STYLE_LINK=http://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/styles/%OVERRIDE_STYLE_NAME%.min.css
99+
100+
export JWT_TOKEN_COOKIE_KEY="tcjwt_vm"

initializers/middleware.js

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,20 +81,27 @@ exports.middleware = function (api, next) {
8181
isCachedReturned,
8282
cacheKey,
8383
socialUserId,
84-
socialProvider;
85-
if (!_.isDefined(authHeader)) {
84+
socialProvider,
85+
cookieToken = api.utils.parseCookies(connection.rawConnection.req)[process.env.JWT_TOKEN_COOKIE_KEY];
86+
87+
if (_.isUndefined(authHeader) && _.isUndefined(cookieToken)) {
8688
connection.caller = {accessLevel: "anon"};
8789
next(connection, true);
8890
return;
8991
}
92+
9093
async.waterfall([
9194
function (cb) {
92-
var reg = /^bearer ([\s\S]+)$/i;
93-
if (!reg.test(authHeader)) {
94-
cb(new IllegalArgumentError("Malformed Auth header"));
95-
return;
95+
if (_.isUndefined(authHeader)) {
96+
cb(null, cookieToken);
97+
} else {
98+
var reg = /^bearer ([\s\S]+)$/i;
99+
if (!reg.test(authHeader)) {
100+
cb(new IllegalArgumentError("Malformed Auth header"));
101+
return;
102+
}
103+
cb(null, reg.exec(authHeader)[1]);
96104
}
97-
cb(null, reg.exec(authHeader)[1]);
98105
}, function (token, cb) {
99106
jwt.verify(token,
100107
api.config.tcConfig.oauthClientSecret,
@@ -107,6 +114,11 @@ exports.middleware = function (api, next) {
107114
return;
108115
}
109116
var split = decoded.sub.split("|");
117+
if (split.length == 1) {
118+
// token.sub should contain "|"
119+
cb(new IllegalArgumentError('Malformed Auth header. token.sub is in bad format!'));
120+
return;
121+
}
110122
try {
111123
socialUserId = (split[split.length-1] || "").trim();
112124
socialProvider = (split[0] || "").trim();
@@ -212,7 +224,8 @@ exports.middleware = function (api, next) {
212224
//error messages returned by jwt.verify(...) method
213225
if (err.message.indexOf('Invalid token') !== -1 ||
214226
String(err.message).startsWith("jwt audience invalid.") ||
215-
err.message === "invalid signature") {
227+
err.message === "invalid signature" ||
228+
err.message === "jwt malformed") {
216229
errorMessage = "Malformed Auth header";
217230
baseError = api.helper.apiCodes.badRequest;
218231
} else if (err.message === "jwt expired") {

0 commit comments

Comments
 (0)