Author Archives: dmitriano

An Interface Segregation Principle (ISP) example

#include <iostream>
#include <memory>
#include <string>
#include <vector>

struct IObject {
    virtual ~IObject() = default;

    /// Returns the name of the object.
    virtual std::string getName() const = 0;

    /// Prints a textual description of the object.
    virtual void describe() const = 0;

    /// Eats another object.
    virtual bool eat(IObject* other) = 0;
};
(more…)

An investigation of why dynamic_cast violates LSP

Signal sender cast in QT

QT implies that the client code will do qobject_cast that is actually dynamic_cast:

awl::ProcessTask<void> MarketModel::coPlaceOrder(OrderPtr p)
{
    // Update SQLite databse...
    // ...
    // QT signals are used in both C++ and QML.
    // They works with QObject*, and they are not aware of concrete types.
    QObject::connect(p.get(), &OrderModel::statusChanged, this, &MarketModel::onOrderStatusChanged);
}
(more…)

Examples of const function parameters in C++

Examples with int

Compiles without warnings with MSVC:

class A
{
public:

    void f(const int a);
};

void A::f(int a)
{
    a = 10;
    std::cout << a;
}
(more…)

Recording and decrypting LDAPS traffic

Capturing LDAPS traffic with keylog file

sudo apt  install tcpdump
sudo tcpdump -i any -w ldaps.pcap 'tcp port 636' &
export SSLKEYLOGFILE=/home/dmitriano/dev/work/sslkeys.log
ldapsearch -H ldaps://$localhost:636 -x -D $ad_user -w $ad_password -b "DC=my,DC=local"
ll
-rw-r--r-- 1 tcpdump   tcpdump   246320 Oct 14 13:50 ldaps.pcap
-rw-r--r-- 1 dmitriano dmitriano    176 Oct 14 13:47 sslkeys.log
(more…)

Checking LDAPS logs on a domain controller

Directory Service logs

I set Verbose level:

(Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Diagnostics")."16 LDAP Interface Events"
0
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\NTDS\Diagnostics" -Name "16 LDAP Interface Events" -Value 5
(more…)

How to remove terribly annoying English/Russian keyboard layout

(more…)

Investigating cobalt::generator

Standard C++ generator

The code below demonstrates how standard C++23 synchronous generator works:

#include <boost/cobalt.hpp>
#include <iostream>
#include <generator>

namespace cobalt = boost::cobalt;

std::generator<int> numbers()
{
    for (int i = 1; i <= 5; ++i)
    {
        co_yield i;
    }
}
(more…)

Building boost::cobalt with MSVC 2022

cd C:\dev\repos\boost_1_89_0

set OPENSSL_ROOT_DIR=C:/dev/libs/OpenSSL
set OPENSSL_USE_STATIC_LIBS=ON
 
bootstrap.bat

b2 cxxstd=20 install --with-system --with-thread --with-cobalt --prefix=C:/dev/libs/boost_1_89_0 --toolset=msvc-14.3 -s _WIN32_WINNT=0x0A00 link=static runtime-link=static variant=release address-model=64
b2 cxxstd=20 install --with-system --with-thread --with-cobalt --prefix=C:/dev/libs/boost_1_89_0 --toolset=msvc-14.3 -s _WIN32_WINNT=0x0A00 link=static runtime-link=static variant=debug address-model=64
(more…)

Nginx TCP proxy with SSL Termination

Obtaining the certificates

Obtain private and public keys from exported pfx file:

openssl pkcs12 -in ldaps.pfx -nocerts -nodes -out ldap.key
openssl pkcs12 -in ldaps.pfx -clcerts -nokeys -out ldap.crt
(more…)

Enabling LDAP over SSL

Add Certificate Manager role

Enable probably something like Certificate Manager role on DC:

(more…)