mirror of
https://github.com/bitwarden/web
synced 2025-12-12 06:13:28 +00:00
Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1b169f368b | ||
|
|
3375bda789 | ||
|
|
6569fbe6aa | ||
|
|
1d2b82a302 | ||
|
|
004ddb1e75 | ||
|
|
400826baf7 | ||
|
|
96ae20d81d | ||
|
|
ef5f4df30f | ||
|
|
2ce1b12f6e | ||
|
|
85efba92e6 | ||
|
|
d17211ff86 |
@@ -30,6 +30,8 @@ paths.lessDir = 'less/';
|
|||||||
paths.cssDir = paths.webroot + 'css/';
|
paths.cssDir = paths.webroot + 'css/';
|
||||||
paths.jsDir = paths.webroot + 'js/';
|
paths.jsDir = paths.webroot + 'js/';
|
||||||
|
|
||||||
|
var randomString = Math.random().toString(36).substring(7);
|
||||||
|
|
||||||
gulp.task('lint', function () {
|
gulp.task('lint', function () {
|
||||||
return gulp.src(paths.webroot + 'app/**/*.js')
|
return gulp.src(paths.webroot + 'app/**/*.js')
|
||||||
.pipe(jshint())
|
.pipe(jshint())
|
||||||
@@ -261,7 +263,7 @@ gulp.task('dist:css', function () {
|
|||||||
paths.cssDir + '**/*.css',
|
paths.cssDir + '**/*.css',
|
||||||
'!' + paths.cssDir + '**/*.min.css'
|
'!' + paths.cssDir + '**/*.min.css'
|
||||||
])
|
])
|
||||||
.pipe(preprocess({ context: settings }))
|
.pipe(preprocess({ context: { cacheTag: randomString } }))
|
||||||
.pipe(cssmin())
|
.pipe(cssmin())
|
||||||
.pipe(rename({ suffix: '.min' }))
|
.pipe(rename({ suffix: '.min' }))
|
||||||
.pipe(gulp.dest(paths.dist + 'css'));
|
.pipe(gulp.dest(paths.dist + 'css'));
|
||||||
@@ -277,7 +279,7 @@ gulp.task('dist:js:app', function () {
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
merge(mainStream, config())
|
merge(mainStream, config())
|
||||||
.pipe(preprocess({ context: settings }))
|
.pipe(preprocess({ context: { cacheTag: randomString } }))
|
||||||
.pipe(concat(paths.dist + '/js/app.min.js'))
|
.pipe(concat(paths.dist + '/js/app.min.js'))
|
||||||
.pipe(ngAnnotate())
|
.pipe(ngAnnotate())
|
||||||
.pipe(uglify())
|
.pipe(uglify())
|
||||||
@@ -306,7 +308,7 @@ gulp.task('dist:preprocess', function () {
|
|||||||
.src([
|
.src([
|
||||||
paths.dist + '/**/*.html'
|
paths.dist + '/**/*.html'
|
||||||
], { base: '.' })
|
], { base: '.' })
|
||||||
.pipe(preprocess({ context: settings }))
|
.pipe(preprocess({ context: { cacheTag: randomString }}))
|
||||||
.pipe(gulp.dest('.'));
|
.pipe(gulp.dest('.'));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"version": "1.0.1",
|
"version": "1.1.1",
|
||||||
"environment": "Development",
|
"environment": "Development",
|
||||||
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
@@ -56,7 +56,9 @@
|
|||||||
/// <reference path="lib/angular-md5/angular-md5.js" />
|
/// <reference path="lib/angular-md5/angular-md5.js" />
|
||||||
/// <reference path="lib/angular-messages/angular-messages.js" />
|
/// <reference path="lib/angular-messages/angular-messages.js" />
|
||||||
/// <reference path="lib/angular-resource/angular-resource.js" />
|
/// <reference path="lib/angular-resource/angular-resource.js" />
|
||||||
/// <reference path="lib/angular-toastr/angular-toastr.js" />
|
/// <reference path="lib/angulartics/angulartics.js" />
|
||||||
|
/// <reference path="lib/angulartics/angulartics-ga.js" />
|
||||||
|
/// <reference path="lib/angular-toastr/angular-toastr.min.js" />
|
||||||
/// <reference path="lib/angular-toastr/angular-toastr.tpls.js" />
|
/// <reference path="lib/angular-toastr/angular-toastr.tpls.js" />
|
||||||
/// <reference path="lib/angular-ui-router/angular-ui-router.js" />
|
/// <reference path="lib/angular-ui-router/angular-ui-router.js" />
|
||||||
/// <reference path="lib/bootstrap/js/bootstrap.min.js" />
|
/// <reference path="lib/bootstrap/js/bootstrap.min.js" />
|
||||||
@@ -67,4 +69,3 @@
|
|||||||
/// <reference path="lib/papaparse/papaparse.js" />
|
/// <reference path="lib/papaparse/papaparse.js" />
|
||||||
/// <reference path="lib/sjcl/bitArray.js" />
|
/// <reference path="lib/sjcl/bitArray.js" />
|
||||||
/// <reference path="lib/sjcl/cbc.js" />
|
/// <reference path="lib/sjcl/cbc.js" />
|
||||||
/// <reference path="lib/sjcl/sjcl.js" />
|
|
||||||
|
|||||||
@@ -24,9 +24,9 @@ angular
|
|||||||
folderId: encryptedSite.FolderId,
|
folderId: encryptedSite.FolderId,
|
||||||
favorite: encryptedSite.Favorite,
|
favorite: encryptedSite.Favorite,
|
||||||
name: cryptoService.decrypt(encryptedSite.Name),
|
name: cryptoService.decrypt(encryptedSite.Name),
|
||||||
uri: cryptoService.decrypt(encryptedSite.Uri),
|
uri: encryptedSite.Uri && encryptedSite.Uri !== '' ? cryptoService.decrypt(encryptedSite.Uri) : null,
|
||||||
username: encryptedSite.Username && encryptedSite.Username !== '' ? cryptoService.decrypt(encryptedSite.Username) : null,
|
username: encryptedSite.Username && encryptedSite.Username !== '' ? cryptoService.decrypt(encryptedSite.Username) : null,
|
||||||
password: cryptoService.decrypt(encryptedSite.Password),
|
password: encryptedSite.Password && encryptedSite.Password !== '' ? cryptoService.decrypt(encryptedSite.Password) : null,
|
||||||
notes: encryptedSite.Notes && encryptedSite.Notes !== '' ? cryptoService.decrypt(encryptedSite.Notes) : null
|
notes: encryptedSite.Notes && encryptedSite.Notes !== '' ? cryptoService.decrypt(encryptedSite.Notes) : null
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -79,10 +79,10 @@ angular
|
|||||||
'type': 1,
|
'type': 1,
|
||||||
folderId: unencryptedSite.folderId === '' ? null : unencryptedSite.folderId,
|
folderId: unencryptedSite.folderId === '' ? null : unencryptedSite.folderId,
|
||||||
favorite: unencryptedSite.favorite !== null ? unencryptedSite.favorite : false,
|
favorite: unencryptedSite.favorite !== null ? unencryptedSite.favorite : false,
|
||||||
uri: cryptoService.encrypt(unencryptedSite.uri, key),
|
uri: !unencryptedSite.uri || unencryptedSite.uri === '' ? null : cryptoService.encrypt(unencryptedSite.uri, key),
|
||||||
name: cryptoService.encrypt(unencryptedSite.name, key),
|
name: cryptoService.encrypt(unencryptedSite.name, key),
|
||||||
username: !unencryptedSite.username || unencryptedSite.username === '' ? null : cryptoService.encrypt(unencryptedSite.username, key),
|
username: !unencryptedSite.username || unencryptedSite.username === '' ? null : cryptoService.encrypt(unencryptedSite.username, key),
|
||||||
password: cryptoService.encrypt(unencryptedSite.password, key),
|
password: !unencryptedSite.password || unencryptedSite.password === '' ? null : cryptoService.encrypt(unencryptedSite.password, key),
|
||||||
notes: !unencryptedSite.notes || unencryptedSite.notes === '' ? null : cryptoService.encrypt(unencryptedSite.notes, key)
|
notes: !unencryptedSite.notes || unencryptedSite.notes === '' ? null : cryptoService.encrypt(unencryptedSite.notes, key)
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -12,6 +12,12 @@
|
|||||||
case 'lastpass':
|
case 'lastpass':
|
||||||
importLastPass(file, success, error);
|
importLastPass(file, success, error);
|
||||||
break;
|
break;
|
||||||
|
case 'safeincloudcsv':
|
||||||
|
importSafeInCloudCsv(file, success, error);
|
||||||
|
break;
|
||||||
|
case 'keypassxml':
|
||||||
|
importKeyPassXml(file, success, error);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
error();
|
error();
|
||||||
break;
|
break;
|
||||||
@@ -27,10 +33,6 @@
|
|||||||
folderRelationships = [];
|
folderRelationships = [];
|
||||||
|
|
||||||
angular.forEach(results.data, function (value, key) {
|
angular.forEach(results.data, function (value, key) {
|
||||||
if (!value.uri || value.uri === '') {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var folderIndex = folders.length,
|
var folderIndex = folders.length,
|
||||||
siteIndex = sites.length,
|
siteIndex = sites.length,
|
||||||
hasFolder = value.folder && value.folder !== '',
|
hasFolder = value.folder && value.folder !== '',
|
||||||
@@ -38,7 +40,7 @@
|
|||||||
|
|
||||||
if (hasFolder) {
|
if (hasFolder) {
|
||||||
for (var i = 0; i < folders.length; i++) {
|
for (var i = 0; i < folders.length; i++) {
|
||||||
if (folders[i].name == value.folder) {
|
if (folders[i].name === value.folder) {
|
||||||
addFolder = false;
|
addFolder = false;
|
||||||
folderIndex = i;
|
folderIndex = i;
|
||||||
break;
|
break;
|
||||||
@@ -48,11 +50,11 @@
|
|||||||
|
|
||||||
sites.push({
|
sites.push({
|
||||||
favorite: value.favorite !== null ? value.favorite : false,
|
favorite: value.favorite !== null ? value.favorite : false,
|
||||||
uri: value.uri,
|
uri: value.uri && value.uri !== '' ? value.uri : null,
|
||||||
username: value.username && value.username !== '' ? value.username : null,
|
username: value.username && value.username !== '' ? value.username : null,
|
||||||
password: value.password,
|
password: value.password && value.password !== '' ? value.password : null,
|
||||||
notes: value.notes && value.notes !== '' ? value.notes : null,
|
notes: value.notes && value.notes !== '' ? value.notes : null,
|
||||||
name: value.name
|
name: value.name && value.name !== '' ? value.name : '--',
|
||||||
});
|
});
|
||||||
|
|
||||||
if (addFolder) {
|
if (addFolder) {
|
||||||
@@ -76,6 +78,100 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function importLastPass(file, success, error) {
|
function importLastPass(file, success, error) {
|
||||||
|
if (file.type === 'text/html') {
|
||||||
|
var reader = new FileReader();
|
||||||
|
reader.readAsText(file, 'utf-8');
|
||||||
|
reader.onload = function (evt) {
|
||||||
|
var doc = $(evt.target.result);
|
||||||
|
var pre = doc.find('pre');
|
||||||
|
var csv, results;
|
||||||
|
|
||||||
|
if (pre.length === 1) {
|
||||||
|
csv = pre.text().trim();
|
||||||
|
results = Papa.parse(csv, { header: true });
|
||||||
|
parseData(results.data);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var foundPre = false;
|
||||||
|
for (var i = 0; i < doc.length; i++) {
|
||||||
|
if (doc[i].tagName === 'PRE') {
|
||||||
|
foundPre = true;
|
||||||
|
csv = doc[i].outerText.trim();
|
||||||
|
results = Papa.parse(csv, { header: true });
|
||||||
|
parseData(results.data);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!foundPre) {
|
||||||
|
error();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
reader.onerror = function (evt) {
|
||||||
|
error();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Papa.parse(file, {
|
||||||
|
header: true,
|
||||||
|
complete: function (results) {
|
||||||
|
parseData(results.data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseData(data) {
|
||||||
|
var folders = [],
|
||||||
|
sites = [],
|
||||||
|
siteRelationships = [];
|
||||||
|
|
||||||
|
angular.forEach(data, function (value, key) {
|
||||||
|
var folderIndex = folders.length,
|
||||||
|
siteIndex = sites.length,
|
||||||
|
hasFolder = value.grouping && value.grouping !== '' && value.grouping !== '(none)',
|
||||||
|
addFolder = hasFolder;
|
||||||
|
|
||||||
|
if (hasFolder) {
|
||||||
|
for (var i = 0; i < folders.length; i++) {
|
||||||
|
if (folders[i].name === value.grouping) {
|
||||||
|
addFolder = false;
|
||||||
|
folderIndex = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sites.push({
|
||||||
|
favorite: value.fav === '1',
|
||||||
|
uri: value.url && value.url !== '' ? value.url : null,
|
||||||
|
username: value.username && value.username !== '' ? value.username : null,
|
||||||
|
password: value.password && value.password !== '' ? value.password : null,
|
||||||
|
notes: value.extra && value.extra !== '' ? value.extra : null,
|
||||||
|
name: value.name && value.name !== '' ? value.name : '--',
|
||||||
|
});
|
||||||
|
|
||||||
|
if (addFolder) {
|
||||||
|
folders.push({
|
||||||
|
name: value.grouping
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasFolder) {
|
||||||
|
var relationship = {
|
||||||
|
key: siteIndex,
|
||||||
|
value: folderIndex
|
||||||
|
};
|
||||||
|
siteRelationships.push(relationship);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
success(folders, sites, siteRelationships);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function importSafeInCloudCsv(file, success, error) {
|
||||||
Papa.parse(file, {
|
Papa.parse(file, {
|
||||||
header: true,
|
header: true,
|
||||||
complete: function (results) {
|
complete: function (results) {
|
||||||
@@ -84,47 +180,14 @@
|
|||||||
siteRelationships = [];
|
siteRelationships = [];
|
||||||
|
|
||||||
angular.forEach(results.data, function (value, key) {
|
angular.forEach(results.data, function (value, key) {
|
||||||
if (!value.url || value.url === '') {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var folderIndex = folders.length,
|
|
||||||
siteIndex = sites.length,
|
|
||||||
hasFolder = value.grouping && value.grouping !== '' && value.grouping != '(none)',
|
|
||||||
addFolder = hasFolder;
|
|
||||||
|
|
||||||
if (hasFolder) {
|
|
||||||
for (var i = 0; i < folders.length; i++) {
|
|
||||||
if (folders[i].name == value.grouping) {
|
|
||||||
addFolder = false;
|
|
||||||
folderIndex = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sites.push({
|
sites.push({
|
||||||
favorite: value.fav == '1',
|
favorite: false,
|
||||||
uri: value.url,
|
uri: value.URL && value.URL !== '' ? value.URL : null,
|
||||||
username: value.username && value.username !== '' ? value.username : null,
|
username: value.Login && value.Login !== '' ? value.Login : null,
|
||||||
password: value.password,
|
password: value.Password && value.Password !== '' ? value.Password : null,
|
||||||
notes: value.extra && value.extra !== '' ? value.extra : null,
|
notes: value.Notes && value.Notes !== '' ? value.Notes : null,
|
||||||
name: value.name
|
name: value.Title && value.Title !== '' ? value.Title : '--',
|
||||||
});
|
});
|
||||||
|
|
||||||
if (addFolder) {
|
|
||||||
folders.push({
|
|
||||||
name: value.grouping
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hasFolder) {
|
|
||||||
var relationship = {
|
|
||||||
key: siteIndex,
|
|
||||||
value: folderIndex
|
|
||||||
};
|
|
||||||
siteRelationships.push(relationship);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
success(folders, sites, siteRelationships);
|
success(folders, sites, siteRelationships);
|
||||||
@@ -132,5 +195,120 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function importKeyPassXml(file, success, error) {
|
||||||
|
var folders = [],
|
||||||
|
sites = [],
|
||||||
|
siteRelationships = [];
|
||||||
|
|
||||||
|
var reader = new FileReader();
|
||||||
|
reader.readAsText(file, 'utf-8');
|
||||||
|
reader.onload = function (evt) {
|
||||||
|
var xmlDoc = $.parseXML(evt.target.result),
|
||||||
|
xml = $(xmlDoc);
|
||||||
|
|
||||||
|
var root = xml.find('Root');
|
||||||
|
if (root.length) {
|
||||||
|
var group = root.find('> Group');
|
||||||
|
if (group.length) {
|
||||||
|
traverse($(group[0]), true, '');
|
||||||
|
success(folders, sites, siteRelationships);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
error();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
reader.onerror = function (evt) {
|
||||||
|
error();
|
||||||
|
};
|
||||||
|
|
||||||
|
function traverse(node, isRootNode, groupNamePrefix) {
|
||||||
|
var nodeEntries = [];
|
||||||
|
var folderIndex = folders.length;
|
||||||
|
var groupName = groupNamePrefix;
|
||||||
|
|
||||||
|
if (!isRootNode) {
|
||||||
|
if (groupName !== '') {
|
||||||
|
groupName += ' > ';
|
||||||
|
}
|
||||||
|
groupName += node.find('> Name').text();
|
||||||
|
folders.push({
|
||||||
|
name: groupName
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
var entries = node.find('> Entry');
|
||||||
|
if (entries.length) {
|
||||||
|
for (var i = 0; i < entries.length; i++) {
|
||||||
|
var entry = $(entries[i]);
|
||||||
|
var siteIndex = sites.length;
|
||||||
|
var site = {
|
||||||
|
favorite: false,
|
||||||
|
uri: null,
|
||||||
|
username: null,
|
||||||
|
password: null,
|
||||||
|
notes: null,
|
||||||
|
name: null
|
||||||
|
};
|
||||||
|
|
||||||
|
var entryStrings = entry.find('> String');
|
||||||
|
for (var j = 0; j < entryStrings.length; j++) {
|
||||||
|
var entryString = $(entryStrings[j]);
|
||||||
|
|
||||||
|
var key = entryString.find('> Key').text();
|
||||||
|
var value = entryString.find('> Value').text();
|
||||||
|
if (value === '') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (key) {
|
||||||
|
case 'URL':
|
||||||
|
site.uri = value;
|
||||||
|
break;
|
||||||
|
case 'UserName':
|
||||||
|
site.username = value;
|
||||||
|
break;
|
||||||
|
case 'Password':
|
||||||
|
site.password = value;
|
||||||
|
break;
|
||||||
|
case 'Title':
|
||||||
|
site.name = value;
|
||||||
|
break;
|
||||||
|
case 'Notes':
|
||||||
|
site.notes = site.notes === null ? value + '\n' : site.notes + value + '\n';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// other custom fields
|
||||||
|
site.notes = site.notes === null ? key + ': ' + value + '\n'
|
||||||
|
: site.notes + key + ': ' + value + '\n';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (site.name === null) {
|
||||||
|
site.name = '--';
|
||||||
|
}
|
||||||
|
|
||||||
|
sites.push(site);
|
||||||
|
|
||||||
|
if (!isRootNode) {
|
||||||
|
siteRelationships.push({
|
||||||
|
key: siteIndex,
|
||||||
|
value: folderIndex
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var groups = node.find('> Group');
|
||||||
|
if (groups.length) {
|
||||||
|
for (var k = 0; k < groups.length; k++) {
|
||||||
|
traverse($(groups[k]), false, groupName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return _service;
|
return _service;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
angular.module("bit")
|
angular.module("bit")
|
||||||
.constant("appSettings", {"rememberedEmailCookieName":"bit.rememberedEmail","version":"1.0.1","environment":"Development","apiUri":"http://localhost:4000"});
|
.constant("appSettings", {"rememberedEmailCookieName":"bit.rememberedEmail","version":"1.1.1","environment":"Development","apiUri":"http://localhost:4000"});
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
}, function () {
|
}, function () {
|
||||||
$uibModalInstance.dismiss('cancel');
|
$uibModalInstance.dismiss('cancel');
|
||||||
$state.go('backend.vault').then(function () {
|
$state.go('backend.vault').then(function () {
|
||||||
$analytics.eventTrack('Imported Data', { label: model.source });
|
$analytics.eventTrack('Imported Data', { label: $scope.model.source });
|
||||||
toastr.success('Data has been successfully imported into your vault.', 'Import Success');
|
toastr.success('Data has been successfully imported into your vault.', 'Import Success');
|
||||||
});
|
});
|
||||||
}, importError);
|
}, importError);
|
||||||
|
|||||||
@@ -7,8 +7,10 @@
|
|||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="source">Source</label>
|
<label for="source">Source</label>
|
||||||
<select id="source" name="source" class="form-control" ng-model="model.source">
|
<select id="source" name="source" class="form-control" ng-model="model.source">
|
||||||
<option value="local">bitwarden</option>
|
<option value="local">bitwarden (csv)</option>
|
||||||
<option value="lastpass">LastPass</option>
|
<option value="lastpass">LastPass (csv)</option>
|
||||||
|
<option value="safeincloudcsv">SafeInCloud (csv)</option>
|
||||||
|
<option value="keypassxml">KeyPass (xml)</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
|||||||
@@ -64,7 +64,7 @@
|
|||||||
<label for="password">Password</label>
|
<label for="password">Password</label>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input tabindex="-1" type="text" id="password-text" value="{{site.password}}" style="margin-left: -9999px;" />
|
<input tabindex="-1" type="text" id="password-text" value="{{site.password}}" style="margin-left: -9999px;" />
|
||||||
<input type="password" id="password" name="Password" ng-model="site.password" class="form-control" required api-field />
|
<input type="password" id="password" name="Password" ng-model="site.password" class="form-control" api-field />
|
||||||
<span class="input-group-btn" uib-tooltip="Copy Password" tooltip-placement="left">
|
<span class="input-group-btn" uib-tooltip="Copy Password" tooltip-placement="left">
|
||||||
<button tabindex="-1" class="btn btn-default btn-flat" type="button" ngclipboard
|
<button tabindex="-1" class="btn btn-default btn-flat" type="button" ngclipboard
|
||||||
ngclipboard-success="clipboardSuccess(e)"
|
ngclipboard-success="clipboardSuccess(e)"
|
||||||
|
|||||||
@@ -67,7 +67,7 @@
|
|||||||
<label for="password">Password</label>
|
<label for="password">Password</label>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input type="text" id="password-text" value="{{site.password}}" style="margin-left: -9999px;" />
|
<input type="text" id="password-text" value="{{site.password}}" style="margin-left: -9999px;" />
|
||||||
<input type="password" id="password" name="Password" ng-model="site.password" class="form-control" required api-field />
|
<input type="password" id="password" name="Password" ng-model="site.password" class="form-control" api-field />
|
||||||
<span class="input-group-btn" uib-tooltip="Copy Password" tooltip-placement="left">
|
<span class="input-group-btn" uib-tooltip="Copy Password" tooltip-placement="left">
|
||||||
<button tabindex="-1" class="btn btn-default btn-flat" type="button" ngclipboard
|
<button tabindex="-1" class="btn btn-default btn-flat" type="button" ngclipboard
|
||||||
ngclipboard-success="clipboardSuccess(e)"
|
ngclipboard-success="clipboardSuccess(e)"
|
||||||
|
|||||||
@@ -113,7 +113,8 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="header">
|
<li class="header">
|
||||||
MOBILE APPS<small class="label pull-right bg-green">FREE</small>
|
<small class="label pull-right bg-green">FREE</small>
|
||||||
|
MOBILE APPS
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="https://itunes.apple.com/us/app/bitwarden-free-password-manager/id1137397744?mt=8"
|
<a href="https://itunes.apple.com/us/app/bitwarden-free-password-manager/id1137397744?mt=8"
|
||||||
@@ -128,7 +129,8 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="header">
|
<li class="header">
|
||||||
BROWSER EXTENSIONS <small class="label pull-right bg-green">FREE</small>
|
<small class="label pull-right bg-green">FREE</small>
|
||||||
|
BROWSER EXTENSIONS
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb"
|
<a href="https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb"
|
||||||
@@ -139,22 +141,22 @@
|
|||||||
<li>
|
<li>
|
||||||
<a href="javascript:void(0)"
|
<a href="javascript:void(0)"
|
||||||
target="_blank" analytics-on="click" analytics-event="Clicked Firefox">
|
target="_blank" analytics-on="click" analytics-event="Clicked Firefox">
|
||||||
<i class="fa fa-firefox"></i> <span>Firefox</span>
|
|
||||||
<small class="label pull-right bg-gray">coming very soon</small>
|
<small class="label pull-right bg-gray">coming very soon</small>
|
||||||
|
<i class="fa fa-firefox"></i> <span>Firefox</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="javascript:void(0)"
|
<a href="javascript:void(0)"
|
||||||
target="_blank" analytics-on="click" analytics-event="Clicked Opera">
|
target="_blank" analytics-on="click" analytics-event="Clicked Opera">
|
||||||
<i class="fa fa-opera"></i> <span>Opera</span>
|
|
||||||
<small class="label pull-right bg-gray">coming very soon</small>
|
<small class="label pull-right bg-gray">coming very soon</small>
|
||||||
|
<i class="fa fa-opera"></i> <span>Opera</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="javascript:void(0)"
|
<a href="javascript:void(0)"
|
||||||
target="_blank" analytics-on="click" analytics-event="Clicked Edge">
|
target="_blank" analytics-on="click" analytics-event="Clicked Edge">
|
||||||
<i class="fa fa-edge"></i> <span>Edge</span>
|
|
||||||
<small class="label pull-right bg-gray">coming soon</small>
|
<small class="label pull-right bg-gray">coming soon</small>
|
||||||
|
<i class="fa fa-edge"></i> <span>Edge</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
@@ -10,13 +10,13 @@
|
|||||||
<!-- @if true !>
|
<!-- @if true !>
|
||||||
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
|
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
|
||||||
<meta name="x-stylesheet-test-bs" content="" class="invisible" />
|
<meta name="x-stylesheet-test-bs" content="" class="invisible" />
|
||||||
<script>!function(a,b,c){var d,e=document,f=e.getElementsByTagName('SCRIPT'),g=f[f.length-1].previousElementSibling,h=e.defaultView&&e.defaultView.getComputedStyle?e.defaultView.getComputedStyle(g):g.currentStyle;if(h&&h[a]!==b)for(d=0;d<c.length;d++)e.write('<link rel="stylesheet" href="'+c[d]+'"/>')}('visibility','hidden',['lib\/bootstrap\/css\/bootstrap.min.css']);</script>
|
<script>!function(a,b,c){var d,e=document,f=e.getElementsByTagName('SCRIPT'),g=f[f.length-1].previousElementSibling,h=e.defaultView&&e.defaultView.getComputedStyle?e.defaultView.getComputedStyle(g):g.currentStyle;if(h&&h[a]!==b)for(d=0;d<c.length;d++)e.write('<link rel="stylesheet" href="'+c[d]+'"/>')}('visibility','hidden',['lib\/bootstrap\/css\/bootstrap.min.css?v=<!-- @echo cacheTag !>']);</script>
|
||||||
|
|
||||||
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css" />
|
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css" />
|
||||||
<meta name="x-stylesheet-test-fa" content="" class="fa" />
|
<meta name="x-stylesheet-test-fa" content="" class="fa" />
|
||||||
<script>!function(a,b,c){var d,e=document,f=e.getElementsByTagName('SCRIPT'),g=f[f.length-1].previousElementSibling,h=e.defaultView&&e.defaultView.getComputedStyle?e.defaultView.getComputedStyle(g):g.currentStyle;if(h&&h[a]!==b)for(d=0;d<c.length;d++)e.write('<link rel="stylesheet" href="'+c[d]+'"/>')}('font-family','FontAwesome',['lib\/font-awesome\/css\/font-awesome.min.css']);</script>
|
<script>!function(a,b,c){var d,e=document,f=e.getElementsByTagName('SCRIPT'),g=f[f.length-1].previousElementSibling,h=e.defaultView&&e.defaultView.getComputedStyle?e.defaultView.getComputedStyle(g):g.currentStyle;if(h&&h[a]!==b)for(d=0;d<c.length;d++)e.write('<link rel="stylesheet" href="'+c[d]+'"/>')}('font-family','FontAwesome',['lib\/font-awesome\/css\/font-awesome.min.css?v=<!-- @echo cacheTag !>']);</script>
|
||||||
|
|
||||||
<link rel="stylesheet" href="css/vault.min.css" />
|
<link rel="stylesheet" href="css/vault.min.css?v=<!-- @echo cacheTag !>" />
|
||||||
<!-- @endif -->
|
<!-- @endif -->
|
||||||
<!-- @exclude -->
|
<!-- @exclude -->
|
||||||
<link rel="stylesheet" href="lib/bootstrap/css/bootstrap.css" />
|
<link rel="stylesheet" href="lib/bootstrap/css/bootstrap.css" />
|
||||||
@@ -30,16 +30,16 @@
|
|||||||
|
|
||||||
<!-- @if true !>
|
<!-- @if true !>
|
||||||
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
|
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
|
||||||
<script>(window.jQuery||document.write('<script src="lib\/jquery\/jquery.min.js"><\/script>'));</script>
|
<script>(window.jQuery||document.write('<script src="lib\/jquery\/jquery.min.js?v=<!-- @echo cacheTag !>"><\/script>'));</script>
|
||||||
|
|
||||||
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
|
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
|
||||||
<script>((window.jQuery&&window.jQuery.fn&&window.jQuery.fn.modal)||document.write('<script src="lib\/bootstrap\/js\/bootstrap.min.js"><\/script>'));</script>
|
<script>((window.jQuery&&window.jQuery.fn&&window.jQuery.fn.modal)||document.write('<script src="lib\/bootstrap\/js\/bootstrap.min.js?v=<!-- @echo cacheTag !>"><\/script>'));</script>
|
||||||
|
|
||||||
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js"></script>
|
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js"></script>
|
||||||
<script>(window.angular||document.write('<script src="lib\/angular\/angular.min.js"><\/script>'));</script>
|
<script>(window.angular||document.write('<script src="lib\/angular\/angular.min.js?v=<!-- @echo cacheTag !>"><\/script>'));</script>
|
||||||
|
|
||||||
<script src="js/lib.min.js"></script>
|
<script src="js/lib.min.js?v=<!-- @echo cacheTag !>"></script>
|
||||||
<script src="js/app.min.js"></script>
|
<script src="js/app.min.js?v=<!-- @echo cacheTag !>"></script>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||||
|
|||||||
Reference in New Issue
Block a user