mirror of
				https://github.com/NginxProxyManager/nginx-proxy-manager.git
				synced 2025-11-03 17:13:33 +00:00 
			
		
		
		
	Compare commits
	
		
			5 Commits
		
	
	
		
			v2.12.6
			...
			8fb9d9fec6
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					8fb9d9fec6 | ||
| 
						 | 
					cea9a17218 | ||
| 
						 | 
					6bbe7d4cc4 | ||
| 
						 | 
					c6ab315165 | ||
| 
						 | 
					2c1595756d | 
@@ -313,6 +313,7 @@ const internalCertificate = {
 | 
				
			|||||||
					.where('is_deleted', 0)
 | 
										.where('is_deleted', 0)
 | 
				
			||||||
					.andWhere('id', data.id)
 | 
										.andWhere('id', data.id)
 | 
				
			||||||
					.allowGraph('[owner]')
 | 
										.allowGraph('[owner]')
 | 
				
			||||||
 | 
										.allowGraph('[proxy_hosts]')
 | 
				
			||||||
					.first();
 | 
										.first();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (access_data.permission_visibility !== 'all') {
 | 
									if (access_data.permission_visibility !== 'all') {
 | 
				
			||||||
@@ -464,6 +465,7 @@ const internalCertificate = {
 | 
				
			|||||||
					.where('is_deleted', 0)
 | 
										.where('is_deleted', 0)
 | 
				
			||||||
					.groupBy('id')
 | 
										.groupBy('id')
 | 
				
			||||||
					.allowGraph('[owner]')
 | 
										.allowGraph('[owner]')
 | 
				
			||||||
 | 
										.allowGraph('[proxy_hosts]')
 | 
				
			||||||
					.orderBy('nice_name', 'ASC');
 | 
										.orderBy('nice_name', 'ASC');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if (access_data.permission_visibility !== 'all') {
 | 
									if (access_data.permission_visibility !== 'all') {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,6 @@
 | 
				
			|||||||
const db      = require('../db');
 | 
					const db      = require('../db');
 | 
				
			||||||
const helpers = require('../lib/helpers');
 | 
					const helpers = require('../lib/helpers');
 | 
				
			||||||
const Model   = require('objection').Model;
 | 
					const Model   = require('objection').Model;
 | 
				
			||||||
const User    = require('./user');
 | 
					 | 
				
			||||||
const now     = require('./now_helper');
 | 
					const now     = require('./now_helper');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Model.knex(db);
 | 
					Model.knex(db);
 | 
				
			||||||
@@ -68,6 +67,8 @@ class Certificate extends Model {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	static get relationMappings () {
 | 
						static get relationMappings () {
 | 
				
			||||||
 | 
							const ProxyHost = require('./proxy_host');
 | 
				
			||||||
 | 
							const User      = require('./user');
 | 
				
			||||||
		return {
 | 
							return {
 | 
				
			||||||
			owner: {
 | 
								owner: {
 | 
				
			||||||
				relation:   Model.HasOneRelation,
 | 
									relation:   Model.HasOneRelation,
 | 
				
			||||||
@@ -79,6 +80,17 @@ class Certificate extends Model {
 | 
				
			|||||||
				modify: function (qb) {
 | 
									modify: function (qb) {
 | 
				
			||||||
					qb.where('user.is_deleted', 0);
 | 
										qb.where('user.is_deleted', 0);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								proxy_hosts: {
 | 
				
			||||||
 | 
									relation:   Model.HasManyRelation,
 | 
				
			||||||
 | 
									modelClass: ProxyHost,
 | 
				
			||||||
 | 
									join:       {
 | 
				
			||||||
 | 
										from: 'certificate.id',
 | 
				
			||||||
 | 
										to:   'proxy_host.certificate_id'
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									modify: function (qb) {
 | 
				
			||||||
 | 
										qb.where('proxy_host.is_deleted', 0);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,6 +33,13 @@
 | 
				
			|||||||
<td class="<%- isExpired() ? 'text-danger' : '' %>">
 | 
					<td class="<%- isExpired() ? 'text-danger' : '' %>">
 | 
				
			||||||
    <%- formatDbDate(expires_on, 'Do MMMM YYYY, h:mm a') %>
 | 
					    <%- formatDbDate(expires_on, 'Do MMMM YYYY, h:mm a') %>
 | 
				
			||||||
</td>
 | 
					</td>
 | 
				
			||||||
 | 
					<td>
 | 
				
			||||||
 | 
					    <% if (proxy_hosts.length > 0) { %>
 | 
				
			||||||
 | 
					        <span class="status-icon bg-success"></span> <%- i18n('certificates', 'in-use') %>
 | 
				
			||||||
 | 
					    <% } else { %>
 | 
				
			||||||
 | 
					        <span class="status-icon bg-danger"></span> <%- i18n('certificates', 'inactive') %>
 | 
				
			||||||
 | 
					    <% } %>
 | 
				
			||||||
 | 
					</td>
 | 
				
			||||||
<% if (canManage) { %>
 | 
					<% if (canManage) { %>
 | 
				
			||||||
<td class="text-right">
 | 
					<td class="text-right">
 | 
				
			||||||
    <div class="item-action dropdown">
 | 
					    <div class="item-action dropdown">
 | 
				
			||||||
@@ -48,7 +55,14 @@
 | 
				
			|||||||
                <div class="dropdown-divider"></div>
 | 
					                <div class="dropdown-divider"></div>
 | 
				
			||||||
            <% } %>
 | 
					            <% } %>
 | 
				
			||||||
            <a href="#" class="delete dropdown-item"><i class="dropdown-icon fe fe-trash-2"></i> <%- i18n('str', 'delete') %></a>
 | 
					            <a href="#" class="delete dropdown-item"><i class="dropdown-icon fe fe-trash-2"></i> <%- i18n('str', 'delete') %></a>
 | 
				
			||||||
 | 
					            <% if (proxy_hosts.length > 0) { %>
 | 
				
			||||||
 | 
					                <div class="dropdown-divider"></div>
 | 
				
			||||||
 | 
					                <span class="dropdown-header"><%- i18n('certificates', 'active-domain_names') %></span>
 | 
				
			||||||
 | 
					                <% proxy_hosts.forEach(function(host) { %>
 | 
				
			||||||
 | 
					                    <a href="https://<%- host %>" class="dropdown-item" target="_blank"><%- host %></a>
 | 
				
			||||||
 | 
					                <% }); %>
 | 
				
			||||||
 | 
					            <% } %>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
</td>
 | 
					</td>
 | 
				
			||||||
<% } %>
 | 
					<% } %>
 | 
				
			||||||
@@ -44,12 +44,23 @@ module.exports = Mn.View.extend({
 | 
				
			|||||||
        },
 | 
					        },
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    templateContext: {
 | 
					    templateContext: function () {
 | 
				
			||||||
        canManage: App.Cache.User.canManage('certificates'),
 | 
					        return {
 | 
				
			||||||
        isExpired: function () {
 | 
					            canManage: App.Cache.User.canManage('certificates'),
 | 
				
			||||||
            return moment(this.expires_on).isBefore(moment());
 | 
					            isExpired: function () {
 | 
				
			||||||
        },
 | 
					                return moment(this.expires_on).isBefore(moment());
 | 
				
			||||||
        dns_providers: dns_providers
 | 
					            },
 | 
				
			||||||
 | 
					            dns_providers: dns_providers,
 | 
				
			||||||
 | 
					            proxy_hosts: this.getProxyHosts() 
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    getProxyHosts: function () {
 | 
				
			||||||
 | 
					        const hosts = this.model.attributes.proxy_hosts || [];
 | 
				
			||||||
 | 
					        return hosts.reduce((acc, host) => {
 | 
				
			||||||
 | 
					            acc.push(...(host.domain_names || []));
 | 
				
			||||||
 | 
					            return acc;
 | 
				
			||||||
 | 
					        }, []);
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    initialize: function () {
 | 
					    initialize: function () {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,7 @@
 | 
				
			|||||||
    <th><%- i18n('str', 'name') %></th>
 | 
					    <th><%- i18n('str', 'name') %></th>
 | 
				
			||||||
    <th><%- i18n('all-hosts', 'cert-provider') %></th>
 | 
					    <th><%- i18n('all-hosts', 'cert-provider') %></th>
 | 
				
			||||||
    <th><%- i18n('str', 'expires') %></th>
 | 
					    <th><%- i18n('str', 'expires') %></th>
 | 
				
			||||||
 | 
					    <th><%- i18n('str', 'status') %></th>
 | 
				
			||||||
    <% if (canManage) { %>
 | 
					    <% if (canManage) { %>
 | 
				
			||||||
    <th> </th>
 | 
					    <th> </th>
 | 
				
			||||||
    <% } %>
 | 
					    <% } %>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -74,7 +74,7 @@ module.exports = Mn.View.extend({
 | 
				
			|||||||
            e.preventDefault();
 | 
					            e.preventDefault();
 | 
				
			||||||
            let query = this.ui.query.val();
 | 
					            let query = this.ui.query.val();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            this.fetch(['owner'], query)
 | 
					            this.fetch(['owner','proxy_hosts'], query)
 | 
				
			||||||
                .then(response => this.showData(response))
 | 
					                .then(response => this.showData(response))
 | 
				
			||||||
                .catch(err => {
 | 
					                .catch(err => {
 | 
				
			||||||
                    this.showError(err);
 | 
					                    this.showError(err);
 | 
				
			||||||
@@ -89,7 +89,7 @@ module.exports = Mn.View.extend({
 | 
				
			|||||||
    onRender: function () {
 | 
					    onRender: function () {
 | 
				
			||||||
        let view = this;
 | 
					        let view = this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        view.fetch(['owner'])
 | 
					        view.fetch(['owner','proxy_hosts'])
 | 
				
			||||||
            .then(response => {
 | 
					            .then(response => {
 | 
				
			||||||
                if (!view.isDestroyed()) {
 | 
					                if (!view.isDestroyed()) {
 | 
				
			||||||
                    if (response && response.length) {
 | 
					                    if (response && response.length) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -206,7 +206,10 @@
 | 
				
			|||||||
      "reachability-other": "There is a server found at this domain but it returned an unexpected status code {code}. Is it the NPM server? Please make sure your domain points to the IP where your NPM instance is running.",
 | 
					      "reachability-other": "There is a server found at this domain but it returned an unexpected status code {code}. Is it the NPM server? Please make sure your domain points to the IP where your NPM instance is running.",
 | 
				
			||||||
      "download": "Download",
 | 
					      "download": "Download",
 | 
				
			||||||
      "renew-title": "Renew Let's Encrypt Certificate",
 | 
					      "renew-title": "Renew Let's Encrypt Certificate",
 | 
				
			||||||
      "search": "Search Certificate…"
 | 
					      "search": "Search Certificate…",
 | 
				
			||||||
 | 
					      "in-use"  : "In use",
 | 
				
			||||||
 | 
					      "inactive": "Inactive",
 | 
				
			||||||
 | 
					      "active-domain_names": "Active domain names"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "access-lists": {
 | 
					    "access-lists": {
 | 
				
			||||||
      "title": "Access Lists",
 | 
					      "title": "Access Lists",
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user