This is an automated email from the git hooks/post-receive script. New commit to branch bow-v2-go in repository bow. See https://gitlab.nuiton.org/chorem/bow.git commit 16e7009aea27a5cf220026dfa9f648ffd304a00f Author: Benjamin <poussin@codelutin.com> Date: Thu Apr 23 03:02:12 2020 +0200 opensearch avec bow-token car les cookies ne sont pas envoyes debut page preference (bookmarklet add) correction suppression cookie au logout (probleme dans le header logout/login :() --- pkg/http/userResource.go | 6 ++-- web/public/index.html | 15 +++++++-- web/src/App.vue | 29 ++++++++++++++--- web/src/components/layout/Header.vue | 61 +++++++++++++++++++----------------- web/src/main.js | 1 + web/src/router/index.js | 6 ++++ web/src/utils/Store.js | 2 +- web/src/views/Home.vue | 4 +-- web/src/views/Preferences.vue | 31 ++++++++++++++++++ 9 files changed, 114 insertions(+), 41 deletions(-) diff --git a/pkg/http/userResource.go b/pkg/http/userResource.go index 33399ef..c123e79 100644 --- a/pkg/http/userResource.go +++ b/pkg/http/userResource.go @@ -20,7 +20,7 @@ import ( deleteAuth remove cookie authentication */ func deleteAuth(w http.ResponseWriter, r *http.Request) { - cookie := http.Cookie{Name: constant.Token, Value: "", HttpOnly: true, MaxAge: 0} + cookie := http.Cookie{Name: constant.Token, Value: "", Path: "/", HttpOnly: false, Expires: time.Unix(0, 0)} http.SetCookie(w, &cookie) } @@ -47,7 +47,7 @@ func createAuth(w http.ResponseWriter, r *http.Request) { utils.Throw(w, utils.NewHTTPError500(err, pseudoUser)) return } - +log.Println(userJSON) var user model.BowUser err = json.Unmarshal([]byte(userJSON), &user) if err != nil { @@ -63,7 +63,7 @@ func createAuth(w http.ResponseWriter, r *http.Request) { w.Header().Add(constant.TokenHeader, token) expiration := time.Now().AddDate(10, 0, 0) // le cookie est valide 10ans :) - cookieToken := http.Cookie{Name: constant.Token, Value: token, Path: "/", Expires: expiration, HttpOnly: true} + cookieToken := http.Cookie{Name: constant.Token, Value: token, Path: "/", Expires: expiration, HttpOnly: false} http.SetCookie(w, &cookieToken) cookieUser := http.Cookie{Name: constant.User, Value: url.PathEscape(userJSON), Path: "/", Expires: expiration, HttpOnly: false} http.SetCookie(w, &cookieUser) diff --git a/web/public/index.html b/web/public/index.html index f3fd181..a2ba798 100644 --- a/web/public/index.html +++ b/web/public/index.html @@ -4,9 +4,20 @@ <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> - <link rel="icon" href="<%= BASE_URL %>favicon.png"> - <link title="bow" type="application/opensearchdescription+xml" rel="search" href="<%= VUE_APP_BOW_PUBLIC_URL %>/api/v1/opensearch"> <title>Bow - <%= htmlWebpackPlugin.options.title %></title> + <!-- + Allows control over where resources are loaded from. + Place as early in the <head> as possible, as the tag + only applies to resources that are declared after it. + --> + <!-- <meta http-equiv="Content-Security-Policy" content="default-src 'self'"> --> + <link rel="icon" href="<%= BASE_URL %>favicon.png"> + <!-- Completely opt out of DNS prefetching by setting to "off" --> + <meta http-equiv="x-dns-prefetch-control" content="off"> + <!-- Allows control over how referrer information is passed --> + <meta name="referrer" content="no-referrer"> + <!-- Name of web application (only should be used if the website is used as an app) --> + <meta name="application-name" content="Bow"> </head> <body> <noscript> diff --git a/web/src/App.vue b/web/src/App.vue index 74518cc..5d209a4 100644 --- a/web/src/App.vue +++ b/web/src/App.vue @@ -13,16 +13,35 @@ <script> import { Component, Vue } from 'vue-property-decorator' -import Footer from './components/layout/Footer.vue'; -import Header from './components/layout/Header.vue'; -import Sidebar from './components/layout/Sidebar.vue'; +import Footer from './components/layout/Footer.vue' +import Header from './components/layout/Header.vue' +import Sidebar from './components/layout/Sidebar.vue' @Component({ name: 'App', components: { Header, Footer, Sidebar } }) -class App extends Vue {} -export default App; +class App extends Vue { + insertOpenSearch() { + let token = this.$store.getCookie('bow-token') + if (token) { + // <link title="bow" type="application/opensearchdescription+xml" rel="search" href="<%= VUE_APP_BOW_PUBLIC_API_URL %>/api/v1/opensearch"> + let link = document.createElement('link') + link.id = 'opensearch' + link.title = 'bow' + link.type = 'application/opensearchdescription+xml' + link.rel = 'search' + link.href = `${location.protocol}//${location.hostname}:8000/api/v1/opensearch?bow-token=${token}` + document.head.appendChild(link) + } + } + + beforeMount() { + console.log('beforeMounted App') + this.insertOpenSearch() + } +} +export default App </script> <style lang="less"> diff --git a/web/src/components/layout/Header.vue b/web/src/components/layout/Header.vue index a23d5a7..1f1fb89 100644 --- a/web/src/components/layout/Header.vue +++ b/web/src/components/layout/Header.vue @@ -1,14 +1,16 @@ <template> <header> <router-link to="/" class="header-logo"> - <img alt="Bow logo" src="../../assets/img/logos/bow-text.svg"> + <img alt="Bow logo" src="../../assets/img/logos/bow-text.svg" /> </router-link> <SearchInput></SearchInput> <div id="header-user-infos"> - <span v-if="user"> - {{ this.user.login }} (bow user since {{ new Date(this.user.creationdate).getFullYear() }}) + <span v-if="token"> + <router-link to="/preferences"> + {{ this.user.login }} (bow user since {{ new Date(this.user.creationdate).getFullYear() }}) + </router-link> <button @click="logout">Logout</button> </span> <span v-else> @@ -29,25 +31,28 @@ import SearchInput from '@/components/SearchInput' @Component({ name: 'Header', - components: {SearchInput} + components: { SearchInput } }) class Header extends Vue { user = {} + token = '' logout() { - this.$fetch.delete(`/users/${this.user.id}/auth`).then( - () => this.$router.push({ name: 'Login'}) - ) + this.$fetch + .delete(`/users/${this.user.id}/auth`) + .then(() => this.$router.push({ name: 'Login' })) } beforeMount() { console.log('beforeMounted Header') this.user = this.$store.get('bow-user') + this.token = this.$store.getCookie('bow-token') } // beforeUpdate() { // console.log('beforeUpdate Header') // this.user = this.$store.get('bow-user') + // this.token = this.$store.getCookie('bow-token') // } } @@ -55,32 +60,32 @@ export default Header </script> <style scoped lang="less"> - header { - display: flex; - flex-direction: row; - align-items: center; +header { + display: flex; + flex-direction: row; + align-items: center; - height: var(--header-height); + height: var(--header-height); - border-bottom: 1px solid #EEE; + border-bottom: 1px solid #eee; - & > a, - & > div { - flex: 1; - height: 100%; + & > a, + & > div { + flex: 1; + height: 100%; - padding: var(--margin--medium); - } + padding: var(--margin--medium); } +} - .header-logo { - text-align: left; - } +.header-logo { + text-align: left; +} - #header-user-infos { - display: flex; - flex-direction: row; - align-items: center; - justify-content: right; - } +#header-user-infos { + display: flex; + flex-direction: row; + align-items: center; + justify-content: right; +} </style> diff --git a/web/src/main.js b/web/src/main.js index bd62384..c8d3090 100644 --- a/web/src/main.js +++ b/web/src/main.js @@ -13,6 +13,7 @@ Component.registerHooks([ ]) window.BACKEND_URL = 'http://localhost:8000/api/v1' +window.FRONTEND_URL = process.env.BASE_URL // register utilities function on window, Vue and Vue instance if (typeof window !== 'undefined') { diff --git a/web/src/router/index.js b/web/src/router/index.js index 6357cd7..90152d6 100644 --- a/web/src/router/index.js +++ b/web/src/router/index.js @@ -1,6 +1,7 @@ import Vue from 'vue' import VueRouter from 'vue-router' import Login from '../views/Login.vue' +import Preferences from '../views/Preferences.vue' import Home from '../views/Home.vue' import BookmarkEdit from '../views/BookmarkEdit.vue' @@ -12,6 +13,11 @@ const routes = [ name: 'Login', component: Login }, + { + path: '/preferences', + name: 'Preferences', + component: Preferences + }, { path: '/', name: 'Home', diff --git a/web/src/utils/Store.js b/web/src/utils/Store.js index 4c7af18..ee3ea5d 100644 --- a/web/src/utils/Store.js +++ b/web/src/utils/Store.js @@ -5,7 +5,7 @@ If data not found on localStorage, looking for value in cookie let StoreHelper = { get(key) { let value = localStorage.getItem(key) || this.getCookie(key) - return JSON.parse(value) + return value === undefined ? undefined : JSON.parse(value) }, set(key, value) { diff --git a/web/src/views/Home.vue b/web/src/views/Home.vue index 3cd7e0d..96c2bbd 100644 --- a/web/src/views/Home.vue +++ b/web/src/views/Home.vue @@ -18,7 +18,7 @@ import Bookmark from '@/components/Bookmark' @Component({ name: 'Home', - props: ['id', 'tags', 'fulltext', 'query', 'orderby','orderdesc','first'], + props: ['id', 'tags', 'fulltext', 'query', 'orderby', 'orderdesc', 'first'], components: { Bookmark } }) class Home extends Vue { @@ -90,4 +90,4 @@ export default Home padding-left: var(--margin--medium); padding-right: var(--margin--medium); } -</style> \ No newline at end of file +</style> diff --git a/web/src/views/Preferences.vue b/web/src/views/Preferences.vue new file mode 100644 index 0000000..8710f4a --- /dev/null +++ b/web/src/views/Preferences.vue @@ -0,0 +1,31 @@ +<template> + <div class="preferences"> + <div>{{ errorMsg }}</div> + <a :href="bookmarkletAdd">bookmarklet add</a> + </div> +</template> + +<script> +// @ is an alias to /src +import { Component, Vue } from 'vue-property-decorator' + +@Component({ + name: 'Preferences' +}) +class Preferences extends Vue { + + errorMsg = '' + user = {} + bookmarkletAdd=`javascript:document.location='${location.protocol + '//' + location.host}/edit/new?uri='+encodeURIComponent(location.href)+'&description='+encodeURIComponent(document.title + '\\n' + (document.getSelection() || ''))` + + beforeMount() { + console.log('beforeMounted preference') + } + +} + +export default Preferences +</script> + +<style lang="less"> +</style> -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.