# -*- mode: python -*-
Import("env")
Import("wiredtiger")
Import("get_option")

env = env.Clone()

using_ubsan = False
sanitizer_list = get_option('sanitize')
if sanitizer_list:
    using_ubsan = 'undefined' in sanitizer_list.split(',')

if not wiredtiger:
    env.FatalError("EncryptedStorage requires WiredTiger")

wtEnv = env.Clone()
wtEnv.InjectThirdParty(libraries=['wiredtiger'])
if env.TargetOSIs('darwin', 'macOS'):
    wtEnv.Append(CPPDEFINES=["DISABLE_GCM_TESTVECTORS"]);


wtEnv.Library(target='encryption_key_manager_aux',
            source=[
                'encryption_key_manager_init.cpp',
                'encryption_server_status.cpp',
            ],
            LIBDEPS=[
                'encryptdb',
                'symmetric_crypto_enterprise',
            ],
            LIBDEPS_PRIVATE=[
                '$BUILD_DIR/mongo/db/commands/server_status',
            ],
            PROGDEPS_DEPENDENTS=[
                '$BUILD_DIR/mongo/mongod',
            ])

env.Library(
    target='keystore_metadata',
    source=[
        'keystore_metadata.idl',
        'keystore_metadata.cpp',
    ],
    LIBDEPS=[
        'symmetric_crypto_enterprise',
        '$BUILD_DIR/mongo/crypto/symmetric_crypto',
    ],
    LIBDEPS_PRIVATE=[
        '$BUILD_DIR/mongo/db/storage/storage_engine_metadata',
    ]
)

wtEnv.Library(target='encryptdb',
              source=[
                   'keystore_data_store.cpp',
                   'keystore.cpp',
                   'encrypted_data_protector.cpp',
                   'encryption_key_manager.cpp',
                   'wiredtiger_encryption_callbacks.cpp',
                   'encryption_key_manager.idl',
              ],
              LIBDEPS=[
                   '$BUILD_DIR/mongo/base',
                   '$BUILD_DIR/mongo/crypto/symmetric_crypto',
                   '$BUILD_DIR/mongo/db/storage/encryption_hooks',
                   '$BUILD_DIR/mongo/db/storage/wiredtiger/storage_wiredtiger_core',
                   '$BUILD_DIR/third_party/shim_wiredtiger',
              ],
              LIBDEPS_PRIVATE=[
                   'key_acquisition',
                   'keystore_metadata',
                   'symmetric_crypto_enterprise',
                   '$BUILD_DIR/mongo/db/catalog/catalog_impl',
                   '$BUILD_DIR/mongo/db/storage/storage_options',
                   '$BUILD_DIR/mongo/idl/server_parameter',
              ],
)

env.Library(target='log_redact_options',
            source=[
                'log_redact_options.cpp',
                'log_redact_options.idl',
            ],
            LIBDEPS_PRIVATE=[
                '$BUILD_DIR/mongo/util/options_parser/options_parser',
                '$BUILD_DIR/mongo/idl/server_parameter',
            ],
            PROGDEPS_DEPENDENTS=[
                '$BUILD_DIR/mongo/mongos'
            ],
)

env.Library(target='symmetric_crypto_enterprise',
            source=[
                'symmetric_crypto.cpp',
                'symmetric_crypto_smoke.cpp',
                'encryption_options.cpp',
                'kmip_options.cpp',
                'encryption_options.idl',
                'kmip_options.idl',
            ],
            LIBDEPS=[
                '$BUILD_DIR/mongo/base/secure_allocator',
                '$BUILD_DIR/mongo/util/net/ssl_manager',
                '$BUILD_DIR/mongo/util/secure_zero_memory',
                '$BUILD_DIR/mongo/crypto/symmetric_crypto',
            ],
            LIBDEPS_PRIVATE=[
                '$BUILD_DIR/mongo/util/options_parser/options_parser',
                'log_redact_options'
            ]
)

env.Library(target='kmip',
            source=[
                'kmip_request.cpp',
                'kmip_response.cpp',
                'kmip_service.cpp',
            ],
            LIBDEPS=[
                '$BUILD_DIR/mongo/base',
                '$BUILD_DIR/mongo/crypto/symmetric_crypto',
                'symmetric_crypto_enterprise',
                '$BUILD_DIR/mongo/util/net/network',
            ])

env.Library(
    target='key_acquisition',
    source=[
        'encryption_key_acquisition.cpp',
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/auth/security_file',
        'kmip',
    ]
)

wtEnv.CppUnitTest(
    target='enterprise_encryptdb_test',
    source=[
        'keystore_metadata_test.cpp',
        'keystore_test.cpp',
        'kmip_request_test.cpp',
        'kmip_response_test.cpp',
        'symmetric_crypto_test.cpp',
        'remove_saver_test.cpp'
    ],
    LIBDEPS=[
        '$BUILD_DIR/mongo/db/service_context_test_fixture',
        '$BUILD_DIR/mongo/db/storage/storage_options',
        '$BUILD_DIR/mongo/db/storage/wiredtiger/storage_wiredtiger_core',
        '$BUILD_DIR/mongo/util/net/network',
        "$BUILD_DIR/mongo/db/storage/remove_saver",
        '$BUILD_DIR/mongo/base',
        "$BUILD_DIR/mongo/db/server_options_core",
        "$BUILD_DIR/mongo/rpc/rpc",
        'encryptdb',
        'keystore_metadata',
        'kmip',
        'symmetric_crypto_enterprise',
    ],
)

if not using_ubsan:
    wtEnv.CppUnitTest(
        target='enterprise_encryptdb_noubsan_test',
        source=[
            'wiredtiger_encryption_test.cpp',
        ],
        LIBDEPS=[
            '$BUILD_DIR/mongo/db/auth/authmocks',
            '$BUILD_DIR/mongo/db/auth/security_file',
            '$BUILD_DIR/mongo/db/service_context',
            '$BUILD_DIR/mongo/db/service_context_test_fixture',
            '$BUILD_DIR/mongo/db/storage/wiredtiger/storage_wiredtiger_core',
            '$BUILD_DIR/mongo/util/net/network',
            'encryptdb',
            'symmetric_crypto_enterprise',
        ],
    )