1
0
mirror of https://github.com/1C-Company/v8-code-style.git synced 2024-11-28 09:33:06 +02:00

#412 Небезопасное хранение паролей в информационной базе (#917)

This commit is contained in:
Artem Iliukhin 2022-05-12 15:17:34 +03:00 committed by GitHub
parent a563131230
commit 36f378d85b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 533 additions and 12 deletions

View File

@ -15,6 +15,7 @@
#### Метаданные
- Длина синонима раздела верхнего уровня, отображаемого в интерфейсе, не должна превышать 35 символов
- Небезопасное хранение паролей в информационной базе
#### Формы
- У реквизита "Ссылка" динамического списка выключен признак "Использовать всегда"

View File

@ -0,0 +1,11 @@
# Небезопасное хранение паролей в информационной базе
Для сведения к минимуму возможности перехвата пароля злоумышленниками не следует хранить пароли и
другую конфиденциальную информацию в информационной базе.
## Неправильно
## Правильно
## См.
[Безопасное хранение паролей](https://its.1c.ru/db/v8std#content:740:hdoc:2)

View File

@ -0,0 +1,11 @@
# Unsafe password storage
To minimize risks of unauthorized access to passwords,
avoid storing passwords or any other confidential information in the infobase.
## Noncompliant Code Example
## Compliant Solution
## See
[Secure password storage](https://support.1ci.com/hc/en-us/articles/360011003100-Secure-password-storage)

View File

@ -78,6 +78,10 @@
category="com.e1c.v8codestyle.md"
class="com.e1c.v8codestyle.internal.md.ExecutableExtensionFactory:com.e1c.v8codestyle.md.check.CommonModuleNameServerCallCachedCheck">
</check>
<check
category="com.e1c.v8codestyle.md"
class="com.e1c.v8codestyle.md.check.UnsafePasswordStorageCheck">
</check>
<check
category="com.e1c.v8codestyle.md"
class="com.e1c.v8codestyle.md.check.SubsystemSynonymTooLongCheck">

View File

@ -59,6 +59,9 @@ final class Messages
public static String MdScheduledJobPeriodicityCheck_The_minimum_job_interval_is_less_then_minute;
public static String MdScheduledJobPeriodicityCheck_title;
public static String MdScheduledJobPeriodicityCheck_Minimum_job_interval_description;
public static String UnsafePasswordStorageCheck_Avoid_storing_password_in_infobase;
public static String UnsafePasswordStorageCheck_Avoid_storing_password_in_infobase_description;
public static String UnsafePasswordStorageCheck_Avoid_storing_password_in_infobase_error;
public static String SubsystemSynonymTooLongCheck_description;
public static String SubsystemSynonymTooLongCheck_Exclude_languages_comma_separated;
public static String SubsystemSynonymTooLongCheck_Length_of_section_name_more_than_symbols_for_language;

View File

@ -0,0 +1,90 @@
/*******************************************************************************
* Copyright (C) 2022, 1C-Soft LLC and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* 1C-Soft LLC - initial API and implementation
*******************************************************************************/
package com.e1c.v8codestyle.md.check;
import static com._1c.g5.v8.dt.metadata.mdclass.MdClassPackage.Literals.BASIC_FEATURE;
import static com._1c.g5.v8.dt.metadata.mdclass.MdClassPackage.Literals.BASIC_FEATURE__PASSWORD_MODE;
import static com._1c.g5.v8.dt.metadata.mdclass.MdClassPackage.Literals.CATALOG;
import static com._1c.g5.v8.dt.metadata.mdclass.MdClassPackage.Literals.CHART_OF_CHARACTERISTIC_TYPES;
import static com._1c.g5.v8.dt.metadata.mdclass.MdClassPackage.Literals.CONSTANT;
import static com._1c.g5.v8.dt.metadata.mdclass.MdClassPackage.Literals.CONSTANT__PASSWORD_MODE;
import static com._1c.g5.v8.dt.metadata.mdclass.MdClassPackage.Literals.DOCUMENT;
import org.eclipse.core.runtime.IProgressMonitor;
import com._1c.g5.v8.dt.metadata.mdclass.BasicFeature;
import com._1c.g5.v8.dt.metadata.mdclass.Constant;
import com.e1c.g5.v8.dt.check.CheckComplexity;
import com.e1c.g5.v8.dt.check.ICheckParameters;
import com.e1c.g5.v8.dt.check.components.BasicCheck;
import com.e1c.g5.v8.dt.check.settings.IssueSeverity;
import com.e1c.g5.v8.dt.check.settings.IssueType;
import com.e1c.v8codestyle.check.StandardCheckExtension;
import com.e1c.v8codestyle.internal.md.CorePlugin;
/**
* Check not secure password storage in the information database.
*
* @author Artem Iliukhin
*/
public final class UnsafePasswordStorageCheck
extends BasicCheck
{
private static final String CHECK_ID = "unsafe-password-ib-storage"; //$NON-NLS-1$
@Override
public String getCheckId()
{
return CHECK_ID;
}
@Override
protected void configureCheck(CheckConfigurer builder)
{
builder.title(Messages.UnsafePasswordStorageCheck_Avoid_storing_password_in_infobase)
.description(Messages.UnsafePasswordStorageCheck_Avoid_storing_password_in_infobase_description)
.complexity(CheckComplexity.NORMAL)
.severity(IssueSeverity.MINOR)
.issueType(IssueType.SECURITY)
.extension(new StandardCheckExtension(getCheckId(), CorePlugin.PLUGIN_ID))
.topObject(CONSTANT)
.checkTop()
.features(CONSTANT__PASSWORD_MODE)
.topObject(CATALOG)
.containment(BASIC_FEATURE)
.features(BASIC_FEATURE__PASSWORD_MODE)
.topObject(DOCUMENT)
.containment(BASIC_FEATURE)
.features(BASIC_FEATURE__PASSWORD_MODE)
.topObject(CHART_OF_CHARACTERISTIC_TYPES)
.containment(BASIC_FEATURE)
.features(BASIC_FEATURE__PASSWORD_MODE); //TODO change to BASIC_DB_OBJECT, when will it work
}
@Override
protected void check(Object object, ResultAcceptor resultAceptor, ICheckParameters parameters,
IProgressMonitor monitor)
{
if (object instanceof BasicFeature && ((BasicFeature)object).isPasswordMode())
{
resultAceptor.addIssue(Messages.UnsafePasswordStorageCheck_Avoid_storing_password_in_infobase_error, object,
BASIC_FEATURE__PASSWORD_MODE);
}
else if (object instanceof Constant && ((Constant)object).isPasswordMode())
{
resultAceptor.addIssue(Messages.UnsafePasswordStorageCheck_Avoid_storing_password_in_infobase_error, object,
CONSTANT__PASSWORD_MODE);
}
}
}

View File

@ -17,12 +17,6 @@ CommonModuleNameGlobal_message = Global common module should end with "{0}" suff
CommonModuleNameGlobal_title = Global common module should end with Global suffix
CommonModuleNameServerCallPostfixCheck_0 = Common module should end with {0}
CommonModuleNameServerCallPostfixCheck_Common_module_name_description = Common module should end with correct postfix
CommonModuleNameServerCallPostfixCheck_Common_module_postfix_title = Common module should end with correct postfix
CommonModuleType_description = Common module has incorrect type
CommonModuleType_message = Common module for type "{0}" has incorrect settings: {1}
@ -35,6 +29,12 @@ ConfigurationDataLock_message = Application should use managed data lock mode
ConfigurationDataLock_title = Configuration data lock mode
CommonModuleNameServerCallPostfixCheck_0=Common module should end with {0}
CommonModuleNameServerCallPostfixCheck_Common_module_name_description=Common module should end with correct postfix
CommonModuleNameServerCallPostfixCheck_Common_module_postfix_title=Common module should end with correct postfix
MdListObjectPresentationCheck_Neither_Object_presentation_nor_List_presentation_is_not_filled = Neither Object presentation nor List presentation is not filled
MdListObjectPresentationCheck_decription = Neither Object presentation nor List presentation is not filled
@ -73,6 +73,12 @@ MdScheduledJobPeriodicityCheck_description = The minimum job interval is less th
MdScheduledJobPeriodicityCheck_title = The minimum job interval is less then {0}s
UnsafePasswordStorageCheck_Avoid_storing_password_in_infobase=Avoid storing passwords in the infobase
UnsafePasswordStorageCheck_Avoid_storing_password_in_infobase_description=To minimize risks of unauthorized access to passwords, avoid storing passwords in the infobase.
UnsafePasswordStorageCheck_Avoid_storing_password_in_infobase_error=Avoid storing passwords in the infobase
SubsystemSynonymTooLongCheck_Exclude_languages_comma_separated = Exclude languages (codes, comma-separated)
SubsystemSynonymTooLongCheck_Length_of_section_name_more_than_symbols_for_language = Length of section synonym "{0}" more than {1} symbols for language {2}

View File

@ -18,12 +18,6 @@ CommonModuleNameGlobal_message = Глобальный общий модуль д
CommonModuleNameGlobal_title = Глобальный общий модуль должен оканчиваться на суффикс Глобальный
CommonModuleNameServerCallPostfixCheck_0 = Общий модуль должен именоваться с постфиксом {0}
CommonModuleNameServerCallPostfixCheck_Common_module_name_description = Общий модуль должен именоваться с постфиксом
CommonModuleNameServerCallPostfixCheck_Common_module_postfix_title = Общий модуль должен именоваться с постфиксом
CommonModuleType_description = Общий модуль имеет некорректный тип
CommonModuleType_message = Общий модуль для типа "{0}" имеет некорректне настройки: {1}
@ -36,6 +30,12 @@ ConfigurationDataLock_message = Приложение должно использ
ConfigurationDataLock_title = Режим блокировки данных конфигурации
CommonModuleNameServerCallPostfixCheck_0 = Общий модуль должен именоваться с постфиксом {0}
CommonModuleNameServerCallPostfixCheck_Common_module_name_description=Общий модуль должен именоваться с постфиксом
CommonModuleNameServerCallPostfixCheck_Common_module_postfix_title=Общий модуль должен именоваться с постфиксом
MdListObjectPresentationCheck_Neither_Object_presentation_nor_List_presentation_is_not_filled = Не заполнено ни представление объекта, ни представление списка
MdListObjectPresentationCheck_decription = Не заполнено ни представление объекта, ни представление списка
@ -83,3 +83,9 @@ SubsystemSynonymTooLongCheck_Maximum_section_name_length = Максимальн
SubsystemSynonymTooLongCheck_description = Длина названия раздела превышает 35 символов
SubsystemSynonymTooLongCheck_title = Длина названия раздела превышает 35 символов
UnsafePasswordStorageCheck_Avoid_storing_password_in_infobase=Не следует хранить пароли в информационной базе
UnsafePasswordStorageCheck_Avoid_storing_password_in_infobase_description=Для сведения к минимуму возможности перехвата пароля злоумышленниками не следует хранить пароли в информационной базе
UnsafePasswordStorageCheck_Avoid_storing_password_in_infobase_error=Не следует хранить пароли в информационной базе

View File

@ -0,0 +1,68 @@
/*******************************************************************************
* Copyright (C) 2022, 1C-Soft LLC and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* 1C-Soft LLC - initial API and implementation
*******************************************************************************/
package com.e1c.v8codestyle.md.check.itests;
import static org.junit.Assert.assertNotNull;
import org.junit.Test;
import com._1c.g5.v8.dt.core.platform.IDtProject;
import com._1c.g5.v8.dt.validation.marker.Marker;
import com.e1c.g5.v8.dt.testing.check.CheckTestBase;
import com.e1c.v8codestyle.md.check.UnsafePasswordStorageCheck;
/**
* The test for class {@link UnsafePasswordStorageCheck}.
*
* @author Artem Iliukhin
*/
public class UnsafePasswordStorageCheckTest
extends CheckTestBase
{
private static final String CHECK_ID = "unsafe-password-ib-storage"; //$NON-NLS-1$
private static final String PROJECT_NAME = "UnsafePasswordStorage";
@Test
public void unsafePasswordStorageConstantCheck() throws Exception
{
IDtProject dtProject = openProjectAndWaitForValidationFinish(PROJECT_NAME);
assertNotNull(dtProject);
long id = getTopObjectIdByFqn("Constant.Constant", dtProject);
Marker marker = getFirstMarker(CHECK_ID, id, dtProject);
assertNotNull(marker);
}
@Test
public void unsafePasswordStorageDocumentCheck() throws Exception
{
IDtProject dtProject = openProjectAndWaitForValidationFinish(PROJECT_NAME);
assertNotNull(dtProject);
long id = getTopObjectIdByFqn("Document.Document", dtProject);
Marker marker = getFirstNestedMarker(CHECK_ID, id, dtProject);
assertNotNull(marker);
}
@Test
public void unsafePasswordStorageCatalogCheck() throws Exception
{
IDtProject dtProject = openProjectAndWaitForValidationFinish(PROJECT_NAME);
assertNotNull(dtProject);
long id = getTopObjectIdByFqn("Catalog.Catalog", dtProject);
Marker marker = getFirstNestedMarker(CHECK_ID, id, dtProject);
assertNotNull(marker);
}
}

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>UnsafePasswordStorage</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
<nature>com._1c.g5.v8.dt.core.V8ConfigurationNature</nature>
</natures>
</projectDescription>

View File

@ -0,0 +1,2 @@
eclipse.preferences.version=1
encoding/<project>=UTF-8

View File

@ -0,0 +1,2 @@
Manifest-Version: 1.0
Runtime-Version: 8.3.19

View File

@ -0,0 +1,116 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Catalog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="0d44c827-3d42-4d85-b451-25af5f0a3b30">
<producedTypes>
<objectType typeId="81502f8e-8ada-47d0-9b11-7ca6228db032" valueTypeId="cf33033e-e4aa-43ff-b42e-959d274f6f3a"/>
<refType typeId="f5c4f311-3dd5-4a79-87e2-5a937b979927" valueTypeId="fb60283f-d06e-48c9-9818-702586cde2ad"/>
<selectionType typeId="cb11191a-034f-40bc-a328-8f9a04dee4a6" valueTypeId="f1db8199-3224-4c85-a6c5-83eca11cbedb"/>
<listType typeId="8f085bf8-28a0-4250-9b4a-ed5775a8f93f" valueTypeId="405c423e-4413-4101-a06f-f6fe41e4d64e"/>
<managerType typeId="5749e20a-1c41-4eff-b8f5-2d892b6d7117" valueTypeId="52975bae-2795-49f6-90ec-5e5d9f11c622"/>
</producedTypes>
<name>Catalog</name>
<synonym>
<key>en</key>
<value>Catalog</value>
</synonym>
<useStandardCommands>true</useStandardCommands>
<inputByString>Catalog.Catalog.StandardAttribute.Code</inputByString>
<inputByString>Catalog.Catalog.StandardAttribute.Description</inputByString>
<fullTextSearchOnInputByString>DontUse</fullTextSearchOnInputByString>
<createOnInput>Use</createOnInput>
<dataLockControlMode>Managed</dataLockControlMode>
<fullTextSearch>Use</fullTextSearch>
<levelCount>2</levelCount>
<foldersOnTop>true</foldersOnTop>
<codeLength>9</codeLength>
<descriptionLength>25</descriptionLength>
<codeType>String</codeType>
<codeAllowedLength>Variable</codeAllowedLength>
<checkUnique>true</checkUnique>
<autonumbering>true</autonumbering>
<defaultPresentation>AsDescription</defaultPresentation>
<editType>InDialog</editType>
<choiceMode>BothWays</choiceMode>
<attributes uuid="f91b597f-74f0-4898-a6af-2a97eff91e5b">
<name>Attribute</name>
<synonym>
<key>en</key>
<value>Attribute</value>
</synonym>
<type>
<types>String</types>
<stringQualifiers>
<length>10</length>
</stringQualifiers>
</type>
<passwordMode>true</passwordMode>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
<fillValue xsi:type="core:UndefinedValue"/>
<fullTextSearch>Use</fullTextSearch>
<dataHistory>Use</dataHistory>
</attributes>
<attributes uuid="f6cfdf36-af78-4ae0-959a-860f1b4bde7c">
<name>Attribute1</name>
<synonym>
<key>en</key>
<value>Attribute1</value>
</synonym>
<type>
<types>String</types>
<stringQualifiers>
<length>10</length>
</stringQualifiers>
</type>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
<fillValue xsi:type="core:UndefinedValue"/>
<fullTextSearch>Use</fullTextSearch>
<dataHistory>Use</dataHistory>
</attributes>
<tabularSections uuid="aa5087a9-6dbf-434b-8d4e-ea78c7606e57">
<producedTypes>
<objectType typeId="210c3388-f58f-462c-afde-1f06b25288b4" valueTypeId="8e18dbdb-54cf-43e1-9ca6-00321a0e7cf4"/>
<rowType typeId="cbf02324-dcb3-421a-94f0-092aad591f15" valueTypeId="ecd2feb4-a615-4bf1-8332-3b3ff9342587"/>
</producedTypes>
<name>TabularSection</name>
<synonym>
<key>en</key>
<value>Tabular section</value>
</synonym>
<attributes uuid="2ece4c6f-8539-4dfa-b554-74fb22c1ff26">
<name>Attribute</name>
<synonym>
<key>en</key>
<value>Attribute</value>
</synonym>
<type>
<types>String</types>
<stringQualifiers>
<length>10</length>
</stringQualifiers>
</type>
<passwordMode>true</passwordMode>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
<dataHistory>Use</dataHistory>
<fullTextSearch>Use</fullTextSearch>
</attributes>
<attributes uuid="29172d4e-8d31-465a-83f1-ae0fe816dc80">
<name>Attribute1</name>
<synonym>
<key>en</key>
<value>Attribute1</value>
</synonym>
<type>
<types>String</types>
<stringQualifiers>
<length>10</length>
</stringQualifiers>
</type>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
<dataHistory>Use</dataHistory>
<fullTextSearch>Use</fullTextSearch>
</attributes>
</tabularSections>
</mdclass:Catalog>

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<cmi:CommandInterface xmlns:cmi="http://g5.1c.ru/v8/dt/cmi"/>

View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Configuration xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="a117c83f-d9f8-4628-ae78-b1c46549636e">
<name>UnsafePasswordStorage</name>
<synonym>
<key>en</key>
<value>Unsafe password storage</value>
</synonym>
<containedObjects classId="9cd510cd-abfc-11d4-9434-004095e12fc7" objectId="4d108b38-b244-423b-a420-bc21c110459b"/>
<containedObjects classId="9fcd25a0-4822-11d4-9414-008048da11f9" objectId="5860e6e7-bc7b-4d2f-95a3-072bcb8e87c0"/>
<containedObjects classId="e3687481-0a87-462c-a166-9f34594f9bba" objectId="0e3c7a50-5464-4071-a7a4-5e754c25b27c"/>
<containedObjects classId="9de14907-ec23-4a07-96f0-85521cb6b53b" objectId="238f9938-388d-4654-a7d8-26457bf63f48"/>
<containedObjects classId="51f2d5d8-ea4d-4064-8892-82951750031e" objectId="e4333249-4586-4d8f-ae79-bfa46ee2a977"/>
<containedObjects classId="e68182ea-4237-4383-967f-90c1e3370bc7" objectId="e8e0ce7a-5a35-43b0-8104-4de863a3b8c3"/>
<containedObjects classId="fb282519-d103-4dd3-bc12-cb271d631dfc" objectId="32068759-9545-4339-a739-c9a45ca48c74"/>
<configurationExtensionCompatibilityMode>8.3.21</configurationExtensionCompatibilityMode>
<defaultRunMode>ManagedApplication</defaultRunMode>
<usePurposes>PersonalComputer</usePurposes>
<usedMobileApplicationFunctionalities>
<functionality>
<use>true</use>
</functionality>
<functionality>
<functionality>OSBackup</functionality>
<use>true</use>
</functionality>
</usedMobileApplicationFunctionalities>
<defaultLanguage>Language.English</defaultLanguage>
<dataLockControlMode>Managed</dataLockControlMode>
<objectAutonumerationMode>NotAutoFree</objectAutonumerationMode>
<modalityUseMode>DontUse</modalityUseMode>
<synchronousPlatformExtensionAndAddInCallUseMode>DontUse</synchronousPlatformExtensionAndAddInCallUseMode>
<compatibilityMode>8.3.21</compatibilityMode>
<languages uuid="a80e8cf3-a962-4585-8631-71e4cfd88da5">
<name>English</name>
<synonym>
<key>en</key>
<value>English</value>
</synonym>
<languageCode>en</languageCode>
</languages>
<constants>Constant.Constant</constants>
<catalogs>Catalog.Catalog</catalogs>
<documents>Document.Document</documents>
</mdclass:Configuration>

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<cmi:CommandInterface xmlns:cmi="http://g5.1c.ru/v8/dt/cmi"/>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Constant xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="32b5b628-da6e-4868-b8fc-06f2ec5cece3">
<producedTypes>
<managerType typeId="d4eb4b7b-7e45-4a74-bc7a-770fb35bc07e" valueTypeId="3eca7ac4-7ff1-434c-ac0c-0c8ff1ff676f"/>
<valueManagerType typeId="71a6c0da-29fc-42e6-92e0-c64250a46c20" valueTypeId="ed860853-fb2e-418b-9848-40fd0c5cda52"/>
<valueKeyType typeId="3421be78-1d56-4d2b-b08a-fe6e0f825d79" valueTypeId="07eea9eb-7165-4e84-8c56-59f4b416a089"/>
</producedTypes>
<name>Constant</name>
<synonym>
<key>en</key>
<value>Constant</value>
</synonym>
<type>
<types>String</types>
<stringQualifiers>
<length>10</length>
</stringQualifiers>
</type>
<useStandardCommands>true</useStandardCommands>
<passwordMode>true</passwordMode>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
<dataLockControlMode>Managed</dataLockControlMode>
</mdclass:Constant>

View File

@ -0,0 +1,111 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="a6bdfa11-cb4e-4083-9497-ef0d792ce0a6">
<producedTypes>
<objectType typeId="9d09e9ad-5528-4943-b6e8-91c359973dc6" valueTypeId="8c619f20-8478-47ae-bc3a-69edd0e681c7"/>
<refType typeId="8e8ab5df-d3f6-4938-8971-124facf3882d" valueTypeId="83521e2a-7b55-4e43-9a77-e60c69961263"/>
<selectionType typeId="674e373f-937a-498d-8cc3-52d069e99d53" valueTypeId="e7e78ace-efd6-4306-a50e-b87a25e5c57d"/>
<listType typeId="bbfb7ce3-2ee9-4167-a697-372e802596c9" valueTypeId="66d6db43-58a9-4cd0-a9ba-888425bfabd6"/>
<managerType typeId="e04bfbf3-9968-42e9-8d68-5c2eb2e0fda2" valueTypeId="d0c83892-0b38-4177-8152-9c4db4d45f17"/>
</producedTypes>
<name>Document</name>
<synonym>
<key>en</key>
<value>Document</value>
</synonym>
<useStandardCommands>true</useStandardCommands>
<inputByString>Document.Document.StandardAttribute.Number</inputByString>
<fullTextSearchOnInputByString>DontUse</fullTextSearchOnInputByString>
<createOnInput>Use</createOnInput>
<dataLockControlMode>Managed</dataLockControlMode>
<fullTextSearch>Use</fullTextSearch>
<numberType>String</numberType>
<numberLength>9</numberLength>
<numberAllowedLength>Variable</numberAllowedLength>
<checkUnique>true</checkUnique>
<autonumbering>true</autonumbering>
<postInPrivilegedMode>true</postInPrivilegedMode>
<unpostInPrivilegedMode>true</unpostInPrivilegedMode>
<attributes uuid="82867c72-f794-4dc9-a233-2b150ca5d02e">
<name>Attribute</name>
<synonym>
<key>en</key>
<value>Attribute</value>
</synonym>
<type>
<types>String</types>
<stringQualifiers>
<length>10</length>
</stringQualifiers>
</type>
<passwordMode>true</passwordMode>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
<fillValue xsi:type="core:UndefinedValue"/>
<fullTextSearch>Use</fullTextSearch>
<dataHistory>Use</dataHistory>
</attributes>
<attributes uuid="b545253e-45da-48bb-9ae6-f41b516d65cf">
<name>Attribute1</name>
<synonym>
<key>en</key>
<value>Attribute1</value>
</synonym>
<type>
<types>String</types>
<stringQualifiers>
<length>10</length>
</stringQualifiers>
</type>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
<fillValue xsi:type="core:UndefinedValue"/>
<fullTextSearch>Use</fullTextSearch>
<dataHistory>Use</dataHistory>
</attributes>
<tabularSections uuid="276fa58f-641c-455b-b512-3afff3d65788">
<producedTypes>
<objectType typeId="95f8b3d2-054c-4ed8-bc94-84d5449ca506" valueTypeId="da64438c-99af-4dae-85f9-5809cf2f4595"/>
<rowType typeId="d894873c-eab3-4ef0-a23c-5db5abd68a81" valueTypeId="59180447-d44a-4b5f-acc2-14ff910d135a"/>
</producedTypes>
<name>TabularSection</name>
<synonym>
<key>en</key>
<value>Tabular section</value>
</synonym>
<attributes uuid="1424c847-95d8-4511-81c9-dce439f79d7e">
<name>Attribute</name>
<synonym>
<key>en</key>
<value>Attribute</value>
</synonym>
<type>
<types>String</types>
<stringQualifiers>
<length>10</length>
</stringQualifiers>
</type>
<passwordMode>true</passwordMode>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
<dataHistory>Use</dataHistory>
<fullTextSearch>Use</fullTextSearch>
</attributes>
<attributes uuid="115ba99a-0caf-46d2-9f99-2aaae14c11f6">
<name>Attribute1</name>
<synonym>
<key>en</key>
<value>Attribute1</value>
</synonym>
<type>
<types>String</types>
<stringQualifiers>
<length>10</length>
</stringQualifiers>
</type>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
<dataHistory>Use</dataHistory>
<fullTextSearch>Use</fullTextSearch>
</attributes>
</tabularSections>
</mdclass:Document>