Skip to content

Library import fails due to broken convert_library_v2 #3491

@LoZio

Description

@LoZio

Describe the bug
I'm creating a threats template to import. Used convert_library_v2 to create the yaml.
Import fails with generic errors in the UI.
After looking at the logs from the app I found it is a problem with a field size limited to 200 chars (I was at 231).

To Reproduce
Steps to reproduce the behavior:

  1. Crate a template with a "name" column longet than 200 chars
  2. Use convert_library_v2 to crate the yaml
  3. Procedure is successful, file is not usable
my-backend   | ::: Getting Dependencies :::
my-backend   | ::: Dependencies are ok :::
my-backend   | 2026-02-18T16:21:12.197781Z [error    ] Library import error           [library.utils] ciso_assistant_url=https://my-url error=DataError('value too long for type character varying(200)\n') ip=172.20.0.2 library=<StoredLibrary: my-company-threats - my-company - Minacce ISO 27001> request_id=44eacb20-97e7-466f-ad1e-c9cc31900ae4 user_id=None
my-backend   | 2026-02-18T16:21:12.198143Z [error    ] Unexpected exception while loading newly uploaded library, removing stored entry [library.views] ciso_assistant_url=https://my-url ip=172.20.0.2 request_id=44eacb20-97e7-466f-ad1e-c9cc31900ae4 urn=urn:my-company:risk:library:my-company-threats user_id=None
my-backend   | Traceback (most recent call last):
my-backend   |   File "/code/.venv/lib/python3.14/site-packages/django/db/backends/utils.py", line 105, in _execute
my-backend   |     return self.cursor.execute(sql, params)
my-backend   |            ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
my-backend   | psycopg2.errors.StringDataRightTruncation: value too long for type character varying(200)
my-backend   |
my-backend   |
my-backend   | The above exception was the direct cause of the following exception:
my-backend   |
my-backend   | Traceback (most recent call last):
my-backend   |   File "/code/library/views.py", line 467, in upload_library
my-backend   |     load_error = library.load()
my-backend   |   File "/code/core/models.py", line 467, in load
my-backend   |     error_msg = library_importer.import_library()
my-backend   |   File "/code/library/utils.py", line 908, in import_library
my-backend   |     raise e
my-backend   |   File "/code/library/utils.py", line 899, in import_library
my-backend   |     self._import_library()
my-backend   |     ~~~~~~~~~~~~~~~~~~~~^^
my-backend   |   File "/usr/local/lib/python3.14/contextlib.py", line 85, in inner
my-backend   |     return func(*args, **kwds)
my-backend   |   File "/code/library/utils.py", line 881, in _import_library
my-backend   |     self.import_objects(library_object)
my-backend   |     ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
my-backend   |   File "/code/library/utils.py", line 861, in import_objects
my-backend   |     threat.import_threat(library_object)
my-backend   |     ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
my-backend   |   File "/code/library/utils.py", line 345, in import_threat
my-backend   |     Threat.objects.create(
my-backend   |     ~~~~~~~~~~~~~~~~~~~~~^
my-backend   |         library=library_object,
my-backend   |         ^^^^^^^^^^^^^^^^^^^^^^^
my-backend   |     ...<8 lines>...
my-backend   |         default_locale=library_object.default_locale,  # Change this in the future ?
my-backend   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
my-backend   |     )
my-backend   |     ^
my-backend   |   File "/code/.venv/lib/python3.14/site-packages/django/db/models/manager.py", line 87, in manager_method
my-backend   |     return getattr(self.get_queryset(), name)(*args, **kwargs)
my-backend   |            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
my-backend   |   File "/code/.venv/lib/python3.14/site-packages/django/db/models/query.py", line 665, in create
my-backend   |     obj.save(force_insert=True, using=self.db)
my-backend   |     ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
my-backend   |   File "/code/core/base_models.py", line 120, in save
my-backend   |     super().save(*args, **kwargs)
my-backend   |     ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
my-backend   |   File "/code/iam/models.py", line 417, in save
my-backend   |     super().save(*args, **kwargs)
my-backend   |     ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
my-backend   |   File "/code/.venv/lib/python3.14/site-packages/django/db/models/base.py", line 902, in save
my-backend   |     self.save_base(
my-backend   |     ~~~~~~~~~~~~~~^
my-backend   |         using=using,
my-backend   |         ^^^^^^^^^^^^
my-backend   |     ...<2 lines>...
my-backend   |         update_fields=update_fields,
my-backend   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
my-backend   |     )
my-backend   |     ^
my-backend   |   File "/code/.venv/lib/python3.14/site-packages/django/db/models/base.py", line 1008, in save_base
my-backend   |     updated = self._save_table(
my-backend   |         raw,
my-backend   |     ...<4 lines>...
my-backend   |         update_fields,
my-backend   |     )
my-backend   |   File "/code/.venv/lib/python3.14/site-packages/django/db/models/base.py", line 1169, in _save_table
my-backend   |     results = self._do_insert(
my-backend   |         cls._base_manager, using, fields, returning_fields, raw
my-backend   |     )
my-backend   |   File "/code/.venv/lib/python3.14/site-packages/django/db/models/base.py", line 1210, in _do_insert
my-backend   |     return manager._insert(
my-backend   |            ~~~~~~~~~~~~~~~^
my-backend   |         [self],
my-backend   |         ^^^^^^^
my-backend   |     ...<3 lines>...
my-backend   |         raw=raw,
my-backend   |         ^^^^^^^^
my-backend   |     )
my-backend   |     ^
my-backend   |   File "/code/.venv/lib/python3.14/site-packages/django/db/models/manager.py", line 87, in manager_method
my-backend   |     return getattr(self.get_queryset(), name)(*args, **kwargs)
my-backend   |            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
my-backend   |   File "/code/.venv/lib/python3.14/site-packages/django/db/models/query.py", line 1873, in _insert
my-backend   |     return query.get_compiler(using=using).execute_sql(returning_fields)
my-backend   |            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
my-backend   |   File "/code/.venv/lib/python3.14/site-packages/django/db/models/sql/compiler.py", line 1882, in execute_sql
my-backend   |     cursor.execute(sql, params)
my-backend   |     ~~~~~~~~~~~~~~^^^^^^^^^^^^^
my-backend   |   File "/code/.venv/lib/python3.14/site-packages/django/db/backends/utils.py", line 79, in execute
my-backend   |     return self._execute_with_wrappers(
my-backend   |            ~~~~~~~~~~~~~~~~~~~~~~~~~~~^
my-backend   |         sql, params, many=False, executor=self._execute
my-backend   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
my-backend   |     )
my-backend   |     ^
my-backend   |   File "/code/.venv/lib/python3.14/site-packages/django/db/backends/utils.py", line 92, in _execute_with_wrappers
my-backend   |     return executor(sql, params, many, context)
my-backend   |   File "/code/.venv/lib/python3.14/site-packages/django/db/backends/utils.py", line 100, in _execute
my-backend   |     with self.db.wrap_database_errors:
my-backend   |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
my-backend   |   File "/code/.venv/lib/python3.14/site-packages/django/db/utils.py", line 91, in __exit__
my-backend   |     raise dj_exc_value.with_traceback(traceback) from exc_value
my-backend   |   File "/code/.venv/lib/python3.14/site-packages/django/db/backends/utils.py", line 105, in _execute
my-backend   |     return self.cursor.execute(sql, params)
my-backend   |            ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
my-backend   | django.db.utils.DataError: value too long for type character varying(200)
my-backend   |
my-backend   | 2026-02-18T16:21:12.211780Z [warning  ] request_finished               [django_structlog.middlewares.request] ciso_assistant_url=https://my-url code=422 ip=172.20.0.2 request=POST /api/stored-libraries/upload/ request_id=44eacb20-97e7-466f-ad1e-c9cc31900ae4 user_id=1763e24d-d810-4422-9975-b296cc4178d2
my-backend   | Unprocessable Content: /api/stored-libraries/upload/
my-frontend  | {
my-frontend  |   error: 'libraryLoadFailed',
my-frontend  |   detail: 'An unexpected error occurred while loading the library.'
my-frontend  | }

Expected behavior
Convert library stops and tells there's an error

Environment (please complete the following information):

  • 3.11.1 on Linux/Docker

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions