Welcome to mirror list, hosted at ThFree Co, Russian Federation.

Apply.js « Connect « PassLink « Controller « js « src - github.com/marius-wieschollek/passwords-webextension.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: f45bfdbfedc733ffa663594df483686d9030cf52 (plain)
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;
    }
}