1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
import AbstractController from '@js/Controller/AbstractController';
import SystemService from '@js/Services/SystemService';
import {HttpError, NetworkError} from 'passwords-client/errors';
import ServerValidation from '@js/Validation/Server';
import ServerRepository from '@js/Repositories/ServerRepository';
import ServerManager from '@js/Manager/ServerManager';
import ErrorManager from '@js/Manager/ErrorManager';
import RegistryService from '@js/Services/RegistryService';
export default class Analyze extends AbstractController {
/**
*
* @param {Message} message
* @param {Message} reply
*/
async execute(message, reply) {
if(!RegistryService.has('passlink.action.connect')) {
reply.setPayload({success: false, message: 'PasslinkNoActiveAction'});
}
/** @type Connect **/
let action = RegistryService.get('passlink.action.connect');
action.setClientLabel(await this._getClientLabel());
let createServer = !RegistryService.has('passlink.connect.' + action.getParameter('id'));
RegistryService.set('passlink.connect.' + action.getParameter('id'), true);
try {
let login = await action.apply(),
label = await this._getServerName(login, action);
if(createServer) await this._createServer(login, action, label);
reply.setPayload({success: true, message: label});
} catch(e) {
reply.setPayload({success: false, message: this._getErrorMessage(e)});
}
RegistryService.remove('passlink.action.connect');
}
/**
*
* @param {Object} login
* @param {Connect} action
* @param {String} label
* @return {Promise<void>}
*/
async _createServer(login, action, label) {
let data = {
label,
baseUrl: action.getParameters().baseUrl,
user : login.login,
token : login.token
},
validation = new ServerValidation(),
result = await validation.validate(data);
if(!result.ok) throw new Error(result.message);
let server = result.server;
server.setEnabled(true);
await ServerRepository.create(server);
ServerManager.addServer(server)
.catch(ErrorManager.catch);
}
/**
*
* @param {Object} login
* @param {Connect} action
* @return {Promise<String>}
*/
async _getServerName(login, action) {
try {
let theme = await action.getTheme();
if(theme.hasOwnProperty('label')) {
let label = `${theme.label} - ${login.login}`;
if(label.length <= 48) return label;
}
} catch(e) {
ErrorManager.logError(e);
}
let host = new URL(action.getParameter('baseUrl')).host;
return `${login.login}@${host}`.substr(0,48);
}
/**
*
* @return {Promise<String>}
* @private
*/
async _getClientLabel() {
return await SystemService.getUserAgent();
}
/**
*
* @param {Error} error
* @return {string|*}
* @private
*/
_getErrorMessage(error) {
if(error instanceof HttpError && (error.status === 404 || error.status === 424)) {
return error.status === 404 ? 'PasslinkConnectNotFound':'PasslinkConnectRejected';
} else if(error instanceof NetworkError) {
return 'PasslinkConnectNetworkError';
}
return error.message;
}
}
|