Skip to content

--nedbtodb migration silently zeroes user rights (all users lose admin permissions) #8093

Description

@claytontavaresdan

Title (EN): --nedbtodb migration silently zeroes user rights (all users lose admin permissions)

Título (PT): Migração --nedbtodb zera silenciosamente o campo rights dos usuários (todos perdem permissões de admin)


Summary / Resumo

EN: When running node meshcentral.js --nedbtodb to migrate from NeDB to MongoDB, the rights field of every user document is not carried over — it ends up as 0 (or missing) in the MongoDB target. The result is that all users lose every permission, including the server administrator (0xFFFFFFFF expected). There is no error, no warning, and the server starts normally — but no user can administer anything, and the File Management / server-side file access (bit 0x200) is silently disabled for everyone.

PT: Ao executar node meshcentral.js --nedbtodb para migrar de NeDB para MongoDB, o campo rights de todos os documentos de usuário não é preservado — ele termina como 0 (ou ausente) no destino MongoDB. O resultado é que todos os usuários perdem todas as permissões, inclusive o administrador do servidor (que deveria ser 0xFFFFFFFF). Não há erro nem aviso: o servidor sobe normalmente, mas nenhum usuário consegue administrar nada, e o File Management / acesso a arquivos no servidor (bit 0x200) fica desativado silenciosamente para todos.


Steps to reproduce / Passos para reproduzir

EN:

  1. Have a working MeshCentral running on NeDB with at least one admin user whose rights = 4294967295 (0xFFFFFFFF).
  2. Stop the server, set settings.mongodb in config.json to a MongoDB connection string.
  3. Run node meshcentral.js --nedbtodb.
  4. Start MeshCentral normally (node meshcentral.js).
  5. Inspect the migrated user documents in MongoDB:
    db.meshcentral.find({ type: "user" }, { email: 1, rights: 1 })
  6. Observed: every user has rights: 0 (or the field is absent).
  7. Log in as the former admin → no administrative UI, File Management tab unavailable.

PT:

  1. Ter um MeshCentral funcionando em NeDB com pelo menos um usuário admin cujo rights = 4294967295 (0xFFFFFFFF).
  2. Parar o servidor, definir settings.mongodb no config.json apontando para um MongoDB.
  3. Executar node meshcentral.js --nedbtodb.
  4. Iniciar o MeshCentral normalmente (node meshcentral.js).
  5. Inspecionar os documentos de usuário migrados no MongoDB:
    db.meshcentral.find({ type: "user" }, { email: 1, rights: 1 })
  6. Observado: todos os usuários têm rights: 0 (ou o campo está ausente).
  7. Logar como o ex-admin → sem UI administrativa, aba de File Management indisponível.

Root cause / Causa raiz

EN: The NeDB→Mongo migration path (--nedbtodb, in db.js) copies the meshcentral collection documents but does not preserve the rights integer. Either the field is dropped during the document transform, or the Mongo users schema/insert defaults it to 0. Because NeDB stored rights as a top-level number and the Mongo path re-serializes the record, the value is lost. The migration logs "Done. N record(s)" but never validates that permission bits survived.

PT: O caminho de migração NeDB→Mongo (--nedbtodb, em db.js) copia os documentos da collection meshcentral, mas não preserva o inteiro rights. Ou o campo é descartado durante a transformação do documento, ou o schema/insert Mongo do usuário o define como 0 por padrão. Como o NeDB armazenava rights como número de nível superior e o caminho Mongo re-serializa o registro, o valor é perdido. A migração registra "Done. N record(s)", mas nunca valida se os bits de permissão sobreviveram.


Impact / Impacto

EN: Data corruption / silent privilege loss. Any operator migrating to MongoDB (the recommended path on Node 22/24, where NeDB is deprecated) ends up with a server where nobody can administer anything. High severity because it is silent and affects 100% of migrated users.

PT: Corrupção de dados / perda silenciosa de privilégios. Qualquer operador que migra para MongoDB (o caminho recomendado no Node 22/24, onde NeDB está obsoleto) acaba com um servidor onde ninguém consegue administrar nada. Severidade alta porque é silencioso e afeta 100% dos usuários migrados.


Suggested fix / Correção sugerida

EN: In the --nedbtodb migration, explicitly copy rights (and any other permission/flag fields) from the source NeDB record to the Mongo insert, and add a post-migration assertion that every type:"user" document has rights > 0. Example:

// during record transform
const rights = (src.rights !== undefined && src.rights !== null) ? src.rights : 4294967295;
mongoDoc.rights = rights;

And log a warning if any user ends up with rights === 0.

PT: Na migração --nedbtodb, copiar explicitamente rights (e quaisquer outros campos de permissão/flag) do registro NeDB de origem para o insert Mongo, e adicionar uma asserção pós-migração de que todo documento type:"user" tem rights > 0. Exemplo:

// durante a transformação do registro
const rights = (src.rights !== undefined && src.rights !== null) ? src.rights : 4294967295;
mongoDoc.rights = rights;

E registrar um aviso se algum usuário terminar com rights === 0.


Environment / Ambiente

  • MeshCentral version: 1.2.5
  • Node.js: v24.18.1
  • Migration: NeDB → MongoDB 7.0.40
  • OS: Alpine 3.24 (container ylianst/meshcentral / meshcentral-aio)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions