2015-03-10 16:57:23 +00:00
|
|
|
import re
|
|
|
|
|
2015-03-04 21:06:16 +00:00
|
|
|
from django.core.exceptions import ValidationError
|
|
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
|
2015-03-10 11:46:48 +00:00
|
|
|
from orchestra.plugins import Plugin
|
|
|
|
from orchestra.utils.functional import cached
|
2015-03-04 21:06:16 +00:00
|
|
|
from orchestra.utils.python import import_class
|
|
|
|
|
|
|
|
from . import settings
|
|
|
|
|
|
|
|
|
2015-03-10 11:46:48 +00:00
|
|
|
class AppOption(Plugin):
|
|
|
|
PHP = 'PHP'
|
|
|
|
PROCESS = 'Process'
|
|
|
|
FILESYSTEM = 'FileSystem'
|
2015-03-04 21:06:16 +00:00
|
|
|
|
2015-03-10 11:46:48 +00:00
|
|
|
help_text = ""
|
|
|
|
group = None
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
@cached
|
|
|
|
def get_plugins(cls):
|
|
|
|
plugins = []
|
|
|
|
for cls in settings.WEBAPPS_ENABLED_OPTIONS:
|
|
|
|
plugins.append(import_class(cls))
|
|
|
|
return plugins
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
@cached
|
|
|
|
def get_option_groups(cls):
|
|
|
|
groups = {}
|
|
|
|
for opt in cls.get_plugins():
|
|
|
|
try:
|
|
|
|
groups[opt.group].append(opt)
|
|
|
|
except KeyError:
|
|
|
|
groups[opt.group] = [opt]
|
|
|
|
return groups
|
|
|
|
|
2015-03-11 16:32:33 +00:00
|
|
|
def validate(self):
|
|
|
|
if self.regex and not re.match(self.regex, self.instance.value):
|
2015-03-04 21:06:16 +00:00
|
|
|
raise ValidationError({
|
|
|
|
'value': ValidationError(_("'%(value)s' does not match %(regex)s."),
|
|
|
|
params={
|
2015-03-11 16:32:33 +00:00
|
|
|
'value': self.instance.value,
|
2015-03-04 21:06:16 +00:00
|
|
|
'regex': self.regex
|
|
|
|
}),
|
|
|
|
})
|
|
|
|
|
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPAppOption(AppOption):
|
|
|
|
deprecated = None
|
|
|
|
group = AppOption.PHP
|
|
|
|
|
|
|
|
def validate(self):
|
|
|
|
super(PHPAppOption, self).validate()
|
|
|
|
if self.deprecated:
|
2015-04-07 15:14:49 +00:00
|
|
|
php_version = self.instance.webapp.type_instance.get_php_version_number()
|
2015-04-10 15:03:38 +00:00
|
|
|
if php_version and self.deprecated and float(php_version) > self.deprecated:
|
2015-03-25 17:04:44 +00:00
|
|
|
raise ValidationError(
|
|
|
|
_("This option is deprecated since PHP version %s.") % str(self.deprecated)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2015-03-10 11:46:48 +00:00
|
|
|
class PublicRoot(AppOption):
|
|
|
|
name = 'public-root'
|
|
|
|
verbose_name = _("Public root")
|
|
|
|
help_text = _("Document root relative to webapps/<webapp>/")
|
|
|
|
regex = r'[^ ]+'
|
|
|
|
group = AppOption.FILESYSTEM
|
|
|
|
|
|
|
|
|
|
|
|
class Timeout(AppOption):
|
|
|
|
name = 'timeout'
|
2015-03-04 21:06:16 +00:00
|
|
|
# FCGID FcgidIOTimeout
|
|
|
|
# FPM pm.request_terminate_timeout
|
|
|
|
# PHP max_execution_time ini
|
2015-03-10 11:46:48 +00:00
|
|
|
verbose_name = _("Process timeout")
|
2015-04-10 15:03:38 +00:00
|
|
|
help_text = _("Maximum time in seconds allowed for a request to complete (a number between 0 and 999).<br>"
|
|
|
|
"Also sets <tt>max_request_time</tt> when php-cgi is used.")
|
2015-03-10 11:46:48 +00:00
|
|
|
regex = r'^[0-9]{1,3}$'
|
|
|
|
group = AppOption.PROCESS
|
2015-03-04 21:06:16 +00:00
|
|
|
|
2015-03-10 11:46:48 +00:00
|
|
|
|
|
|
|
class Processes(AppOption):
|
|
|
|
name = 'processes'
|
2015-03-04 21:06:16 +00:00
|
|
|
# FCGID MaxProcesses
|
|
|
|
# FPM pm.max_children
|
2015-03-10 16:57:23 +00:00
|
|
|
verbose_name = _("Number of processes")
|
|
|
|
help_text = _("Maximum number of children that can be alive at the same time (a number between 0 and 9).")
|
2015-04-12 18:18:10 +00:00
|
|
|
regex = r'^[0-9]{1,2}$'
|
2015-03-10 11:46:48 +00:00
|
|
|
group = AppOption.PROCESS
|
|
|
|
|
|
|
|
|
2015-04-13 14:46:10 +00:00
|
|
|
class PHPEnableFunctions(PHPAppOption):
|
|
|
|
name = 'enable_functions'
|
|
|
|
verbose_name = _("Enable functions")
|
2015-05-20 18:21:21 +00:00
|
|
|
help_text = '<tt>%s</tt>' % '<br>'.join([
|
|
|
|
','.join(settings.WEBAPPS_PHP_DISABLED_FUNCTIONS[i:i+10])
|
|
|
|
for i in range(0, len(settings.WEBAPPS_PHP_DISABLED_FUNCTIONS), 10)
|
|
|
|
])
|
2015-03-10 16:57:23 +00:00
|
|
|
regex = r'^[\w\.,-]+$'
|
2015-03-10 11:46:48 +00:00
|
|
|
|
2015-03-04 21:06:16 +00:00
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPAllowURLInclude(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'allow_url_include'
|
2015-03-10 16:57:23 +00:00
|
|
|
verbose_name = _("Allow URL include")
|
|
|
|
help_text = _("Allows the use of URL-aware fopen wrappers with include, include_once, require, "
|
2015-03-10 11:46:48 +00:00
|
|
|
"require_once (On or Off).")
|
2015-03-10 16:57:23 +00:00
|
|
|
regex = r'^(On|Off|on|off)$'
|
2015-03-04 21:06:16 +00:00
|
|
|
|
2015-03-10 11:46:48 +00:00
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPAllowURLFopen(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'allow_url_fopen'
|
2015-03-10 16:57:23 +00:00
|
|
|
verbose_name = _("Allow URL fopen")
|
|
|
|
help_text = _("Enables the URL-aware fopen wrappers that enable accessing URL object like files (On or Off).")
|
|
|
|
regex = r'^(On|Off|on|off)$'
|
2015-03-10 11:46:48 +00:00
|
|
|
|
2015-03-04 21:06:16 +00:00
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPAutoAppendFile(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'auto_append_file'
|
2015-03-10 16:57:23 +00:00
|
|
|
verbose_name = _("Auto append file")
|
|
|
|
help_text = _("Specifies the name of a file that is automatically parsed after the main file.")
|
|
|
|
regex = r'^[\w\.,-/]+$'
|
2015-03-10 11:46:48 +00:00
|
|
|
|
2015-03-04 21:06:16 +00:00
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPAutoPrependFile(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'auto_prepend_file'
|
2015-03-10 16:57:23 +00:00
|
|
|
verbose_name = _("Auto prepend file")
|
|
|
|
help_text = _("Specifies the name of a file that is automatically parsed before the main file.")
|
|
|
|
regex = r'^[\w\.,-/]+$'
|
2015-03-04 21:06:16 +00:00
|
|
|
|
2015-03-10 11:46:48 +00:00
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPDateTimeZone(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'date.timezone'
|
2015-03-10 16:57:23 +00:00
|
|
|
verbose_name = _("date.timezone")
|
|
|
|
help_text = _("Sets the default timezone used by all date/time functions (Timezone string 'Europe/London').")
|
|
|
|
regex = r'^\w+/\w+$'
|
2015-03-10 11:46:48 +00:00
|
|
|
|
2015-03-04 21:06:16 +00:00
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPDefaultSocketTimeout(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'default_socket_timeout'
|
2015-03-10 16:57:23 +00:00
|
|
|
verbose_name = _("Default socket timeout")
|
|
|
|
help_text = _("Number between 0 and 999.")
|
|
|
|
regex = r'^[0-9]{1,3}$'
|
2015-03-04 21:06:16 +00:00
|
|
|
|
2015-03-10 11:46:48 +00:00
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPDisplayErrors(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'display_errors'
|
2015-03-10 16:57:23 +00:00
|
|
|
verbose_name = _("Display errors")
|
|
|
|
help_text = _("Determines whether errors should be printed to the screen as part of the output or "
|
2015-04-10 15:03:38 +00:00
|
|
|
"if they should be hidden from the user (On or Off).")
|
2015-03-10 16:57:23 +00:00
|
|
|
regex = r'^(On|Off|on|off)$'
|
2015-03-10 11:46:48 +00:00
|
|
|
|
2015-03-04 21:06:16 +00:00
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPExtension(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'extension'
|
2015-03-10 16:57:23 +00:00
|
|
|
verbose_name = _("Extension")
|
|
|
|
regex = r'^[^ ]+$'
|
2015-03-04 21:06:16 +00:00
|
|
|
|
2015-03-10 11:46:48 +00:00
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPMagicQuotesGPC(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'magic_quotes_gpc'
|
2015-03-10 16:57:23 +00:00
|
|
|
verbose_name = _("Magic quotes GPC")
|
|
|
|
help_text = _("Sets the magic_quotes state for GPC (Get/Post/Cookie) operations (On or Off) "
|
2015-04-10 15:03:38 +00:00
|
|
|
"<b>DEPRECATED as of PHP 5.3.0</b>.")
|
2015-03-10 16:57:23 +00:00
|
|
|
regex = r'^(On|Off|on|off)$'
|
2015-03-25 17:04:44 +00:00
|
|
|
deprecated = 5.3
|
2015-03-10 11:46:48 +00:00
|
|
|
|
2015-03-04 21:06:16 +00:00
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPMagicQuotesRuntime(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'magic_quotes_runtime'
|
2015-03-10 16:57:23 +00:00
|
|
|
verbose_name = _("Magic quotes runtime")
|
|
|
|
help_text = _("Functions that return data from any sort of external source will have quotes escaped "
|
2015-04-10 15:03:38 +00:00
|
|
|
"with a backslash (On or Off) <b>DEPRECATED as of PHP 5.3.0</b>.")
|
2015-03-10 16:57:23 +00:00
|
|
|
regex = r'^(On|Off|on|off)$'
|
2015-03-25 17:04:44 +00:00
|
|
|
deprecated = 5.3
|
2015-03-10 11:46:48 +00:00
|
|
|
|
2015-03-04 21:06:16 +00:00
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPMaginQuotesSybase(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'magic_quotes_sybase'
|
2015-03-10 16:57:23 +00:00
|
|
|
verbose_name = _("Magic quotes sybase")
|
|
|
|
help_text = _("Single-quote is escaped with a single-quote instead of a backslash (On or Off).")
|
|
|
|
regex = r'^(On|Off|on|off)$'
|
2015-03-10 11:46:48 +00:00
|
|
|
|
2015-03-04 21:06:16 +00:00
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPMaxInputTime(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'max_input_time'
|
2015-03-10 16:57:23 +00:00
|
|
|
verbose_name = _("Max input time")
|
|
|
|
help_text = _("Maximum time in seconds a script is allowed to parse input data, like POST and GET "
|
2015-03-10 11:46:48 +00:00
|
|
|
"(Integer between 0 and 999).")
|
2015-03-10 16:57:23 +00:00
|
|
|
regex = r'^[0-9]{1,3}$'
|
2015-03-10 11:46:48 +00:00
|
|
|
|
2015-03-04 21:06:16 +00:00
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPMaxInputVars(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'max_input_vars'
|
2015-03-10 16:57:23 +00:00
|
|
|
verbose_name = _("Max input vars")
|
|
|
|
help_text = _("How many input variables may be accepted (limit is applied to $_GET, $_POST "
|
2015-03-10 11:46:48 +00:00
|
|
|
"and $_COOKIE superglobal separately) (Integer between 0 and 9999).")
|
2015-03-10 16:57:23 +00:00
|
|
|
regex = r'^[0-9]{1,4}$'
|
2015-03-10 11:46:48 +00:00
|
|
|
|
2015-03-04 21:06:16 +00:00
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPMemoryLimit(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'memory_limit'
|
2015-03-10 16:57:23 +00:00
|
|
|
verbose_name = _("Memory limit")
|
|
|
|
help_text = _("This sets the maximum amount of memory in bytes that a script is allowed to allocate "
|
2015-04-10 15:03:38 +00:00
|
|
|
"(Value between 0M and 999M).")
|
2015-03-10 16:57:23 +00:00
|
|
|
regex = r'^[0-9]{1,3}M$'
|
2015-03-04 21:06:16 +00:00
|
|
|
|
2015-03-10 11:46:48 +00:00
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPMySQLConnectTimeout(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'mysql.connect_timeout'
|
2015-03-10 16:57:23 +00:00
|
|
|
verbose_name = _("Mysql connect timeout")
|
|
|
|
help_text = _("Number between 0 and 999.")
|
|
|
|
regex = r'^([0-9]){1,3}$'
|
2015-03-10 11:46:48 +00:00
|
|
|
|
2015-03-04 21:06:16 +00:00
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPOutputBuffering(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'output_buffering'
|
2015-03-10 16:57:23 +00:00
|
|
|
verbose_name = _("Output buffering")
|
|
|
|
help_text = _("Turn on output buffering (On or Off).")
|
|
|
|
regex = r'^(On|Off|on|off)$'
|
2015-03-04 21:06:16 +00:00
|
|
|
|
2015-03-10 11:46:48 +00:00
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPRegisterGlobals(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'register_globals'
|
2015-03-10 16:57:23 +00:00
|
|
|
verbose_name = _("Register globals")
|
|
|
|
help_text = _("Whether or not to register the EGPCS (Environment, GET, POST, Cookie, Server) "
|
2015-04-10 15:03:38 +00:00
|
|
|
"variables as global variables (On or Off).")
|
2015-03-10 16:57:23 +00:00
|
|
|
regex = r'^(On|Off|on|off)$'
|
2015-03-10 11:46:48 +00:00
|
|
|
|
2015-03-04 21:06:16 +00:00
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPPostMaxSize(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'post_max_size'
|
2015-03-10 16:57:23 +00:00
|
|
|
verbose_name = _("Post max size")
|
|
|
|
help_text = _("Sets max size of post data allowed (Value between 0M and 999M).")
|
|
|
|
regex = r'^[0-9]{1,3}M$'
|
2015-03-04 21:06:16 +00:00
|
|
|
|
2015-03-10 11:46:48 +00:00
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPSendmailPath(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'sendmail_path'
|
2015-04-10 15:03:38 +00:00
|
|
|
verbose_name = _("Sendmail path")
|
2015-03-10 16:57:23 +00:00
|
|
|
help_text = _("Where the sendmail program can be found.")
|
|
|
|
regex = r'^[^ ]+$'
|
2015-03-10 11:46:48 +00:00
|
|
|
|
2015-03-04 21:06:16 +00:00
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPSessionBugCompatWarn(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'session.bug_compat_warn'
|
2015-04-10 15:03:38 +00:00
|
|
|
verbose_name = _("Session bug compat warning")
|
2015-03-10 16:57:23 +00:00
|
|
|
help_text = _("Enables an PHP bug on session initialization for legacy behaviour (On or Off).")
|
|
|
|
regex = r'^(On|Off|on|off)$'
|
2015-03-10 11:46:48 +00:00
|
|
|
|
2015-03-04 21:06:16 +00:00
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPSessionAutoStart(PHPAppOption):
|
2015-03-10 16:57:23 +00:00
|
|
|
name = 'session.auto_start'
|
2015-04-10 15:03:38 +00:00
|
|
|
verbose_name = _("Session auto start")
|
2015-03-10 16:57:23 +00:00
|
|
|
help_text = _("Specifies whether the session module starts a session automatically on request "
|
2015-03-10 11:46:48 +00:00
|
|
|
"startup (On or Off).")
|
2015-03-10 16:57:23 +00:00
|
|
|
regex = r'^(On|Off|on|off)$'
|
2015-03-10 11:46:48 +00:00
|
|
|
group = AppOption.PHP
|
|
|
|
|
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPSafeMode(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'safe_mode'
|
2015-03-10 16:57:23 +00:00
|
|
|
verbose_name = _("Safe mode")
|
|
|
|
help_text = _("Whether to enable PHP's safe mode (On or Off) <b>DEPRECATED as of PHP 5.3.0</b>")
|
|
|
|
regex = r'^(On|Off|on|off)$'
|
2015-03-04 21:06:16 +00:00
|
|
|
deprecated=5.3
|
2015-03-10 11:46:48 +00:00
|
|
|
|
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPSuhosinPostMaxVars(PHPAppOption):
|
2015-03-10 16:57:23 +00:00
|
|
|
name = 'suhosin.post.max_vars'
|
|
|
|
verbose_name = _("Suhosin POST max vars")
|
|
|
|
help_text = _("Number between 0 and 9999.")
|
|
|
|
regex = r'^[0-9]{1,4}$'
|
2015-03-10 11:46:48 +00:00
|
|
|
|
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPSuhosinGetMaxVars(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'suhosin.get.max_vars'
|
2015-03-10 16:57:23 +00:00
|
|
|
verbose_name = _("Suhosin GET max vars")
|
|
|
|
help_text = _("Number between 0 and 9999.")
|
|
|
|
regex = r'^[0-9]{1,4}$'
|
2015-03-10 11:46:48 +00:00
|
|
|
|
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPSuhosinRequestMaxVars(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'suhosin.request.max_vars'
|
2015-03-10 16:57:23 +00:00
|
|
|
verbose_name = _("Suhosin request max vars")
|
|
|
|
help_text = _("Number between 0 and 9999.")
|
|
|
|
regex = r'^[0-9]{1,4}$'
|
2015-03-10 11:46:48 +00:00
|
|
|
|
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPSuhosinSessionEncrypt(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'suhosin.session.encrypt'
|
2015-04-10 15:03:38 +00:00
|
|
|
verbose_name = _("Suhosin session encrypt")
|
2015-03-10 16:57:23 +00:00
|
|
|
help_text = _("On or Off")
|
|
|
|
regex = r'^(On|Off|on|off)$'
|
2015-03-10 11:46:48 +00:00
|
|
|
|
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPSuhosinSimulation(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'suhosin.simulation'
|
2015-03-10 16:57:23 +00:00
|
|
|
verbose_name = _("Suhosin simulation")
|
|
|
|
help_text = _("On or Off")
|
|
|
|
regex = r'^(On|Off|on|off)$'
|
2015-03-10 11:46:48 +00:00
|
|
|
|
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPSuhosinExecutorIncludeWhitelist(PHPAppOption):
|
2015-03-10 11:46:48 +00:00
|
|
|
name = 'suhosin.executor.include.whitelist'
|
2015-04-10 15:03:38 +00:00
|
|
|
verbose_name = _("Suhosin executor include whitelist")
|
2015-03-10 16:57:23 +00:00
|
|
|
regex = r'.*$'
|
2015-03-10 11:46:48 +00:00
|
|
|
|
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPUploadMaxFileSize(PHPAppOption):
|
2015-03-10 16:57:23 +00:00
|
|
|
name = 'upload_max_filesize'
|
2015-04-24 11:39:20 +00:00
|
|
|
verbose_name = _("Upload max filesize")
|
2015-03-10 16:57:23 +00:00
|
|
|
help_text = _("Value between 0M and 999M.")
|
|
|
|
regex = r'^[0-9]{1,3}M$'
|
2015-03-10 11:46:48 +00:00
|
|
|
|
|
|
|
|
2015-03-25 17:04:44 +00:00
|
|
|
class PHPZendExtension(PHPAppOption):
|
2015-03-18 21:51:12 +00:00
|
|
|
name = 'zend_extension'
|
|
|
|
verbose_name = _("Zend extension")
|
2015-03-10 16:57:23 +00:00
|
|
|
regex = r'^[^ ]+$'
|