@@ -0,0 +1,7 @@ | |||
node_modules | |||
/LessPass-win32-x64/ | |||
/LessPass-linux-x64/ | |||
/LessPass-mas-x64/ | |||
/LessPass-win32-ia32/ | |||
/LessPass-linux-ia32/ | |||
/LessPass-darwin-x64/ |
@@ -0,0 +1,9 @@ | |||
# LessPass Desktop App | |||
desktop application for [lesspass.com](https://lesspass.com) | |||
# Run | |||
npm install && npm start | |||
see [LessPass](https://github.com/lesspass/lesspass) project |
@@ -0,0 +1,2 @@ | |||
*{border-radius:0!important}i{cursor:pointer}#autoLoginButton,#fingerprint,.option-block{display:none}#displayOptionsButton{cursor:pointer}.card{border:none}#passwordGenerator input{background-clip:padding-box} | |||
/*# sourceMappingURL=lesspass-pure.css.map*/ |
@@ -0,0 +1 @@ | |||
{"version":3,"sources":[],"names":[],"mappings":"","file":"lesspass-pure.css","sourceRoot":""} |
@@ -0,0 +1 @@ | |||
{"version":3,"sources":[],"names":[],"mappings":"","file":"lesspass-vendors.css","sourceRoot":""} |
@@ -0,0 +1,2 @@ | |||
!function(t){function r(n){if(e[n])return e[n].exports;var o=e[n]={exports:{},id:n,loaded:!1};return t[n].call(o.exports,o,o.exports,r),o.loaded=!0,o.exports}var e={};return r.m=t,r.c=e,r.p="/dist/",r(0)}({0:function(t,r,e){"use strict";e(17)},17:function(t,r){}}); | |||
//# sourceMappingURL=lesspass-vendors.js.map?8e61f7b8fff8e676e36f |
@@ -0,0 +1 @@ | |||
{"version":3,"sources":["webpack:///lesspass-vendors.js","webpack:///webpack/bootstrap 8e61f7b8fff8e676e36f?5b61","webpack:///./src/vendors.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","id","loaded","call","m","c","p","0","17"],"mappings":"CAAS,SAAUA,GCInB,QAAAC,GAAAC,GAGA,GAAAC,EAAAD,GACA,MAAAC,GAAAD,GAAAE,OAGA,IAAAC,GAAAF,EAAAD,IACAE,WACAE,GAAAJ,EACAK,QAAA,EAUA,OANAP,GAAAE,GAAAM,KAAAH,EAAAD,QAAAC,IAAAD,QAAAH,GAGAI,EAAAE,QAAA,EAGAF,EAAAD,QAvBA,GAAAD,KAqCA,OATAF,GAAAQ,EAAAT,EAGAC,EAAAS,EAAAP,EAGAF,EAAAU,EAAA,SAGAV,EAAA,KDMMW,EACA,SAASP,EAAQD,EAASH,GAE/B,YE/CDA,GAAA,KFqDMY,GACA,SAASR,EAAQD","file":"lesspass-vendors.js?8e61f7b8fff8e676e36f","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"/dist/\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 0:\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\t__webpack_require__(17);\n\n/***/ },\n\n/***/ 17:\n/***/ function(module, exports) {\n\n\t// removed by extract-text-webpack-plugin\n\n/***/ }\n\n/******/ });\n\n\n/** WEBPACK FOOTER **\n ** lesspass-vendors.js?8e61f7b8fff8e676e36f\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/dist/\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 8e61f7b8fff8e676e36f\n **/","import \"./vendors.scss\";\n\n\n/** WEBPACK FOOTER **\n ** ./src/vendors.js\n **/"],"sourceRoot":""} |
@@ -0,0 +1,16 @@ | |||
'use strict'; | |||
var gulp = require('gulp'); | |||
gulp.task('lesspass', [], function () { | |||
return gulp.src(['node_modules/lesspass-pure/dist/**/*']) | |||
.pipe(gulp.dest('dist/')); | |||
}); | |||
gulp.task('build', [], function () { | |||
gulp.start('lesspass'); | |||
}); | |||
gulp.task('default', ['build'], function () { | |||
}); |
@@ -0,0 +1,208 @@ | |||
<!DOCTYPE html> | |||
<html> | |||
<head> | |||
<meta charset="UTF-8"> | |||
<title>LessPass</title> | |||
<link rel="stylesheet" href="dist/lesspass-vendors.css"> | |||
<link rel="stylesheet" href="dist/lesspass-pure.css"> | |||
<style> | |||
body { | |||
padding: 1em; | |||
} | |||
.option-block { | |||
display: block; | |||
} | |||
</style> | |||
</head> | |||
<body> | |||
<div class="container m-y-1"> | |||
<div class="row"> | |||
<div class="col-xs-12"> | |||
<img src="images/logo.png" alt="logo"> | |||
</div> | |||
</div> | |||
</div> | |||
<div class="container m-y-1"> | |||
<div class="row"> | |||
<div class="col-xs-12"> | |||
<div id="passwordGenerator"> | |||
<div class="card"> | |||
<div id="password-block" class="card-block"> | |||
<form id="generatedPasswordForm"> | |||
<fieldset class="form-group"> | |||
<label for="login" class="sr-only">Login</label> | |||
<input id="login" | |||
name="login" | |||
type="text" | |||
class="form-control" | |||
placeholder="Login" | |||
autofocus | |||
autocomplete="off" | |||
autocorrect="off" | |||
autocapitalize="none"> | |||
<!-- remove autofill for masterPassword --> | |||
<input type="password" id="password" style="display: none"> | |||
</fieldset> | |||
<fieldset class="form-group"> | |||
<label for="masterPassword" class="sr-only">Password</label> | |||
<div class="input-group"> | |||
<input id="masterPassword" | |||
name="masterPassword" | |||
type="password" | |||
class="form-control" | |||
placeholder="Master password" | |||
autocomplete="off" | |||
autocorrect="off" | |||
autocapitalize="none"> | |||
<span class="input-group-btn"> | |||
<a id="displayMasterPasswordButton" class="btn btn-secondary" type="button" | |||
tabindex="-1"> | |||
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAABXElEQVQ4jeXTvUsdQRjF4edevyvRoKSTkNLKj4AXAloplgmCZUiXSmzEwl4D6cUulWCrjYGAH4V/gzaaJlYpUgRFg9dNMQOum9nrVSvxwLIz+7K/98xhXp6aWu6oVzCHF/iFWbzG4WMbf0BWeP5i8LHgwwQ4w9eHwCr4hO8l0AwX2MB0GaSa+NaGMYw2aN6BGoYauSvTW6xhGX3ox0+cYRW9Qt5NqxULWBGOPBChO8Jp3uEPFvHxPmD45ibPy+gswzmucrUvZYBUxrCZW7dHp9Dl9t3fvo/bmpBjhjpmcBL3e5jPOT7Fy2bBB25frXEM4wd6hGzz9c8pSDGK/ug4r5EIPcPvuM/rfTNuJ/w/DOuYFGLpxnGhXkdnEdRa2Pckmo0Io13FFF4V6tXY8KKR41rCcR37cb2bqF+6uTWlqmIr8fN14Z3/vpQCpUa6gjfCxDXSlRDR0V1un7n+AYMEbjEuFwpUAAAAAElFTkSuQmCC" | |||
alt="See secret"> | |||
<small class="hint--top" id="fingerprint" aria-label="fingerprint"></small> | |||
</a> | |||
</span> | |||
</div> | |||
</fieldset> | |||
<fieldset class="form-group"> | |||
<label for="site" class="sr-only">Site</label> | |||
<input id="site" | |||
name="site" | |||
type="text" | |||
class="form-control" | |||
placeholder="Site" | |||
autofocus | |||
autocomplete="off" | |||
autocorrect="off" | |||
autocapitalize="none"> | |||
</fieldset> | |||
<fieldset class="form-group"> | |||
<div class="input-group"> | |||
<span id="autoLoginButton" class="input-group-btn"> | |||
<button class="btn btn-secondary"> | |||
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAAAzUlEQVQ4je3SIWtCURgG4AdXBRUMFjGMgWF5TYsia/4n9xPWx0wm/4Gsj60Oo1pXFxY1eA67yA3nzmtRXzh83BMe3nvO4VzSStyv4i4V7eItTBiF2cYCD+G7jg/84jEV74V5g2VoBv0D9BNPAR+m4n18YYs1xmG/kUEbuMcPJqlwXuM89BtTVIrA/J1xRLfhTwbHoDFZNLsiWjsF2sRcgctLQWPGChxHHe856Mz+Uv+VC0fhOQd9dcQ7jelgpcSm2dxigxclND1MaS2vsQOL4kuuSAflIAAAAABJRU5ErkJggg==" | |||
alt="auto login"> | |||
</button> | |||
</span> | |||
<label for="generatedPassword" class="sr-only">Password Generated</label> | |||
<input id="generatedPassword" | |||
name="generatedPassword" | |||
type="text" | |||
class="form-control" | |||
tabindex="-1" | |||
readonly> | |||
<span class="input-group-btn"> | |||
<button id="copyPasswordButton" class="btn-copy btn btn-primary" type="button" | |||
data-clipboard-target="#generatedPassword"> | |||
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAABNUlEQVQ4jdXUsWoVURSF4W9HowYsbQ1CVBAELSySTlJFsEmRIkUsBAufQAufwQfQ1kIUlGBr7QOkCES0EeVWoqWFZFnk3jAZ7sQhE8T8cJhzZvb6ObNnOJw0ajJJMo8HmO2R28WLqtruKjjdmD/EY/zG5jg8jTs4j4vY6CM+M77+xCOkI3MN13G2S9oWT7iAT4eF+jAzIHspybmuh9N2PI2PeNJY38NdvE2yWlW/jir+XlWvJ4ski/iAK13yIa34htu4jM0kc8clVlVfsYwFvElyaqh4hLUkwZexeAXrQ8VPcQO3GuM9bk4K+n68A1TVLraa95L80DgiBvX4MP6JeOc4xfs9rqpnSd5hrlVz394vdTTxWD5qFyQZ4WqSV39xLeHzVHEHL+2deO03abOD5z18/yl/AD7MTbMWZ1fGAAAAAElFTkSuQmCC" | |||
alt="Copy"> | |||
</button> | |||
</span> | |||
</div> | |||
</fieldset> | |||
<fieldset class="form-group m-b-0"> | |||
<span id="displayOptionsButton"> | |||
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABmJLR0QA/wD/AP+gvaeTAAABhElEQVQ4jeXUsUtXURQH8I+mQYPuLlEJDaUNSqIhrQUNDkK6CUG1BYGrm4qONujvD3AQ3EScbUzXFgvM1EkFTSHQgl/DOz+8PHzvpyA0+IXHed9zzj33nHvvOdwktKIj/juCXwu+4BBvcBD8UmjAfdwrsM+gGsGrwS+FF7GgiseJvg1LOMZE6CaDL4VdYy5YP35gBAOJfhCj2MQT9KIFW2HfCt6LO/kMm7GfZFn0rYV/Bb+xErKSBksz/oPphJ9gHos4S/RTIbtxG9shu9PATSFv4Tnag//CU3wP3ofPUVUnfuI9HmIBq/iWPwJ4lCu3coHPcs6n5aJANeQvrwwNdXjhBj34FNkcycqsoU92zlWM45nsTIfC/hpdZRt8cF7qsfPLO030w+G7jr+Yk138elnWu+o/t6/hX/rc8ujBjqz/Z5NgY/iIDbzCXujfxrp3wffwoGwDeJkELmrp8dBNyLV0GRplQ+hugb02hI5ccQjVQzo2D11hbNZDq6wLhby2Qf9/8A9IaHNVoXWKEAAAAABJRU5ErkJggg==" | |||
alt="Options"> | |||
Advanced options | |||
</span> | |||
</fieldset> | |||
<fieldset class="form-group option-block m-t-1"> | |||
<div class="row"> | |||
<div class="col-xs-12"> | |||
<label>Password groups :</label> | |||
</div> | |||
</div> | |||
<div class="row"> | |||
<div class="col-sm-6"> | |||
<label class="c-input c-checkbox"> | |||
<input type="checkbox" id="lowercase" value="lowercase" name="lowercase" | |||
checked> | |||
<span class="c-indicator"></span> Lower letters (a‑z) | |||
</label> | |||
</div> | |||
<div class="col-sm-6"> | |||
<label class="c-input c-checkbox"> | |||
<input type="checkbox" id="uppercase" value="uppercase" name="uppercase" | |||
checked> | |||
<span class="c-indicator"></span> Upper letters (A-Z) | |||
</label> | |||
</div> | |||
</div> | |||
<div class="row"> | |||
<div class="col-sm-6"> | |||
<label class="c-input c-checkbox"> | |||
<input type="checkbox" id="numbers" value="numbers" name="numbers" checked> | |||
<span class="c-indicator"></span> Numbers (0-9) | |||
</label> | |||
</div> | |||
<div class="col-sm-6"> | |||
<label class="c-input c-checkbox"> | |||
<input type="checkbox" id="symbols" value="symbols" name="symbols" checked> | |||
<span class="c-indicator"></span> Special chars (@&%) | |||
</label> | |||
</div> | |||
</div> | |||
</fieldset> | |||
<fieldset class="form-group option-block"> | |||
<div class="row"> | |||
<div class="col-xs-6"> | |||
<label for="passwordLength">Length :</label> | |||
<input id="passwordLength" | |||
type="number" | |||
class="form-control" | |||
value="12" | |||
min="6" | |||
max="64"/> | |||
</div> | |||
<div class="col-xs-6"> | |||
<label for="passwordCounter">Counter :</label> | |||
<input id="passwordCounter" | |||
type="number" class="form-control" | |||
value="1" | |||
min="1" | |||
max="1000"/> | |||
</div> | |||
</div> | |||
</fieldset> | |||
<!-- | |||
<fieldset class="form-group option-block"> | |||
<div class="row"> | |||
<div class="col-xs-12"> | |||
<label class="c-input c-checkbox"> | |||
<input type="checkbox" id="saveLocally" value="saveLocally" name="saveLocally"> | |||
<span class="c-indicator"></span> Save passwords info locally | |||
</label> | |||
</div> | |||
</div> | |||
</fieldset> | |||
<fieldset class="form-group option-block"> | |||
<div class="row"> | |||
<div class="col-xs-6"> | |||
<button class="btn btn-success-outline btn-sm btn-block"> | |||
<i class="fa fa-download" aria-hidden="true"></i> download passwords info | |||
</button> | |||
</div> | |||
<div class="col-xs-6"> | |||
<button class="btn btn-primary-outline btn-sm btn-block"> | |||
<i class="fa fa-upload" aria-hidden="true"></i> load passwords info | |||
</button> | |||
</div> | |||
</div> | |||
</fieldset> | |||
--> | |||
</form> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
</body> | |||
<script src="dist/lesspass-vendors.js"></script> | |||
<script src="dist/lesspass-pure.js"></script> | |||
<script> | |||
require('./renderer.js') | |||
</script> | |||
</html> |
@@ -0,0 +1,21 @@ | |||
The MIT License (MIT) | |||
Copyright (c) Guillaume Vincent <guillaume@oslab.fr> (guillaumevincent.com) | |||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||
of this software and associated documentation files (the "Software"), to deal | |||
in the Software without restriction, including without limitation the rights | |||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
copies of the Software, and to permit persons to whom the Software is | |||
furnished to do so, subject to the following conditions: | |||
The above copyright notice and this permission notice shall be included in | |||
all copies or substantial portions of the Software. | |||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||
THE SOFTWARE. |
@@ -0,0 +1,53 @@ | |||
const electron = require('electron') | |||
// Module to control application life. | |||
const app = electron.app | |||
// Module to create native browser window. | |||
const BrowserWindow = electron.BrowserWindow | |||
// Keep a global reference of the window object, if you don't, the window will | |||
// be closed automatically when the JavaScript object is garbage collected. | |||
let mainWindow | |||
function createWindow () { | |||
// Create the browser window. | |||
mainWindow = new BrowserWindow({width: 800, height: 700}) | |||
// and load the index.html of the app. | |||
mainWindow.loadURL(`file://${__dirname}/index.html`) | |||
// Open the DevTools. | |||
// mainWindow.webContents.openDevTools() | |||
// Emitted when the window is closed. | |||
mainWindow.on('closed', function () { | |||
// Dereference the window object, usually you would store windows | |||
// in an array if your app supports multi windows, this is the time | |||
// when you should delete the corresponding element. | |||
mainWindow = null | |||
}) | |||
} | |||
// This method will be called when Electron has finished | |||
// initialization and is ready to create browser windows. | |||
// Some APIs can only be used after this event occurs. | |||
app.on('ready', createWindow) | |||
// Quit when all windows are closed. | |||
app.on('window-all-closed', function () { | |||
// On OS X it is common for applications and their menu bar | |||
// to stay active until the user quits explicitly with Cmd + Q | |||
if (process.platform !== 'darwin') { | |||
app.quit() | |||
} | |||
}) | |||
app.on('activate', function () { | |||
// On OS X it's common to re-create a window in the app when the | |||
// dock icon is clicked and there are no other windows open. | |||
if (mainWindow === null) { | |||
createWindow() | |||
} | |||
}) | |||
// In this file you can include the rest of your app's specific main process | |||
// code. You can also put them in separate files and require them here. |
@@ -0,0 +1,24 @@ | |||
{ | |||
"name": "lesspass-desktop", | |||
"version": "1.0.0", | |||
"description": "lesspass app", | |||
"main": "main.js", | |||
"productName": "LessPass", | |||
"scripts": { | |||
"build": "gulp", | |||
"start": "electron ." | |||
}, | |||
"author": "Guillaume Vincent <guillaume@oslab.fr>", | |||
"bugs": { | |||
"url": "https://github.com/electron/electron-quick-start/issues" | |||
}, | |||
"homepage": "https://github.com/electron/electron-quick-start#readme", | |||
"devDependencies": { | |||
"electron-prebuilt": "^1.2.0", | |||
"gulp": "^3.9.1" | |||
}, | |||
"dependencies": { | |||
"lesspass-pure": "^1.1.2" | |||
} | |||
} |
@@ -0,0 +1,3 @@ | |||
// This file is required by the index.html file and will | |||
// be executed in the renderer process for that window. | |||
// All of the Node.js APIs are available in this process. |