From fac00436f9109c8652cab67a43d44656e9c44781 Mon Sep 17 00:00:00 2001 From: kolaente Date: Tue, 13 Oct 2020 21:41:29 +0200 Subject: [PATCH] Fix parsing of descriptions and multi-level values Signed-off-by: kolaente --- docs/content/doc/setup/config.md | 980 ++++++++++++++++++++++++------- magefile.go | 33 +- 2 files changed, 804 insertions(+), 209 deletions(-) diff --git a/docs/content/doc/setup/config.md b/docs/content/doc/setup/config.md index 5a645cc11..b5e00e873 100644 --- a/docs/content/doc/setup/config.md +++ b/docs/content/doc/setup/config.md @@ -40,222 +40,790 @@ Vikunja will search on various places for a config file: This is the same as the `config.yml.sample` file you'll find in the root of vikunja. -{{< highlight yaml >}} -service: - # This token is used to verify issued JWT tokens. - # Default is a random token which will be generated at each startup of vikunja. - # (This means all already issued tokens will be invalid once you restart vikunja) - JWTSecret: "cei6gaezoosah2bao3ieZohkae5aicah" - # The interface on which to run the webserver - interface: ":3456" - # The URL of the frontend, used to send password reset emails. - frontendurl: "" - # The base path on the file system where the binary and assets are. - # Vikunja will also look in this path for a config file, so you could provide only this variable to point to a folder - # with a config file which will then be used. - rootpath: - # The max number of items which can be returned per page - maxitemsperpage: 50 - # If set to true, enables a /metrics endpoint for prometheus to collect metrics about the system - # You'll need to use redis for this in order to enable common metrics over multiple nodes - enablemetrics: false - # Enable the caldav endpoint, see the docs for more details - enablecaldav: true - # Set the motd message, available from the /info endpoint - motd: "" - # Enable sharing of lists via a link - enablelinksharing: true - # Whether to let new users registering themselves or not - enableregistration: true - # Whether to enable task attachments or not - enabletaskattachments: true - # The time zone all timestamps are in - timezone: GMT - # Whether task comments should be enabled or not - enabletaskcomments: true - # Whether totp is enabled. In most cases you want to leave that enabled. - enabletotp: true - # If not empty, enables logging of crashes and unhandled errors in sentry. - sentrydsn: '' + -database: - # Database type to use. Supported types are mysql, postgres and sqlite. - type: "sqlite" - # Database user which is used to connect to the database. - user: "vikunja" - # Databse password - password: "" - # Databse host - host: "localhost" - # Databse to use - database: "vikunja" - # When using sqlite, this is the path where to store the data - path: "./vikunja.db" - # Sets the max open connections to the database. Only used when using mysql and postgres. - maxopenconnections: 100 - # Sets the maximum number of idle connections to the db. - maxidleconnections: 50 - # The maximum lifetime of a single db connection in miliseconds. - maxconnectionlifetime: 10000 - # Secure connection mode. Only used with postgres. - # (see https://pkg.go.dev/github.com/lib/pq?tab=doc#hdr-Connection_String_Parameters) - sslmode: disable +## service -cache: - # If cache is enabled or not - enabled: false - # Cache type. Possible values are "keyvalue", "memory" or "redis". - # When choosing "keyvalue" this setting follows the one configured in the "keyvalue" section. - # When choosing "redis" you will need to configure the redis connection seperately. - type: keyvalue - # When using memory this defines the maximum size an element can take - maxelementsize: 1000 -redis: - # Whether to enable redis or not - enabled: false - # The host of the redis server including its port. - host: 'localhost:6379' - # The password used to authenicate against the redis server - password: '' - # 0 means default database - db: 0 -cors: - # Whether to enable or disable cors headers. - # Note: If you want to put the frontend and the api on seperate domains or ports, you will need to enable this. - # Otherwise the frontend won't be able to make requests to the api through the browser. - enable: true - # A list of origins which may access the api. - origins: - - * - # How long (in seconds) the results of a preflight request can be cached. - maxage: 0 +### JWTSecret -mailer: - # Whether to enable the mailer or not. If it is disabled, all users are enabled right away and password reset is not possible. - enabled: false - # SMTP Host - host: "" - # SMTP Host port - port: 587 - # SMTP username - username: "user" - # SMTP password - password: "" - # Wether to skip verification of the tls certificate on the server - skiptlsverify: false - # The default from address when sending emails - fromemail: "mail@vikunja" - # The length of the mail queue. - queuelength: 100 - # The timeout in seconds after which the current open connection to the mailserver will be closed. - queuetimeout: 30 - # By default, vikunja will try to connect with starttls, use this option to force it to use ssl. - forcessl: false +This token is used to verify issued JWT tokens. +Default is a random token which will be generated at each startup of vikunja. +(This means all already issued tokens will be invalid once you restart vikunja) -log: - # A folder where all the logfiles should go. - path: logs - # Whether to show any logging at all or none - enabled: true - # Where the normal log should go. Possible values are stdout, stderr, file or off to disable standard logging. - standard: "stdout" - # Change the log level. Possible values (case-insensitive) are CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG. - level: "INFO" - # Whether or not to log database queries. Useful for debugging. Possible values are stdout, stderr, file or off to disable database logging. - database: "off" - # The log level for database log messages. Possible values (case-insensitive) are CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG. - databaselevel: "WARNING" - # Whether to log http requests or not. Possible values are stdout, stderr, file or off to disable http logging. - http: "stdout" - # Echo has its own logging which usually is unnessecary, which is why it is disabled by default. Possible values are stdout, stderr, file or off to disable standard logging. - echo: "off" +Default: `` -ratelimit: - # whether or not to enable the rate limit - enabled: false - # The kind on which rates are based. Can be either "user" for a rate limit per user or "ip" for an ip-based rate limit. - kind: user - # The time period in seconds for the limit - period: 60 - # The max number of requests a user is allowed to do in the configured time period - limit: 100 - # The store where the limit counter for each user is stored. - # Possible values are "keyvalue", "memory" or "redis". - # When choosing "keyvalue" this setting follows the one configured in the "keyvalue" section. - store: keyvalue +### interface -files: - # The path where files are stored - basepath: ./files # relative to the binary - # The maximum size of a file, as a human-readable string. - # Warning: The max size is limited 2^64-1 bytes due to the underlying datatype - maxsize: 20MB +The interface on which to run the webserver -migration: - # These are the settings for the wunderlist migrator - wunderlist: - # Wheter to enable the wunderlist migrator or not - enable: false - # The client id, required for making requests to the wunderlist api - # You need to register your vikunja instance at https://developer.wunderlist.com/apps/new to get this - clientid: - # The client secret, also required for making requests to the wunderlist api - clientsecret: - # The url where clients are redirected after they authorized Vikunja to access their wunderlist stuff. - # This needs to match the url you entered when registering your Vikunja instance at wunderlist. - # This is usually the frontend url where the frontend then makes a request to /migration/wunderlist/migrate - # with the code obtained from the wunderlist api. - # Note that the vikunja frontend expects this to be /migrate/wunderlist - redirecturl: - todoist: - # Wheter to enable the todoist migrator or not - enable: false - # The client id, required for making requests to the wunderlist api - # You need to register your vikunja instance at https://developer.todoist.com/appconsole.html to get this - clientid: - # The client secret, also required for making requests to the todoist api - clientsecret: - # The url where clients are redirected after they authorized Vikunja to access their todoist items. - # This needs to match the url you entered when registering your Vikunja instance at todoist. - # This is usually the frontend url where the frontend then makes a request to /migration/todoist/migrate - # with the code obtained from the todoist api. - # Note that the vikunja frontend expects this to be /migrate/todoist - redirecturl: +Default: `:3456` -avatar: - # When using gravatar, this is the duration in seconds until a cached gravatar user avatar expires - gravatarexpiration: 3600 +### frontendurl -backgrounds: - # Whether to enable backgrounds for lists at all. - enabled: true - providers: - upload: - # Whethere to enable uploaded list backgrounds - enabled: true - unsplash: - # Whether to enable setting backgrounds from unsplash as list backgrounds - enabled: false - # You need to create an application for your installation at https://unsplash.com/oauth/applications/new - # and set the access token below. - accesstoken: - # The unsplash application id is only used for pingback and required as per their api guidelines. - # You can find the Application ID in the dashboard for your API application. It should be a numeric ID. - # It will only show in the UI if your application has been approved for Enterprise usage, therefore if - # you’re in Demo mode, you can also find the ID in the URL at the end: https://unsplash.com/oauth/applications/:application_id - applicationid: +The URL of the frontend, used to send password reset emails. -# Legal urls -# Will be shown in the frontend if configured here -legal: - imprinturl: - privacyurl: +Default: `` + +### rootpath + +The base path on the file system where the binary and assets are. +Vikunja will also look in this path for a config file, so you could provide only this variable to point to a folder +with a config file which will then be used. + +Default: `` + +### maxitemsperpage + +The max number of items which can be returned per page + +Default: `50` + +### enablemetrics + +If set to true, enables a /metrics endpoint for prometheus to collect metrics about the system +You'll need to use redis for this in order to enable common metrics over multiple nodes + +Default: `false` + +### enablecaldav + +Enable the caldav endpoint, see the docs for more details + +Default: `true` + +### motd + +Set the motd message, available from the /info endpoint + +Default: `` + +### enablelinksharing + +Enable sharing of lists via a link + +Default: `true` + +### enableregistration + +Whether to let new users registering themselves or not + +Default: `true` + +### enabletaskattachments + +Whether to enable task attachments or not + +Default: `true` + +### timezone + +The time zone all timestamps are in + +Default: `GMT` + +### enabletaskcomments + +Whether task comments should be enabled or not + +Default: `true` + +### enabletotp + +Whether totp is enabled. In most cases you want to leave that enabled. + +Default: `true` + +### sentrydsn + +If not empty, enables logging of crashes and unhandled errors in sentry. + +Default: `` + +## database + + + +### type + +Database type to use. Supported types are mysql, postgres and sqlite. + +Default: `sqlite` + +### user + +Database user which is used to connect to the database. + +Default: `vikunja` + +### password + +Databse password + +Default: `` + +### host + +Databse host + +Default: `localhost` + +### database + +Databse to use + +Default: `vikunja` + +### path + +When using sqlite, this is the path where to store the data + +Default: `./vikunja.db` + +### maxopenconnections + +Sets the max open connections to the database. Only used when using mysql and postgres. + +Default: `100` + +### maxidleconnections + +Sets the maximum number of idle connections to the db. + +Default: `50` + +### maxconnectionlifetime + +The maximum lifetime of a single db connection in miliseconds. + +Default: `10000` + +### sslmode + +Secure connection mode. Only used with postgres. +(see https://pkg.go.dev/github.com/lib/pq?tab=doc#hdr-Connection_String_Parameters) + +Default: `disable` + +## cache + + + +### enabled + +If cache is enabled or not + +Default: `false` + +### type + +Cache type. Possible values are "keyvalue", "memory" or "redis". +When choosing "keyvalue" this setting follows the one configured in the "keyvalue" section. +When choosing "redis" you will need to configure the redis connection seperately. + +Default: `keyvalue` + +### maxelementsize + +When using memory this defines the maximum size an element can take + +Default: `1000` + +## redis + + + +### enabled + +Whether to enable redis or not + +Default: `false` + +### host + +The host of the redis server including its port. + +Default: `localhost:6379` + +### password + +The password used to authenicate against the redis server + +Default: `` + +### db + +0 means default database + +Default: `0` + +## cors + + + +### enable + +Whether to enable or disable cors headers. +Note: If you want to put the frontend and the api on seperate domains or ports, you will need to enable this. + Otherwise the frontend won't be able to make requests to the api through the browser. + +Default: `true` + +### origins + +A list of origins which may access the api. + +Default: `` + +### maxage + +How long (in seconds) the results of a preflight request can be cached. + +Default: `0` + +## mailer + + + +### enabled + +Whether to enable the mailer or not. If it is disabled, all users are enabled right away and password reset is not possible. + +Default: `false` + +### host + +SMTP Host + +Default: `` + +### port + +SMTP Host port + +Default: `587` + +### username + +SMTP username + +Default: `user` + +### password + +SMTP password + +Default: `` + +### skiptlsverify + +Wether to skip verification of the tls certificate on the server + +Default: `false` + +### fromemail + +The default from address when sending emails + +Default: `mail@vikunja` + +### queuelength + +The length of the mail queue. + +Default: `100` + +### queuetimeout + +The timeout in seconds after which the current open connection to the mailserver will be closed. + +Default: `30` + +### forcessl + +By default, vikunja will try to connect with starttls, use this option to force it to use ssl. + +Default: `false` + +## log + + + +### path + +A folder where all the logfiles should go. + +Default: `logs` + +### enabled + +Whether to show any logging at all or none + +Default: `true` + +### standard + +Where the normal log should go. Possible values are stdout, stderr, file or off to disable standard logging. + +Default: `stdout` + +### level + +Change the log level. Possible values (case-insensitive) are CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG. + +Default: `INFO` + +### database + +Whether or not to log database queries. Useful for debugging. Possible values are stdout, stderr, file or off to disable database logging. + +Default: `off` + +### databaselevel + +The log level for database log messages. Possible values (case-insensitive) are CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG. + +Default: `WARNING` + +### http + +Whether to log http requests or not. Possible values are stdout, stderr, file or off to disable http logging. + +Default: `stdout` + +### echo + +Echo has its own logging which usually is unnessecary, which is why it is disabled by default. Possible values are stdout, stderr, file or off to disable standard logging. + +Default: `off` + +## ratelimit + + + +### enabled + +whether or not to enable the rate limit + +Default: `false` + +### kind + +The kind on which rates are based. Can be either "user" for a rate limit per user or "ip" for an ip-based rate limit. + +Default: `user` + +### period + +The time period in seconds for the limit + +Default: `60` + +### limit + +The max number of requests a user is allowed to do in the configured time period + +Default: `100` + +### store + +The store where the limit counter for each user is stored. +Possible values are "keyvalue", "memory" or "redis". +When choosing "keyvalue" this setting follows the one configured in the "keyvalue" section. + +Default: `keyvalue` + +## files + + + +### basepath + +The path where files are stored + +Default: `./files` + +### maxsize + +The maximum size of a file, as a human-readable string. +Warning: The max size is limited 2^64-1 bytes due to the underlying datatype + +Default: `20MB` + +## migration + + + +### wunderlist + +These are the settings for the wunderlist migrator + +Default: `` + +### todoist + +Default: `` + +## avatar + + + +### gravatarexpiration + +When using gravatar, this is the duration in seconds until a cached gravatar user avatar expires + +Default: `3600` + +## backgrounds + + + +### enabled + +Whether to enable backgrounds for lists at all. + +Default: `true` + +### providers + +Default: `` + +## legal + +Legal urls +Will be shown in the frontend if configured here + + + +### imprinturl + +Default: `` + +### privacyurl + +Default: `` + +## keyvalue + +Key Value Storage settings +The Key Value Storage is used for different kinds of things like metrics and a few cache systems. + + + +### type + +The type of the storage backend. Can be either "memory" or "redis". If "redis" is chosen it needs to be configured seperately. + +Default: `memory` + +mit + +The max number of requests a user is allowed to do in the configured time period + +Default: `100` + +### limit + +Default: `100` + +### store + +The store where the limit counter for each user is stored. +Possible values are "keyvalue", "memory" or "redis". +When choosing "keyvalue" this setting follows the one configured in the "keyvalue" section. + +Default: `keyvalue` + +### store + +Default: `keyvalue` + +## files + + + +### basepath + +The path where files are stored + +Default: `./files` + +### basepath + +Default: `./files` + +### maxsize + +The maximum size of a file, as a human-readable string. +Warning: The max size is limited 2^64-1 bytes due to the underlying datatype + +Default: `20MB` + +### maxsize + +Default: `20MB` + +## migration + + + +### wunderlist + +These are the settings for the wunderlist migrator + +Default: `` + +### wunderlist + +Default: `` + +#### enable + +Wheter to enable the wunderlist migrator or not + +Default: `` + +#### false + +Default: `` + +#### clientid + +The client id, required for making requests to the wunderlist api +You need to register your vikunja instance at https://developer.wunderlist.com/apps/new to get this + +Default: `` + + +#### clientsecret + +The client secret, also required for making requests to the wunderlist api + +Default: `` + + +#### redirecturl + +The url where clients are redirected after they authorized Vikunja to access their wunderlist stuff. +This needs to match the url you entered when registering your Vikunja instance at wunderlist. +This is usually the frontend url where the frontend then makes a request to /migration/wunderlist/migrate +with the code obtained from the wunderlist api. +Note that the vikunja frontend expects this to be /migrate/wunderlist + +Default: `` + + +### todoist + +Default: `` + +## avatar + + + +### gravatarexpiration + +When using gravatar, this is the duration in seconds until a cached gravatar user avatar expires + +Default: `3600` + +### gravatarexpiration + +Default: `3600` + +## backgrounds + + + +### enabled + +Whether to enable backgrounds for lists at all. + +Default: `true` + +### enabled + +Default: `true` + +### providers + +Default: `` + +### providers + +Default: `` + +#### upload + +Default: `` + + +##### enabled + +Whethere to enable uploaded list backgrounds + +Default: `true` + +##### enabled + +Default: `true` + +#### unsplash + +Default: `` + + +##### enabled + +Whether to enable setting backgrounds from unsplash as list backgrounds + +Default: `false` + +##### enabled + +Default: `false` + +##### accesstoken + +You need to create an application for your installation at https://unsplash.com/oauth/applications/new +and set the access token below. + +Default: `` + +##### accesstoken + +Default: `` + +##### applicationid + +The unsplash application id is only used for pingback and required as per their api guidelines. +You can find the Application ID in the dashboard for your API application. It should be a numeric ID. +It will only show in the UI if your application has been approved for Enterprise usage, therefore if +you�re in Demo mode, you can also find the ID in the URL at the end: https://unsplash.com/oauth/applications/:application_id + +Default: `` + +## legal + +Legal urls +Will be shown in the frontend if configured here + + + +### imprinturl + +Default: `` + +### imprinturl + +Default: `` + +### privacyurl + +Default: `` + +## keyvalue + +Key Value Storage settings +The Key Value Storage is used for different kinds of things like metrics and a few cache systems. + + + +### type + +The type of the storage backend. Can be either "memory" or "redis". If "redis" is chosen it needs to be configured seperately. + +Default: `memory` + +### type + +Default: `memory` + + chosen it needs to be configured seperately. + +Default: `` + +### type + +Default: `memory` + +## unsplash + +Default: `` + + +##### enabled + +Whether to enable setting backgrounds from unsplash as list backgrounds + +Default: `` + +##### enabled + +Default: `false` + +##### accesstoken + +You need to create an application for your installation at https://unsplash.com/oauth/applications/new +and set the access token below. + +Default: `` + +##### accesstoken + +Default: `` + +##### applicationid + +The unsplash application id is only used for pingback and required as per their api guidelines. +You can find the Application ID in the dashboard for your API application. It should be a numeric ID. +It will only show in the UI if your application has been approved for Enterprise usage, therefore if +you�re in Demo mode, you can also find the ID in the URL at the end: https://unsplash.com/oauth/applications/:application_id + +Default: `` + +##### applicationid + +Default: `` + +## legal + +Legal urls +Will be shown in the frontend if configured here + + + +### imprinturl + +Default: `` + +### imprinturl + +Default: `` + +### privacyurl + +Default: `` + +### privacyurl + +Default: `` + +## keyvalue + +Key Value Storage settings +The Key Value Storage is used for different kinds of things like metrics and a few cache systems. + + + +### type + +The type of the storage backend. Can be either "memory" or "redis". If "redis" is chosen it needs to be configured seperately. + +Default: `` + +### type + +Default: `memory` -# Key Value Storage settings -# The Key Value Storage is used for different kinds of things like metrics and a few cache systems. -keyvalue: - # The type of the storage backend. Can be either "memory" or "redis". If "redis" is chosen it needs to be configured seperately. - type: "memory" -{{< /highlight >}} diff --git a/magefile.go b/magefile.go index efab51287..fc91de798 100644 --- a/magefile.go +++ b/magefile.go @@ -746,7 +746,9 @@ func parseYamlConfigNode(node *yaml.Node) (config *configOption) { description: strings.ReplaceAll(node.HeadComment, "# ", ""), } - // TODO: second-level comments don't work + valMap := make(map[string]*configOption) + + var lastOption *configOption for i, n2 := range node.Content { coo := &configOption{ @@ -754,8 +756,23 @@ func parseYamlConfigNode(node *yaml.Node) (config *configOption) { description: strings.ReplaceAll(n2.HeadComment, "# ", ""), } + // If there's a key in valMap for the current key we should use that to append etc + // Else we just create a new configobject + co, exists := valMap[n2.Value] + if exists { + co.description = coo.description + } else { + valMap[n2.Value] = coo + config.children = append(config.children, coo) + } + + // fmt.Println(i, coo.key, coo.description, n2.Value) + if i%2 == 0 { + lastOption = coo continue + } else { + lastOption.defaultValue = n2.Value } if i-1 >= 0 && i-1 <= len(node.Content) && node.Content[i-1].Value != "" { @@ -763,8 +780,6 @@ func parseYamlConfigNode(node *yaml.Node) (config *configOption) { coo.key = node.Content[i-1].Value } - config.children = append(config.children, coo) - if len(n2.Content) > 0 { for _, n := range n2.Content { coo.children = append(coo.children, parseYamlConfigNode(n)) @@ -776,9 +791,20 @@ func parseYamlConfigNode(node *yaml.Node) (config *configOption) { } func printConfig(config []*configOption, level int) (rendered string) { + + // Keep track of what we already printed to prevent printing things twice + printed := make(map[string]bool) + for _, option := range config { + if option.key != "" { + // Filter out all config objects where the default value == key + // Yaml is weired: It gives you a slice with an entry each for the key and their value. + if printed[option.key] { + continue + } + rendered += "#" for i := 0; i <= level; i++ { rendered += "#" @@ -799,6 +825,7 @@ func printConfig(config []*configOption, level int) (rendered string) { } } + printed[option.key] = true rendered += "\n" + printConfig(option.children, level+1) }