diff --git a/.eslintrc.js b/.eslintrc.js index b5f5022f..cdc3cec3 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -24,7 +24,6 @@ module.exports = { "blessing": true, "debounce": false, "showModal": false, - "docCookies": false, "showAjaxError": false, "getQueryString": false, "TexturePreview": false diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index c5ae9112..bf047123 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -136,7 +136,12 @@ class UserController extends Controller if ($this->user->changePasswd($request->input('new_password'))) { event(new UserProfileUpdated($action, $this->user)); - return json(trans('user.profile.password.success'), 0); + + session()->flush(); + + return json(trans('user.profile.password.success'), 0) + ->withCookie(cookie()->forget('uid')) + ->withCookie(cookie()->forget('token')); } break; // @codeCoverageIgnore @@ -156,7 +161,10 @@ class UserController extends Controller if ($this->user->setEmail($request->input('new_email'))) { event(new UserProfileUpdated($action, $this->user)); - return json(trans('user.profile.email.success'), 0); + + return json(trans('user.profile.email.success'), 0) + ->withCookie(cookie()->forget('uid')) + ->withCookie(cookie()->forget('token')); } break; // @codeCoverageIgnore diff --git a/resources/assets/src/js/__tests__/admin.test.js b/resources/assets/src/js/__tests__/admin.test.js index 7209a9a6..8dac73c8 100644 --- a/resources/assets/src/js/__tests__/admin.test.js +++ b/resources/assets/src/js/__tests__/admin.test.js @@ -1125,10 +1125,8 @@ describe('tests for "common" module', () => { it('send feedbacks', async () => { const fetch = jest.fn() .mockReturnValue(Promise.resolve({ errno: 0, msg: 'Recorded.' })); - const docCookies = require('../common/cookie'); window.document.cookie = ''; - window.docCookies = docCookies; window.fetch = fetch; window.blessing = { site_name: 'inm', diff --git a/resources/assets/src/js/__tests__/common.test.js b/resources/assets/src/js/__tests__/common.test.js index bb6bb1e1..a3a3064d 100644 --- a/resources/assets/src/js/__tests__/common.test.js +++ b/resources/assets/src/js/__tests__/common.test.js @@ -3,43 +3,6 @@ const $ = require('jquery'); window.jQuery = window.$ = $; -describe('tests for "cookie" module', () => { - it('operates cookies', () => { - const cookies = require('../common/cookie'); - - expect(cookies.hasItem('key1')).toBe(false); - expect(cookies.getItem('key1')).toBeNull(); - - expect(cookies.setItem('key1', 'value1')).toBe(true); - expect(document.cookie).toBe('key1=value1'); - expect(cookies.setItem('key2', 'value2')).toBe(true); - expect(document.cookie).toBe('key1=value1; key2=value2'); - expect(cookies.hasItem('key1')).toBe(true); - expect(cookies.getItem('key1')).toBe('value1'); - expect(cookies.hasItem('key2')).toBe(true); - expect(cookies.getItem('key2')).toBe('value2'); - expect(cookies.keys()).toEqual(['key1', 'key2']); - - expect(cookies.setItem('domain', 'value')).toBe(false); - - expect(cookies.removeItem('key0')).toBe(false); - expect(cookies.removeItem('key2')).toBe(true); - expect(cookies.hasItem('key2')).toBe(false); - expect(document.cookie).toBe('key1=value1'); - expect(cookies.removeItem('key1')).toBe(true); - - expect(cookies.setItem('key3', 'value3', 50)); - expect(cookies.getItem('key3')).toBe('value3'); - expect(cookies.setItem('key3', 'value3', Infinity)); - expect(cookies.getItem('key3')).toBe('value3'); - expect(cookies.setItem('key3', 'value3', '60')); - expect(cookies.getItem('key3')).toBe('value3'); - expect(cookies.setItem('key4', 'value3', new Date)); - expect(cookies.removeItem('key3')).toBe(true); - expect(document.cookie).toBe(''); - }); -}); - describe('tests for "i18n" module', () => { const modulePath = '../common/i18n'; diff --git a/resources/assets/src/js/__tests__/user.test.js b/resources/assets/src/js/__tests__/user.test.js index 1fa970ab..fdedfd85 100644 --- a/resources/assets/src/js/__tests__/user.test.js +++ b/resources/assets/src/js/__tests__/user.test.js @@ -850,7 +850,6 @@ describe('tests for "profile" module', () => { it('change password', async () => { const fetch = jest.fn() - .mockReturnValueOnce(Promise.resolve({ errno: 0, msg: 'success' })) .mockReturnValueOnce(Promise.resolve({ errno: 0, msg: 'success' })) .mockReturnValueOnce(Promise.resolve({ errno: 1, msg: 'warning' })) .mockReturnValueOnce(Promise.reject()); @@ -862,19 +861,12 @@ describe('tests for "profile" module', () => { warning: jest.fn() }; const showAjaxError = jest.fn(); - const docCookies = { - removeItem: jest.fn() - }; window.fetch = fetch; window.swal = swal; window.trans = trans; window.url = url; window.toastr = toastr; window.showAjaxError = showAjaxError; - window.logout = jest.fn() - .mockReturnValueOnce(Promise.resolve({ errno: 0 })) - .mockReturnValueOnce(Promise.reject()); - window.docCookies = docCookies; document.body.innerHTML = ` @@ -911,10 +903,6 @@ describe('tests for "profile" module', () => { dataType: 'json', data: { current_password: 'password', new_password: 'new-password' } }); - expect(logout).toBeCalled(); - - await changePassword(); - expect(docCookies.removeItem).toBeCalledWith('token'); await changePassword(); expect(swal).toBeCalledWith({ type: 'warning', text: 'warning' }); @@ -925,9 +913,8 @@ describe('tests for "profile" module', () => { it('change email', async () => { const fetch = jest.fn() - .mockReturnValueOnce(Promise.resolve({ errno: 0, msg: 'success' })) - .mockReturnValueOnce(Promise.resolve({ errno: 0, msg: 'success' })) .mockReturnValueOnce(Promise.resolve({ errno: 1, msg: 'warning' })) + .mockReturnValueOnce(Promise.resolve({ errno: 0, msg: 'success' })) .mockReturnValueOnce(Promise.reject()); const swal = jest.fn() .mockReturnValueOnce(Promise.resolve()) @@ -941,19 +928,12 @@ describe('tests for "profile" module', () => { warning: jest.fn() }; const showAjaxError = jest.fn(); - const docCookies = { - removeItem: jest.fn() - }; window.fetch = fetch; window.swal = swal; window.trans = trans; window.url = url; window.toastr = toastr; window.showAjaxError = showAjaxError; - window.logout = jest.fn() - .mockReturnValueOnce(Promise.resolve({ errno: 0 })) - .mockReturnValueOnce(Promise.reject()); - window.docCookies = docCookies; document.body.innerHTML = ` @@ -985,15 +965,11 @@ describe('tests for "profile" module', () => { dataType: 'json', data: { new_email: 'a@b.c', password: 'pwd' } }); - expect(swal).toBeCalledWith({ type: 'success', text: 'success' }); - expect(logout).toBeCalled(); - - await changeEmail(); - expect(docCookies.removeItem).toBeCalled(); - - await changeEmail(); expect(swal).toBeCalledWith({ type: 'warning', text: 'warning' }); + await changeEmail(); + expect(swal).toBeCalledWith({ type: 'success', text: 'success' }); + await changeEmail(); expect(showAjaxError).toBeCalled(); }); diff --git a/resources/assets/src/js/admin/common.js b/resources/assets/src/js/admin/common.js index 12544c40..22e0d012 100644 --- a/resources/assets/src/js/admin/common.js +++ b/resources/assets/src/js/admin/common.js @@ -26,8 +26,9 @@ function initTables() { } async function sendFeedback() { - if (docCookies.getItem('feedback_sent') !== null) + if (document.cookie.replace(/(?:(?:^|.*;\s*)feedback_sent\s*=\s*([^;]*).*$)|^.*$/, '$1') !== '') { return; + } try { const { errno } = await fetch({ @@ -41,8 +42,8 @@ async function sendFeedback() { } }); if (errno === 0) { - // Will be expired when current session ends - docCookies.setItem('feedback_sent', Date.now()); + // It will be expired when current session ends + document.cookie = 'feedback_sent=' + Date.now(); console.log('Feedback sent. Thank you!'); } diff --git a/resources/assets/src/js/common/cookie.js b/resources/assets/src/js/common/cookie.js deleted file mode 100644 index d66c7cc0..00000000 --- a/resources/assets/src/js/common/cookie.js +++ /dev/null @@ -1,64 +0,0 @@ -/* eslint-disable */ - -/*\ -|*| -|*| :: cookies.js :: -|*| -|*| A complete cookies reader/writer framework with full unicode support. -|*| -|*| https://developer.mozilla.org/en-US/docs/DOM/document.cookie -|*| -|*| This framework is released under the GNU Public License, version 3 or later. -|*| http://www.gnu.org/licenses/gpl-3.0-standalone.html -|*| -|*| Syntaxes: -|*| -|*| * docCookies.setItem(name, value[, end[, path[, domain[, secure]]]]) -|*| * docCookies.getItem(name) -|*| * docCookies.removeItem(name[, path], domain) -|*| * docCookies.hasItem(name) -|*| * docCookies.keys() -|*| -\*/ - -var docCookies = { - getItem: function (sKey) { - return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null; - }, - setItem: function (sKey, sValue, vEnd, sPath, sDomain, bSecure) { - if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) { return false; } - var sExpires = ""; - if (vEnd) { - switch (vEnd.constructor) { - case Number: - sExpires = vEnd === Infinity ? "; expires=Fri, 31 Dec 9999 23:59:59 GMT" : "; max-age=" + vEnd; - break; - case String: - sExpires = "; expires=" + vEnd; - break; - case Date: - sExpires = "; expires=" + vEnd.toUTCString(); - break; - } - } - document.cookie = encodeURIComponent(sKey) + "=" + encodeURIComponent(sValue) + sExpires + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : "") + (bSecure ? "; secure" : ""); - return true; - }, - removeItem: function (sKey, sPath, sDomain) { - if (!sKey || !this.hasItem(sKey)) { return false; } - document.cookie = encodeURIComponent(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT" + ( sDomain ? "; domain=" + sDomain : "") + ( sPath ? "; path=" + sPath : ""); - return true; - }, - hasItem: function (sKey) { - return (new RegExp("(?:^|;\\s*)" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(document.cookie); - }, - keys: /* optional method: you can safely remove it! */ function () { - var aKeys = document.cookie.replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g, "").split(/\s*(?:\=[^;]*)?;\s*/); - for (var nIdx = 0; nIdx < aKeys.length; nIdx++) { aKeys[nIdx] = decodeURIComponent(aKeys[nIdx]); } - return aKeys; - } -}; - -if (process.env.NODE_ENV === 'test') { - module.exports = docCookies; -} diff --git a/resources/assets/src/js/user/profile.js b/resources/assets/src/js/user/profile.js index 64d3f2f1..99563c17 100644 --- a/resources/assets/src/js/user/profile.js +++ b/resources/assets/src/js/user/profile.js @@ -70,18 +70,13 @@ async function changePassword() { }); if (errno === 0) { - try { - await swal({ - type: 'success', - text: msg - }); - await logout(); - } catch (error) { - docCookies.removeItem('token') && console.warn(error); - } finally { - window.location = url('auth/login'); - } - return; + await swal({ + type: 'success', + text: msg + }); + + // Cookies were already deleted by remote server + return window.location = url('auth/login'); } else { return swal({ type: 'warning', text: msg }); } @@ -136,14 +131,8 @@ async function changeEmail() { type: 'success', text: msg }); - - try { - await logout(); - } catch (error) { - docCookies.removeItem('token') && console.warn(error); - } finally { - window.location = url('auth/login'); - } + + return window.location = url('auth/login'); } else { return swal({ type: 'warning', text: msg }); }