Skip to content
Snippets Groups Projects
Commit 77a86e52 authored by michael.minelli's avatar michael.minelli
Browse files

Merge branch 'API-client-version-detection' into v2.2.0

parents e2fac0e0 f7ccf9fb
No related branches found
No related tags found
No related merge requests found
Pipeline #26575 passed
...@@ -3,6 +3,8 @@ workspace.xml ...@@ -3,6 +3,8 @@ workspace.xml
.gitlab-ci-local .gitlab-ci-local
Wiki/.idea Wiki/.idea
NodeApp/src/config/Version.ts
############################ MacOS ############################ MacOS
# General # General
.DS_Store .DS_Store
......
...@@ -4,8 +4,8 @@ ...@@ -4,8 +4,8 @@
#/--------------------------------------------------/ #/--------------------------------------------------/
# development # development
DOTENV_VAULT_DEVELOPMENT="McsEkttfKr1Vl0q9g7z4+6IRodJFBiT+rZWlz8SH12VCeviOBsot3YnUku80PwUxI3MqaWKmw6WNL5eLxKLlo64coMfgdajaTcp9yOfK6CRfHfWdh3MCoAf8ZiqbJGkmaH2X8j2QcnzJ6C+v8S1ZPUxk49ug+6otlyKl8hnr9ECvNGFKJ+Xa5L7XzEo+IGIFDrEYDtxI2VyUOiwudRnP0WarU8KJNt28IZYz3M5zymdFFI8Wlcq2+KiOp/CjiKYDxALkcINGkffu1WIU/lS0WE1FVLbds2hMsGkB4LwT1Q1ASkmsVT/BIb/wRxamDmAN494cTgGqYdaM5IOCGt2BDtm2UJWFrM5txl/PKRrbgE8wjpIaSp5OQ33nRV2P1fGk38z3gYHVI3NG5SRzxZTo+D4lT9UdNmwWIzL6rXRfnJgUTwKhc0MBrl+giaIt3U8wzYB69/F5+thYruSJVir42/b+XpOWSovZTwYYcAO5dXML/24jR3eNMxTlcxVvXpdx/Eg8r5ZCHSsMVKCgmyfGA49xWGjaMqOiizu83mt9KhsXiRgaI1imKiOm85eK9CUkvfLTQo8ccK+RITMvLKtCZgirF4HLi7y5DVjvufhtjxxOXjknFmI3UJFmjU9cUAKC3ccsM9F8Pm4mo6XbcPjBXZdX/18gtlvxps5at1cH998F8ZPkoaEJGp7lCYlxXTEBHOxxCEd5DdUldhpbOUfSsYZHUuxiA1gqJvilok39bgxl1WpO6nPM7S0S0GaI1jGkPKOJ/gx1fBRY91sSQy9Qw/O3tBUId1Az0QZLQZ+gijr6kchd5aczHmIRa2z4AHCSbeuzmaGfP+4yh0M6FvPPCD4i" DOTENV_VAULT_DEVELOPMENT="NTrhViMVBn/ekwfQ6v08+59FZipjGK0nZ7HJ7eUW1x4BrUG/hQlj3oRMddzPWa8DE8e++W/SCLWWdP6kEOj0xreTQyDymi1d/95TswRdGrmST9iYBTiW7SBoCW0jUCkXkCVcFj/81cButo52OP7BJoAyosc0R6qtt6mO+zxMSyA51tVERgis9TMHTkqH42Fa+2w0ggcYuu3fdbKLUSYoJMLeM08MttiGHy+5bPnS6fCpSuZzNpt9tgMz+K4uAkKjsRAk2BF8xrW3stG4CcWlejhHPllMh0hCF1tISrN2pTmAqS2J/MbIouohr7+LA/9Jqm/oaFUs1lybhMjT45DE7BjqOQWPKEhXx+8faWujOs2v5cV9X3W8uGvQlI4tluXxdvj/wJvPh8BoI7SLpZ0+6xSTl99TorE5bg5n1yuXRLcfZ3HuCqvgXAUAF8l955H9Bjgssoufe4BZroNkt1HWSgEIPMpJGMmzP27rpAfV9ROwQl6aMtCVFiC/0FvxgW4P8N/UgGAS4xCgWqURZ/3wFsko+RBG2gJ3FYEj+PnoRJoR7zhjKZhywLfNESshDmOsIUPYpMQEgKl7CEaRVFy+GSjnHosDeIZu7JqDJnU+URRQf1SzJqByjOyfVViI4Dqzhtm3lzT77xW5jJUurO+uhYGD8jDAKkwtSJV/RHLyz3p56No1YW2buIZhRTVcfmRsHYfTdZNFBY+lzR4DWe9HXbJ48apMN83grqlsFzyT9wfxMwzJAeR2Ah+QQyRTar3y0gckJWesdXprTGJbNZDmSCzMK1p6lvWtfnIgN0KJfQDU/OuoUogaiYJdJQ8cUDyTEARZtfQLV7+gMpf2BU66EGB8LhTmd1vqRusyYV1P7O8pfDjyt8j5uvpi4fCeIFpFcOdUANq6NrXnhvsFIc9gKk20Ky8Ar0QYtFXvo3K2dXcWbhj8sUN61rNHTC5JgWL8N8mf5kVmeIPZv/E5JfcFSPACVw=="
# production # production
DOTENV_VAULT_PRODUCTION="aWWYhhCla0zC0MtLgZl1O7b4j8q5ya47bbHgZZtNJzw1PrL1I/2axdy6atW3v1cstw2putaNl4Gc81IM3GUPHyP6dDod6L7AMmLXKwrQFoYUxz0Za8fWLpnx79nY6A/zNgwfBqEZ0NE5o/GFKCDRYsfA6UuX8f6jBN2lhVK9leMU5DRvEyPrhKV4KHDwjKSTuqNbkZNW/BwyTf9Fdrd/SgUjgWA5Rvrg6N3RSkcHsuHfrBXzuzFHUFjQyrDlfS+fmpHj6PN69HWwtG+OjpgPaLocZ3WN2cDnb9X+rhB1W0uTN9Y8gAJkddUw3Kynf7YXimEBxWwV3ltdftIPAIcnz5cOx6lbzwFrXPnl2FesjpFZ1G27rZVr61kSUiILjRbOg9KIEmSqJXFzUHEyX7FwEYWxHtm1jw+76ePTV5g+4yfIxx2Vjo78uUKreASwtlA6CnsnnkFKqqLE3LYtskI7SYq/2t/Y0UrFKOFrOiK3Y5Kza7rRfcZo5SoNGFcyBw+4/YV5Tk/8z4zhyt/6lzLTA/w/mNXv4KCKn2oRBIUOlaMClvfmA2pwCv7YgpCGAycj0qQkhNhhIkd2F3cuc0o+U1XnWiqlEIVX9Z40gnrzodTRBmdvjVNdQ79nMvEVsmzjwmhoAC62RnyEnMUBrE9XM3RvRFoYFThOd7RE5TxCmLjbZfyVYN58hufZZDFT3oPYzoT9rzur6nU0NqjfNNU6BfZK4L+qGBg=" DOTENV_VAULT_PRODUCTION="QyizJk0k4H0ebjOx03rGPVAL8XM2oRjdO6CXvCXATMvwgdLGGV7k4FKc5vWea7G7JL21KuHRAjdzq/DRhke5N1x5RECcKenMOBvClya6B4tj+UB3mixDkU5uTqAbcdvA64WGbQB3Ubh1ZVIgSLyK3ZUotbrKJkFplLWEuXfOtiRtc1o5MJVDYwy3aIxl2F0xUseSM7TYvH/HRwYwnddSojwaZ2UMQTM6ne4KifQSY6/VFlkaHen+9z8tjs9TLcRrxZK63WhN4OTDC3E1c6dRH9JIyAc6a1LE2L1CaGUvyCU3ipNkocLG+p/kJitJRK75PSbx2zfhceahC6PFkU5rdKpBLU06T8fyVNz2t4WemBT4qvVl7O7CbSN3WaL5talyrVVQEib4P3vg7O+c3tz+A6ZZltHSryROtiV4lD7cievfUPirzBlhkdn+g4qa2Z3v5p7/gMQ5fOEwFpOMDylXE+z7k9P+2KJWzFrQgEXHvBtiGQ79FIB2F+NjBLh4LeqyUjJFJCT/D2glDfRc+yJiiZhpOAx/7NYRQRjP26cgH9/IlLQXzzot362IjvomLKEjws9x2AlKXWy78xvIQPEnb4MCEuL2HJlRHll6aAKUeHpSyMfIqTJhTVkNmlChYXtbxuYvAwyEFVMLCtgbsyzCJmaHV9XQUzgreinKVJAV206xanLmS9mYd2jk6HopaUIDBLEN5HswOMAkVHkJKX65D8eQzEk0E9ymmnA6rui0mLz6gVRFuKmMZKpYcMZMiTk3oeFc/ZXTrj1iXHAJdeIs3bwdPTy/vejWMjeLxbH7HbKyYccQ4aG7N5oyiN+7SjuTJ0Y/eNzBIb2VXB6Zq//2lLHhs7+dfQZa"
This diff is collapsed.
{ {
"name" : "dojo_cli", "name" : "dojo_cli",
"description" : "CLI of the Dojo project",
"version" : "2.2.0", "version" : "2.2.0",
"license" : "AGPLv3",
"author" : "Michaël Minelli <dojo@minelli.me>",
"main" : "dist/app.js", "main" : "dist/app.js",
"bin" : { "bin" : {
"dojo": "./dist/app.js" "dojo": "./dist/app.js"
...@@ -22,8 +25,10 @@ ...@@ -22,8 +25,10 @@
] ]
}, },
"scripts" : { "scripts" : {
"build" : "npx tsc", "dotenv:build": "npx dotenv-vault local build",
"start:dev": "npx ts-node src/app.ts", "genversion" : "npx genversion -s -e src/config/Version.ts",
"build" : "npm run genversion; npx tsc",
"start:dev" : "npm run genversion; npx ts-node src/app.ts",
"test" : "echo \"Error: no test specified\" && exit 1" "test" : "echo \"Error: no test specified\" && exit 1"
}, },
"dependencies" : { "dependencies" : {
...@@ -50,6 +55,7 @@ ...@@ -50,6 +55,7 @@
"@types/node" : "^18.17.2", "@types/node" : "^18.17.2",
"@types/tar-stream" : "^2.2.2", "@types/tar-stream" : "^2.2.2",
"dotenv-vault" : "^1.25.0", "dotenv-vault" : "^1.25.0",
"genversion" : "^3.1.1",
"pkg" : "^5.8.1", "pkg" : "^5.8.1",
"tiny-typed-emitter" : "^2.1.0", "tiny-typed-emitter" : "^2.1.0",
"ts-node" : "^10.9.1", "ts-node" : "^10.9.1",
......
...@@ -6,6 +6,10 @@ class Config { ...@@ -6,6 +6,10 @@ class Config {
folder: string; file: string; folder: string; file: string;
}; };
public readonly gitlab: {
cliReleasePage: string
};
public readonly folders: { public readonly folders: {
defaultLocalExercise: string defaultLocalExercise: string
}; };
...@@ -24,6 +28,10 @@ class Config { ...@@ -24,6 +28,10 @@ class Config {
file : process.env.LOCAL_CONFIG_FILE || '' file : process.env.LOCAL_CONFIG_FILE || ''
}; };
this.gitlab = {
cliReleasePage: process.env.GITLAB_CLI_RELEASE_PAGE || ''
};
this.folders = { this.folders = {
defaultLocalExercise: process.env.LOCAL_EXERCISE_DEFAULT_FOLDER || './' defaultLocalExercise: process.env.LOCAL_EXERCISE_DEFAULT_FOLDER || './'
}; };
......
import axios, { AxiosRequestHeaders } from 'axios'; import axios, { AxiosRequestHeaders } from 'axios';
import SessionManager from './SessionManager'; import SessionManager from './SessionManager';
import FormData from 'form-data'; import FormData from 'form-data';
import logger from '../shared/logging/WinstonLogger';
import GitlabManager from './GitlabManager'; import GitlabManager from './GitlabManager';
import { StatusCodes } from 'http-status-codes'; import { StatusCodes } from 'http-status-codes';
import ClientsSharedConfig from '../sharedByClients/config/ClientsSharedConfig'; import ClientsSharedConfig from '../sharedByClients/config/ClientsSharedConfig';
import { version } from '../config/Version';
import DojoBackendResponse from '../shared/types/Dojo/DojoBackendResponse';
import DojoStatusCode from '../shared/types/Dojo/DojoStatusCode';
import boxen from 'boxen';
import Config from '../config/Config';
class HttpManager { class HttpManager {
public handleCommandErrors: boolean = true; public handleAuthorizationCommandErrors: boolean = true;
registerAxiosInterceptor() { registerAxiosInterceptor() {
this.registerRequestInterceptor(); this.registerRequestInterceptor();
...@@ -32,6 +36,9 @@ class HttpManager { ...@@ -32,6 +36,9 @@ class HttpManager {
if ( SessionManager.isLogged ) { if ( SessionManager.isLogged ) {
config.headers.Authorization = `Bearer ${ SessionManager.token }`; config.headers.Authorization = `Bearer ${ SessionManager.token }`;
} }
config.headers['client'] = 'DojoCLI';
config.headers['client-version'] = version;
} }
if ( GitlabManager.isLogged && config.url && config.url.indexOf(ClientsSharedConfig.gitlab.apiURL) !== -1 ) { if ( GitlabManager.isLogged && config.url && config.url.indexOf(ClientsSharedConfig.gitlab.apiURL) !== -1 ) {
...@@ -42,6 +49,19 @@ class HttpManager { ...@@ -42,6 +49,19 @@ class HttpManager {
}); });
} }
private requestError(message: string) {
console.log(boxen(message, {
title : 'Request error',
titleAlignment: 'center',
borderColor : 'red',
borderStyle : 'bold',
margin : 1,
padding : 1,
textAlignment : 'left'
}));
process.exit(1);
}
private registerResponseInterceptor() { private registerResponseInterceptor() {
axios.interceptors.response.use((response) => { axios.interceptors.response.use((response) => {
if ( response.data && response.data.sessionToken ) { if ( response.data && response.data.sessionToken ) {
...@@ -51,28 +71,39 @@ class HttpManager { ...@@ -51,28 +71,39 @@ class HttpManager {
return response; return response;
}, (error) => { }, (error) => {
if ( error.response ) { if ( error.response ) {
if ( this.handleCommandErrors ) { if ( error.response.status === StatusCodes.METHOD_NOT_ALLOWED && error.response.data ) {
const data: DojoBackendResponse<{}> = error.response.data;
switch ( data.code ) {
case DojoStatusCode.CLIENT_NOT_SUPPORTED:
this.requestError('Client not recognized by the server. Please contact the administrator.');
break;
case DojoStatusCode.CLIENT_VERSION_NOT_SUPPORTED:
this.requestError(`CLI version not anymore supported by the server. Please update the CLI.\nYou can download the latest stable version (latest release without "-dev" suffix) on this page:\n${ Config.gitlab.cliReleasePage }`);
break;
default:
break;
}
}
if ( this.handleAuthorizationCommandErrors ) {
if ( error.response.url && error.response.url.indexOf(ClientsSharedConfig.apiURL) !== -1 ) { if ( error.response.url && error.response.url.indexOf(ClientsSharedConfig.apiURL) !== -1 ) {
switch ( error.response.status ) { switch ( error.response.status ) {
case StatusCodes.UNAUTHORIZED: // Unauthorized case StatusCodes.UNAUTHORIZED:
logger.error('Session expired or inexistent. Please login again.'); this.requestError('Session expired or does not exist. Please login again.');
process.exit(1);
break; break;
case StatusCodes.FORBIDDEN: // Forbidden case StatusCodes.FORBIDDEN:
logger.error('Forbidden access.'); this.requestError('Forbidden access.');
process.exit(1);
break; break;
} }
} }
} else { } else {
this.handleCommandErrors = true; this.handleAuthorizationCommandErrors = true;
} }
} else { } else {
logger.error('Error connecting to the server.'); this.requestError('Error connecting to the server. Please check your internet connection. If the problem persists, please contact the administrator.');
process.exit(1);
} }
return Promise.reject(error); return Promise.reject(error);
}); });
} }
......
...@@ -97,7 +97,7 @@ class SessionManager { ...@@ -97,7 +97,7 @@ class SessionManager {
ora('Checking Dojo session: ').start().info(); ora('Checking Dojo session: ').start().info();
} }
HttpManager.handleCommandErrors = false; HttpManager.handleAuthorizationCommandErrors = false;
const spinner: ora.Ora = ora({ const spinner: ora.Ora = ora({
text : `Testing Dojo session`, text : `Testing Dojo session`,
......
Subproject commit 8bdbef31376a8284bd8a5139588b43a57cf74a4b Subproject commit 8424367748a6fc47f8da10b85e7663f3f7d07620
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment