Devices Documents


Veridium server maintains internally the list of devices. Each device gets an unique internal ID in form of UUID.

Each device is linked to an account, this being modeled by two fields: accountID (the internal Veridium account ID) and accountExternalID (the account ID imported from the Active Directory). Also, each device also has a deviceType, which can be

  • phone

  • desktop

  • friend – used for devices which are part of the infrastructure and use the Veridium Server API

  • admin – used for the devices which allow users to connect to Veridium Admin


Screenshot 2024-07-01 at 15.42.37.png


Devices are linked to a certificate, by the fields representing the Certificate UUID (the internal Veridium ID of the certificate), Certificate Expiration Time and Certificate Fingerprint. Also, they carry information about the OS they are running on (OS name, OS version, OS patch) and the App and SDK version they are using.

Another aspect is that Veridium Server has an internal device management policy with groups and roles.

Each device is part of one or more groups and each group has a list of associated roles. The internal roles are used to gain access for certain internal Veridium resources.

Lastly, each device has a set of biometric capabilities which can be used during authentications, such as TOTP, 4F, PIN, TOUCHID, VFACE, etc

Other fields:

  • Device name, commercial name, description, manufacturer

  • Device registration time

  • Whether the device is a system device or not

  • Whether the device is dormant or not

  • The device status, which can be NONE, ACTIVATED, BLOCKED_BY_ADMIN, BLOCKED_BY_OWNER, LOST, etc.

Storage format in Elasticsearch

In Elastic, device related data is stored in two index aliases:

  • devices - holds the current state of each device (serialized as JSON) together with a compact array of history logs.

  • device_history - holds each history log of a device in a separate document. It contains information about the action, the entire state of the device in that moment and the set of field changes brought by that specific action.

Devices Index

Devices are distributed in multiple indices, using an elasticsearch rollover policy that automatically creates and writes into a new index when the size of the current index goes beyond 50GB. The first index will be called devices-000001, the second devices-000002 and so on. The first index is manually created by the ElasticSearchSettingsUpdate migration task.

A document in an device index contains two main fields: device (holding the current state of the device) and actionLogs (compact array of history logs, NOT indexed). It can be used for searching data related to the current state of devices.

The device field contains the following searchable fields:

Field path

Functional Meaning

Mapping types

Notes

Example Values

id


keyword

searchable as keyword only

298cedef-d78b-4f40-9579-2637343144f6

accountExternalID


keyword

searchable as keyword only

johndoe@veridiumid.com

accountID


keyword

searchable as keyword only

ad27868d-0baf-4d70-85eb-0ae3d3bb7ff0

appVersion


keyword,text

searchable as keyword or text (individual/partial terms)

3.6

applicationId


keyword

searchable as keyword only

AD

authenticatorType


keyword_lowercase

searchable as keyword only (lowercase value)

CLIENT_FULL

biometricCapabilities


keyword

array of keyword searchable terms

["TOTP","4F","PIN","TOUCHID","VFACE"]

bundleID


keyword

searchable as keyword only

com.veridiumid.authenticator

certExpirationTime




2025-04-11T09:43:55.544+00:00

certUUID


keyword

searchable as keyword only

63425300-ECBD-4636-8924-6895792CF226

certificateFingerprint


keyword

searchable as keyword only

8E:74:B6:ED:07:B2:60:42:2A:38:93:69:2E:63:B0:5C:FE:F9:72:D9

commercialName


keyword,text

searchable as keyword or text (individual/partial terms)

Apple iPhone 13 Pro Max

description


keyword,text

searchable as keyword

iPhone14,3 ' 17.4.1

deviceType


keyword_lowercase

searchable as keyword only (lowercase value)

PHONE

dormant


boolean


false

enrolmentRequestUUID


keyword

searchable as keyword only

6b6b2420-5b8d-4184-ac5a-105f635c19fc

externalId


keyword

searchable as keyword only

61865D1F-2BB5-4FA9-A064-6E2C2A0B5667

groups


keyword

array of keyword searchable terms

["Administrators", "Users"]

httpContextIP


keyword

searchable as keyword only

80.97.13.78

isSystemDevice


boolean


false

locale


keyword

searchable as keyword only

en

manufacturer


keyword,text

searchable as keyword or text (individual/partial terms)

Apple

name


keyword,text

searchable as keyword or text (individual/partial terms)

iPhone

os


keyword,text

searchable as keyword or text (individual/partial terms)

iOS

osPatch


keyword,text

searchable as keyword or text (individual/partial terms)

21E236

osVersion


keyword,text

searchable as keyword or text (individual/partial terms)

17.4.1

status


keyword_lowercase

searchable as keyword only (lowercase value)

ACTIVATED

registrationTime


date


2024-04-11T07:57:55.820+00:00

sdkVersion


keyword,text

searchable as keyword or text (individual/partial terms)

5.11.4

Example of document:

{
      "device": {
          "id": "298cedef-d78b-4f40-9579-2637343144f6",
          "accountExternalID": "johndoe@veridiumid.com",
          "accountID": "ad27868d-0baf-4d70-85eb-0ae3d3bb7ff0",
          "appVersion": "3.6",
          "applicationId": "AD",
          "authenticatorType": "CLIENT_FULL",
          
          "biometricCapabilities": [
            "TOTP",
            "4F",
            "NULL",
            "PIN",
            "TOUCHID",
            "VFACE"
          ],
          
          "bundleID": "com.veridiumid.authenticator",
          "certExpirationTime": "2025-04-11T09:43:55.544+00:00",
          "certUUID": "63425300-ECBD-4636-8924-6895792CF226",
          "certificateFingerprint": "8E:74:B6:ED:07:B2:60:42:2A:38:93:69:2E:63:B0:5C:FE:F9:72:D9",
          "commercialName": "Apple iPhone 13 Pro Max",
          "description": "iPhone14,3 ' 17.4.1",
          "deviceType": "PHONE",
          "dormant": false,
          "enrolmentRequestUUID": "6b6b2420-5b8d-4184-ac5a-105f635c19fc",
          "externalId": "61865D1F-2BB5-4FA9-A064-6E2C2A0B5667",
          "groups": [
            "Administrators",
            "Users"
          ],
          "httpContextIP": "80.97.13.78",
          "isSystemDevice": false,
          "locale": "en",
          "manufacturer": "Apple",
          "name": "iPhone",
          "os": "iOS",
          "osPatch": "21E236",
          "osVersion": "17.4.1",
          "previousStatus": "NONE",
          "status": "ACTIVATED",
          "registrationTime": "2024-04-11T07:57:55.820+00:00",
          "sdkVersion": "5.11.4",
        }
      },
      "actionLogs": [...] // NOT INDEXED
    }

Devices History Index

Device history documents are distributed in indices using time window pattern. An index for each month following the pattern veridium.device_history-YYYY-MM (veridium.device_history-2024-02).

The index is automatically created when the first device history index request is received for the current month.

Documents are never individually deleted, only the entire index gets deleted according to the lifecycle policy.

A document in the device history index contains searchable fields related to the action itself (actionId, type, time, location, authorAccountId, authorDeviceId). Also, it contains the entire state of the device in that moment (the device field, which has the same searchable fields as above) and a set of searchable fieldChanges, storing all the fields that have changed compared to the previous version, with their previous and current value. It can be used for searching data related to specific mutations of a device.

An example of document:

{
  "id": "ac03cfd9-1528-422e-b5e3-b72f0fdcaa3d",
  "actionTime": "2024-04-11T09:43:55.580+00:00",
  "actionType": "UPDATED",
  "location": {
    "ip": "80.91.11.71",
    "countryCode": "RO",
    "countryName": "Romania",
    "regionCode": "IF",
    "regionName": "Ilfov",
    "city": "Dobroeşti",
    "postalCode": "123456",
    "coordinates": {
      "lat": 12.3456,
      "lon": 34.5678
    }
  },
  "authorAccountId": "ad27868d-0baf-4d70-85eb-0ae3d3bb7ff0",
  "authorDeviceId": "ad27868d-0baf-4d70-85eb-0ae3d3bb7ff0",
  "device": {...} // the current state of the device, having the same structure as above
  "fieldChanges": {
      "certExpirationTime": {
        "previousValue": "2025-04-11T09:31:16.437+00:00",
        "currentValue": "2025-04-11T09:43:55.544+00:00"
      },
      "certificateFingerprint": {
        "previousValue": "1D:5F:BA:95:0D:7C:86:96:52:7E:60:CC:B9:7D:87:96:5F:70:BD:42",
        "currentValue": "69:9A:13:D8:AD:D4:5A:7B:E9:5E:0E:50:5C:A8:BC:27:09:EA:01:02"
      },
      "certUUID": {
        "previousValue": "B4392F8B-7B9D-4A98-AF24-27F1EADA6E2A",
        "currentValue": "63425300-ECBD-4636-8924-6895792CF226"
      },
      "osVersion": {
        "previousValue": "17.4.0",
        "currentValue": "17.4.1"
      }
      ,... //other fields from the state that have changed in this specific history event
    },
}