Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Simon
OpenLDAP
Commits
58c97882
Commit
58c97882
authored
May 27, 2020
by
Quanah Gibson-Mount
Browse files
Issue
#9020
- Use consistent namespaces for overlays
parent
3e5490f4
Changes
18
Hide whitespace changes
Inline
Side-by-side
contrib/slapd-modules/autogroup/autogroup.c
View file @
58c97882
...
...
@@ -1713,7 +1713,7 @@ static ConfigDriver ag_cfgen;
static
ConfigTable
agcfg
[]
=
{
{
"autogroup-attrset"
,
"group-oc> <URL-ad> <member-ad"
,
4
,
4
,
0
,
ARG_MAGIC
|
AG_ATTRSET
,
ag_cfgen
,
"( OLcfgCtAt:2.1 NAME 'olcAGattrSet' "
"( OLcfgCtAt:2.1 NAME
( 'olcAutoGroupAttrSet'
'olcAGattrSet'
)
"
"DESC 'Automatic groups: <group objectClass>, <URL attributeDescription>, <member attributeDescription>' "
"EQUALITY caseIgnoreMatch "
"SYNTAX OMsDirectoryString "
...
...
@@ -1722,7 +1722,7 @@ static ConfigTable agcfg[] = {
{
"autogroup-memberof-ad"
,
"memberOf attribute"
,
2
,
2
,
0
,
ARG_MAGIC
|
AG_MEMBER_OF_AD
,
ag_cfgen
,
"( OLcfgCtAt:2.2 NAME 'olcAGmemberOfAd' "
"( OLcfgCtAt:2.2 NAME
( 'olcAutoGroupMemberOfAd'
'olcAGmemberOfAd'
)
"
"DESC 'memberOf attribute' "
"EQUALITY caseIgnoreMatch "
"SYNTAX OMsDirectoryString SINGLE-VALUE )"
,
...
...
@@ -1733,12 +1733,12 @@ static ConfigTable agcfg[] = {
static
ConfigOCs
agocs
[]
=
{
{
"( OLcfgCtOc:2.1 "
"NAME 'olcAuto
maticGroups
' "
"NAME 'olcAuto
GroupConfig
' "
"DESC 'Automatic groups configuration' "
"SUP olcOverlayConfig "
"MAY ( "
"olcA
Ga
ttrSet "
"$ olcA
Gm
emberOfAd "
"olcA
utoGroupA
ttrSet "
"$ olcA
utoGroupM
emberOfAd "
")"
")"
,
Cft_Overlay
,
agcfg
,
NULL
,
NULL
},
...
...
contrib/slapd-modules/autogroup/slapo-autogroup.5
View file @
58c97882
...
...
@@ -39,7 +39,7 @@ here for convenience:
.TP
.B \FCautogroup-attrset\FT <group-oc> <URL-ad> <member-ad>
.TP
.B \FColcA
Ga
ttrSet:\FT <group-oc> <URL-ad> <member-ad>
.B \FColcA
utoGroupA
ttrSet:\FT <group-oc> <URL-ad> <member-ad>
This defines the objectclass-attribute-URI mappings defining the
automatically managed groups, and may appear multiple times.
...
...
@@ -57,7 +57,7 @@ disabled for consistency.
.TP
.B \FCautogroup-memberof-ad\FT <memberof-ad>
.TP
.B \FColcA
Gm
emberOfAd\FT <memberof-ad>
.B \FColcA
utoGroupM
emberOfAd\FT <memberof-ad>
This defines the attribute that is used by the memberOf overlay to
store the names of groups that an entry is member of; it must be
DN-valued. It should be set to the same value as
...
...
@@ -88,6 +88,15 @@ cases the overlay will try to detect if groups have been modified and
then simply refresh them. This can cause performance hits if the
search specified by the URI deals with a significant number of
entries.
.SH BACKWARD COMPATIBILITY
The autogroup overlay has been reworked with the 2.5 release to use
a consistent namespace as with other overlays. As a side-effect the
following cn=config parameters are deprecated and will be removed in
a future release:
.B olcAGattrSet
is replaced with olcAutoGroupAttrSet
.B olcAGmemberOfAd
is replaced with olcAutoGroupMemberOfAd
.SH ACKNOWLEDGEMENTS
This module was originally written in 2007 by Michał
Szulczyński. Further enhancements were contributed by Howard
...
...
doc/man/man5/slapo-dyngroup.5
View file @
58c97882
...
...
@@ -42,6 +42,15 @@ to be evaluated for the result.
.TP
ETCDIR/slapd.conf
default slapd configuration file
.SH BACKWARD COMPATIBILITY
The dyngroup overlay has been reworked with the 2.5 release to use
a consistent namespace as with other overlays. As a side-effect the
following cn=config parameters are deprecated and will be removed in
a future release:
.B olcDGAttrPair
is replaced with olcDynGroupAttrPair
.B olcDGConfig
is replaced with olcDynGroupConfig
.SH SEE ALSO
.BR slapd.conf (5),
.BR slapd\-config (5).
...
...
doc/man/man5/slapo-dynlist.5
View file @
58c97882
...
...
@@ -197,6 +197,15 @@ entry like
.TP
ETCDIR/slapd.conf
default slapd configuration file
.SH BACKWARD COMPATIBILITY
The dyngroup overlay has been reworked with the 2.5 release to use
a consistent namespace as with other overlays. As a side-effect the
following cn=config parameters are deprecated and will be removed in
a future release:
.B olcDlAttrSet
is replaced with olcDynListAttrSet
.B olcDynamicList
is replaced with olcDynListConfig
.SH SEE ALSO
.BR slapd.conf (5),
.BR slapd\-config (5),
...
...
doc/man/man5/slapo-memberof.5
View file @
58c97882
...
...
@@ -118,6 +118,13 @@ to emulate slapo-memberOf behavior.
.TP
ETCDIR/slapd.conf
default slapd configuration file
.SH BACKWARD COMPATIBILITY
The dyngroup overlay has been reworked with the 2.5 release to use
a consistent namespace as with other overlays. As a side-effect the
following cn=config parameters are deprecated and will be removed in
a future release:
.B olcMemberOf
is replaced with olcMemberOfConfig
.SH SEE ALSO
.BR slapd.conf (5),
.BR slapd\-config (5),
...
...
servers/slapd/overlays/autoca.c
View file @
58c97882
...
...
@@ -724,55 +724,55 @@ static int autoca_cf( ConfigArgs *c )
static
ConfigTable
autoca_cfg
[]
=
{
{
"userClass"
,
"objectclass"
,
2
,
2
,
0
,
ARG_STRING
|
ARG_MAGIC
|
ACA_USRCLASS
,
autoca_cf
,
"( OLcfgOvAt:22.1 NAME 'olcACAuserClass' "
"( OLcfgOvAt:22.1 NAME 'olcA
uto
CAuserClass' "
"DESC 'ObjectClass of user entries' "
"EQUALITY caseIgnoreMatch "
"SYNTAX OMsDirectoryString SINGLE-VALUE )"
,
NULL
,
NULL
},
{
"serverClass"
,
"objectclass"
,
2
,
2
,
0
,
ARG_STRING
|
ARG_MAGIC
|
ACA_SRVCLASS
,
autoca_cf
,
"( OLcfgOvAt:22.2 NAME 'olcACAserverClass' "
"( OLcfgOvAt:22.2 NAME 'olcA
uto
CAserverClass' "
"DESC 'ObjectClass of server entries' "
"EQUALITY caseIgnoreMatch "
"SYNTAX OMsDirectoryString SINGLE-VALUE )"
,
NULL
,
NULL
},
{
"userKeybits"
,
"integer"
,
2
,
2
,
0
,
ARG_INT
|
ARG_MAGIC
|
ACA_USRKEYBITS
,
autoca_cf
,
"( OLcfgOvAt:22.3 NAME 'olcACAuserKeybits' "
"( OLcfgOvAt:22.3 NAME 'olcA
uto
CAuserKeybits' "
"DESC 'Size of PrivateKey for user entries' "
"EQUALITY integerMatch "
"SYNTAX OMsInteger SINGLE-VALUE )"
,
NULL
,
NULL
},
{
"serverKeybits"
,
"integer"
,
2
,
2
,
0
,
ARG_INT
|
ARG_MAGIC
|
ACA_SRVKEYBITS
,
autoca_cf
,
"( OLcfgOvAt:22.4 NAME 'olcACAserverKeybits' "
"( OLcfgOvAt:22.4 NAME 'olcA
uto
CAserverKeybits' "
"DESC 'Size of PrivateKey for server entries' "
"EQUALITY integerMatch "
"SYNTAX OMsInteger SINGLE-VALUE )"
,
NULL
,
NULL
},
{
"caKeybits"
,
"integer"
,
2
,
2
,
0
,
ARG_INT
|
ARG_MAGIC
|
ACA_CAKEYBITS
,
autoca_cf
,
"( OLcfgOvAt:22.5 NAME 'olcACAKeybits' "
"( OLcfgOvAt:22.5 NAME 'olcA
uto
CAKeybits' "
"DESC 'Size of PrivateKey for CA certificate' "
"EQUALITY integerMatch "
"SYNTAX OMsInteger SINGLE-VALUE )"
,
NULL
,
NULL
},
{
"userDays"
,
"integer"
,
2
,
2
,
0
,
ARG_INT
|
ARG_MAGIC
|
ACA_USRDAYS
,
autoca_cf
,
"( OLcfgOvAt:22.6 NAME 'olcACAuserDays' "
"( OLcfgOvAt:22.6 NAME 'olcA
uto
CAuserDays' "
"DESC 'Lifetime of user certificates in days' "
"EQUALITY integerMatch "
"SYNTAX OMsInteger SINGLE-VALUE )"
,
NULL
,
NULL
},
{
"serverDays"
,
"integer"
,
2
,
2
,
0
,
ARG_INT
|
ARG_MAGIC
|
ACA_SRVDAYS
,
autoca_cf
,
"( OLcfgOvAt:22.7 NAME 'olcACAserverDays' "
"( OLcfgOvAt:22.7 NAME 'olcA
uto
CAserverDays' "
"DESC 'Lifetime of server certificates in days' "
"EQUALITY integerMatch "
"SYNTAX OMsInteger SINGLE-VALUE )"
,
NULL
,
NULL
},
{
"caDays"
,
"integer"
,
2
,
2
,
0
,
ARG_INT
|
ARG_MAGIC
|
ACA_CADAYS
,
autoca_cf
,
"( OLcfgOvAt:22.8 NAME 'olcACADays' "
"( OLcfgOvAt:22.8 NAME 'olcA
uto
CADays' "
"DESC 'Lifetime of CA certificate in days' "
"EQUALITY integerMatch "
"SYNTAX OMsInteger SINGLE-VALUE )"
,
NULL
,
NULL
},
{
"localdn"
,
"dn"
,
2
,
2
,
0
,
ARG_DN
|
ARG_MAGIC
|
ACA_LOCALDN
,
autoca_cf
,
"( OLcfgOvAt:22.9 NAME 'olcACAlocalDN' "
"( OLcfgOvAt:22.9 NAME 'olcA
uto
CAlocalDN' "
"DESC 'DN of local server cert' "
"EQUALITY distinguishedNameMatch "
"SYNTAX OMsDN SINGLE-VALUE )"
,
NULL
,
NULL
},
...
...
@@ -781,13 +781,13 @@ static ConfigTable autoca_cfg[] = {
static
ConfigOCs
autoca_ocs
[]
=
{
{
"( OLcfgOvOc:22.1 "
"NAME 'olcACAConfig' "
"NAME 'olcA
uto
CAConfig' "
"DESC 'AutoCA configuration' "
"SUP olcOverlayConfig "
"MAY ( olcACAuserClass $ olcACAserverClass $ "
"olcACAuserKeybits $ olcACAserverKeybits $ olcACAKeyBits $ "
"olcACAuserDays $ olcACAserverDays $ olcACADays $ "
"olcACAlocalDN ) )"
,
"MAY ( olcA
uto
CAuserClass $ olcA
uto
CAserverClass $ "
"olcA
uto
CAuserKeybits $ olcA
uto
CAserverKeybits $ olcA
uto
CAKeyBits $ "
"olcA
uto
CAuserDays $ olcA
uto
CAserverDays $ olcA
uto
CADays $ "
"olcA
uto
CAlocalDN ) )"
,
Cft_Overlay
,
autoca_cfg
},
{
NULL
,
0
,
NULL
}
};
...
...
servers/slapd/overlays/dyngroup.c
View file @
58c97882
...
...
@@ -123,7 +123,7 @@ static int dgroup_cf( ConfigArgs *c )
static
ConfigTable
dgroupcfg
[]
=
{
{
"attrpair"
,
"member-attribute> <URL-attribute"
,
3
,
3
,
0
,
ARG_MAGIC
,
dgroup_cf
,
"( OLcfgOvAt:17.1 NAME 'olcDGAttrPair' "
"( OLcfgOvAt:17.1 NAME
( 'olcDynGroupAttrPair'
'olcDGAttrPair'
)
"
"EQUALITY caseIgnoreMatch "
"DESC 'Member and MemberURL attribute pair' "
"SYNTAX OMsDirectoryString )"
,
NULL
,
NULL
},
...
...
@@ -132,10 +132,10 @@ static ConfigTable dgroupcfg[] = {
static
ConfigOCs
dgroupocs
[]
=
{
{
"( OLcfgOvOc:17.1 "
"NAME 'olcDGConfig' "
"NAME
( 'olcDynGroupConfig'
'olcDGConfig'
)
"
"DESC 'Dynamic Group configuration' "
"SUP olcOverlayConfig "
"MAY olcD
G
AttrPair
)"
,
"MAY olcD
ynGroup
AttrPair)"
,
Cft_Overlay
,
dgroupcfg
},
{
NULL
,
0
,
NULL
}
};
...
...
servers/slapd/overlays/dynlist.c
View file @
58c97882
...
...
@@ -1398,7 +1398,7 @@ static ConfigDriver dl_cfgen;
static
ConfigTable
dlcfg
[]
=
{
{
"dynlist-attrset"
,
"group-oc> [uri] <URL-ad> <[mapped:]member-ad> [...]"
,
3
,
0
,
0
,
ARG_MAGIC
|
DL_ATTRSET
,
dl_cfgen
,
"( OLcfgOvAt:8.1 NAME 'olcDlAttrSet' "
"( OLcfgOvAt:8.1 NAME
( 'olcDynListAttrSet'
'olcDlAttrSet'
)
"
"DESC 'Dynamic list: <group objectClass>, <URL attributeDescription>, <member attributeDescription>' "
"EQUALITY caseIgnoreMatch "
"SYNTAX OMsDirectoryString "
...
...
@@ -1417,10 +1417,10 @@ static ConfigTable dlcfg[] = {
static
ConfigOCs
dlocs
[]
=
{
{
"( OLcfgOvOc:8.1 "
"NAME 'olcDynamicList' "
"NAME
( 'olcDynListConfig'
'olcDynamicList'
)
"
"DESC 'Dynamic list configuration' "
"SUP olcOverlayConfig "
"MAY olcD
La
ttrSet )"
,
"MAY olcD
ynListA
ttrSet )"
,
Cft_Overlay
,
dlcfg
,
NULL
,
NULL
},
{
NULL
,
0
,
NULL
}
};
...
...
servers/slapd/overlays/memberof.c
View file @
58c97882
...
...
@@ -1759,7 +1759,7 @@ static ConfigTable mo_cfg[] = {
static
ConfigOCs
mo_ocs
[]
=
{
{
"( OLcfgOvOc:18.1 "
"NAME 'olcMemberOf' "
"NAME
( 'olcMemberOfConfig'
'olcMemberOf'
)
"
"DESC 'Member-of configuration' "
"SUP olcOverlayConfig "
"MAY ( "
...
...
tests/data/regressions/its8444/slapd-provider1.ldif
View file @
58c97882
...
...
@@ -101,13 +101,13 @@ olcSyncrepl: {2}rid=102 provider=@URI4@ binddn="cn=manager,dc=example,dc=com
dn: olcOverlay={0}dynlist,olcDatabase={1}@BACKEND@,cn=config
objectClass: olcOverlayConfig
objectClass: olcDyn
amic
List
objectClass: olcDynList
Config
olcOverlay: {0}dynlist
olcD
l
AttrSet: {0}groupOfURLs memberURL
olcD
ynList
AttrSet: {0}groupOfURLs memberURL
dn: olcOverlay={1}memberof,olcDatabase={1}@BACKEND@,cn=config
objectClass: olcOverlayConfig
objectClass: olcMemberOf
objectClass: olcMemberOf
Config
olcOverlay: {1}memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
...
...
tests/data/regressions/its8444/slapd-provider2.ldif
View file @
58c97882
...
...
@@ -101,13 +101,13 @@ olcSyncrepl: {2}rid=102 provider=@URI4@ binddn="cn=manager,dc=example,dc=com
dn: olcOverlay={0}dynlist,olcDatabase={1}@BACKEND@,cn=config
objectClass: olcOverlayConfig
objectClass: olcDyn
amic
List
objectClass: olcDynList
Config
olcOverlay: {0}dynlist
olcD
l
AttrSet: {0}groupOfURLs memberURL
olcD
ynList
AttrSet: {0}groupOfURLs memberURL
dn: olcOverlay={1}memberof,olcDatabase={1}@BACKEND@,cn=config
objectClass: olcOverlayConfig
objectClass: olcMemberOf
objectClass: olcMemberOf
Config
olcOverlay: {1}memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
...
...
tests/data/regressions/its8444/slapd-provider3.ldif
View file @
58c97882
...
...
@@ -101,13 +101,13 @@ olcSyncrepl: {2}rid=102 provider=@URI4@ binddn="cn=manager,dc=example,dc=com
dn: olcOverlay={0}dynlist,olcDatabase={1}@BACKEND@,cn=config
objectClass: olcOverlayConfig
objectClass: olcDyn
amic
List
objectClass: olcDynList
Config
olcOverlay: {0}dynlist
olcD
l
AttrSet: {0}groupOfURLs memberURL
olcD
ynList
AttrSet: {0}groupOfURLs memberURL
dn: olcOverlay={1}memberof,olcDatabase={1}@BACKEND@,cn=config
objectClass: olcOverlayConfig
objectClass: olcMemberOf
objectClass: olcMemberOf
Config
olcOverlay: {1}memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
...
...
tests/data/regressions/its8444/slapd-provider4.ldif
View file @
58c97882
...
...
@@ -101,13 +101,13 @@ olcSyncrepl: {2}rid=102 provider=@URI1@ binddn="cn=manager,dc=example,dc=com
dn: olcOverlay={0}dynlist,olcDatabase={1}@BACKEND@,cn=config
objectClass: olcOverlayConfig
objectClass: olcDyn
amic
List
objectClass: olcDynList
Config
olcOverlay: {0}dynlist
olcD
l
AttrSet: {0}groupOfURLs memberURL
olcD
ynList
AttrSet: {0}groupOfURLs memberURL
dn: olcOverlay={1}memberof,olcDatabase={1}@BACKEND@,cn=config
objectClass: olcOverlayConfig
objectClass: olcMemberOf
objectClass: olcMemberOf
Config
olcOverlay: {1}memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
...
...
tests/data/regressions/its8663/its8663
View file @
58c97882
...
...
@@ -134,7 +134,7 @@ changetype: add
objectClass: olcOverlayConfig
objectClass: olcConfig
objectClass: top
objectClass: olcMemberOf
objectClass: olcMemberOf
Config
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf
...
...
tests/scripts/test044-dynlist
View file @
58c97882
...
...
@@ -309,11 +309,11 @@ $LDAPMODIFY -x -D cn=config -h $LOCALHOST -p $PORT1 -y $CONFIGPWF > \
version: 1
dn: olcOverlay={0}dynlist,olcDatabase={
$DBIX
}
$BACKEND
,cn=config
changetype: modify
delete: olcD
La
ttrSet
olcD
La
ttrSet: {0}
delete: olcD
ynListA
ttrSet
olcD
ynListA
ttrSet: {0}
-
add: olcD
La
ttrSet
olcD
La
ttrSet: groupOfURLs memberURL sn:cn mail
add: olcD
ynListA
ttrSet
olcD
ynListA
ttrSet: groupOfURLs memberURL sn:cn mail
-
EOMODS
...
...
@@ -419,11 +419,11 @@ $LDAPMODIFY -x -D cn=config -h $LOCALHOST -p $PORT1 -y $CONFIGPWF > \
version: 1
dn: olcOverlay={0}dynlist,olcDatabase={
$DBIX
}
$BACKEND
,cn=config
changetype: modify
delete: olcD
La
ttrSet
olcD
La
ttrSet: {0}
delete: olcD
ynListA
ttrSet
olcD
ynListA
ttrSet: {0}
-
add: olcD
La
ttrSet
olcD
La
ttrSet: groupOfURLs memberURL member
add: olcD
ynListA
ttrSet
olcD
ynListA
ttrSet: groupOfURLs memberURL member
-
EOMODS
...
...
@@ -698,11 +698,11 @@ $LDAPMODIFY -x -D cn=config -h $LOCALHOST -p $PORT1 -y $CONFIGPWF > \
version: 1
dn: olcOverlay={0}dynlist,olcDatabase={
$DBIX
}
$BACKEND
,cn=config
changetype: modify
delete: olcD
La
ttrSet
olcD
La
ttrSet: {0}
delete: olcD
ynListA
ttrSet
olcD
ynListA
ttrSet: {0}
-
add: olcD
La
ttrSet
olcD
La
ttrSet: groupOfURLs memberURL member@dgMemberOf
add: olcD
ynListA
ttrSet
olcD
ynListA
ttrSet: groupOfURLs memberURL member@dgMemberOf
-
EOMODS
...
...
tests/scripts/test052-memberof
View file @
58c97882
...
...
@@ -121,7 +121,7 @@ ${mainInclude}olcDbMode: 384"
dn: olcOverlay={0}memberof,olcDatabase={1}
$BACKEND
,cn=config
objectClass: olcOverlayConfig
objectClass: olcMemberOf
objectClass: olcMemberOf
Config
olcOverlay: {0}memberof
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
...
...
@@ -130,7 +130,7 @@ olcMemberOfMemberOfAD: memberOf
dn: olcOverlay={1}memberof,olcDatabase={1}
$BACKEND
,cn=config
objectClass: olcOverlayConfig
objectClass: olcMemberOf
objectClass: olcMemberOf
Config
olcOverlay: {1}memberof
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupA
...
...
@@ -139,7 +139,7 @@ olcMemberOfMemberOfAD: memberOfA
dn: olcOverlay={2}memberof,olcDatabase={1}
$BACKEND
,cn=config
objectClass: olcOverlayConfig
objectClass: olcMemberOf
objectClass: olcMemberOf
Config
olcOverlay: {2}memberof
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupB
...
...
tests/scripts/test057-memberof-refint
View file @
58c97882
...
...
@@ -107,7 +107,7 @@ ${mainInclude}olcDbMode: 384
# {0}memberof, {1}
$BACKEND
, config
dn: olcOverlay={0}memberof,olcDatabase={1}
$BACKEND
,cn=config
objectClass: olcOverlayConfig
objectClass: olcMemberOf
objectClass: olcMemberOf
Config
olcOverlay: {0}memberof
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
...
...
tests/scripts/test066-autoca
View file @
58c97882
...
...
@@ -195,9 +195,9 @@ $LDAPMODIFY -D cn=config -H $URIP1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1
dn: olcOverlay=autoca,olcDatabase={1}
$BACKEND
,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcACAConfig
objectClass: olcA
uto
CAConfig
olcOverlay: autoca
olcACAlocalDN: cn=localhost,ou=Servers,
$BASEDN
olcA
uto
CAlocalDN: cn=localhost,ou=Servers,
$BASEDN
EOF
RC
=
$?
if
test
$RC
!=
0
;
then
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment