...
 
Commits (1)
---
engines:
csslint:
enabled: true
checks:
box-sizing:
enabled: false
duplication:
enabled: false
checks:
Identical code:
enabled: false
config:
languages:
javascript:
mass_threshold: 60
eslint:
enabled: true
fixme:
enabled: true
checks:
TODO:
enabled: false
ratings:
paths:
- "**.css"
- "**.inc"
- "**.js"
- "**.jsx"
- "**.module"
- "**.php"
- "**.py"
- "**.rb"
exclude_paths:
- docu/**/*
- var/**/*
- unittests/**/*
- src/common/data/js/lib/**/*
- src/common/data/css/lib/**/*
--exclude-exts=.min.css
--ignore=adjoining-classes,box-model,ids,order-alphabetical,unqualified-attributes
---
parserOptions:
sourceType: module
ecmaFeatures:
jsx: true
env:
amd: true
browser: true
es6: true
jquery: true
node: true
# http://eslint.org/docs/rules/
rules:
# Possible Errors
no-await-in-loop: off
no-cond-assign: error
no-console: off
no-constant-condition: error
no-control-regex: error
no-debugger: error
no-dupe-args: error
no-dupe-keys: error
no-duplicate-case: error
no-empty-character-class: error
no-empty: error
no-ex-assign: error
no-extra-boolean-cast: error
no-extra-parens: off
no-extra-semi: error
no-func-assign: error
no-inner-declarations:
- error
- functions
no-invalid-regexp: error
no-irregular-whitespace: error
no-negated-in-lhs: error
no-obj-calls: error
no-prototype-builtins: off
no-regex-spaces: error
no-sparse-arrays: error
no-template-curly-in-string: off
no-unexpected-multiline: error
no-unreachable: error
no-unsafe-finally: off
no-unsafe-negation: off
use-isnan: error
valid-jsdoc: off
valid-typeof: error
# Best Practices
accessor-pairs: error
array-callback-return: off
block-scoped-var: off
class-methods-use-this: off
complexity:
- error
- 6
consistent-return: off
curly: off
default-case: off
dot-location: off
dot-notation: off
eqeqeq: error
guard-for-in: error
no-alert: error
no-caller: error
no-case-declarations: error
no-div-regex: error
no-else-return: off
no-empty-function: off
no-empty-pattern: error
no-eq-null: error
no-eval: error
no-extend-native: error
no-extra-bind: error
no-extra-label: off
no-fallthrough: error
no-floating-decimal: off
no-global-assign: off
no-implicit-coercion: off
no-implied-eval: error
no-invalid-this: off
no-iterator: error
no-labels:
- error
- allowLoop: true
allowSwitch: true
no-lone-blocks: error
no-loop-func: error
no-magic-number: off
no-multi-spaces: off
no-multi-str: off
no-native-reassign: error
no-new-func: error
no-new-wrappers: error
no-new: error
no-octal-escape: error
no-octal: error
no-param-reassign: off
no-proto: error
no-redeclare: error
no-restricted-properties: off
no-return-assign: error
no-return-await: off
no-script-url: error
no-self-assign: off
no-self-compare: error
no-sequences: off
no-throw-literal: off
no-unmodified-loop-condition: off
no-unused-expressions: error
no-unused-labels: off
no-useless-call: error
no-useless-concat: error
no-useless-escape: off
no-useless-return: off
no-void: error
no-warning-comments: off
no-with: error
prefer-promise-reject-errors: off
radix: error
require-await: off
vars-on-top: off
wrap-iife: error
yoda: off
# Strict
strict: off
# Variables
init-declarations: off
no-catch-shadow: error
no-delete-var: error
no-label-var: error
no-restricted-globals: off
no-shadow-restricted-names: error
no-shadow: off
no-undef-init: error
no-undef: off
no-undefined: off
no-unused-vars: off
no-use-before-define: off
# Node.js and CommonJS
callback-return: error
global-require: error
handle-callback-err: error
no-mixed-requires: off
no-new-require: off
no-path-concat: error
no-process-env: off
no-process-exit: error
no-restricted-modules: off
no-sync: off
# Stylistic Issues
array-bracket-spacing: off
block-spacing: off
brace-style: off
camelcase: off
capitalized-comments: off
comma-dangle:
- error
- never
comma-spacing: off
comma-style: off
computed-property-spacing: off
consistent-this: off
eol-last: off
func-call-spacing: off
func-name-matching: off
func-names: off
func-style: off
id-length: off
id-match: off
indent: off
jsx-quotes: off
key-spacing: off
keyword-spacing: off
line-comment-position: off
linebreak-style: off
lines-around-comment: off
lines-around-directive: off
max-depth: off
max-len: off
max-nested-callbacks: off
max-params: off
max-statements-per-line: off
max-statements:
- error
- 30
multiline-ternary: off
new-cap: off
new-parens: off
newline-after-var: off
newline-before-return: off
newline-per-chained-call: off
no-array-constructor: off
no-bitwise: off
no-continue: off
no-inline-comments: off
no-lonely-if: off
no-mixed-operators: off
no-mixed-spaces-and-tabs: off
no-multi-assign: off
no-multiple-empty-lines: off
no-negated-condition: off
no-nested-ternary: off
no-new-object: off
no-plusplus: off
no-restricted-syntax: off
no-spaced-func: off
no-tabs: off
no-ternary: off
no-trailing-spaces: off
no-underscore-dangle: off
no-unneeded-ternary: off
object-curly-newline: off
object-curly-spacing: off
object-property-newline: off
one-var-declaration-per-line: off
one-var: off
operator-assignment: off
operator-linebreak: off
padded-blocks: off
quote-props: off
quotes: off
require-jsdoc: off
semi-spacing: off
semi: off
sort-keys: off
sort-vars: off
space-before-blocks: off
space-before-function-paren: off
space-in-parens: off
space-infix-ops: off
space-unary-ops: off
spaced-comment: off
template-tag-spacing: off
unicode-bom: off
wrap-regex: off
# ECMAScript 6
arrow-body-style: off
arrow-parens: off
arrow-spacing: off
constructor-super: off
generator-star-spacing: off
no-class-assign: off
no-confusing-arrow: off
no-const-assign: off
no-dupe-class-members: off
no-duplicate-imports: off
no-new-symbol: off
no-restricted-imports: off
no-this-before-super: off
no-useless-computed-key: off
no-useless-constructor: off
no-useless-rename: off
no-var: off
object-shorthand: off
prefer-arrow-callback: off
prefer-const: off
prefer-destructuring: off
prefer-numeric-literals: off
prefer-rest-params: off
prefer-reflect: off
prefer-spread: off
prefer-template: off
require-yield: off
rest-spread-spacing: off
sort-imports: off
symbol-description: off
template-curly-spacing: off
yield-star-spacing: off
.idea
docs
out
unittests/coverage
var/ngdocs/templates
node_modules
build/
dist/
doc/
test
*~
*.py[cod]
\ No newline at end of file
variables:
CONTAINER_TEST_IMAGE: psono-docker-local.jfrog.io/psono/psono-client:$CI_BUILD_REF_NAME
CONTAINER_RELEASE_IMAGE: psono-docker-local.jfrog.io/psono/psono-client:latest
stages:
- test
- build
- release
- deploy
unittests:
except:
- schedules
stage: test
image: ubuntu:16.04
script:
- sh ./var/build-ubuntu.sh
- apt-get install -y --no-install-recommends xvfb x11vnc fluxbox xterm
- curl -fsSL https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
- echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list
- apt-get update
- apt-get install -y google-chrome-stable
- karma start ./unittests/karma-chrome-headless.conf.js
linter:
except:
- schedules
stage: test
image: ubuntu:16.04
script:
- sh ./var/build-ubuntu.sh
- cat ./build/firefox/manifest.json
- addons-linter --help
- addons-linter ./build/firefox
docker-image:
except:
- schedules
stage: build
image: ubuntu:16.04
services:
- docker:dind
variables:
DOCKER_HOST: 'tcp://docker:2375'
script:
- sh ./var/build-ubuntu.sh
- set -x && curl -fSL "https://download.docker.com/linux/static/stable/x86_64/docker-17.12.0-ce.tgz" -o docker.tgz && echo "692e1c72937f6214b1038def84463018d8e320c8eaf8530546c84c2f8f9c767d *docker.tgz" | sha256sum -c - && tar -xzvf docker.tgz && mv docker/* /usr/local/bin/
- docker info
- echo $CI_BUILD_TOKEN | docker login --username=gitlab-ci-token --password-stdin registry.gitlab.com
- echo $artifactory_credentials | docker login --username=gitlab --password-stdin psono-docker.jfrog.io
- echo $artifactory_credentials | docker login --username=gitlab --password-stdin psono-docker-local.jfrog.io
- docker build -t $CONTAINER_TEST_IMAGE .
- docker push $CONTAINER_TEST_IMAGE
firefox-extension:
except:
- schedules
stage: build
image: ubuntu:16.04
script:
- pwd
- ls -la
- sh ./var/build-ubuntu.sh
- mv /builds/psono/psono-client/build/firefox ../
- rm -Rf *
- rm -Rf .* 2> /dev/null || true
- mv ../firefox/* ./
artifacts:
name: "firefox_$CI_BUILD_REF_NAME"
paths:
- ./*
chrome-extension:
except:
- schedules
stage: build
image: ubuntu:16.04
script:
- pwd
- ls -la
- sh ./var/build-ubuntu.sh
- mv /builds/psono/psono-client/build/chrome ../
- rm -Rf *
- rm -Rf .* 2> /dev/null || true
- mv ../chrome/* ./
artifacts:
name: "chrome_$CI_BUILD_REF_NAME"
paths:
- ./*
webclient:
except:
- schedules
stage: build
image: ubuntu:16.04
script:
- pwd
- ls -la
- sh ./var/build-ubuntu.sh
- mv /builds/psono/psono-client/build/webclient ../
- rm -Rf *
- rm -Rf .* 2> /dev/null || true
- mv ../webclient/* ./
artifacts:
name: "webclient_$CI_BUILD_REF_NAME"
paths:
- ./*
release-docker:
except:
- schedules
stage: release
image: docker:git
services:
- docker:dind
script:
- docker info
- echo $CI_BUILD_TOKEN | docker login --username=gitlab-ci-token --password-stdin registry.gitlab.com
- echo $artifactory_credentials | docker login --username=gitlab --password-stdin psono-docker.jfrog.io
- echo $artifactory_credentials | docker login --username=gitlab --password-stdin psono-docker-local.jfrog.io
- docker pull $CONTAINER_TEST_IMAGE
- docker tag $CONTAINER_TEST_IMAGE $CONTAINER_RELEASE_IMAGE
- docker push $CONTAINER_RELEASE_IMAGE
only:
- /^v[0-9]*\.[0-9]*\.[0-9]*$/
deploy-security-scan-image:
except:
- schedules
stage: deploy
image: docker:git
services:
- docker:dind
script:
- sh ./var/deploy_security_scan_image.sh
deploy:
except:
- schedules
stage: deploy
image: docker:git
services:
- docker:dind
script:
- sh ./var/deploy.sh
environment:
name: production
url: https://psono.pw
only:
- /^v[0-9]*\.[0-9]*\.[0-9]*$/
deploy-chrome:
except:
- schedules
stage: deploy
image: ubuntu:16.04
script:
- sh ./var/build-ubuntu.sh
- sh ./var/package-chrome-extension.sh
- sh ./var/deploy-chrome-extension.sh
environment:
name: chrome-webstore
url: https://chrome.google.com/webstore/detail/psonopw/eljmjmgjkbmpmfljlmklcfineebidmlo
only:
- /^v[0-9]*\.[0-9]*\.[0-9]*$/
deploy-firefox:
except:
- schedules
stage: deploy
image: ubuntu:16.04
script:
- sh ./var/build-ubuntu.sh
- sh ./var/package-firefox-extension.sh
- sh ./var/deploy-firefox-extension.sh
environment:
name: firefox-webstore
url: https://addons.mozilla.org/de/firefox/addon/psono-pw-password-manager/
only:
- /^v[0-9]*\.[0-9]*\.[0-9]*$/
scheduled-linter:
only:
- schedules
stage: test
image: ubuntu:16.04
script:
- apt-get update
- apt-get install -y git
- git checkout develop
- git pull
- sh ./var/build-ubuntu.sh
- cat ./build/firefox/manifest.json
- addons-linter --help
......
FROM psono-docker.jfrog.io/nginx:alpine
MAINTAINER Sascha Pfeiffer <saschapfeiffer@psono.com>
COPY ./build/webclient /usr/share/nginx/html/
WORKDIR /root
\ No newline at end of file
This diff is collapsed.
# PSONO Client - Password Manager
Master: [![build status](https://gitlab.com/psono/psono-client/badges/master/build.svg)](https://gitlab.com/psono/psono-client/commits/master) [![coverage report](https://gitlab.com/psono/psono-client/badges/master/coverage.svg)](https://gitlab.com/psono/psono-client/commits/master) [![Code Climate](https://codeclimate.com/github/psono/psono-client/badges/gpa.svg)](https://codeclimate.com/github/psono/psono-client) [![build status](https://images.microbadger.com/badges/image/psono/psono-client.svg)](https://hub.docker.com/r/psono/psono-client/) [![build status](https://img.shields.io/docker/pulls/psono/psono-client.svg)](https://hub.docker.com/r/psono/psono-client/)
Develop: [![build status](https://gitlab.com/psono/psono-client/badges/develop/build.svg)](https://gitlab.com/psono/psono-client/commits/develop) [![coverage report](https://gitlab.com/psono/psono-client/badges/develop/coverage.svg)](https://gitlab.com/psono/psono-client/commits/develop)
# Canonical source
The canonical source of PSONO Client is [hosted on GitLab.com](https://gitlab.com/psono/psono-client).
# Documentation
The documentation for the psono server can be found here:
[Psono Documentation](https://doc.psono.com/)
## LICENSE
Visit the [License.md](/LICENSE.md) for more details
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
add_header Content-Security-Policy "default-src 'none'; connect-src 'self'; font-src 'self'; img-src 'self' www.google-analytics.com; script-src 'self' www.google-analytics.com; style-src 'self' 'unsafe-inline'";
}
server {
listen 80;
server_name www.example.com;
return 301 https://$host$request_uri;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
add_header Content-Security-Policy "default-src 'none'; connect-src 'self'; font-src 'self'; img-src 'self' www.google-analytics.com; script-src 'self' www.google-analytics.com; style-src 'self' 'unsafe-inline'";
}
server {
listen 443 ssl http2;
server_name example.com;
return 301 https://www.$host$request_uri;
# from https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=nginx-1.10.0&openssl=1.0.2g&hsts=yes&profile=modern
ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
ssl_session_timeout 1d;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
# Enable the following line only if you know what you are doing :)
# add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header Referrer-Policy same-origin;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Content-Security-Policy "default-src 'none'; connect-src 'self'; font-src 'self'; img-src 'self' www.google-analytics.com; script-src 'self' www.google-analytics.com; style-src 'self' 'unsafe-inline'";
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
}
server {
listen 443 ssl http2;
server_name www.example.com;
# from https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=nginx-1.10.0&openssl=1.0.2g&hsts=yes&profile=modern
ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
ssl_session_timeout 1d;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
# Enable the following line only if you know what you are doing :)
# add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header Referrer-Policy same-origin;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Content-Security-Policy "default-src 'none'; connect-src 'self'; font-src 'self'; img-src 'self' www.google-analytics.com; script-src 'self' www.google-analytics.com; style-src 'self' 'unsafe-inline'";
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types text/plain text/css application/json application/x-javascript application/javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;
root /var/www/html;
location ~ /.well-known {
allow all;
}
location /server {
rewrite ^/server/(.*) /$1 break;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
#
proxy_pass http://localhost:10100;
# proxy_read_timeout 90;
#
# proxy_redirect http://localhost:10100 https://example.com;
}
location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
expires 30d;
add_header Pragma public;
add_header Cache-Control "public";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://localhost:10101;
proxy_read_timeout 90;
proxy_redirect http://localhost:10101 https://example.com;
}
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://localhost:10101;
proxy_read_timeout 90;
proxy_redirect http://localhost:10101 https://example.com;
}
}
This diff is collapsed.
{"guid":"{3dce78ca-2a07-4017-9111-998d4f826625}","active":false,"automated_signing":false,"url":"https://addons.mozilla.org/api/v3/addons/%7B3dce78ca-2a07-4017-9111-998d4f826625%7D/versions/1.0.18/uploads/5f0d13f47ecf4d6297e50dccc8d1522a/","files":[],"passed_review":false,"pk":"5f0d13f47ecf4d6297e50dccc8d1522a","processed":false,"reviewed":false,"valid":false,"validation_results":null,"validation_url":"https://addons.mozilla.org/en-US/developers/upload/5f0d13f47ecf4d6297e50dccc8d1522a","version":"1.0.18"}
\ No newline at end of file
This diff is collapsed.
(function(jQuery, browser) {
"use strict";
ClassWorkerContentScript(browser, jQuery);
}(jQuery, chrome));
\ No newline at end of file
(function(angular, $, window) {
'use strict';
var browserClient = function($rootScope, $q, $templateRequest, $http) {
var registrations = {};
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
for (var i = 0; registrations.hasOwnProperty(request.event) && i < registrations[request.event].length; i++) {
registrations[request.event][i](request.data);
}
});
/**
* Opens the URL in a new browser tab
* @param url
*/
var open_tab = function(url) {
window.open(url, '_blank');
};
/**
* returns the base url which can be used to generate activation links
*
* @returns {string}
*/
var get_base_url = function() {
return $q(function (resolve) {
resolve("chrome-extension://"+chrome.runtime.id+"/data/");
});
};
/**
* returns a promise with the version string
*
* @returns {Promise}
*/
var load_version = function() {
return $templateRequest('./VERSION.txt');
};
/**
* returns a promise with the version string
*
* @returns {Promise}
*/
var load_config = function() {
var req = {
method: 'GET',
url: "config.json"
};
return $http(req);
};
/**
* returns the active tab
*
* @returns {promise}
*/
var get_active_tab = function() {
return $q(function (resolve) {
chrome.tabs.query({active: true, currentWindow: true}, function(arrayOfTabs) {
resolve(arrayOfTabs[0])}
);
});
};
/**
* returns a promise which will return the active tabs url
*
* @returns {promise} promise
*/
var get_active_tab_url = function() {
return get_active_tab().then(function(tab){
return tab.url;
});
};
/**
* Dummy function to see if the background page works
*/
var test_background_page = function () {
return backgroundPage.bg.test();
};
/**
* sends an event message to browser
*
* @param event
* @param data
*/
var emit = function (event, data) {
chrome.runtime.sendMessage({event: event, data: data}, function(response) {
//console.log(response);
});
$rootScope.$broadcast(event, '');
};
/**
* emits sensitive data only to secure locations
*
* @param event
* @param data
*/
var emit_sec = function(event, data) {
chrome.runtime.sendMessage({event: event, data: data}, function(response) {
//console.log(response);
});
};
/**
* registers for an event with a function
*
* @param event
* @param myFunction
*
* @returns {boolean}
*/
var on = function (event, myFunction) {
$rootScope.$on(event, myFunction);
if (!registrations.hasOwnProperty(event)) {
registrations[event] = [];
}
registrations[event].push(myFunction);
};
var config = {};
/**
* helper function to return either the config itself or if key has been specified only the config part for the key
*
* @param key
* @returns {*}
* @private
*/
var _get_config = function(key) {
if (typeof(key) === 'undefined') {
return config;
}
if (config.hasOwnProperty(key)) {
return config[key];
}
return null;
};
/**
* Loads the config (or only the part specified by the "key") fresh or from "cache"
*
* @param key
* @returns {*}
*/
var get_config = function (key) {
return $q(function(resolve, reject) {
if (Object.keys(config).length === 0) {
var onSuccess = function(data) {
config = data.data;
return resolve(_get_config(key));
};
var onError = function(data) {
reject(data);
};
load_config()
.then(onSuccess, onError);
} else {
return resolve(_get_config(key));
}
});
};
/**
* @ngdoc
* @name psonocli.browserClient#get_config
* @methodOf psonocli.browserClient
*
* @description
* Closes the popup
*/
var close_popup = function() {
window.close()
};
/**
* @ngdoc
* @name psonocli.browserClient#disable_browser_password_saving
* @methodOf psonocli.browserClient
*
* @description
* Disables the password saving function in the browser
*
* @returns {promise} A promise with the success or failure state
*/
var disable_browser_password_saving = function() {
return $q(function(resolve, reject) {
chrome.privacy.services.passwordSavingEnabled.get({}, function(details) {
if (details.levelOfControl === 'controllable_by_this_extension') {
chrome.privacy.services.passwordSavingEnabled.set({ value: false }, function() {
if (chrome.runtime.lastError === undefined) {
resolve("Hooray, it worked!");
} else {
reject("Sadness!");
console.log("Sadness!", chrome.runtime.lastError);
}
});
}
});
});
};
return {
open_tab: open_tab,
get_base_url: get_base_url,
load_version: load_version,
load_config: load_config,
get_active_tab: get_active_tab,
get_active_tab_url: get_active_tab_url,
test_background_page: test_background_page,
emit: emit,
emit_sec: emit_sec,
on: on,
get_config:get_config,
close_popup:close_popup,
disable_browser_password_saving:disable_browser_password_saving
};
};
var app = angular.module('psonocli');
app.factory("browserClient", ['$rootScope', '$q', '$templateRequest', '$http', browserClient]);
}(angular, $, window));
\ No newline at end of file
{
"manifest_version": 2,
"name": "Psono.PW Password Manager",
"short_name": "Psono.PW Password Manager",
"description": "Psono Password Manager",
"version": "1.0.0",
"browser_action": {
"default_icon": "data/img/icon-32.png",
"default_popup": "data/default_popup.html"
},
"permissions": [
"activeTab",
"storage",
"contextMenus",
"unlimitedStorage",
"privacy",
"notifications",
"tabs",
"clipboardWrite",
"webRequest",
"webRequestBlocking",
"http://*/*",
"https://*/*"
],
"icons": {
"16": "data/img/icon-16.png",
"32": "data/img/icon-32.png",
"48": "data/img/icon-48.png",
"64": "data/img/icon-64.png",
"128": "data/img/icon-128.png"
},
"omnibox": {
"keyword": "pp"
},
"background": {
"page": "data/background.html",
"persistent": true
},
"content_scripts": [
{
"matches": ["*://*/*"],
"css": [
"data/css/lib/cssreset-context-min.css"
],
"js": [
"data/js/lib/jquery.min.js",
"data/js/lib/uuid.js",
"data/js/extension/worker-content-script.js",
"data/js/content-script.js"
],
"run_at": "document_idle",
"all_frames": true
}
],
"options_page": "data/index.html#!/settings",
"web_accessible_resources": [
"data/fonts/*.woff2",
"data/css/contentscript.css"
]
}
1.1.0 (build abcd1234)
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
{
"backend_servers": [{
"title": "Psono.pw",
"url": "https://www.psono.pw/server"
}],
"base_url": "https://www.psono.pw/",
"allow_custom_server": true
}
\ No newline at end of file
/* new bootstrap fix */
.tree * {
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
}
.tree .fa {
z-index: 3;
}
/* tree control */
.tree {
padding-left: 9px;
overflow-x: hidden;
overflow-y: auto;
position: relative;
}
.tree:before {
display: inline-block;
content: "";
position: absolute;
top: -20px;
bottom: 16px;
left: 0;
border: dotted #67b2dd;
border-width: 0 0 0 1px;
z-index: 1;
}
.tree .tree-folder {
width: auto;
min-height: 20px;
}
.tree .tree-folder .tree-folder-header {
position: relative;
height: 20px;
line-height: 20px;
cursor: pointer;
}
.tree .tree-folder .tree-folder-header:hover,
.tree .tree-folder .tree-folder-header:focus,
.tree .tree-item:hover,
.tree .tree-item:focus {
background-color: #F0F7FC;
outline: none;
}
.tree .tree-folder .tree-folder-header .tree-folder-name,
.tree .tree-item .tree-item-name {
display: inline;
z-index: 2;
}
.tree .tree-folder .tree-folder-header > [class*="icon-"]:first-child,
.tree .tree-item > [class*="icon-"]:first-child {
display: inline-block;
position: relative;
z-index: 2;
/* top: -1px; */
color: #80a6cd;
}
.tree .tree-folder .tree-folder-header .tree-folder-name {
margin-left: 0;
}
.tree .tree-folder:last-child:after {
display: inline-block;
content: "";
position: absolute;
z-index: 1;
top: 15px;
bottom: 0;
left: -15px;
border-left: 1px solid #FFF;
}
.tree .tree-folder .tree-folder-content {
margin-left: 23px;
position: relative;
}
.tree .tree-folder .tree-folder-content:before {
display: inline-block;
content: "";
position: absolute;
z-index: 1;
top: -9px;
bottom: 16px;
left: -14px;
border: dotted #67b2dd;
border-width: 0 0 0 1px;
}
.tree .tree-item {
position: relative;
height: 20px;
line-height: 20px;
cursor: pointer;
}
.tree .tree-item .tree-item-name {
margin-left: 0;
}
.tree .tree-item .tree-item-name > [class*="icon-"]:first-child {
margin-right: 3px;
color: #555;
}
.tree .tree-item > [class*="icon-"]:first-child {
margin-top: -1px;
}
.tree .tree-folder,
.tree .tree-item {
position: relative;
}
.tree .tree-folder:before,
.tree .tree-item:before {
display: inline-block;
content: "";
position: absolute;
top: 14px;
left: -13px;
width: 18px;
height: 0;
border-top: 1px dotted #67b2dd;
z-index: 1;
}
.tree .tree-selected {
background-color: rgb(98, 168, 209);
background-color: rgba(98, 168, 209, 0.1);
color: #6398B0;
}
.tree .tree-selected:hover {
background-color: rgb(98, 168, 209);
background-color: rgba(98, 168, 209, 0.1);
}
.tree .tree-item,
.tree .tree-folder .tree-folder-header {
margin: 0;
padding: 5px 3px;
color: #4D6878;
border: 1px solid #FFF;
display: block;
text-decoration: none;
}
.tree .tree-item.selected,
.tree .tree-folder .tree-folder-header.selected {
border-color: #62a8d1;
background-color: #F0F7FC;
}
.tree .tree-item:hover,
.tree .tree-item.selected:focus,
.tree .tree-folder .tree-folder-header:hover,
.tree .tree-folder .tree-folder-header:focus {
text-decoration: none;
}
.tree .tree-item > [class*="icon-"]:first-child {
/* color: #F9E8CE; */
color: #80a6cd;
width: 13px;
height: 13px;
line-height: 13px;
font-size: 11px;
text-align: center;
border-radius: 3px;
background-color: #FAFAFA;
border: 1px solid #CCC;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
}
.tree .tree-selected > [class*="icon-"]:first-child {
background-color: #F9A021;
border-color: #F9A021;
color: #FFF;
}
.tree .icon-plus[class*="icon-"]:first-child,
.tree .icon-minus[class*="icon-"]:first-child {
vertical-align: middle;
height: 11px;
width: 11px;
text-align: center;
border: 1px solid #8BAEBF;
line-height: 10px;
background-color: #FFF;
position: relative;
z-index: 1;
}
.tree .icon-plus[class*="icon-"]:first-child:before {
display: block;
content: "+";
font-family: "Open Sans", serif;
font-size: 16px;
position: relative;
z-index: 1;
}
.tree .icon-minus[class*="icon-"]:first-child:before {
content: "";
display: block;
width: 7px;
height: 0;
border-top: 1px solid #4D6878;
position: absolute;
top: 5px;
left: 2px;
}
.tree .tree-unselectable .tree-item > [class*="icon-"]:first-child {
color: #5084A0;
width: 13px;
height: 13px;
line-height: 13px;
font-size: 10px;
text-align: center;
border-radius: 0;
background-color: transparent;
border: none;
box-shadow: none;
}
.tree [class*="icon-"][class*="-down"] {
transform: rotate(-45deg);
}
.tree .icon-spin {
height: auto;
}
.tree .tree-loading {
margin-left: 36px;
}
.tree img {
display: inline;
vertical-align: middle;
}
.tree {
padding-left: 22px;
}
.tree:before {
margin-left: 9px;
}
.tree .tree-item {
/* padding: 5px 10px; */
}
.tree .tree-folder {
/* padding: 0 2px; */
}
.tree .tree-folder:before, .tree .tree-item:before {
width: 12px;
}
.tree .tree-item, .tree .tree-folder .tree-folder-header {
text-wrap: none;
white-space: nowrap;
}
.tree .input-append {
position: relative;
top: -2px;