Completed
Push — master ( 641a91...fc9f6a )
by
unknown
10:16
created

PassmanImporter.EnPassTXT.readFile   B

Complexity

Conditions 8
Paths 11

Size

Total Lines 41

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 8
dl 0
loc 41
rs 7.0293
c 0
b 0
f 0
nc 11
nop 0
1
/**
2
 * Nextcloud - passman
3
 *
4
 * @copyright Copyright (c) 2016, Sander Brand ([email protected])
5
 * @copyright Copyright (c) 2016, Marcos Zuriaga Miguel ([email protected])
6
 * @license GNU AGPL version 3 or any later version
7
 *
8
 * This program is free software: you can redistribute it and/or modify
9
 * it under the terms of the GNU Affero General Public License as
10
 * published by the Free Software Foundation, either version 3 of the
11
 * License, or (at your option) any later version.
12
 *
13
 * This program is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 * GNU Affero General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU Affero General Public License
19
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
 *
21
 */
22
23
// Importers should always start with this
24
/** global: PassmanImporter */
25
var PassmanImporter = PassmanImporter || {};
26
(function(window, $, PassmanImporter) {
27
	'use strict';
28
	// Define the importer
29
	PassmanImporter.EnPassTXT = {
30
		info: {
31
			name: 'EnPass text file',
32
			id: 'EnPassTXT',
33
			exportSteps: ['Access your Enpass Database. Select "File" > "Export" > "As Text"']
34
		}
35
	};
36
37
	function parseEnpass(fileData){
38
		var lastProperty, matches, loginBlocks, property;
39
		loginBlocks = fileData.replaceAll("Title :","<~passman~>\nTitle :").split('<~passman~>\n').clean("");
40
		var regex = /(.*) : (.*)/;
41
		var results = [];
42
		for(var l = 0; l < loginBlocks.length; l++){
43
			var loginBlock = loginBlocks[l];
44
			var lrow = loginBlock.split('\n');
45
			var result = {};
46
			for(var r = 0; r < lrow.length; r++){
47
				var row = lrow[r];
48
				matches = regex.exec(row);
49
				if(matches){
50
					property = matches[1];
51
					result[property] = matches[2];
52
				} else {
53
					if(lastProperty){
54
						result[lastProperty] += "\n" + row;
55
					}
56
				}
57
				if(property) {
58
					lastProperty = property;
59
				}
60
			}
61
			results.push(result)
0 ignored issues
show
Coding Style introduced by
There should be a semicolon.

Requirement of semicolons purely is a coding style issue since JavaScript has specific rules about semicolons which are followed by all browsers.

Further Readings:

Loading history...
62
		}
63
		return results
0 ignored issues
show
Coding Style introduced by
There should be a semicolon.

Requirement of semicolons purely is a coding style issue since JavaScript has specific rules about semicolons which are followed by all browsers.

Further Readings:

Loading history...
64
	}
65
66
	PassmanImporter.EnPassTXT.readFile = function (file_data) {
67
		var mapper = {
68
			'Title': 'label',
69
			'Username': 'username',
70
			'Password': 'password',
71
			'Email': 'email',
72
			'Url': 'url',
73
			'Note': 'description'
74
		};
75
76
		var secret_fields = ['cvc', 'pin', 'security answer'];
77
78
		/** global: C_Promise */
79
		return new C_Promise(function(){
80
			var credential_list = [];
81
			var credentials = parseEnpass(file_data);
82
			for (var i = 0; i < credentials.length; i++) {
83
				var enpass_credential = credentials[i];
84
				var new_credential = PassmanImporter.newCredential();
85
				for(var key in enpass_credential){
86
					if(!enpass_credential.hasOwnProperty(key)){
87
						continue;
88
					}
89
90
					if(mapper.hasOwnProperty(key)){
91
						var prop = mapper[key];
92
						new_credential[prop] = enpass_credential[key];
93
					} else {
94
						if(key !== 'TOTP') {
95
							var isSecret = (secret_fields.indexOf(key.toLowerCase()) !== -1) ? 1 : 0;
96
							new_credential.custom_fields.push({
97
								'label': key,
98
								'value': enpass_credential[key],
99
								'secret': isSecret
100
							})
0 ignored issues
show
Coding Style introduced by
There should be a semicolon.

Requirement of semicolons purely is a coding style issue since JavaScript has specific rules about semicolons which are followed by all browsers.

Further Readings:

Loading history...
101
						}
102
					}
103
				}
104
105
				if(enpass_credential.hasOwnProperty('TOTP')){
106
					new_credential.otp.secret = enpass_credential['TOTP'];
0 ignored issues
show
Coding Style introduced by
['TOTP'] could be written in dot notation.

You can rewrite this statement in dot notation:

var obj = { };
obj['foo'] = 'bar'; // Bad
obj.foo = 'bar'; // Good
Loading history...
107
				}
108
109
				var progress = {
110
					percent: i/credentials.length*100,
111
					loaded: i,
112
					total: credentials.length
113
				};
114
115
				credential_list.push(new_credential);
116
				this.call_progress(progress);
117
			}
118
			this.call_then(credential_list);
119
		});
120
	};
121
})(window, $, PassmanImporter);