From 9f779087cabb994438aecbb27b6ba01aee3d3305 Mon Sep 17 00:00:00 2001 From: brantje Date: Sat, 1 Oct 2016 19:26:58 +0200 Subject: [PATCH 1/6] Add public share page --- appinfo/routes.php | 1 + controller/pagecontroller.php | 11 ++++++++++- templates/public_share.php | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 templates/public_share.php diff --git a/appinfo/routes.php b/appinfo/routes.php index 0138089d..105ec422 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -21,6 +21,7 @@ return [ 'routes' => [ ['name' => 'page#index', 'url' => '/', 'verb' => 'GET'], ['name' => 'page#bookmarklet', 'url' => '/bookmarklet', 'verb' => 'GET'], + ['name' => 'page#publicSharePage', 'url' => '/share/public', 'verb' => 'GET'], //Vault ['name' => 'vault#listVaults', 'url' => '/api/v2/vaults', 'verb' => 'GET'], diff --git a/controller/pagecontroller.php b/controller/pagecontroller.php index 1520cd02..c93482f6 100644 --- a/controller/pagecontroller.php +++ b/controller/pagecontroller.php @@ -48,7 +48,16 @@ class PageController extends Controller { */ public function bookmarklet($url='',$title='') { $params = array('url' => $url, 'label' => $title); - return new TemplateResponse('passman', 'bookmarklet', $params); + + } + + /** + * @NoAdminRequired + * @NoCSRFRequired + * @PublicPage + */ + public function publicSharePage($shareKey) { + return new TemplateResponse('passman', 'public_share'); } } \ No newline at end of file diff --git a/templates/public_share.php b/templates/public_share.php new file mode 100644 index 00000000..95c0c0e2 --- /dev/null +++ b/templates/public_share.php @@ -0,0 +1 @@ +Public shared credential \ No newline at end of file From ef01ef0d1aafc38cc1ee6d06c4e0d682b2fd6c96 Mon Sep 17 00:00:00 2001 From: brantje Date: Mon, 3 Oct 2016 11:41:04 +0200 Subject: [PATCH 2/6] Add scss file for public share page --- sass/public-page.scss | 75 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 sass/public-page.scss diff --git a/sass/public-page.scss b/sass/public-page.scss new file mode 100644 index 00000000..fc17ce7c --- /dev/null +++ b/sass/public-page.scss @@ -0,0 +1,75 @@ +@import 'variables'; +@import 'mixins'; +header { + display: none; +} + +#content-wrapper { + padding-top: 0; +} + +.credential_container{ + margin-top: 20px; + margin-bottom: 20px; + padding: 20px; + background: #f8f8f8; + border: 1px solid #c9c9c9; + @include border-radius(5px); + .text{ + text-align: center; + } + h2{ + font-weight: bold; + } + button, .text{ + margin: 0 auto; + display: block; + i{ + margin-right: 5px; + } + } +} + +.credential_field { + overflow: hidden; + .cell, .value { + float: left; + } + .tools { + margin-left: 10px; + overflow: hidden; + float: left; + .cell { + cursor: pointer; + margin-right: 4px; + } + } +} +table{ + white-space: normal; + td:first-child{ + min-width: 110px; + } + td{ + padding-bottom: 1em; + } +} + +.tags { + .tag { + background-color: rgba(240, 240, 240, .9); + padding: 4px; + font-size: 12px; + margin-right: 3px; + @include border-radius(5px); + } + .tag:last-child { + margin-right: 8px; + } +} +.footer{ + font-size: 10px; + position: relative; + bottom: -20px; + text-align: center; +} \ No newline at end of file From 8ba647a000a77d78d6715e577707ecc57ee77b4e Mon Sep 17 00:00:00 2001 From: brantje Date: Mon, 3 Oct 2016 11:42:19 +0200 Subject: [PATCH 3/6] Pimp my public share page --- Gruntfile.js | 7 + css/public-page.css | 64 ++++++ css/public-page.css.map | 7 + js/app/app_public.js | 14 ++ js/app/controllers/edit_credential.js | 2 +- .../controllers/public_shared_credential.js | 89 ++++++++ js/app/services/shareservice.js | 10 + templates/public_share.php | 193 +++++++++++++++++- 8 files changed, 384 insertions(+), 2 deletions(-) create mode 100644 css/public-page.css create mode 100644 css/public-page.css.map create mode 100644 js/app/app_public.js create mode 100644 js/app/controllers/public_shared_credential.js diff --git a/Gruntfile.js b/Gruntfile.js index cd58cf62..639b9fdd 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -42,6 +42,13 @@ module.exports = function (grunt) { src: ["**/bookmarklet.scss"], dest: "css", ext: ".css" + }, + { + expand: true, + cwd: "sass", + src: ["**/public-page.scss"], + dest: "css", + ext: ".css" } ] } diff --git a/css/public-page.css b/css/public-page.css new file mode 100644 index 00000000..a40be5f9 --- /dev/null +++ b/css/public-page.css @@ -0,0 +1,64 @@ +header { + display: none; } + +#content-wrapper { + padding-top: 0; } + +.credential_container { + margin-top: 20px; + margin-bottom: 20px; + padding: 20px; + background: #f8f8f8; + border: 1px solid #c9c9c9; + -webkit-border-radius: 5px; + border-radius: 5px; + background-clip: padding-box; + /* stops bg color from leaking outside the border: */ } + .credential_container .text { + text-align: center; } + .credential_container h2 { + font-weight: bold; } + .credential_container button, .credential_container .text { + margin: 0 auto; + display: block; } + .credential_container button i, .credential_container .text i { + margin-right: 5px; } + +.credential_field { + overflow: hidden; } + .credential_field .cell, .credential_field .value { + float: left; } + .credential_field .tools { + margin-left: 10px; + overflow: hidden; + float: left; } + .credential_field .tools .cell { + cursor: pointer; + margin-right: 4px; } + +table { + white-space: normal; } + table td:first-child { + min-width: 110px; } + table td { + padding-bottom: 1em; } + +.tags .tag { + background-color: rgba(240, 240, 240, 0.9); + padding: 4px; + font-size: 12px; + margin-right: 3px; + -webkit-border-radius: 5px; + border-radius: 5px; + background-clip: padding-box; + /* stops bg color from leaking outside the border: */ } +.tags .tag:last-child { + margin-right: 8px; } + +.footer { + font-size: 10px; + position: relative; + bottom: -20px; + text-align: center; } + +/*# sourceMappingURL=public-page.css.map */ diff --git a/css/public-page.css.map b/css/public-page.css.map new file mode 100644 index 00000000..88a663f6 --- /dev/null +++ b/css/public-page.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "AAEA,MAAO;EACL,OAAO,EAAE,IAAI;;AAGf,gBAAiB;EACf,WAAW,EAAE,CAAC;;AAGhB,qBAAqB;EACnB,UAAU,EAAE,IAAI;EAChB,aAAa,EAAE,IAAI;EACnB,OAAO,EAAE,IAAI;EACb,UAAU,EAAE,OAAO;EACnB,MAAM,EAAE,iBAAiB;ECJzB,qBAAqB,EDKE,GAAG;ECJ1B,aAAa,EDIU,GAAG;ECH1B,eAAe,EAAE,WAAW;EAAG,qDAAqD;EDIpF,2BAAK;IACJ,UAAU,EAAE,MAAM;EAEnB,wBAAE;IACA,WAAW,EAAE,IAAI;EAEnB,yDAAa;IACX,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,KAAK;IACd,6DAAC;MACC,YAAY,EAAE,GAAG;;AAKvB,iBAAkB;EAChB,QAAQ,EAAE,MAAM;EAChB,iDAAc;IACZ,KAAK,EAAE,IAAI;EAEb,wBAAO;IACL,WAAW,EAAE,IAAI;IACjB,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,IAAI;IACX,8BAAM;MACJ,MAAM,EAAE,OAAO;MACf,YAAY,EAAE,GAAG;;AAIvB,KAAK;EACF,WAAW,EAAE,MAAM;EAClB,oBAAc;IACZ,SAAS,EAAE,KAAK;EAElB,QAAE;IACA,cAAc,EAAE,GAAG;;AAKvB,UAAK;EACH,gBAAgB,EAAE,wBAAuB;EACzC,OAAO,EAAE,GAAG;EACZ,SAAS,EAAE,IAAI;EACf,YAAY,EAAE,GAAG;ECnDnB,qBAAqB,EDoDI,GAAG;ECnD5B,aAAa,EDmDY,GAAG;EClD5B,eAAe,EAAE,WAAW;EAAG,qDAAqD;ADoDpF,qBAAgB;EACd,YAAY,EAAE,GAAG;;AAGrB,OAAO;EACL,SAAS,EAAE,IAAI;EACf,QAAQ,EAAE,QAAQ;EAClB,MAAM,EAAE,KAAK;EACb,UAAU,EAAE,MAAM", +"sources": ["../sass/public-page.scss","../sass/mixins.scss"], +"names": [], +"file": "public-page.css" +} diff --git a/js/app/app_public.js b/js/app/app_public.js new file mode 100644 index 00000000..a56dc867 --- /dev/null +++ b/js/app/app_public.js @@ -0,0 +1,14 @@ +'use strict'; +angular + .module('passmanApp', [ + 'ngAnimate', + 'ngCookies', + 'ngResource', + 'ngRoute', + 'ngSanitize', + 'ngTouch', + 'ngclipboard', + + ]).config(['$httpProvider', function ($httpProvider) { + $httpProvider.defaults.headers.common.requesttoken = oc_requesttoken; +}]); diff --git a/js/app/controllers/edit_credential.js b/js/app/controllers/edit_credential.js index d6b409ff..8be47c12 100644 --- a/js/app/controllers/edit_credential.js +++ b/js/app/controllers/edit_credential.js @@ -214,7 +214,7 @@ angular.module('passmanApp') $scope.saveCredential = function () { //@TODO validation //@TODO When credential is expired and has renew interval set, calc new expire time. - + console.log(JSON.stringify($scope.storedCredential)); delete $scope.storedCredential.password_repeat; if (!$scope.storedCredential.credential_id) { $scope.storedCredential.vault_id = $scope.active_vault.vault_id; diff --git a/js/app/controllers/public_shared_credential.js b/js/app/controllers/public_shared_credential.js new file mode 100644 index 00000000..0bc411d8 --- /dev/null +++ b/js/app/controllers/public_shared_credential.js @@ -0,0 +1,89 @@ +/** + * @ngdoc function + * @name passmanApp.controller:MainCtrl + * @description + * # MainCtrl + * Controller of the passmanApp + */ +angular.module('passmanApp') + .controller('PublicSharedCredential', ['$scope', 'ShareService', function ($scope, ShareService) { + $scope.test = 'hello world'; + + $scope.loading = false; + + + var example_shared_credential = { + "credential_id": 292, + "guid": "3D18EAD3-CF40-4B2B-B568-82CD7CB3D47F", + "user_id": "sander", + "vault_id": 2, + "label": "donnelly.com", + "description": null, + "created": 1475479693, + "changed": 1475479693, + "tags": [{"text": "Games"}], + "email": null, + "username": "ebrekke", + "password": "hd%/U_%vzvh%", + "url": "http://api.namefake.com/english-united-states/male/2854dda4938c9c5f60a288fa6fbe5095", + "favicon": null, + "renew_interval": null, + "expire_time": 0, + "delete_time": 0, + "files": [{ + "file_id": 1, + "filename": "20160925-Clipperz_Export.html", + "guid": "6DA2CE41-A26B-4F97-A334-2CC74F7E9890", + "size": 13863, + "created": 1475485368, + "mimetype": "text/html", + "$$hashKey": "object:1261" + }, { + "file_id": 2, + "filename": "20160925_Clipperz_Offline.html", + "guid": "9337D189-B79E-4750-BEF9-3C912A9EA59D", + "size": 3088428, + "created": 1475485376, + "mimetype": "text/html", + "$$hashKey": "object:1268" + }], + "custom_fields": [{ + "label": "Test field", + "value": "blah blah", + "secret": false, + "$$hashKey": "object:1205" + }, { + "label": "another field =)", + "value": "vlaue", + "secret": true, + "$$hashKey": "object:1220" + }], + "otp": { + "type": "totp", + "label": "Google:fake@gmail.com", + "qr_uri": { + "qrData": "otpauth://totp/Google%3Afake%40gmail.com?secret=oyonyttithtryvpnqqrxluytgwon2mhw&issuer=Google", + "image": "" + }, + "secret": "oyonyttithtryvpnqqrxluytgwon2mhw", + "issuer": "Google" + }, + "hidden": 0, + "shared_key": null, + "tags_raw": [{"text": "Games"}] + }; + + $scope.loadSharedCredential = function () { + $scope.loading = true; + ShareService.getPublicSharedCredential().then(function (sharedCredential) { + //Decrypt stuff here + + //And then set it + $scope.loading = false; + $scope.shared_credential = example_shared_credential; + }) + + } + }]) +; + diff --git a/js/app/services/shareservice.js b/js/app/services/shareservice.js index b1c184c2..2cef04f8 100644 --- a/js/app/services/shareservice.js +++ b/js/app/services/shareservice.js @@ -67,6 +67,16 @@ angular.module('passmanApp') return response.data; }) }, + getPublicSharedCredential: function (request, crypted_shared_key) { + var queryUrl = OC.generateUrl('apps/passman/api/v2/sharing/public/view'); + return $http.get(queryUrl).then(function (response) { + if (response.data) { + return response.data; + } else { + return response; + } + }); + }, getCredendialsSharedWithUs: function (vault_guid) { var queryUrl = OC.generateUrl('apps/passman/api/v2/sharing/vault/'+ vault_guid +'/get'); return $http.get(queryUrl).then(function (response) { diff --git a/templates/public_share.php b/templates/public_share.php index 95c0c0e2..43e9438f 100644 --- a/templates/public_share.php +++ b/templates/public_share.php @@ -1 +1,192 @@ -Public shared credential \ No newline at end of file + +
+
+
+

Passman

+
+ {name} has shared a credential with you. + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Label + + {{shared_credential.label}} +
+ Account + + +
+ Password + + +
+ OTP + + +
+ E-mail + + +
+ URL + + +
+ Files + + +
+ {{field.label}} + + +
+ Expire time + + {{shared_credential.expire_time * 1000 | + date:'dd-MM-yyyy @ HH:mm:ss'}} +
+ Changed + + {{shared_credential.changed * 1000 | + date:'dd-MM-yyyy @ HH:mm:ss'}} +
+ Created + + {{shared_credential.created * 1000 | + date:'dd-MM-yyyy @ HH:mm:ss'}} +
+ +
+ {{tag.text}} + +
+
+ +
+
+
\ No newline at end of file From 9433c4571f6821fb345b54d3c0698a3d7354b122 Mon Sep 17 00:00:00 2001 From: brantje Date: Mon, 3 Oct 2016 11:47:06 +0200 Subject: [PATCH 4/6] Add vertical align --- css/public-page.css | 3 ++- css/public-page.css.map | 2 +- sass/public-page.scss | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/css/public-page.css b/css/public-page.css index a40be5f9..525aeea8 100644 --- a/css/public-page.css +++ b/css/public-page.css @@ -41,7 +41,8 @@ table { table td:first-child { min-width: 110px; } table td { - padding-bottom: 1em; } + padding-bottom: 1em; + vertical-align: top; } .tags .tag { background-color: rgba(240, 240, 240, 0.9); diff --git a/css/public-page.css.map b/css/public-page.css.map index 88a663f6..d5886df1 100644 --- a/css/public-page.css.map +++ b/css/public-page.css.map @@ -1,6 +1,6 @@ { "version": 3, -"mappings": "AAEA,MAAO;EACL,OAAO,EAAE,IAAI;;AAGf,gBAAiB;EACf,WAAW,EAAE,CAAC;;AAGhB,qBAAqB;EACnB,UAAU,EAAE,IAAI;EAChB,aAAa,EAAE,IAAI;EACnB,OAAO,EAAE,IAAI;EACb,UAAU,EAAE,OAAO;EACnB,MAAM,EAAE,iBAAiB;ECJzB,qBAAqB,EDKE,GAAG;ECJ1B,aAAa,EDIU,GAAG;ECH1B,eAAe,EAAE,WAAW;EAAG,qDAAqD;EDIpF,2BAAK;IACJ,UAAU,EAAE,MAAM;EAEnB,wBAAE;IACA,WAAW,EAAE,IAAI;EAEnB,yDAAa;IACX,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,KAAK;IACd,6DAAC;MACC,YAAY,EAAE,GAAG;;AAKvB,iBAAkB;EAChB,QAAQ,EAAE,MAAM;EAChB,iDAAc;IACZ,KAAK,EAAE,IAAI;EAEb,wBAAO;IACL,WAAW,EAAE,IAAI;IACjB,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,IAAI;IACX,8BAAM;MACJ,MAAM,EAAE,OAAO;MACf,YAAY,EAAE,GAAG;;AAIvB,KAAK;EACF,WAAW,EAAE,MAAM;EAClB,oBAAc;IACZ,SAAS,EAAE,KAAK;EAElB,QAAE;IACA,cAAc,EAAE,GAAG;;AAKvB,UAAK;EACH,gBAAgB,EAAE,wBAAuB;EACzC,OAAO,EAAE,GAAG;EACZ,SAAS,EAAE,IAAI;EACf,YAAY,EAAE,GAAG;ECnDnB,qBAAqB,EDoDI,GAAG;ECnD5B,aAAa,EDmDY,GAAG;EClD5B,eAAe,EAAE,WAAW;EAAG,qDAAqD;ADoDpF,qBAAgB;EACd,YAAY,EAAE,GAAG;;AAGrB,OAAO;EACL,SAAS,EAAE,IAAI;EACf,QAAQ,EAAE,QAAQ;EAClB,MAAM,EAAE,KAAK;EACb,UAAU,EAAE,MAAM", +"mappings": "AAEA,MAAO;EACL,OAAO,EAAE,IAAI;;AAGf,gBAAiB;EACf,WAAW,EAAE,CAAC;;AAGhB,qBAAqB;EACnB,UAAU,EAAE,IAAI;EAChB,aAAa,EAAE,IAAI;EACnB,OAAO,EAAE,IAAI;EACb,UAAU,EAAE,OAAO;EACnB,MAAM,EAAE,iBAAiB;ECJzB,qBAAqB,EDKE,GAAG;ECJ1B,aAAa,EDIU,GAAG;ECH1B,eAAe,EAAE,WAAW;EAAG,qDAAqD;EDIpF,2BAAK;IACJ,UAAU,EAAE,MAAM;EAEnB,wBAAE;IACA,WAAW,EAAE,IAAI;EAEnB,yDAAa;IACX,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,KAAK;IACd,6DAAC;MACC,YAAY,EAAE,GAAG;;AAKvB,iBAAkB;EAChB,QAAQ,EAAE,MAAM;EAChB,iDAAc;IACZ,KAAK,EAAE,IAAI;EAEb,wBAAO;IACL,WAAW,EAAE,IAAI;IACjB,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,IAAI;IACX,8BAAM;MACJ,MAAM,EAAE,OAAO;MACf,YAAY,EAAE,GAAG;;AAIvB,KAAK;EACF,WAAW,EAAE,MAAM;EAClB,oBAAc;IACZ,SAAS,EAAE,KAAK;EAElB,QAAE;IACA,cAAc,EAAE,GAAG;IACnB,cAAc,EAAE,GAAG;;AAKvB,UAAK;EACH,gBAAgB,EAAE,wBAAuB;EACzC,OAAO,EAAE,GAAG;EACZ,SAAS,EAAE,IAAI;EACf,YAAY,EAAE,GAAG;ECpDnB,qBAAqB,EDqDI,GAAG;ECpD5B,aAAa,EDoDY,GAAG;ECnD5B,eAAe,EAAE,WAAW;EAAG,qDAAqD;ADqDpF,qBAAgB;EACd,YAAY,EAAE,GAAG;;AAGrB,OAAO;EACL,SAAS,EAAE,IAAI;EACf,QAAQ,EAAE,QAAQ;EAClB,MAAM,EAAE,KAAK;EACb,UAAU,EAAE,MAAM", "sources": ["../sass/public-page.scss","../sass/mixins.scss"], "names": [], "file": "public-page.css" diff --git a/sass/public-page.scss b/sass/public-page.scss index fc17ce7c..0caf1fda 100644 --- a/sass/public-page.scss +++ b/sass/public-page.scss @@ -52,6 +52,7 @@ table{ } td{ padding-bottom: 1em; + vertical-align: top; } } From f44bef765f40c07529fde7398c021daaf293c8e2 Mon Sep 17 00:00:00 2001 From: brantje Date: Mon, 3 Oct 2016 12:55:18 +0200 Subject: [PATCH 5/6] Show share link --- js/app/controllers/share.js | 4 ++-- js/templates.js | 2 +- .../partials/forms/share_credential/expire_settings.html | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/js/app/controllers/share.js b/js/app/controllers/share.js index 7cf6c949..d8437fd0 100644 --- a/js/app/controllers/share.js +++ b/js/app/controllers/share.js @@ -59,8 +59,8 @@ angular.module('passmanApp') $location.path('/vault/' + $scope.storedCredential.vault_id); }; - - + console.log($location); + $scope.share_link = $location.$$protocol + '://'+ $location.$$host + OC.generateUrl('apps/passman/share/public#') + $scope.storedCredential.guid; $scope.share_settings = { linkSharing:{ enabled: false, diff --git a/js/templates.js b/js/templates.js index ffccd238..b7d797d9 100644 --- a/js/templates.js +++ b/js/templates.js @@ -89,7 +89,7 @@ angular.module('views/partials/forms/share_credential/basics.html', []).run(['$t angular.module('views/partials/forms/share_credential/expire_settings.html', []).run(['$templateCache', function($templateCache) { 'use strict'; $templateCache.put('views/partials/forms/share_credential/expire_settings.html', - '
Enable link sharing.
Expire settings:
Share until date No expire date set
Share until views
'); + '
Enable link sharing.
Expire settings:
Share until date No expire date set
Share until views
'); }]); angular.module('views/partials/password-meter.html', []).run(['$templateCache', function($templateCache) { diff --git a/templates/views/partials/forms/share_credential/expire_settings.html b/templates/views/partials/forms/share_credential/expire_settings.html index 52c57bda..e00945bd 100644 --- a/templates/views/partials/forms/share_credential/expire_settings.html +++ b/templates/views/partials/forms/share_credential/expire_settings.html @@ -1,7 +1,8 @@
- Enable link sharing. + Enable link sharing.
+
Expire settings: