Moved v3 code from NginxProxyManager/nginx-proxy-manager-3 to NginxProxyManager/nginx-proxy-manager
This commit is contained in:
.dockerignore.gitignore.versionDEV-README.mdJenkinsfileREADME.md
backend
.editorconfig.eslintrc.json.gitignore.golangci.yml.nancy-ignorego.modgo.sumindex.js
.vscode
README.mdTaskfile.ymlapp.jscmd
server
config
db.jsdoc
embed
api_docs
api.swagger.json
main.gocomponents
CertificateAuthorityList.jsonCertificateAuthorityObject.jsonCertificateList.jsonCertificateObject.jsonConfigObject.jsonDNSProviderList.jsonDNSProviderObject.jsonDeletedItemResponse.jsonErrorObject.jsonFilterObject.jsonHealthObject.jsonHostList.jsonHostObject.jsonHostTemplateList.jsonHostTemplateObject.jsonSettingList.jsonSettingObject.jsonSortObject.jsonStreamList.jsonStreamObject.jsonTokenObject.jsonUserAuthObject.jsonUserList.jsonUserObject.json
main.gopaths
certificates-authorities
certificates
config
dns-providers
get.jsonhost-templates
hosts
schema
settings
streams
tokens
users
migrations
nginx
internal
access-list.jsaudit-log.js
knexfile.jsacme
api
context
filters
handler
auth.gocertificate_authorities.gocertificates.goconfig.godns_providers.gohealth.gohelpers.gohost_templates.gohosts.gonot_allowed.gonot_found.goschema.gosettings.gostreams.gotokens.gousers.go
http
middleware
access_control.goauth.goauth_cache.gobody_context.gocors.goenforce_setup.goexpansion.gofilters.gopretty_print.goschema.go
router.gorouter_test.goschema
certificates.gocommon.gocreate_certificate_authority.gocreate_dns_provider.gocreate_host.gocreate_host_template.gocreate_setting.gocreate_stream.gocreate_user.goget_token.goset_auth.goupdate_certificate_authority.goupdate_dns_provider.goupdate_host.goupdate_host_template.goupdate_setting.goupdate_stream.goupdate_user.go
server.gocache
certificate.jsconfig
database
dead-host.jsdnsproviders
common.godns_ad.godns_ali.godns_aws.godns_cf.godns_cloudns.godns_cx.godns_cyon.godns_dgon.godns_dnsimple.godns_dp.godns_duckdns.godns_dyn.godns_dynu.godns_freedns.godns_gandi_livedns.godns_gd.godns_he.godns_infoblox.godns_ispconfig.godns_linode_v4.godns_lua.godns_me.godns_namecom.godns_nsone.godns_pdns.godns_unoeuro.godns_vscale.godns_yandex.go
entity
auth
certificate
certificateauthority
dnsprovider
filters.gofilters_schema.gohost
hosttemplate
lists_query.gosetting
stream
user
errors
host.jsip_ranges.jsjwt
logger
model
nginx.jsnginx
proxy-host.jsredirection-host.jsreport.jssetting.jsstate
stream.jstoken.jstypes
user.jsutil
validator
worker
lib
access.js
logger.jsmigrate.jsaccess
access_lists-create.jsonaccess_lists-delete.jsonaccess_lists-get.jsonaccess_lists-list.jsonaccess_lists-update.jsonauditlog-list.jsoncertificates-create.jsoncertificates-delete.jsoncertificates-get.jsoncertificates-list.jsoncertificates-update.jsondead_hosts-create.jsondead_hosts-delete.jsondead_hosts-get.jsondead_hosts-list.jsondead_hosts-update.jsonpermissions.jsonproxy_hosts-create.jsonproxy_hosts-delete.jsonproxy_hosts-get.jsonproxy_hosts-list.jsonproxy_hosts-update.jsonredirection_hosts-create.jsonredirection_hosts-delete.jsonredirection_hosts-get.jsonredirection_hosts-list.jsonredirection_hosts-update.jsonreports-hosts.jsonroles.jsonsettings-get.jsonsettings-list.jsonsettings-update.jsonstreams-create.jsonstreams-delete.jsonstreams-get.jsonstreams-list.jsonstreams-update.jsonusers-create.jsonusers-delete.jsonusers-get.jsonusers-list.jsonusers-loginas.jsonusers-password.jsonusers-permissions.jsonusers-update.json
error.jsexpress
helpers.jsmigrate_template.jsutils.jsvalidator
migrations
20180618015850_initial.js20180929054513_websockets.js20181019052346_forward_host.js20181113041458_http2_support.js20181213013211_forward_scheme.js20190104035154_disabled.js20190215115310_customlocations.js20190218060101_hsts.js20190227065017_settings.js20200410143839_access_list_client.js20200410143840_access_list_client_fix.js20201014143841_pass_auth.js20210210154702_redirection_scheme.js20210210154703_redirection_status_code.js20210423103500_stream_domain.js20211108145214_regenerate_default_host.js
models
access_list.jsaccess_list_auth.jsaccess_list_client.jsaudit-log.jsauth.jscertificate.jsdead_host.jsnow_helper.jsproxy_host.jsredirection_host.jssetting.jsstream.jstoken.jsuser.jsuser_permission.js
nodemon.jsonpackage.jsonroutes
api
schema
definitions.json
endpoints
access-lists.jsoncertificates.jsondead-hosts.jsonproxy-hosts.jsonredirection-hosts.jsonsettings.jsonstreams.jsontokens.jsonusers.json
examples.jsonindex.jsonscripts
setup.jstemplates
_assets.conf_certificates.conf_exploits.conf_forced_ssl.conf_header_comment.conf_hsts.conf_listen.conf_location.confdead_host.confdefault.confip_ranges.confletsencrypt-request.confproxy_host.confredirection_host.confstream.conf
yarn.lockdocker
Dockerfile
dev
docker-compose.ci.ymldocker-compose.dev.ymlrootfs
bin
etc
cont-init.d
letsencrypt.inilogrotate.d
nginx
conf.d
default.confdev.conf
nginx.confinclude
.gitignoreacme-challenge.confassets.confblock-exploits.confforce-ssl.confip_ranges.confletsencrypt-acme-challenge.confproxy.confresolvers.confssl-ciphers.conf
production.confservices.d
root
var
www
html
docs
frontend
.babelrc.env.development.eslintrc.gitignore.prettierrcREADME.mdcheck-locales.jspackage.json
fonts
feather
globalSetup.jssource-sans-pro
source-sans-pro-v14-latin-ext_latin-700.woffsource-sans-pro-v14-latin-ext_latin-700.woff2source-sans-pro-v14-latin-ext_latin-700italic.woffsource-sans-pro-v14-latin-ext_latin-700italic.woff2source-sans-pro-v14-latin-ext_latin-italic.woffsource-sans-pro-v14-latin-ext_latin-italic.woff2source-sans-pro-v14-latin-ext_latin-regular.woffsource-sans-pro-v14-latin-ext_latin-regular.woff2
html
imagesjest.eslint.jsjs
app
api.jsrouter.js
audit-log
cache.jscontroller.jsdashboard
empty
error
help
i18n.jsmain.jsnginx
access
certificates-list-item.ejscertificates
dead
proxy
access-list-item.ejsdelete.ejsdelete.jsform.ejsform.js
list
location-item.ejslocation.jsmain.ejsmain.jsredirection
stream
settings
tokens.jsui
user
users
i18n
index.jslib
login.jslogin
models
public
images
default-avatar.jpg
index.htmlfavicon
android-chrome-192x192.pngandroid-chrome-512x512.pngapple-touch-icon.pngbrowserconfig.xmlfavicon-16x16.pngfavicon-32x32.pngfavicon.icomstile-150x150.pngsafari-pinned-tab.svgsite.webmanifest
logo-256.pnglogo-bold-horizontal-grey.svglogo-no-text.svglogo-text-horizontal-grey.pnglogo-text-vertical-grey.pngscss
src
App.test.tsxApp.tsxRouter.tsxreact-app-env.d.ts
tsconfig.jsonwebpack.config.jsyarn.lockapi
npm
base.tscreateCertificateAuthority.tscreateDNSProvider.tscreateUser.tsgetCertificateAuthorities.tsgetCertificateAuthority.tsgetCertificates.tsgetDNSProvider.tsgetDNSProviders.tsgetDNSProvidersAcmesh.tsgetHealth.tsgetHostTemplates.tsgetHosts.tsgetSettings.tsgetToken.tsgetUser.tsgetUsers.tshelpers.tsindex.tsmodels.tsrefreshToken.tsresponseTypes.tssetAuth.tssetCertificateAuthority.tssetDNSProvider.tssetUser.ts
components
EmptyList.tsx
Flag
Footer.tsxHelpDrawer
Loader
Loading.tsxLocalePicker.tsxNavigation
Permissions
PrettyButton.tsxSiteWrapper.tsxSpinnerPage.tsxTable
Formatters.tsxRowActionsMenu.tsxTableHelpers.tsTableLayout.tsxTextFilter.tsxindex.tsreact-table-config.d.ts
ThemeSwitcher.tsxUnhealthy.tsxindex.tscontext
declarations.d.tsfonts
source-sans-pro
source-sans-pro-v14-latin-700.woffsource-sans-pro-v14-latin-700.woff2source-sans-pro-v14-latin-700italic.woffsource-sans-pro-v14-latin-700italic.woff2source-sans-pro-v14-latin-italic.woffsource-sans-pro-v14-latin-italic.woff2source-sans-pro-v14-latin-regular.woffsource-sans-pro-v14-latin-regular.woff2
hooks
index.tsuseCertificateAuthorities.tsuseCertificateAuthority.tsuseCertificates.tsuseDNSProvider.tsuseDNSProviders.tsuseDNSProvidersAcmesh.tsuseHealth.tsuseHostTemplates.tsuseHosts.tsuseSettings.tsuseUser.tsuseUsers.ts
img
index.scssindex.tsxlocale
modals
CertificateAuthorityCreateModal.tsxCertificateAuthorityEditModal.tsxChangePasswordModal.tsxDNSProviderCreateModal.tsxProfileModal.tsxSetPasswordModal.tsxUserCreateModal.tsxUserEditModal.tsxindex.ts
modules
pages
AccessLists
AuditLog
CertificateAuthorities
Certificates
DNSProviders
Dashboard
HostTemplates
Hosts
Login
Settings
Setup
Users
styles
theme
global
scripts
.common.shbuildx
ci
docs-buildfrontend-buildfrontend-lintgo-multiarch-wrapperinstall-s6sqlitestart-devtest-devwait-healthytest
25
backend/internal/entity/hosttemplate/filters.go
Normal file
25
backend/internal/entity/hosttemplate/filters.go
Normal file
@ -0,0 +1,25 @@
|
||||
package hosttemplate
|
||||
|
||||
import (
|
||||
"npm/internal/entity"
|
||||
)
|
||||
|
||||
var filterMapFunctions = make(map[string]entity.FilterMapFunction)
|
||||
|
||||
// getFilterMapFunctions is a map of functions that should be executed
|
||||
// during the filtering process, if a field is defined here then the value in
|
||||
// the filter will be given to the defined function and it will return a new
|
||||
// value for use in the sql query.
|
||||
func getFilterMapFunctions() map[string]entity.FilterMapFunction {
|
||||
// if len(filterMapFunctions) == 0 {
|
||||
// TODO: See internal/model/file_item.go:620 for an example
|
||||
// }
|
||||
|
||||
return filterMapFunctions
|
||||
}
|
||||
|
||||
// GetFilterSchema returns filter schema
|
||||
func GetFilterSchema() string {
|
||||
var m Model
|
||||
return entity.GetFilterSchema(m)
|
||||
}
|
129
backend/internal/entity/hosttemplate/methods.go
Normal file
129
backend/internal/entity/hosttemplate/methods.go
Normal file
@ -0,0 +1,129 @@
|
||||
package hosttemplate
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
goerrors "errors"
|
||||
"fmt"
|
||||
|
||||
"npm/internal/database"
|
||||
"npm/internal/entity"
|
||||
"npm/internal/errors"
|
||||
"npm/internal/logger"
|
||||
"npm/internal/model"
|
||||
)
|
||||
|
||||
// GetByID finds a Host by ID
|
||||
func GetByID(id int) (Model, error) {
|
||||
var m Model
|
||||
err := m.LoadByID(id)
|
||||
return m, err
|
||||
}
|
||||
|
||||
// Create will create a Host from this model
|
||||
func Create(host *Model) (int, error) {
|
||||
if host.ID != 0 {
|
||||
return 0, goerrors.New("Cannot create host template when model already has an ID")
|
||||
}
|
||||
|
||||
host.Touch(true)
|
||||
|
||||
db := database.GetInstance()
|
||||
// nolint: gosec
|
||||
result, err := db.NamedExec(`INSERT INTO `+fmt.Sprintf("`%s`", tableName)+` (
|
||||
created_on,
|
||||
modified_on,
|
||||
user_id,
|
||||
name,
|
||||
host_type,
|
||||
template,
|
||||
is_deleted
|
||||
) VALUES (
|
||||
:created_on,
|
||||
:modified_on,
|
||||
:user_id,
|
||||
:name,
|
||||
:host_type,
|
||||
:template,
|
||||
:is_deleted
|
||||
)`, host)
|
||||
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
last, lastErr := result.LastInsertId()
|
||||
if lastErr != nil {
|
||||
return 0, lastErr
|
||||
}
|
||||
|
||||
return int(last), nil
|
||||
}
|
||||
|
||||
// Update will Update a Host from this model
|
||||
func Update(host *Model) error {
|
||||
if host.ID == 0 {
|
||||
return goerrors.New("Cannot update host template when model doesn't have an ID")
|
||||
}
|
||||
|
||||
host.Touch(false)
|
||||
|
||||
db := database.GetInstance()
|
||||
// nolint: gosec
|
||||
_, err := db.NamedExec(`UPDATE `+fmt.Sprintf("`%s`", tableName)+` SET
|
||||
created_on = :created_on,
|
||||
modified_on = :modified_on,
|
||||
user_id = :user_id,
|
||||
name = :name,
|
||||
host_type = :host_type,
|
||||
template = :template,
|
||||
is_deleted = :is_deleted
|
||||
WHERE id = :id`, host)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// List will return a list of hosts
|
||||
func List(pageInfo model.PageInfo, filters []model.Filter) (ListResponse, error) {
|
||||
var result ListResponse
|
||||
var exampleModel Model
|
||||
|
||||
defaultSort := model.Sort{
|
||||
Field: "created_on",
|
||||
Direction: "ASC",
|
||||
}
|
||||
|
||||
db := database.GetInstance()
|
||||
if db == nil {
|
||||
return result, errors.ErrDatabaseUnavailable
|
||||
}
|
||||
|
||||
// Get count of items in this search
|
||||
query, params := entity.ListQueryBuilder(exampleModel, tableName, &pageInfo, defaultSort, filters, getFilterMapFunctions(), true)
|
||||
countRow := db.QueryRowx(query, params...)
|
||||
var totalRows int
|
||||
queryErr := countRow.Scan(&totalRows)
|
||||
if queryErr != nil && queryErr != sql.ErrNoRows {
|
||||
logger.Debug("%s -- %+v", query, params)
|
||||
return result, queryErr
|
||||
}
|
||||
|
||||
// Get rows
|
||||
var items []Model
|
||||
query, params = entity.ListQueryBuilder(exampleModel, tableName, &pageInfo, defaultSort, filters, getFilterMapFunctions(), false)
|
||||
err := db.Select(&items, query, params...)
|
||||
if err != nil {
|
||||
logger.Debug("%s -- %+v", query, params)
|
||||
return result, err
|
||||
}
|
||||
|
||||
result = ListResponse{
|
||||
Items: items,
|
||||
Total: totalRows,
|
||||
Limit: pageInfo.Limit,
|
||||
Offset: pageInfo.Offset,
|
||||
Sort: pageInfo.Sort,
|
||||
Filter: filters,
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
73
backend/internal/entity/hosttemplate/model.go
Normal file
73
backend/internal/entity/hosttemplate/model.go
Normal file
@ -0,0 +1,73 @@
|
||||
package hosttemplate
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"npm/internal/database"
|
||||
"npm/internal/types"
|
||||
)
|
||||
|
||||
const (
|
||||
tableName = "host_template"
|
||||
)
|
||||
|
||||
// Model is the user model
|
||||
type Model struct {
|
||||
ID int `json:"id" db:"id" filter:"id,integer"`
|
||||
CreatedOn types.DBDate `json:"created_on" db:"created_on" filter:"created_on,integer"`
|
||||
ModifiedOn types.DBDate `json:"modified_on" db:"modified_on" filter:"modified_on,integer"`
|
||||
UserID int `json:"user_id" db:"user_id" filter:"user_id,integer"`
|
||||
Name string `json:"name" db:"name" filter:"name,string"`
|
||||
Type string `json:"host_type" db:"host_type" filter:"host_type,string"`
|
||||
Template string `json:"template" db:"template" filter:"template,string"`
|
||||
IsDeleted bool `json:"is_deleted,omitempty" db:"is_deleted"`
|
||||
}
|
||||
|
||||
func (m *Model) getByQuery(query string, params []interface{}) error {
|
||||
return database.GetByQuery(m, query, params)
|
||||
}
|
||||
|
||||
// LoadByID will load from an ID
|
||||
func (m *Model) LoadByID(id int) error {
|
||||
query := fmt.Sprintf("SELECT * FROM `%s` WHERE id = ? AND is_deleted = ? LIMIT 1", tableName)
|
||||
params := []interface{}{id, 0}
|
||||
return m.getByQuery(query, params)
|
||||
}
|
||||
|
||||
// Touch will update model's timestamp(s)
|
||||
func (m *Model) Touch(created bool) {
|
||||
var d types.DBDate
|
||||
d.Time = time.Now()
|
||||
if created {
|
||||
m.CreatedOn = d
|
||||
}
|
||||
m.ModifiedOn = d
|
||||
}
|
||||
|
||||
// Save will save this model to the DB
|
||||
func (m *Model) Save() error {
|
||||
var err error
|
||||
|
||||
if m.UserID == 0 {
|
||||
return fmt.Errorf("User ID must be specified")
|
||||
}
|
||||
|
||||
if m.ID == 0 {
|
||||
m.ID, err = Create(m)
|
||||
} else {
|
||||
err = Update(m)
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// Delete will mark a host as deleted
|
||||
func (m *Model) Delete() bool {
|
||||
m.Touch(false)
|
||||
m.IsDeleted = true
|
||||
if err := m.Save(); err != nil {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
15
backend/internal/entity/hosttemplate/structs.go
Normal file
15
backend/internal/entity/hosttemplate/structs.go
Normal file
@ -0,0 +1,15 @@
|
||||
package hosttemplate
|
||||
|
||||
import (
|
||||
"npm/internal/model"
|
||||
)
|
||||
|
||||
// ListResponse is the JSON response for this list
|
||||
type ListResponse struct {
|
||||
Total int `json:"total"`
|
||||
Offset int `json:"offset"`
|
||||
Limit int `json:"limit"`
|
||||
Sort []model.Sort `json:"sort"`
|
||||
Filter []model.Filter `json:"filter,omitempty"`
|
||||
Items []Model `json:"items,omitempty"`
|
||||
}
|
Reference in New Issue
Block a user