Compare commits

...

41 Commits

Author SHA1 Message Date
Amir Raminfar
0bf265b001 Release 3.5.6 2021-04-13 11:48:29 -07:00
Amir Raminfar
c65d1f18ae Adds cache 2021-04-13 11:48:21 -07:00
Amir Raminfar
eb8f492ffe Release 3.5.5 2021-04-13 11:35:33 -07:00
Amir Raminfar
5358af5005 Adds setup buildx 2021-04-13 11:35:23 -07:00
Amir Raminfar
5569c7f5b4 Release 3.5.4 2021-04-13 11:29:48 -07:00
Amir Raminfar
5caf5eebb8 Uses docker/build-push-action (#1149) 2021-04-13 11:29:09 -07:00
kodiakhq[bot]
8ffe95b4ab Merge pull request #1148 from amir20/dependabot/go_modules/github.com/docker/docker-20.10.6incompatible
Bump github.com/docker/docker from 20.10.5+incompatible to 20.10.6+incompatible
2021-04-13 08:10:59 +00:00
dependabot[bot]
cca6b0971b Bump github.com/docker/docker
Bumps [github.com/docker/docker](https://github.com/docker/docker) from 20.10.5+incompatible to 20.10.6+incompatible.
- [Release notes](https://github.com/docker/docker/releases)
- [Changelog](https://github.com/moby/moby/blob/master/CHANGELOG.md)
- [Commits](https://github.com/docker/docker/compare/v20.10.5...v20.10.6)

Signed-off-by: dependabot[bot] <support@github.com>
2021-04-13 08:06:09 +00:00
kodiakhq[bot]
0b45972692 Merge pull request #1147 from amir20/dependabot/npm_and_yarn/date-fns-2.20.2
Bump date-fns from 2.20.1 to 2.20.2
2021-04-13 05:09:40 +00:00
kodiakhq[bot]
84d626c75b Merge pull request #1146 from amir20/dependabot/npm_and_yarn/webpack-5.32.0
Bump webpack from 5.31.2 to 5.32.0
2021-04-13 05:08:31 +00:00
dependabot[bot]
380e65641e Bump date-fns from 2.20.1 to 2.20.2
Bumps [date-fns](https://github.com/date-fns/date-fns) from 2.20.1 to 2.20.2.
- [Release notes](https://github.com/date-fns/date-fns/releases)
- [Changelog](https://github.com/date-fns/date-fns/blob/master/CHANGELOG.md)
- [Commits](https://github.com/date-fns/date-fns/compare/v2.20.1...v2.20.2)

Signed-off-by: dependabot[bot] <support@github.com>
2021-04-13 05:05:26 +00:00
dependabot[bot]
49a2bd918a Bump webpack from 5.31.2 to 5.32.0
Bumps [webpack](https://github.com/webpack/webpack) from 5.31.2 to 5.32.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.31.2...v5.32.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-04-13 05:04:36 +00:00
Amir Raminfar
e35734d73a Adds more tests 2021-04-12 14:45:46 -07:00
kodiakhq[bot]
9103124bfa Merge pull request #1144 from amir20/dependabot/npm_and_yarn/vue/test-utils-1.1.4
Bump @vue/test-utils from 1.1.3 to 1.1.4
2021-04-12 05:09:24 +00:00
kodiakhq[bot]
c440aaf1a1 Merge pull request #1143 from amir20/dependabot/npm_and_yarn/postcss-8.2.10
Bump postcss from 8.2.9 to 8.2.10
2021-04-12 05:09:17 +00:00
kodiakhq[bot]
aaf3cd84f0 Merge pull request #1142 from amir20/dependabot/npm_and_yarn/release-it-14.6.1
Bump release-it from 14.6.0 to 14.6.1
2021-04-12 05:09:05 +00:00
dependabot[bot]
cc1e7d0cbe Bump @vue/test-utils from 1.1.3 to 1.1.4
Bumps [@vue/test-utils](https://github.com/vuejs/vue-test-utils/tree/HEAD/packages/test-utils) from 1.1.3 to 1.1.4.
- [Release notes](https://github.com/vuejs/vue-test-utils/releases)
- [Changelog](https://github.com/vuejs/vue-test-utils/blob/dev/packages/test-utils/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue-test-utils/commits/v1.1.4/packages/test-utils)

Signed-off-by: dependabot[bot] <support@github.com>
2021-04-12 05:05:26 +00:00
dependabot[bot]
4012145a3e Bump postcss from 8.2.9 to 8.2.10
Bumps [postcss](https://github.com/postcss/postcss) from 8.2.9 to 8.2.10.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.2.9...8.2.10)

Signed-off-by: dependabot[bot] <support@github.com>
2021-04-12 05:05:03 +00:00
dependabot[bot]
b3cfec8402 Bump release-it from 14.6.0 to 14.6.1
Bumps [release-it](https://github.com/release-it/release-it) from 14.6.0 to 14.6.1.
- [Release notes](https://github.com/release-it/release-it/releases)
- [Changelog](https://github.com/release-it/release-it/blob/master/CHANGELOG.md)
- [Commits](https://github.com/release-it/release-it/compare/14.6.0...14.6.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-04-12 05:04:39 +00:00
Amir Raminfar
3a555a8b04 Release 3.5.3 2021-04-11 14:57:21 -07:00
Amir Raminfar
99a023e3b1 Fixes int test snapshots 2021-04-11 14:52:46 -07:00
Amir Raminfar
f239d077a2 Adds more tests for auth 2021-04-11 14:46:59 -07:00
Amir Raminfar
f822bd5ccd Updates snapshot 2021-04-11 14:13:15 -07:00
Amir Raminfar
3c96572fb0 Fixes authrization bug 2021-04-11 14:12:37 -07:00
Amir Raminfar
4daccddab5 Adds more js tests 2021-04-11 14:02:56 -07:00
Amir Raminfar
41415e6731 Cleans up imports 2021-04-11 13:53:25 -07:00
Amir Raminfar
2bbbb5f7a5 Fixes security error with invalid session 2021-04-11 13:53:16 -07:00
Amir Raminfar
c89e70d697 Fixes #1137 by adding margin 0 2021-04-11 13:43:52 -07:00
kodiakhq[bot]
cbba0fa0ad Merge pull request #1138 from amir20/dependabot/npm_and_yarn/css-loader-5.2.1
Bump css-loader from 5.2.0 to 5.2.1
2021-04-11 20:35:24 +00:00
kodiakhq[bot]
a60634ab1b Merge pull request #1139 from amir20/dependabot/npm_and_yarn/release-it-14.6.0
Bump release-it from 14.5.1 to 14.6.0
2021-04-11 20:35:15 +00:00
kodiakhq[bot]
0a9072cf53 Merge pull request #1140 from amir20/dependabot/npm_and_yarn/date-fns-2.20.1
Bump date-fns from 2.20.0 to 2.20.1
2021-04-11 20:35:04 +00:00
kodiakhq[bot]
dfaea1c95a Merge pull request #1141 from amir20/dependabot/npm_and_yarn/webpack-5.31.2
Bump webpack from 5.31.0 to 5.31.2
2021-04-11 20:34:54 +00:00
Amir Raminfar
a331b6a20b Configures kodiak 2021-04-11 13:34:39 -07:00
Amir Raminfar
3d710118e1 Merge branch 'master' into dependabot/npm_and_yarn/css-loader-5.2.1 2021-04-10 21:18:18 -07:00
Amir Raminfar
be24567d74 Merge branch 'master' into dependabot/npm_and_yarn/release-it-14.6.0 2021-04-10 21:18:10 -07:00
Amir Raminfar
cf7594af38 Merge branch 'master' into dependabot/npm_and_yarn/date-fns-2.20.1 2021-04-10 21:18:03 -07:00
Amir Raminfar
0527d58959 Merge branch 'master' into dependabot/npm_and_yarn/webpack-5.31.2 2021-04-10 21:17:51 -07:00
dependabot[bot]
36984d0787 Bump webpack from 5.31.0 to 5.31.2
Bumps [webpack](https://github.com/webpack/webpack) from 5.31.0 to 5.31.2.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.31.0...v5.31.2)

Signed-off-by: dependabot[bot] <support@github.com>
2021-04-11 00:32:21 +00:00
dependabot[bot]
f6ec3126a4 Bump date-fns from 2.20.0 to 2.20.1
Bumps [date-fns](https://github.com/date-fns/date-fns) from 2.20.0 to 2.20.1.
- [Release notes](https://github.com/date-fns/date-fns/releases)
- [Changelog](https://github.com/date-fns/date-fns/blob/master/CHANGELOG.md)
- [Commits](https://github.com/date-fns/date-fns/compare/v2.20.0...v2.20.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-04-11 00:32:01 +00:00
dependabot[bot]
767fc4fde3 Bump release-it from 14.5.1 to 14.6.0
Bumps [release-it](https://github.com/release-it/release-it) from 14.5.1 to 14.6.0.
- [Release notes](https://github.com/release-it/release-it/releases)
- [Changelog](https://github.com/release-it/release-it/blob/master/CHANGELOG.md)
- [Commits](https://github.com/release-it/release-it/compare/14.5.1...14.6.0)

Signed-off-by: dependabot[bot] <support@github.com>
2021-04-11 00:31:48 +00:00
dependabot[bot]
137dc490ce Bump css-loader from 5.2.0 to 5.2.1
Bumps [css-loader](https://github.com/webpack-contrib/css-loader) from 5.2.0 to 5.2.1.
- [Release notes](https://github.com/webpack-contrib/css-loader/releases)
- [Changelog](https://github.com/webpack-contrib/css-loader/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/css-loader/compare/v5.2.0...v5.2.1)

Signed-off-by: dependabot[bot] <support@github.com>
2021-04-11 00:31:36 +00:00
23 changed files with 241 additions and 106 deletions

View File

@@ -1,27 +0,0 @@
name: automerge
on:
pull_request:
types:
- labeled
- unlabeled
- synchronize
- opened
- edited
- ready_for_review
- reopened
- unlocked
pull_request_review:
types:
- submitted
check_suite:
types:
- completed
status: {}
jobs:
automerge:
runs-on: ubuntu-latest
steps:
- name: automerge
uses: "pascalgn/automerge-action@v0.13.1"
env:
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"

View File

@@ -43,19 +43,34 @@ jobs:
name: Release
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
- name: Docker meta
id: meta
uses: crazy-max/ghaction-docker-meta@v2
with:
images: amir20/dozzle
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v1
- name: Available platforms
run: echo ${{ steps.buildx.outputs.platforms }}
- name: Docker Login
run: docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
- name: Run Buildx
run: make publish
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Cache Docker layers
uses: actions/cache@v2
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Build and push
uses: docker/build-push-action@v2
with:
context: .
push: true
platforms: linux/amd64,linux/arm/v7,linux/arm64/v8
tags: ${{ steps.meta.outputs.tags }}
cache-from: type=gha
cache-to: type=gha
git-release:
needs: [buildx]
name: Github Release

1
.kodiak.toml Normal file
View File

@@ -0,0 +1 @@
version = 1

View File

@@ -1,11 +1,3 @@
TAG := $(shell git describe --tags)
PLATFROMS := linux/amd64,linux/arm/v7,linux/arm64/v8
.PHONY: publish
publish:
docker buildx build --build-arg TAG=$(TAG) --platform $(PLATFROMS) -t amir20/dozzle:latest -t amir20/dozzle:$(TAG) --push .
.PHONY: clean
clean:
@rm -rf static

View File

@@ -27,13 +27,13 @@ describe("<LogEventSource />", () => {
debounce.mockClear();
});
function createLogEventSource(searchFilter = null) {
function createLogEventSource({ hourStyle = "auto", searchFilter = null } = {}) {
const localVue = createLocalVue();
localVue.use(Vuex);
localVue.component("log-viewer", LogViewer);
const state = { searchFilter, settings: { size: "medium", showTimestamp: true, hourStyle: "auto" } };
const state = { searchFilter, settings: { size: "medium", showTimestamp: true, hourStyle } };
const store = new Vuex.Store({
state,
@@ -179,8 +179,38 @@ describe("<LogEventSource />", () => {
`);
});
test("should render dates with 12 hour style", async () => {
const wrapper = createLogEventSource({ hourStyle: "12" });
sources["/api/logs/stream?id=abc"].emitOpen();
sources["/api/logs/stream?id=abc"].emitMessage({
data: `2019-06-12T23:55:42.459034602Z <test>foo bar</test>`,
});
await wrapper.vm.$nextTick();
expect(wrapper.find("ul.events")).toMatchInlineSnapshot(`
<ul class="events medium">
<li class=""><span class="date"><time datetime="2019-06-12T23:55:42.459Z">today at 11:55:42 PM</time></span> <span class="text"> &lt;test&gt;foo bar&lt;/test&gt;</span></li>
</ul>
`);
});
test("should render dates with 24 hour style", async () => {
const wrapper = createLogEventSource({ hourStyle: "24" });
sources["/api/logs/stream?id=abc"].emitOpen();
sources["/api/logs/stream?id=abc"].emitMessage({
data: `2019-06-12T23:55:42.459034602Z <test>foo bar</test>`,
});
await wrapper.vm.$nextTick();
expect(wrapper.find("ul.events")).toMatchInlineSnapshot(`
<ul class="events medium">
<li class=""><span class="date"><time datetime="2019-06-12T23:55:42.459Z">today at 23:55:42</time></span> <span class="text"> &lt;test&gt;foo bar&lt;/test&gt;</span></li>
</ul>
`);
});
test("should render messages with filter", async () => {
const wrapper = createLogEventSource("test");
const wrapper = createLogEventSource({ searchFilter: "test" });
sources["/api/logs/stream?id=abc"].emitOpen();
sources["/api/logs/stream?id=abc"].emitMessage({
data: `2019-06-11T10:55:42.459034602Z Foo bar`,

View File

@@ -7,7 +7,7 @@
</ul>
</template>
<script>
import { mapActions, mapGetters, mapState } from "vuex";
import { mapState } from "vuex";
import AnsiConvertor from "ansi-to-html";
import DOMPurify from "dompurify";
import RelativeTime from "./RelativeTime";

View File

@@ -35,7 +35,7 @@
</div>
</section>
<section class="columns is-centered section">
<section class="columns is-centered section is-marginless">
<div class="column is-4">
<div class="panel">
<p class="panel-heading">Containers</p>

View File

@@ -91,7 +91,6 @@
<script>
import gt from "semver/functions/gt";
import valid from "semver/functions/valid";
import { mapActions, mapState } from "vuex";
import Icon from "../components/Icon";
import config from "../store/config";

2
go.mod
View File

@@ -5,7 +5,7 @@ require (
github.com/beme/abide v0.0.0-20190723115211-635a09831760
github.com/containerd/containerd v1.4.4 // indirect
github.com/docker/distribution v2.7.1+incompatible // indirect
github.com/docker/docker v20.10.5+incompatible
github.com/docker/docker v20.10.6+incompatible
github.com/docker/go-connections v0.4.0 // indirect
github.com/docker/go-units v0.4.0 // indirect
github.com/dustin/go-humanize v1.0.0

4
go.sum
View File

@@ -48,8 +48,8 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug=
github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/docker/docker v20.10.5+incompatible h1:o5WL5onN4awYGwrW7+oTn5x9AF2prw7V0Ox8ZEkoCdg=
github.com/docker/docker v20.10.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/docker v20.10.6+incompatible h1:oXI3Vas8TI8Eu/EjH4srKHJBVqraSzJybhxY7Om9faQ=
github.com/docker/docker v20.10.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 81 KiB

View File

@@ -1,6 +1,6 @@
{
"name": "dozzle",
"version": "3.5.2",
"version": "3.5.6",
"description": "Realtime log viewer for docker containers. ",
"scripts": {
"watch": "npm-run-all -p watch:*",
@@ -30,7 +30,7 @@
"ansi-to-html": "^0.6.14",
"buefy": "^0.9.6",
"bulma": "^0.9.2",
"date-fns": "^2.20.0",
"date-fns": "^2.20.2",
"dompurify": "^2.2.7",
"fuzzysort": "^1.1.4",
"hotkeys-js": "^3.8.3",
@@ -48,13 +48,13 @@
"@babel/core": "^7.13.15",
"@babel/plugin-transform-runtime": "^7.13.15",
"@vue/component-compiler-utils": "^3.2.0",
"@vue/test-utils": "^1.1.3",
"@vue/test-utils": "^1.1.4",
"autoprefixer": "^10.2.5",
"babel-core": "^7.0.0-bridge.0",
"babel-jest": "^26.6.3",
"babel-preset-env": "^1.7.0",
"caniuse-lite": "^1.0.30001208",
"css-loader": "^5.2.0",
"css-loader": "^5.2.1",
"eventsourcemock": "^2.0.0",
"html-webpack-plugin": "^5.3.1",
"husky": "^6.0.0",
@@ -63,10 +63,10 @@
"lint-staged": "^10.5.4",
"mini-css-extract-plugin": "^1.4.1",
"npm-run-all": "^4.1.5",
"postcss": "^8.2.9",
"postcss": "^8.2.10",
"postcss-loader": "^5.2.0",
"prettier": "^2.2.1",
"release-it": "^14.5.1",
"release-it": "^14.6.1",
"sass": "^1.32.8",
"sass-loader": "^11.0.1",
"vue-hot-reload-api": "^2.3.4",
@@ -74,7 +74,7 @@
"vue-loader": "^15.9.6",
"vue-style-loader": "^4.1.3",
"vue-template-compiler": "^2.6.12",
"webpack": "^5.31.0",
"webpack": "^5.32.0",
"webpack-cli": "^4.6.0",
"webpack-dev-server": "^3.11.2",
"webpack-pwa-manifest": "^4.3.0"

View File

@@ -32,6 +32,27 @@ Location: /login
<a href="/login">Temporary Redirect</a>.
/* snapshot: Test_createRoutes_username_password_invalid */
HTTP/1.1 401 Unauthorized
Connection: close
Content-Security-Policy: default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self'; manifest-src 'self'; connect-src 'self' api.github.com; require-trusted-types-for 'script'
Content-Type: text/plain; charset=utf-8
X-Content-Type-Options: nosniff
Unauthorized
/* snapshot: Test_createRoutes_username_password_valid_session */
HTTP/1.1 200 OK
Connection: close
Cache-Control: no-cache
Connection: keep-alive
Content-Security-Policy: default-src 'none'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self'; manifest-src 'self'; connect-src 'self' api.github.com; require-trusted-types-for 'script'
Content-Type: text/event-stream
X-Accel-Buffering: no
event: container-stopped
data: end of stream
/* snapshot: Test_createRoutes_version */
HTTP/1.1 200 OK
Connection: close

View File

@@ -27,12 +27,10 @@ func initializeAuth(h *handler) {
func authorizationRequired(f http.HandlerFunc) http.Handler {
if secured {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
session, _ := store.Get(r, sessionName)
if session.IsNew {
http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
return
} else {
if isAuthorized(r) {
f(w, r)
} else {
http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
}
})
} else {
@@ -40,7 +38,7 @@ func authorizationRequired(f http.HandlerFunc) http.Handler {
}
}
func (h *handler) isAuthorized(r *http.Request) bool {
func isAuthorized(r *http.Request) bool {
if !secured {
return true
}
@@ -59,16 +57,16 @@ func (h *handler) isAuthorized(r *http.Request) bool {
}
func (h *handler) isAuthorizationNeeded(r *http.Request) bool {
return secured && !h.isAuthorized(r)
return secured && !isAuthorized(r)
}
func (h *handler) validateCredentials(w http.ResponseWriter, r *http.Request) {
if !secured {
log.Panic("Validating credentials with secured=false should not happen")
log.Panic("Validating credentials without username and password should not happen")
}
if r.Method != "POST" {
log.Fatal("Expecting method to be POST")
log.Fatal("Expecting credential validation method to be POST")
http.Error(w, http.StatusText(http.StatusNotAcceptable), http.StatusNotAcceptable)
return
}

View File

@@ -82,7 +82,7 @@ func (h *handler) index(w http.ResponseWriter, req *http.Request) {
if err == nil && req.URL.Path != "" && req.URL.Path != "/" {
fileServer.ServeHTTP(w, req)
} else {
if !h.isAuthorized(req) && req.URL.Path != "login" {
if !isAuthorized(req) && req.URL.Path != "login" {
http.Redirect(w, req, h.config.Base+"login", http.StatusTemporaryRedirect)
return
}

View File

@@ -1,16 +1,19 @@
package web
import (
"bytes"
"context"
"errors"
"io"
"io/fs"
"io/ioutil"
"mime/multipart"
"net/http"
"net/http/httptest"
"os"
"strings"
"testing"
"time"
"github.com/gorilla/mux"
"github.com/magiconair/properties/assert"
@@ -312,6 +315,109 @@ func Test_createRoutes_username_password(t *testing.T) {
abide.AssertHTTPResponse(t, t.Name(), rr.Result())
}
func Test_createRoutes_username_password_invalid(t *testing.T) {
handler := createHandler(nil, nil, Config{Base: "/", Username: "amir", Password: "password", Key: "key"})
req, err := http.NewRequest("GET", "/api/logs/stream?id=123", nil)
require.NoError(t, err, "NewRequest should not return an error.")
rr := httptest.NewRecorder()
handler.ServeHTTP(rr, req)
abide.AssertHTTPResponse(t, t.Name(), rr.Result())
}
func Test_createRoutes_username_password_login_happy(t *testing.T) {
handler := createHandler(nil, nil, Config{Base: "/", Username: "amir", Password: "password", Key: "key"})
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
fw, err := writer.CreateFormField("username")
require.NoError(t, err, "Creating field should not be error.")
_, err = io.Copy(fw, strings.NewReader("amir"))
require.NoError(t, err, "Copying field should not result in error.")
fw, err = writer.CreateFormField("password")
require.NoError(t, err, "Creating field should not be error.")
_, err = io.Copy(fw, strings.NewReader("password"))
require.NoError(t, err, "Copying field should not result in error.")
writer.Close()
req, err := http.NewRequest("POST", "/api/validateCredentials", bytes.NewReader(body.Bytes()))
req.Header.Set("Content-Type", writer.FormDataContentType())
require.NoError(t, err, "NewRequest should not return an error.")
rr := httptest.NewRecorder()
handler.ServeHTTP(rr, req)
assert.Equal(t, rr.Code, 200)
cookie := rr.Header().Get("Set-Cookie")
assert.Matches(t, cookie, "session=.+")
}
func Test_createRoutes_username_password_login_failed(t *testing.T) {
handler := createHandler(nil, nil, Config{Base: "/", Username: "amir", Password: "password", Key: "key"})
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
fw, err := writer.CreateFormField("username")
require.NoError(t, err, "Creating field should not be error.")
_, err = io.Copy(fw, strings.NewReader("amir"))
require.NoError(t, err, "Copying field should not result in error.")
fw, err = writer.CreateFormField("password")
require.NoError(t, err, "Creating field should not be error.")
_, err = io.Copy(fw, strings.NewReader("bad"))
require.NoError(t, err, "Copying field should not result in error.")
writer.Close()
req, err := http.NewRequest("POST", "/api/validateCredentials", bytes.NewReader(body.Bytes()))
req.Header.Set("Content-Type", writer.FormDataContentType())
require.NoError(t, err, "NewRequest should not return an error.")
rr := httptest.NewRecorder()
handler.ServeHTTP(rr, req)
assert.Equal(t, rr.Code, 401)
}
func Test_createRoutes_username_password_valid_session(t *testing.T) {
mockedClient := new(MockedClient)
mockedClient.On("FindContainer", "123").Return(docker.Container{ID: "123"}, nil)
mockedClient.On("ContainerLogs", mock.Anything, "123", 0).Return(ioutil.NopCloser(strings.NewReader("test data")), io.EOF)
handler := createHandler(mockedClient, nil, Config{Base: "/", Username: "amir", Password: "password", Key: "key"})
// Get cookie first
req, err := http.NewRequest("GET", "/api/logs/stream?id=123", nil)
require.NoError(t, err, "NewRequest should not return an error.")
session, _ := store.Get(req, sessionName)
session.Values[authorityKey] = time.Now().Unix()
recorder := httptest.NewRecorder()
session.Save(req, recorder)
cookies := recorder.Result().Cookies()
// Test with cookie
req, err = http.NewRequest("GET", "/api/logs/stream?id=123", nil)
require.NoError(t, err, "NewRequest should not return an error.")
req.AddCookie(cookies[0])
rr := httptest.NewRecorder()
handler.ServeHTTP(rr, req)
abide.AssertHTTPResponse(t, t.Name(), rr.Result())
}
func Test_createRoutes_username_password_invalid_session(t *testing.T) {
mockedClient := new(MockedClient)
mockedClient.On("FindContainer", "123").Return(docker.Container{ID: "123"}, nil)
mockedClient.On("ContainerLogs", mock.Anything, "123", 0).Return(ioutil.NopCloser(strings.NewReader("test data")), io.EOF)
handler := createHandler(mockedClient, nil, Config{Base: "/", Username: "amir", Password: "password", Key: "key"})
req, err := http.NewRequest("GET", "/api/logs/stream?id=123", nil)
require.NoError(t, err, "NewRequest should not return an error.")
req.AddCookie(&http.Cookie{Name: "session", Value: "baddata"})
rr := httptest.NewRecorder()
handler.ServeHTTP(rr, req)
assert.Equal(t, rr.Code, 401)
}
func createHandler(client docker.Client, content fs.FS, config Config) *mux.Router {
if client == nil {
client = new(MockedClient)

View File

@@ -1211,10 +1211,10 @@
optionalDependencies:
prettier "^1.18.2"
"@vue/test-utils@^1.1.3":
version "1.1.3"
resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-1.1.3.tgz#747f5683d8d4633c85a385fe2e02c1bb35bec153"
integrity sha512-BAY1Cwe9JpkJseimC295EW3YlAmgIJI9OPkg2FSP62+PHZooB0B+wceDi9TYyU57oqzL0yLbcP73JKFpKiLc9A==
"@vue/test-utils@^1.1.4":
version "1.1.4"
resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-1.1.4.tgz#a9acb32ea1fa4535b2e1ce5ca100bceb4fade2db"
integrity sha512-9BeL8IqGvJKy553lq/07rhYURQkpS/k+j19rJ/4eDpGJk7z872M0YrBWFhjS14yMKlvYVYOCfWnVIXyrAx0xNw==
dependencies:
dom-event-types "^1.0.0"
lodash "^4.17.15"
@@ -2963,10 +2963,10 @@ css-color-names@1.0.1:
resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-1.0.1.tgz#6ff7ee81a823ad46e020fa2fd6ab40a887e2ba67"
integrity sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA==
css-loader@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.2.0.tgz#a9ecda190500863673ce4434033710404efbff00"
integrity sha512-MfRo2MjEeLXMlUkeUwN71Vx5oc6EJnx5UQ4Yi9iUtYQvrPtwLUucYptz0hc6n++kdNcyF5olYBS4vPjJDAcLkw==
css-loader@^5.2.1:
version "5.2.1"
resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.2.1.tgz#15fbd5b6ac4c1b170a098f804c5abd0722f2aa73"
integrity sha512-YCyRzlt/jgG1xanXZDG/DHqAueOtXFHeusP9TS478oP1J++JSKOyEgGW1GHVoCj/rkS+GWOlBwqQJBr9yajQ9w==
dependencies:
camelcase "^6.2.0"
cssesc "^3.0.0"
@@ -3044,10 +3044,10 @@ data-urls@^2.0.0:
whatwg-mimetype "^2.3.0"
whatwg-url "^8.0.0"
date-fns@^2.20.0:
version "2.20.0"
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.20.0.tgz#df00ba9177fbea22d88010b5844ecc91e9e03ceb"
integrity sha512-nmA7y6aDH5+fknfJ0G77HQzUSfTPpq4ifq+c9blP9d+X9zs3kNjxC+t3pcbBMGTp262a6PJB3RVjLlxIgoMI+Q==
date-fns@^2.20.2:
version "2.20.2"
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.20.2.tgz#7f05d1275e1e43c3bdde5998201920098e19c6a1"
integrity sha512-QS0Z8SD/ALhKFvhtU4Fhz+1crsI7fPzBquXmdWay33KJPEU7btro2hnmmErpQRmt2D624B1lbjXQKDUMLnQTmQ==
de-indent@^1.0.2:
version "1.0.2"
@@ -5981,22 +5981,22 @@ micromatch@^4.0.2:
braces "^3.0.1"
picomatch "^2.0.5"
mime-db@1.46.0:
version "1.46.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee"
integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==
mime-db@1.47.0:
version "1.47.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c"
integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==
"mime-db@>= 1.43.0 < 2":
version "1.45.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea"
integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==
mime-types@2.1.29, mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24:
version "2.1.29"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2"
integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==
mime-types@2.1.30, mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24:
version "2.1.30"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d"
integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==
dependencies:
mime-db "1.46.0"
mime-db "1.47.0"
mime@1.6.0, mime@^1.3.4:
version "1.6.0"
@@ -6867,10 +6867,10 @@ postcss@^7.0.14:
source-map "^0.6.1"
supports-color "^6.1.0"
postcss@^8.2.8, postcss@^8.2.9:
version "8.2.9"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.9.tgz#fd95ff37b5cee55c409b3fdd237296ab4096fba3"
integrity sha512-b+TmuIL4jGtCHtoLi+G/PisuIl9avxs8IZMSmlABRwNz5RLUUACrC+ws81dcomz1nRezm5YPdXiMEzBEKgYn+Q==
postcss@^8.2.10, postcss@^8.2.8:
version "8.2.10"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.10.tgz#ca7a042aa8aff494b334d0ff3e9e77079f6f702b"
integrity sha512-b/h7CPV7QEdrqIxtAf2j31U5ef05uBDuvoXv6L51Q4rcS1jdlXAVKJv+atCFdUXYl9dyTHGyoMzIepwowRJjFw==
dependencies:
colorette "^1.2.2"
nanoid "^3.1.22"
@@ -7226,10 +7226,10 @@ relateurl@^0.2.7:
resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=
release-it@^14.5.1:
version "14.5.1"
resolved "https://registry.yarnpkg.com/release-it/-/release-it-14.5.1.tgz#79c971f84bb827794a7ddef0b6209bbb5e978ff8"
integrity sha512-ivbMbYEk4E1RoV3DmWn8T37sjnCx35kwiHDSgfphDr0F8A5zbJCj4ZLZmDseE9sQi9ZjhXTN1webBLW5YbGxNg==
release-it@^14.6.1:
version "14.6.1"
resolved "https://registry.yarnpkg.com/release-it/-/release-it-14.6.1.tgz#a04623312d67886b37b8a6d298844ee3e0c7150a"
integrity sha512-noBho2997G3yrm6YvdLJj4Ua2SCFOU7ajCqtvteI3DZtpM1IhiyXSgcn2Q5irq8lTNK0it4eiNq9TSrAWNYDkA==
dependencies:
"@iarna/toml" "2.2.5"
"@octokit/rest" "18.5.2"
@@ -7248,7 +7248,7 @@ release-it@^14.5.1:
inquirer "8.0.0"
is-ci "3.0.0"
lodash "4.17.21"
mime-types "2.1.29"
mime-types "2.1.30"
ora "5.4.0"
os-name "4.0.0"
parse-json "5.2.0"
@@ -8794,10 +8794,10 @@ webpack-sources@^2.1.1:
source-list-map "^2.0.1"
source-map "^0.6.1"
webpack@^5.31.0:
version "5.31.0"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.31.0.tgz#fab61d0be896feca4af87bdad5c18815c0d63455"
integrity sha512-3fUfZT/FUuThWSSyL32Fsh7weUUfYP/Fjc/cGSbla5KiSo0GtI1JMssCRUopJTvmLjrw05R2q7rlLtiKdSzkzQ==
webpack@^5.32.0:
version "5.32.0"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.32.0.tgz#f013932d778dad81bd51292d0ea00865056dc22c"
integrity sha512-jB9PrNMFnPRiZGnm/j3qfNqJmP3ViRzkuQMIf8za0dgOYvSLi/cgA+UEEGvik9EQHX1KYyGng5PgBTTzGrH9xg==
dependencies:
"@types/eslint-scope" "^3.7.0"
"@types/estree" "^0.0.46"