This is the annotated SystemGlobals.properties file found in the WEB-INF/config directory. A lot of these settings can be changed under Admin Control Panel -> Configurations, but not all of them. The ones that can be changed are stored in WEB-INF/config/jforum-custom.conf. If you want to make changes, add them to that file, not to SystemGlobals.properties itself. Make sure that JForum is not running, or the file (and any changes) might get overwritten.
forum.link = http://localhost:8080/jforum
homepage.link = http://localhost:8080
forum.name = My Forum
forum.page.title = ${forum.name} - your board description
forum.page.metatag.keywords = some keywords for your board
forum.page.metatag.description = here goes the board description
// If "true", all redirect URLs will include the value of "redirect.base.url" as prefix
redirect.absolute.paths = false
// This property is only used when redirect.absolute.paths = true. You can use
// it to force a redirect prefix other than forum.link. It is specially useful when using proxied.context.path
redirect.base.url = ${forum.link}
// In case you're using mod_proxy or something similar, you can set this property to force
// JForum to use a specific context path. Leave it blank if you don't need to use it.
// Note that if you set this property, you will also want to properly set "forum.link" to use the same context path.
proxied.context.path =
// Default language to use. Can be any value in config/languages/locales.properties
i18n.board.default = en_US
// Security Hash. You should change this value just before the
// first run of your forum. The value can be anything and should be
// a long and complex sequence. This value will be used to increase security
user.hash.sequence = 04904SDFfhfh449911-**%$nvMDFHDhskda6546546as4df4ads6f54ads654
// X-Frame-Options: https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options
// Other possible values are DENY and ALLOW-FROM (support for which is patchy)
// If left blank, the header will not be set; this is not recommended.
http.x-frame-options=SAMEORIGIN
// Page encoding
encoding = UTF-8
// Set it to "true" to require that Moderators log their actions
moderation.logging.enabled = true
// show online status
show.online.status = true
// show IP address
show.ip = true
// show avatars
show.avatar = true
// debug mode - if true, causes template changes to be picked up quickly,
// and untranslated properties to be shown prominently (rather than replaced by the default language)
development = false
// Database type to use
database.driver.name = mysql
// Can be net.jforum.SimpleConnection (connection not pooled, not recommended)
// net.jforum.PooledConnection (using C3P0 pool, the previous default)
// net.jforum.HikariPooledConnection (using HikariCP pool, the new default)
// net.jforum.DataSourceConnection (using a data source, if available)
database.connection.implementation = net.jforum.HikariPooledConnection
// Enable / Disable transactions
database.use.transactions = true
// DataSource name, in case of using net.jforum.DataSourceConnection
database.datasource.name = java:/MySqlDS
// Time in seconds to healthcheck all database connections
database.ping.delay = 3600
// Extra parameters to pass to C3P0 (only when using PooledConnection)
// Form is key=value;key2=value2;keyN=valueN
c3p0.extra.params = checkoutTimeout=120000;debugUnreturnedConnectionStackTraces=false;unreturnedConnectionTimeout=180;numHelperThreads=10
topic.cache.enabled = true
posts.cache.enabled = true
topic.cache.size = 45
posts.cache.size = 100
topicsPerPage = 15
postsPerPage = 15
usersPerPage = 30
topic.hottest = 50
top.downloads = 50
// whether the hottest topics are selected by number of views (true) or number of replies (false)
topic.hottest.sort = true
// Delay (in ms) between each post from the user. Set it to 0 (zero) to disable the config
posts.new.delay = 15000
// Whether posts can be edited after a response has been posted.
posts.edit.after.reply = true
// Forum ID for trash can; leave at 0 if you want topics to be permanently deleted
forum.trashcan.id = 0
// Google Analytics ID, looks like UA-XXXXXXX-X; leave blank if you're not using GA
google.analytics.tracker =
// If set to "true", only moderators and admins are allowed to see
// the error stack trace when an exception occurs in the board.
stacktrace.moderators.only = true
// Enable or disable registration of new users.
registration.enabled = true
// Whether emails not matching the registration emails/domains can register (and be assigned to defaultUserGroup).
// Set to false to allow only the specified emails/domains to register.
registration.emailNotMatching.enabled = false
dateTime.format = dd/MM/yyyy HH\:mm\:ss
// Which timezone to use for showing dates. Options are something like "Europe/Berlin", "America/New_York" or "Asia/Taipei".
// See https://en.wikipedia.org/wiki/List_of_tz_database_time_zones for the full list. Leave blank for system default timezone
dateTime.timezone =
// creates human readable, relative timestamps like those seen on Digg, Twitter, and Facebook
dateTime.pretty = false
// Enable or disable private messages
allow.pm = true
// RSS date and time format. If you want to include the timezone, use
// EEE, d MMM yyyy HH:mm:ss z
// However, currently JForum does not include the timezone when writing messages data to the database
rss.datetime.format = EEE, d MMM yyyy HH:mm:ss
// RSS
rss.enabled = true
// Social sharing: whether to show the sharing button on topic pages
social.enabled = false
// The list of sites to show, in the order they're shown.
social.sites.list = facebook, twitter, reddit, tumblr, linkedin, xing, mail, print, pocket
// Also possible: stumbleupon, pinterest, info, addthis, flattr, diaspora, threema, weibo, tencent-weibo, qzone, telegram, vk, flipboard, buffer
// whether to show the list of users to everybody, or just admins and moderators (the default)
user.list.public = false
// whether to show the moderation log to everybody, or just admins and moderators (the default)
moderation.log.public = false
// Comma-separated list of pages that show banners. Possible are : index, forum, topic
banner.pages.list = index, forum, topic
// creates human readable, relative timestamps like those seen on Digg, Twitter, and Facebook
dateTime.pretty = false
// Proxy handling when logging in
// If set to true, the header X-Forwarded-Host will be ignored when building the redirect URL
// after a successful login. Usually useful when running behind a reverse proxy
login.ignore.xforwardedhost = false
// If true, JForum will not try to redirect the browser session to the HTTP Referer (if any) after successfully logging in a user
login.ignore.referer = false
// board-wide announcement to show on all pages
announcement=
captcha.registration = true
captcha.posts = true
captcha.ignore.case = true
captcha.admins.moderators = false
captcha.width = 250
captcha.height = 75
captcha.min.words = 4
captcha.max.words = 6
captcha.min.font.size = 25
captcha.max.font.size = 35
// Passwords can not be shorter than this. No other constraints are applied.
password.min.length = 8
// Permitted HTML tags and attributes when posting a message
html.tags.welcome = a, img, font, b, i, u, li, ul, br, hr, p, tt, strike
html.attributes.welcome = href, target, rel, src, width, height, size, face, color
// Allow or not relative links in the messages. If set to true, links starting with / are allowed,
// otherwise it should start with the values defined in the key html.links.allow.protocols
html.links.allow.relative = false
// Protocols allowed in the links posted in the messages. Only used if html.links.allow.relative
// is set to false. Any value other than those declared will result in an empty link.
html.links.allow.protocols = http, https, mailto, ftp
// Max length for the username
username.max.length = 50
// Directory to store the avatar files
avatar.image.dir = images/avatar
avatar.store.dir = ${application.path}/${avatar.image.dir}/
avatar.maxHeight = 130
avatar.maxWidth = 130
avatarMaxKbSize = 25
// Allow or not the user to link to an external avatar. To disable, set to "false"
avatar.allow.external.url = true
agreement.show = true
agreement.files.path = /templates/agreement
agreement.default.file = terms_en_US.txt
// Board statistics
statistics.ringSize = 100
statistics.active = true
// Allow or not the anonymous user to download an attachment. To disable, set to "false"
attachments.anonymous = true
// Maximum of attachments per post
attachments.max.post = 3
// Create thumbnails for attached images
attachments.images.createthumb = true
// Whether to show the full-sized image as a popup when hovering over an image thumbnail.
// This causes all images to be downloaded in full size - which may not be wanted.
attachments.images.thumb.hover.show = false
// If the image size is less than the specified size, then thumbs are not created
attachments.images.thumb.maxsize.w = 400
attachments.images.thumb.maxsize.h = 400
// If "true", tell the application to display the regular download box for thumbnails as well.
// If "false", then only the thumb will be shown within the message, and then the user should
// click on the image to download the full version
attachments.images.thumb.box.show = true
// Icon to identify topics / posts with attachments
attachments.icon = images/icon_clip.gif
// Directory to store the files
attachments.upload.dir = upload
attachments.store.dir = ${application.path}/${attachments.upload.dir}
// If "true", a mail will be sent to users when a topic is answered. To disable, set it to "false"
mail.notify.answers = false
// SMTP config
mail.sender = email@sender.address
mail.smtp.auth = true
mail.smtp.host = localhost
// Non-SSL default port is 25. If SSL, the default is 465.
mail.smtp.port = 25
mail.smtp.username = your@smtp.username
mail.smtp.password = smtppassword
// a list of additional properties to be passed to the SMTP session, see example:
// mail.smtp.additional.properties = property1=value2, property2=value2
mail.smtp.additional.properties = mail.mime.address.strict=false
// the period in milliseconds JForum waits before sending next mail to SMTP server.
// Some SMTP server will response 421 if you send a lot of mails in a very short time.
// set it to 0 (zero) to disable it completely
mail.smtp.delay = 2000
// SSL support for SMTP. Set it to "true" if your host requires that (GMail does). Don't forget to change the mail.smtp.port too
mail.smtp.ssl = false
// If true, allow users to interact to the forum using any email client, by just sending a message to a specific address
mail.pop3.integration.enabled = false
// If "false", will not add attachments to posts
mail.pop3.integration.attachments = true
// If "false", deletes all messages retrieved from a POP3 connection. If "true", keeps them on the server
mail.pop3.debug.keep.messages = true
// If set to true, the POP3 TOP command will not be used to fetch message headers.
// This is useful for POP3 servers that don't properly implement the TOP command,
// or that provide incorrect information in the TOP command results.
mail.pop3.disabletop = true
// If the mail.smtp.host cannot be resolved, JavaMail sends a HELO without a hostname -
// which is a violation of the SMTP protocol. You can set this property to force the hostname
mail.smtp.localhost =
// If "true", requires all new users to validate their email addresses in order to be accepted in the system
mail.user.email.auth = false
// Can be "text" or "html"
mail.messageFormat = html
mail.charset = UTF-8
mail.template.encoding = UTF-8
mail.lostPassword.subject = [${forum.name}] Password recovery
mail.lostPassword.messageFile = mail/${i18n.board.default}/lostPassword.txt
mail.newAnswer.subject = [${forum.name}] Message posted: {0}
mail.newAnswer.messageFile = mail/${i18n.board.default}/mailNewReply.txt
mail.newPm.subject = [${forum.name}] Private Message
mail.newPm.messageFile = mail/${i18n.board.default}/newPrivateMessage.txt
mail.newTopic.subject = [${forum.name}] New Topic: {0}
mail.newTopic.messageFile = mail/${i18n.board.default}/mailNewTopic.txt
mail.activationKey.subject = [${forum.name}] Activate forum account
mail.activationKey.messageFile = mail/${i18n.board.default}/activateAccount.txt
mail.summary.weekly.subject = [${forum.name}] Weekly Summary
mail.summary.weekly.messageFile = mail/${i18n.board.default}/summaryMessage.txt
extension.field = extension
// DKIM properties for additional mail authenticity
// See https://github.com/markenwerk/java-utils-mail-dkim for help on how to set it up.
// At least signingDomain and derFile need to be filled in, otherwise DKIM will not be used.
// The signing domain to be used.
mail.dkim.signingDomain =
// The selector to be used.
mail.dkim.selector = default
// A file that contains the DER encoded RSA private key to be used.
mail.dkim.derFile =
// The identity
mail.dkim.identity = ${mail.sender}
// Set it to "true" to send "403 Forbidden" header instead of displaying a nice error message to the user, in case of banning
banlist.send.403forbidden = false
search.indexing.enabled = true
//lucene.analyzer.default = org.apache.lucene.analysis.standard.StandardAnalyzer
lucene.analyzer.default = net.jforum.search.PorterStandardAnalyzer
lucene.analyzer.arabic = org.apache.lucene.analysis.ar.ArabicAnalyzer
lucene.analyzer.bulgarian = org.apache.lucene.analysis.bg.BulgarianAnalyzer
lucene.analyzer.bengali = org.apache.lucene.analysis.bn.BengaliAnalyzer
lucene.analyzer.brazilian = org.apache.lucene.analysis.br.BrazilianAnalyzer
lucene.analyzer.catalan = org.apache.lucene.analysis.ca.CatalanAnalyzer
lucene.analyzer.chinese = org.apache.lucene.analysis.cjk.CJKAnalyzer
lucene.analyzer.sorani = org.apache.lucene.analysis.ckb.SoraniAnalyzer
lucene.analyzer.czech = org.apache.lucene.analysis.cz.CzechAnalyzer
lucene.analyzer.danish = org.apache.lucene.analysis.da.DanishAnalyzer
lucene.analyzer.german = org.apache.lucene.analysis.de.GermanAnalyzer
lucene.analyzer.greek = org.apache.lucene.analysis.el.GreekAnalyzer
lucene.analyzer.english = org.apache.lucene.analysis.en.EnglishAnalyzer
lucene.analyzer.spanish = org.apache.lucene.analysis.es.SpanishAnalyzer
lucene.analyzer.basque = org.apache.lucene.analysis.eu.BasqueAnalyzer
lucene.analyzer.persian = org.apache.lucene.analysis.fa.PersianAnalyzer
lucene.analyzer.finnish = org.apache.lucene.analysis.fi.FinnishAnalyzer
lucene.analyzer.french = org.apache.lucene.analysis.fr.FrenchAnalyzer
lucene.analyzer.irish = org.apache.lucene.analysis.ga.IrishAnalyzer
lucene.analyzer.galician = org.apache.lucene.analysis.gl.GalicianAnalyzer
lucene.analyzer.hindi = org.apache.lucene.analysis.hi.HindiAnalyzer
lucene.analyzer.hungarian = org.apache.lucene.analysis.hu.HungarianAnalyzer
lucene.analyzer.armenian = org.apache.lucene.analysis.hy.ArmenianAnalyzer
lucene.analyzer.indonesian = org.apache.lucene.analysis.id.IndonesianAnalyzer
lucene.analyzer.italian = org.apache.lucene.analysis.it.ItalianAnalyzer
lucene.analyzer.lithuanian = org.apache.lucene.analysis.lt.LithuanianAnalyzer
lucene.analyzer.latvian = org.apache.lucene.analysis.lv.LatvianAnalyzer
lucene.analyzer.dutch = org.apache.lucene.analysis.nl.DutchAnalyzer
lucene.analyzer.norwegian = org.apache.lucene.analysis.no.NorwegianAnalyzer
lucene.analyzer.portuguese = org.apache.lucene.analysis.pt.PortugueseAnalyzer
lucene.analyzer.romanian = org.apache.lucene.analysis.ro.RomanianAnalyzer
lucene.analyzer.russian = org.apache.lucene.analysis.ru.RussianAnalyzer
lucene.analyzer.swedish = org.apache.lucene.analysis.sv.SwedishAnalyzer
lucene.analyzer.thai = org.apache.lucene.analysis.th.ThaiAnalyzer
lucene.analyzer.turkish = org.apache.lucene.analysis.tr.TurkishAnalyzer
lucene.analyzer = ${lucene.analyzer.default}
// Languages for which stop words can be removed during searches:
// ar, br, cz, de, en, fr, bg, bn, ca, cjk, ckb, da, el, es, eu, fa, fi, ga, gl, hi, hu, hy, id, it, lt, lv, nl, no, pt, ro, ru, sv, th, tr
// You should remove stop words for languages in which your forum has content.
// List all languages in the next line for which you have content.
// Default is English only, because that's how it used to work.
lucene.analyzer.stopwords = en
// Full path to where the index should be written. It must be writable by the user who's running the web server
lucene.index.write.path = ${resource.dir}/jforumLuceneIndex
// Used for re-indexation. It is the number of documents to keep in memory
// before flushing them to the disk. Keep in mind that a higher number means a higher memory usage
lucene.indexer.ram.numdocs = 10000
// Number of posts to retrieve on each read from the database. A higher number means a higher memory usage
lucene.indexer.db.fetch.count = 50
// whether or not to index (and thus find during a search) attachments
lucene.index.attachments = true
karma.show = true
karma.min.points = 1
karma.max.points = 5
// Authentication type: use one of the following options
// sso: SSO based authentication. The called class will be the one
// specified by the key "sso.implementation", which must be an implementation of net.jforum.sso.SSO
// default: Non-SSO authentication, which relies on the key
// "login.authenticator" to validate users. For more information, please see
// net.jforum.sso.LoginAuthenticator and the default implementation.
authentication.type = default
// The above key will be used when "authentication.type" is set to "default"
// Can be any implementation of net.jforum.sso.LoginAuthenticator
// For LDAP authentication, set the value to net.jforum.sso.LDAPAuthenticator. Also, see the LDAP section below
login.authenticator = net.jforum.sso.DefaultLoginAuthenticator
// When using authentication.type = default, you may choose to disable the automatic login feature,
// which will prevents users to get automatic logged in when they come back to the forum
auto.login.enabled = true
// The above key will be be used then "authentication.type" is set to "sso"
// The default implementation (used here) only checks if request.getRemoteUser()
// is not null. This may be enough for many situations.
sso.implementation = net.jforum.sso.RemoteUserSSO
// Special attributes used when creating a new user
// Only if auhentication.type = sso
// The attribute name to search in the session for the password.
sso.password.attribute = password
// Same as above
sso.email.attribute = email
// The default email to use if sso.email.attribute is empty
sso.default.email = sso@user
// The default password to use if sso.password.attribute is empty
sso.default.password = sso
// Optional redirect for SSO
// If a value is set, the user will be redirected to the defined URL, using the following logic:
// ${sso.redirect}?returnUrl=${forum.link} + "the original JForum URL"
// The value MUST start with the protocol (http:// or https://)
sso.redirect =
// Security protocol to use, e.g: "ssl". Leave it empty (default) to let the provider figure it out
ldap.security.protocol =
// Security authentication to use. Possible values: "none", "simple", "strong",
// "EXTERNAL" (SASL). Leave empty (default) to let the provider figure it out
ldap.authentication =
// Class that provides a LDAP factory
ldap.factory = com.sun.jndi.ldap.LdapCtxFactory
// The prefix your LDAP server requires. e.g 'uid='
// The username supplied gets inserted just after the prefix, e.g: 'uid=username' so adjust the prefix properly
ldap.login.prefix = uid=
// The suffix your LDAP server requires.
// e.g 'ou=Users,dc=department,dc=company,dc=com'
ldap.login.suffix = ou=Users,dc=department,dc=company,dc=com
// The url of your LDAP server.
// Note that if your LDAP server uses SSL you will need to configure your
// server certificate so that Java Secure Sockets Extension (JSSE) will accept it.
// See http://docs.oracle.com/javase/jndi/tutorial/ldap/security/ssl.html
ldap.server.url = ldap://localhost
// Field that holds the user's email
ldap.field.email = mail
// ActiveDirectory
// To configure LDAPAuthenticator integrating with Microsoft Active Directory. The following two keys should be necessary.
// They are similar to ldap.login.prefix and ldap.login.suffix , but it's used when looking up user infomation
// rather than authentication. It's used when the login Distinguished Name (DN) is formatted differently from the lookup
// DN on some LDAP servers, for example, Microsoft Active Directory. If it's the case, you should add these keys in additional
// to ldap.login.prefix and ldap.login.suffix .
//
// The following example is for configuring on Microsoft Active Directory:
// ===========================
// ldap.login.prefix=CN=
// ldap.login.suffix=CN=Users,DC=jform,DC=net
// ldap.lookup.suffix=CN=Users
// ===========================
ldap.lookup.prefix =
ldap.lookup.suffix =
i18n.internal = en_US
database.driver.config = ${config.dir}/database/${database.driver.name}/${database.driver.name}.properties
sql.queries.driver = ${config.dir}/database/${database.driver.name}/${database.driver.name}.sql
sql.queries.generic = ${config.dir}/database/generic/generic_queries.sql
database.support.subqueries = false
// ${application.path}, ${installation}, and ${servlet.name} are set by the web application
resource.dir = ${application.path}/WEB-INF
config.dir = ${resource.dir}/config
installation.config = ${config.dir}/jforum-custom.conf
// Only change these values if you know what you're doing
anonymous.userId = 1
defaultUserGroup = 1
cache.engine.default = net.jforum.cache.DefaultCacheEngine
cache.engine.jboss = net.jforum.cache.JBossCacheEngine
cache.engine.ehcache = net.jforum.cache.EhCacheEngine
jboss.cache.properties = ${config.dir}/jboss-cache-cluster.xml
ehcache.cache.properties = ${config.dir}/ehcache.xml
cache.engine.implementation = ${cache.engine.default}
cacheable.objects = net.jforum.repository.BBCodeRepository, \
net.jforum.repository.RankingRepository, \
net.jforum.repository.SmiliesRepository, \
net.jforum.repository.ForumRepository, \
net.jforum.repository.TopicRepository, \
net.jforum.SessionFacade, \
net.jforum.repository.PostRepository, \
net.jforum.repository.Tpl, \
net.jforum.repository.RolesRepository, \
net.jforum.repository.SecurityRepository, \
net.jforum.repository.BanlistRepository
// The template to use
template.dir = default
// If you change this value, is necessary to edit WEB-INF/web.xml as well
servlet.extension = .page
// The URL from where to load jQuery. Could be a local file if that's preferable.
// Leaving out the protocol so it uses whatever the page uses.
jquery.url=//code.jquery.com/jquery-3.7.1.min.js
//jquery.url=//ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js
//jquery.url=//cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js
cookie.name.data = jforumUserId
cookie.name.user = jforumUserInfo
cookie.name.autologin = jforumAutoLogin
cookie.name.userHash = jforumUserHash
tmp.dir = tmp
cache.dir = cache
templates.mapping = ${config.dir}/templatesMapping.properties
locales.dir = ${config.dir}/languages/
locales.names = locales.properties
smilie.image.dir = images/smilies
smilie.image.pattern =
clickstream.config = ${config.dir}/clickstream-jforum.xml
quartz.config = ${config.dir}/quartz-jforum.properties
// Default charset used by the servlet container.
// It's unlikely you will have to change this value, even if you're using a Cyrillic alphabet. UTF-8 may be preferable, though.
// For detailed information, see [CharEncodingContainer]
default.container.encoding = ISO-8859-1
// the period in milliseconds the config files are watched for changes set it to 0 (zero) to disable it completely
file.changes.delay = 2000
// If you have freemarker templates residing outside of the JForum webapp
// you can add the path to the directory containing them here. Add the full path to the directory.
freemarker.extra.template.path =
// Some colors that can be changed at runtime. The Configurations page has color previews.
// orange and darkblue are font colors, the others are background colors.
color.orange= #ffa34f
color.darkblue= #01336b
color.lightgray= #dee3e7
color.verylight= #fafafa
color.quitelight= #f7f7f7
summary.enabled = false
summary.days.before = 7
stopForumSpam.api.enabled = true
stopForumSpam.api.url = http://api.stopforumspam.org/api?
stopForumSpam.web.url = https://www.stopforumspam.com/search/
whois.api.url = https://whois.domaintools.com/
version = 2.8.2
version.check.enabled = true
jforum.version.url = https://jforum2.sourceforge.io/latest_version.txt