mirror of
https://github.com/NginxProxyManager/nginx-proxy-manager.git
synced 2025-06-17 09:53:35 +00:00
Compare commits
No commits in common. "3f6ac9a021f6b7871bcd124003edc518e248664a" and "4d3d37eaedde1116ffe8fdb54b626b8e239761c5" have entirely different histories.
3f6ac9a021
...
4d3d37eaed
@ -26,14 +26,14 @@ func SSEAuth(next http.Handler) http.Handler {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if claims == nil {
|
if claims != nil {
|
||||||
h.ResultErrorJSON(w, r, http.StatusUnauthorized, "Unauthorised", nil)
|
h.ResultErrorJSON(w, r, http.StatusUnauthorized, "Unauthorised", nil)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
userID := uint(claims["uid"].(float64))
|
userID := uint(claims["uid"].(float64))
|
||||||
_, enabled, _ := user.IsEnabled(userID)
|
_, enabled, _ := user.IsEnabled(userID)
|
||||||
if !enabled {
|
if token == nil || !enabled {
|
||||||
h.ResultErrorJSON(w, r, http.StatusUnauthorized, "Unauthorised", nil)
|
h.ResultErrorJSON(w, r, http.StatusUnauthorized, "Unauthorised", nil)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,6 @@ import (
|
|||||||
func GetByID(id uint) (Model, error) {
|
func GetByID(id uint) (Model, error) {
|
||||||
var m Model
|
var m Model
|
||||||
err := m.LoadByID(id)
|
err := m.LoadByID(id)
|
||||||
m.generateGravatar()
|
|
||||||
return m, err
|
return m, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,21 +99,3 @@ export async function put(
|
|||||||
const response = await fetch(apiUrl, { method, headers, body, signal });
|
const response = await fetch(apiUrl, { method, headers, body, signal });
|
||||||
return processResponse(response, skipCamelize);
|
return processResponse(response, skipCamelize);
|
||||||
}
|
}
|
||||||
|
|
||||||
interface DeleteArgs {
|
|
||||||
url: string;
|
|
||||||
}
|
|
||||||
export async function del(
|
|
||||||
{ url }: DeleteArgs,
|
|
||||||
abortController?: AbortController,
|
|
||||||
) {
|
|
||||||
const apiUrl = buildUrl({ url });
|
|
||||||
const method = "DELETE";
|
|
||||||
const headers = {
|
|
||||||
...buildAuthHeader(),
|
|
||||||
[contentTypeHeader]: "application/json",
|
|
||||||
};
|
|
||||||
const signal = abortController?.signal;
|
|
||||||
const response = await fetch(apiUrl, { method, headers, signal });
|
|
||||||
return processResponse(response);
|
|
||||||
}
|
|
||||||
|
@ -1,14 +0,0 @@
|
|||||||
import * as api from "./base";
|
|
||||||
|
|
||||||
export async function deleteCertificate(
|
|
||||||
id: number,
|
|
||||||
abortController?: AbortController,
|
|
||||||
): Promise<boolean> {
|
|
||||||
const { result } = await api.del(
|
|
||||||
{
|
|
||||||
url: `/certificates/${id}`,
|
|
||||||
},
|
|
||||||
abortController,
|
|
||||||
);
|
|
||||||
return result;
|
|
||||||
}
|
|
@ -2,7 +2,6 @@ export * from "./createCertificate";
|
|||||||
export * from "./createCertificateAuthority";
|
export * from "./createCertificateAuthority";
|
||||||
export * from "./createDNSProvider";
|
export * from "./createDNSProvider";
|
||||||
export * from "./createUser";
|
export * from "./createUser";
|
||||||
export * from "./deleteCertificate";
|
|
||||||
export * from "./getAccessLists";
|
export * from "./getAccessLists";
|
||||||
export * from "./getCertificate";
|
export * from "./getCertificate";
|
||||||
export * from "./getCertificateAuthorities";
|
export * from "./getCertificateAuthorities";
|
||||||
|
@ -26,7 +26,6 @@ function SiteWrapper({ children }: Props) {
|
|||||||
eventSource.onmessage = (e: any) => {
|
eventSource.onmessage = (e: any) => {
|
||||||
const j: SSEMessage = JSON.parse(e.data);
|
const j: SSEMessage = JSON.parse(e.data);
|
||||||
if (j) {
|
if (j) {
|
||||||
console.log("SSE Message:", j);
|
|
||||||
if (j.affects) {
|
if (j.affects) {
|
||||||
queryClient.invalidateQueries({ queryKey: [j.affects] });
|
queryClient.invalidateQueries({ queryKey: [j.affects] });
|
||||||
}
|
}
|
||||||
|
@ -71,9 +71,6 @@
|
|||||||
"certificate.create": {
|
"certificate.create": {
|
||||||
"defaultMessage": "Zertifikat erstellen"
|
"defaultMessage": "Zertifikat erstellen"
|
||||||
},
|
},
|
||||||
"certificate.deleted": {
|
|
||||||
"defaultMessage": "Certificate has been deleted"
|
|
||||||
},
|
|
||||||
"certificate.renewal-requested": {
|
"certificate.renewal-requested": {
|
||||||
"defaultMessage": "Renewal has been queued"
|
"defaultMessage": "Renewal has been queued"
|
||||||
},
|
},
|
||||||
|
@ -347,9 +347,6 @@
|
|||||||
"certificate.create": {
|
"certificate.create": {
|
||||||
"defaultMessage": "Create Certificate"
|
"defaultMessage": "Create Certificate"
|
||||||
},
|
},
|
||||||
"certificate.deleted": {
|
|
||||||
"defaultMessage": "Certificate has been deleted"
|
|
||||||
},
|
|
||||||
"certificate.renewal-requested": {
|
"certificate.renewal-requested": {
|
||||||
"defaultMessage": "Renewal has been queued"
|
"defaultMessage": "Renewal has been queued"
|
||||||
},
|
},
|
||||||
|
@ -71,9 +71,6 @@
|
|||||||
"certificate.create": {
|
"certificate.create": {
|
||||||
"defaultMessage": "ایجاد گواهی"
|
"defaultMessage": "ایجاد گواهی"
|
||||||
},
|
},
|
||||||
"certificate.deleted": {
|
|
||||||
"defaultMessage": "Certificate has been deleted"
|
|
||||||
},
|
|
||||||
"certificate.renewal-requested": {
|
"certificate.renewal-requested": {
|
||||||
"defaultMessage": "Renewal has been queued"
|
"defaultMessage": "Renewal has been queued"
|
||||||
},
|
},
|
||||||
|
@ -8,7 +8,6 @@ import {
|
|||||||
ActionsFormatter,
|
ActionsFormatter,
|
||||||
CertificateStatusFormatter,
|
CertificateStatusFormatter,
|
||||||
CertificateTypeFormatter,
|
CertificateTypeFormatter,
|
||||||
DomainsFormatter,
|
|
||||||
GravatarFormatter,
|
GravatarFormatter,
|
||||||
IDFormatter,
|
IDFormatter,
|
||||||
MonospaceFormatter,
|
MonospaceFormatter,
|
||||||
@ -28,7 +27,6 @@ export interface TableProps {
|
|||||||
filters: TableFilter[];
|
filters: TableFilter[];
|
||||||
onTableEvent: any;
|
onTableEvent: any;
|
||||||
onRenewal: (id: number) => void;
|
onRenewal: (id: number) => void;
|
||||||
onDelete: (id: number) => void;
|
|
||||||
}
|
}
|
||||||
function Table({
|
function Table({
|
||||||
data,
|
data,
|
||||||
@ -37,7 +35,6 @@ function Table({
|
|||||||
sortBy,
|
sortBy,
|
||||||
filters,
|
filters,
|
||||||
onRenewal,
|
onRenewal,
|
||||||
onDelete,
|
|
||||||
}: TableProps) {
|
}: TableProps) {
|
||||||
const [editId, setEditId] = useState(0);
|
const [editId, setEditId] = useState(0);
|
||||||
const [columns, tableData] = useMemo(() => {
|
const [columns, tableData] = useMemo(() => {
|
||||||
@ -62,14 +59,7 @@ function Table({
|
|||||||
Cell: MonospaceFormatter(),
|
Cell: MonospaceFormatter(),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Header: intl.formatMessage({ id: "column.domain-names" }),
|
Header: intl.formatMessage({ id: "column.validation-type" }),
|
||||||
accessor: "domainNames",
|
|
||||||
sortable: true,
|
|
||||||
Filter: TextFilter,
|
|
||||||
Cell: DomainsFormatter(),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Header: intl.formatMessage({ id: "column.type" }),
|
|
||||||
accessor: "type",
|
accessor: "type",
|
||||||
sortable: true,
|
sortable: true,
|
||||||
Cell: CertificateTypeFormatter(),
|
Cell: CertificateTypeFormatter(),
|
||||||
@ -115,7 +105,7 @@ function Table({
|
|||||||
title: intl.formatMessage({
|
title: intl.formatMessage({
|
||||||
id: "action.delete",
|
id: "action.delete",
|
||||||
}),
|
}),
|
||||||
onClick: (_: any, { id }: any) => onDelete(id),
|
onClick: (_: any, { id }: any) => alert(id),
|
||||||
icon: <FiTrash2 />,
|
icon: <FiTrash2 />,
|
||||||
disabled: (data: any) => data.isReadonly,
|
disabled: (data: any) => data.isReadonly,
|
||||||
},
|
},
|
||||||
|
@ -3,7 +3,7 @@ import { useEffect, useReducer, useState } from "react";
|
|||||||
import { Alert, AlertIcon, useToast } from "@chakra-ui/react";
|
import { Alert, AlertIcon, useToast } from "@chakra-ui/react";
|
||||||
import { useQueryClient } from "@tanstack/react-query";
|
import { useQueryClient } from "@tanstack/react-query";
|
||||||
|
|
||||||
import { renewCertificate, deleteCertificate } from "src/api/npm";
|
import { renewCertificate } from "src/api/npm";
|
||||||
import { EmptyList, SpinnerPage, tableEventReducer } from "src/components";
|
import { EmptyList, SpinnerPage, tableEventReducer } from "src/components";
|
||||||
import { useCertificates } from "src/hooks";
|
import { useCertificates } from "src/hooks";
|
||||||
import { intl } from "src/locale";
|
import { intl } from "src/locale";
|
||||||
@ -68,32 +68,6 @@ function TableWrapper() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const deleteCert = async (id: number) => {
|
|
||||||
try {
|
|
||||||
await deleteCertificate(id);
|
|
||||||
toast({
|
|
||||||
description: intl.formatMessage({
|
|
||||||
id: `certificate.deleted`,
|
|
||||||
}),
|
|
||||||
status: "success",
|
|
||||||
position: "top",
|
|
||||||
duration: 3000,
|
|
||||||
isClosable: true,
|
|
||||||
});
|
|
||||||
setTimeout(() => {
|
|
||||||
queryClient.invalidateQueries({ queryKey: ["certificates"] });
|
|
||||||
}, 500);
|
|
||||||
} catch (err: any) {
|
|
||||||
toast({
|
|
||||||
description: err.message,
|
|
||||||
status: "error",
|
|
||||||
position: "top",
|
|
||||||
duration: 3000,
|
|
||||||
isClosable: true,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (isFetching || isLoading || !tableData) {
|
if (isFetching || isLoading || !tableData) {
|
||||||
return <SpinnerPage />;
|
return <SpinnerPage />;
|
||||||
}
|
}
|
||||||
@ -131,7 +105,6 @@ function TableWrapper() {
|
|||||||
filters={filters}
|
filters={filters}
|
||||||
onTableEvent={dispatch}
|
onTableEvent={dispatch}
|
||||||
onRenewal={renewCert}
|
onRenewal={renewCert}
|
||||||
onDelete={deleteCert}
|
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -37,14 +37,11 @@ describe('Certificates endpoints', () => {
|
|||||||
it('Should be able to get a certificate', function() {
|
it('Should be able to get a certificate', function() {
|
||||||
cy.task('backendApiGet', {
|
cy.task('backendApiGet', {
|
||||||
token: token,
|
token: token,
|
||||||
path: '/api/certificates/' + certID + '?expand=user'
|
path: '/api/certificates/' + certID
|
||||||
}).then((data) => {
|
}).then((data) => {
|
||||||
// Check the swagger schema:
|
// Check the swagger schema:
|
||||||
cy.validateSwaggerSchema('get', 200, '/certificates/{certificateID}', data);
|
cy.validateSwaggerSchema('get', 200, '/certificates/{certificateID}', data);
|
||||||
expect(data.result).to.have.property('id', certID);
|
expect(data.result).to.have.property('id', certID);
|
||||||
expect(data.result).to.have.property('user');
|
|
||||||
expect(data.result.user).to.have.property('gravatar_url');
|
|
||||||
expect(data.result.user.gravatar_url).to.include('gravatar.com');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -66,15 +63,12 @@ describe('Certificates endpoints', () => {
|
|||||||
it('Should be able to get all certificates', function() {
|
it('Should be able to get all certificates', function() {
|
||||||
cy.task('backendApiGet', {
|
cy.task('backendApiGet', {
|
||||||
token: token,
|
token: token,
|
||||||
path: '/api/certificates?expand=user'
|
path: '/api/certificates'
|
||||||
}).then((data) => {
|
}).then((data) => {
|
||||||
cy.validateSwaggerSchema('get', 200, '/certificates', data);
|
cy.validateSwaggerSchema('get', 200, '/certificates', data);
|
||||||
expect(data).to.have.property('result');
|
expect(data).to.have.property('result');
|
||||||
expect(data.result).to.have.property('items');
|
expect(data.result).to.have.property('items');
|
||||||
expect(data.result.items.length).to.be.greaterThan(0);
|
expect(data.result.items.length).to.be.greaterThan(0);
|
||||||
expect(data.result.items[0]).to.have.property('user');
|
|
||||||
expect(data.result.items[0].user).to.have.property('gravatar_url');
|
|
||||||
expect(data.result.items[0].user.gravatar_url).to.include('gravatar.com');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user