Commit graph

77 commits

Author SHA1 Message Date
Tim Baek
672094b707
Merge pull request #141 from walkerobrien-cw/fix/publish-each-flavor
Some checks failed
Docker (GHCR) / read-version (push) Has been cancelled
Docker (GHCR) / build-dev (amd64, Dockerfile, default, linux/amd64, ubuntu-latest) (push) Has been cancelled
Docker (GHCR) / build-dev (amd64, Dockerfile.alpine, alpine, linux/amd64, ubuntu-latest) (push) Has been cancelled
Docker (GHCR) / build-dev (arm64, Dockerfile, default, linux/arm64, ubuntu-24.04-arm) (push) Has been cancelled
Docker (GHCR) / build-dev (arm64, Dockerfile.alpine, alpine, linux/arm64, ubuntu-24.04-arm) (push) Has been cancelled
Docker (GHCR) / merge-dev (push) Has been cancelled
Docker (GHCR) / merge-dev-alpine (push) Has been cancelled
Docker (GHCR) / build-release (amd64, Dockerfile, default, linux/amd64, ubuntu-latest) (push) Has been cancelled
Docker (GHCR) / build-release (amd64, Dockerfile.alpine, alpine, linux/amd64, ubuntu-latest) (push) Has been cancelled
Docker (GHCR) / build-release (arm64, Dockerfile, default, linux/arm64, ubuntu-24.04-arm) (push) Has been cancelled
Docker (GHCR) / build-release (arm64, Dockerfile.alpine, alpine, linux/arm64, ubuntu-24.04-arm) (push) Has been cancelled
Docker (GHCR) / merge-release (push) Has been cancelled
Docker (GHCR) / merge-release-alpine (push) Has been cancelled
ci(docker): publish each image flavor on its own
2026-10-10 10:34:25 -05:00
Tim Baek
2be218974f
Merge pull request #137 from pakalov/feature/sharepoint-root-path
feat(sharepoint): add path option to sync a single library folder
2026-10-10 10:33:28 -05:00
Walker O'Brien
45e79971df ci(docker): publish each image flavor on its own
The merge jobs needed the whole build matrix, so the alpine/arm64 build
failing on pymupdf blocked the default image too and no 0.5.0 tag was
published. Each merge job now runs unless the workflow was cancelled and
publishes only when both of its own arches built.

Refs #126
2026-10-10 11:31:30 -04:00
Tim Baek
cbe5102ba2
Merge pull request #128 from djlongy/fix/markdown-upload-content-type
fix: send Markdown uploads as text/markdown
2026-10-10 10:13:28 -05:00
Tim Baek
c43c20cf0f
Merge pull request #134 from LizardNerd/patch-1
Update bookstack.py - Added the ability to accept/refuse self-signed certs
2026-10-10 10:12:58 -05:00
Tim Baek
9aa0c1035b
Merge pull request #140 from glonor/fix/nextcloud-dav-path-encoding
fix: handle Nextcloud DAV path encoding
2026-10-10 10:12:22 -05:00
glonor
e295e4c302 fix: handle Nextcloud DAV path encoding 2026-10-09 15:06:15 +02:00
Pasquale Ventrella
419a66de79 feat(sharepoint): add path option to sync a single library folder
Scan starts at the given folder and uploaded paths are relative to it.
2026-10-02 05:12:36 +02:00
LizardNerd
636edeafdf
Update bookstack.py - Added the ability to accept/refuse self-signed certs 2026-09-29 17:44:43 +02:00
djlongy
191fae4afb
fix: send Markdown uploads as text/markdown
The published image runs Python 3.11, whose mimetypes table has no .md
entry, and the slim base ships no /etc/mime.types. httpx then labels
every Markdown upload application/octet-stream. Open WebUI only reads a
file as plain text when the type is text/* or the extension is a known
source extension, so with a content extraction engine configured
(Docling, Tika) each .md went through that engine and came back
re-rendered. Docling in particular breaks GFM tables that contain
inline code.

Fall back to text/markdown for .md and .markdown when mimetypes has no
answer. Registering the type globally with mimetypes.add_type would
also work but changes process-wide state for connectors that embed
oikb.
2026-09-23 18:24:42 +10:00
Tim Baek
5fd27193da
Merge pull request #125 from Fyrlex/Fyrlex-patch-1
Some checks failed
Docker (GHCR) / build-dev (arm64, Dockerfile.alpine, alpine, linux/arm64, ubuntu-24.04-arm) (push) Has been cancelled
Docker (GHCR) / read-version (push) Has been cancelled
Docker (GHCR) / build-dev (amd64, Dockerfile, default, linux/amd64, ubuntu-latest) (push) Has been cancelled
Docker (GHCR) / build-dev (amd64, Dockerfile.alpine, alpine, linux/amd64, ubuntu-latest) (push) Has been cancelled
Docker (GHCR) / build-dev (arm64, Dockerfile, default, linux/arm64, ubuntu-24.04-arm) (push) Has been cancelled
Docker (GHCR) / merge-dev (push) Has been cancelled
Docker (GHCR) / merge-dev-alpine (push) Has been cancelled
Docker (GHCR) / build-release (amd64, Dockerfile, default, linux/amd64, ubuntu-latest) (push) Has been cancelled
Docker (GHCR) / build-release (amd64, Dockerfile.alpine, alpine, linux/amd64, ubuntu-latest) (push) Has been cancelled
Docker (GHCR) / build-release (arm64, Dockerfile, default, linux/arm64, ubuntu-24.04-arm) (push) Has been cancelled
Docker (GHCR) / build-release (arm64, Dockerfile.alpine, alpine, linux/arm64, ubuntu-24.04-arm) (push) Has been cancelled
Docker (GHCR) / merge-release (push) Has been cancelled
Docker (GHCR) / merge-release-alpine (push) Has been cancelled
Add cloud as param to SharePoint connector
2026-09-17 17:49:03 -04:00
Jaren Goldberg
fa3b90e245
Rename sharepoint_cloud parameter to cloud 2026-09-17 17:15:03 -04:00
Jaren Goldberg
028512e12d
Add sharepoint_cloud parameter to SharePoint connector 2026-09-17 17:12:24 -04:00
Timothy Jaeryang Baek
966ec2352a refac
Some checks failed
Docker (GHCR) / build-dev (amd64, Dockerfile.alpine, alpine, linux/amd64, ubuntu-latest) (push) Has been cancelled
Docker (GHCR) / read-version (push) Has been cancelled
Docker (GHCR) / build-dev (amd64, Dockerfile, default, linux/amd64, ubuntu-latest) (push) Has been cancelled
Docker (GHCR) / build-dev (arm64, Dockerfile, default, linux/arm64, ubuntu-24.04-arm) (push) Has been cancelled
Docker (GHCR) / build-dev (arm64, Dockerfile.alpine, alpine, linux/arm64, ubuntu-24.04-arm) (push) Has been cancelled
Docker (GHCR) / merge-dev-alpine (push) Has been cancelled
Docker (GHCR) / build-release (amd64, Dockerfile, default, linux/amd64, ubuntu-latest) (push) Has been cancelled
Docker (GHCR) / build-release (amd64, Dockerfile.alpine, alpine, linux/amd64, ubuntu-latest) (push) Has been cancelled
Docker (GHCR) / build-release (arm64, Dockerfile, default, linux/arm64, ubuntu-24.04-arm) (push) Has been cancelled
Docker (GHCR) / build-release (arm64, Dockerfile.alpine, alpine, linux/arm64, ubuntu-24.04-arm) (push) Has been cancelled
Docker (GHCR) / merge-release (push) Has been cancelled
Docker (GHCR) / merge-dev (push) Has been cancelled
Docker (GHCR) / merge-release-alpine (push) Has been cancelled
2026-09-16 15:34:43 -04:00
Timothy Jaeryang Baek
5f15bf1605 feat: support Confluence Data Center and shared knowledge bases
Adapt PR #28 to the current connectors and sync lifecycle. Add v1 and
Bearer authentication, context-path support, robust pagination, and
stable names for colliding Confluence page titles. Preserve existing
single-source paths, macro extraction, and empty-page warnings.

Combine configured sources into one KB-wide manifest for CLI, scheduled,
and webhook syncs. Keep per-source credentials, filters, and schedules;
validate destination paths and close connectors on failed scans before
allowing a diff. Document target-path and shared-KB configuration, and
include server response details in upload errors.

Validated with 39 passing tests, git diff --check, and uv build.

Co-authored-by: tedk0n <4rfer0@gmail.com>
2026-09-16 15:30:55 -04:00
zyberwoof
914f7997fd
fix: correct Docker config mount path to /data and improve error message (#44) 2026-09-16 15:25:09 -04:00
DRodriguez
c1133ee801
Fixes #30 (#46)
Co-authored-by: DantesVault <your@email.com>
Co-authored-by: Tim Baek <tim@openwebui.com>
2026-09-16 15:24:52 -04:00
Peter Levart
c23146a368
fix: read KB files from /knowledge/{id}/files endpoint (#89) (#90)
`validate --deep`, `status`, and `ls` derived the KB file list from
`GET /knowledge/{id}`, whose `files` field is a server-hydrated
convenience that some Open WebUI versions return as null. Reading
`len(kb.get("files", []))` then crashed with "object of type 'NoneType'
has no len()" because .get()'s default only applies to a missing key,
not an explicit null. `ls` silently printed "(empty)" for the same
reason. Sync was unaffected as it uses the server-side /sync/diff
endpoint.

Point the file listing at the real `GET /knowledge/{id}/files`
endpoint (returns {items, total}): fix list_kb_files, add
count_kb_files for the authoritative total, and use them in the
affected commands.

Fixes #89

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-16 15:23:50 -04:00
psuckrow-routine
35628637fd
feat(zotero): support multiple Zotero libraries via per-source library ID (#93)
* feat(zotero): support multiple libraries via per-source library ID

Embed an optional numeric library ID in the source string to allow
multiple Zotero libraries to be synced from a single daemon instance:

  source: "zotero:123456:"              # all collections in library 123456
  source: "zotero:123456:Research%%ML"  # specific collection

When a library ID is present the connector resolves credentials from
per-library env vars before falling back to the global defaults:

  ZOTERO_API_KEY_<library_id>      → ZOTERO_API_KEY
  ZOTERO_LIBRARY_TYPE_<library_id> → ZOTERO_LIBRARY_TYPE

Existing source strings ("zotero:" or "zotero:Collection%%Sub") are
fully backward-compatible — collection names are not purely numeric so
there is no ambiguity when parsing.

* refactor(zotero): per-library env var resolution via _zotero_env helper

Introduce _zotero_env(key, library_id, default) which checks
ZOTERO_<KEY>_<library_id> before falling back to ZOTERO_<KEY>. Apply
it uniformly to every configurable setting so that each source entry
in .oikb.yaml can be tuned independently when multiple libraries are
in use:

  ZOTERO_CHECKSUM_<id>              overrides  ZOTERO_CHECKSUM
  ZOTERO_INCLUDE_NOTES_<id>                    ZOTERO_INCLUDE_NOTES
  ZOTERO_INCLUDE_ANNOTATIONS_<id>              ZOTERO_INCLUDE_ANNOTATIONS
  ZOTERO_LIBRARY_TYPE_<id>                     ZOTERO_LIBRARY_TYPE
  ZOTERO_EXCLUDE_<id>                          ZOTERO_EXCLUDE
  ZOTERO_UNFILED_DIR_<id>                      ZOTERO_UNFILED_DIR
  ZOTERO_WEBDAV_{URL,USER,PASSWORD}_<id>       ZOTERO_WEBDAV_*

Single-library setups are unaffected — the helper falls through to the
global vars unchanged.

* fix(sync): skip empty file content before upload

Files with no extractable text (e.g. Zotero items with no fulltext and
no downloadable PDF) were uploaded as zero-byte payloads, causing
Open WebUI to reject them with EMPTY_CONTENT errors on every sync cycle.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Pierre-Louis Suckrow <pierreroutine@mac.speedport.ip>
Co-authored-by: Pierre-Louis Suckrow <pierreroutine@MacBook-Air-von-Pierre-Louis.local>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-09-16 15:23:38 -04:00
Jaren Goldberg
1969950aaf
Feat/sharepoint non root sites (#97)
* feat: add support for non-root sites and subsites

* Refactor SharePointConnector initialization

* Add site_path parameter to SharePoint connector

* Clean up comments in parse_sharepoint_source function

Removed redundant comments and examples from the parse_sharepoint_source function.

* Enhance SharePointConnector for multi-cloud support

Updated SharePoint connector to support multiple cloud environments by adding cloud-specific endpoints. Adjusted token retrieval methods to use the appropriate graph base URL based on the selected cloud.

* fix: reorder default param

* fix: pass source token to gitlab and github connectors

* Add auth parameter to _resolve_connector function

Updated the _resolve_connector function to accept an optional auth parameter, allowing for source-specific credentials to be passed. Modified calls to _resolve_connector throughout the code to include the auth argument where applicable.

* Add auth parameter to connector resolution
2026-09-16 15:23:27 -04:00
Dakota McCarty
c7e9eb183a
Confluence: keep the text held in macro bodies, skip pages that have none (#104)
`<[^>]+>` treats `<![CDATA[...]]>` as a single tag and deletes it whole, so
everything Confluence keeps in a macro body — code blocks, info and note panels,
expand sections — never reaches the Knowledge Base. The page still syncs, quietly
missing the part that was usually worth reading. Across one 321-page space five
pages were affected, the worst losing 1.3KB of a documented HTML snippet.

Macro bodies are now parked before the markup passes and restored after the
whitespace pass, so a code block survives with its own line breaks, indentation
and angle brackets intact rather than having half of itself stripped as tags.
Block ends become newlines too: everything used to collapse onto one line, which
reads as a single thought and chunks as one.

Link labels are dropped along with their links. `<ac:plain-text-link-body>` holds
the title of another page in the space, and that page syncs as its own file, so
keeping labels turns every section index into a document that is nothing but
titles already in the Knowledge Base.

That leaves pages which genuinely have no text — a blank page, or one holding
only a children-display macro. They extract to zero bytes, and Open WebUI
extracts text as part of POST /files/ and answers a bare 400 for a file it can
get nothing out of, so each one fails on every run for as long as it exists and
the space can never sync clean. read_file now raises SourceFileUnavailable for
them, which run_sync already reports as a warning rather than an error.

Note for anyone with a space already synced: a Confluence checksum is built from
the page version rather than the page text, so pages pick up the better
extraction when their version next changes. Salting the manifest to force one
re-upload would fix that immediately but re-uploads every page of every
Confluence space, so it seemed a call for a maintainer rather than this patch.
2026-09-16 15:23:16 -04:00
Tobias Goerke
8fe00166af
Add hierarchical Confluence paths (#107) 2026-09-16 12:00:22 -04:00
Bradd
4c62921f65
Fix: Increased outline document limit (#98)
Co-authored-by: k1rb <bradd.roberson@protonmail.com>
2026-09-16 11:59:25 -04:00
Jaren Goldberg
e5d7a9fe19
Enhance SharePointConnector for multi-cloud support (#103)
* Enhance SharePointConnector for multi-cloud support

Updated SharePoint connector to support multiple cloud environments by adding cloud-specific endpoints. Adjusted token retrieval methods to use the appropriate graph base URL based on the selected cloud.

* fix: reorder default param
2026-09-16 11:59:16 -04:00
crspi
813460655e
fix: recurse into Google Drive subfolders (#99) 2026-09-16 11:59:03 -04:00
naamval
6f14b8970e
fix Zotero sync specific collections (#109)
* fix Zotero sync specific collections

* Add missing comment

---------

Co-authored-by: naamval <mail@naamval.net>
2026-09-16 11:58:53 -04:00
Jaren Goldberg
545860b353
fix: pass source token to gitlab and github connectors (#119)
* feat: add support for non-root sites and subsites

* Refactor SharePointConnector initialization

* Add site_path parameter to SharePoint connector

* Clean up comments in parse_sharepoint_source function

Removed redundant comments and examples from the parse_sharepoint_source function.

* Enhance SharePointConnector for multi-cloud support

Updated SharePoint connector to support multiple cloud environments by adding cloud-specific endpoints. Adjusted token retrieval methods to use the appropriate graph base URL based on the selected cloud.

* fix: reorder default param

* fix: pass source token to gitlab and github connectors

* Add auth parameter to _resolve_connector function

Updated the _resolve_connector function to accept an optional auth parameter, allowing for source-specific credentials to be passed. Modified calls to _resolve_connector throughout the code to include the auth argument where applicable.

* Add auth parameter to connector resolution
2026-09-16 11:58:18 -04:00
Adam Nych
b7fc3d7fad
fix(sharepoint): use SHA-1 thumbprint in the x5t assertion header (#120)
Certificate auth built the x5t header from cert.signature_hash_algorithm,
which for any SHA-256-signed certificate is a 32-byte digest. The Microsoft
identity platform matches the registered key on its SHA-1 thumbprint, so
every such certificate was rejected:

  AADSTS700027: The certificate with identifier used to sign the client
  assertion is not registered on application. [Reason - The key was not found.]

Verified against a live Entra app registration: identical assertion, only
the x5t digest swapped, turns the 401 into an issued token.
2026-09-16 11:58:06 -04:00
Adam Nych
f370f3480a
fix(sharepoint): percent-encode item paths in Graph URLs (#121)
Folder and file names were interpolated into the /root:/{path}: addressing
form as-is. A name containing '#' truncates the request at the fragment
marker, so walking a library with a folder like '#Archive' asks Graph for
/drives/{id}/root:/ and gets 400; '?', '%' and other reserved characters
are wrong in the same way, and read_file has the same flaw on download.

Encode with quote() so only the separators stay structural.
2026-09-16 11:57:53 -04:00
Timothy Jaeryang Baek
26bbdc9f24 refac
Some checks failed
Docker (GHCR) / read-version (push) Has been cancelled
Docker (GHCR) / build-dev (amd64, Dockerfile, default, linux/amd64, ubuntu-latest) (push) Has been cancelled
Docker (GHCR) / build-dev (amd64, Dockerfile.alpine, alpine, linux/amd64, ubuntu-latest) (push) Has been cancelled
Docker (GHCR) / build-dev (arm64, Dockerfile, default, linux/arm64, ubuntu-24.04-arm) (push) Has been cancelled
Docker (GHCR) / build-dev (arm64, Dockerfile.alpine, alpine, linux/arm64, ubuntu-24.04-arm) (push) Has been cancelled
Docker (GHCR) / merge-dev (push) Has been cancelled
Docker (GHCR) / merge-dev-alpine (push) Has been cancelled
Docker (GHCR) / build-release (amd64, Dockerfile, default, linux/amd64, ubuntu-latest) (push) Has been cancelled
Docker (GHCR) / build-release (amd64, Dockerfile.alpine, alpine, linux/amd64, ubuntu-latest) (push) Has been cancelled
Docker (GHCR) / build-release (arm64, Dockerfile, default, linux/arm64, ubuntu-24.04-arm) (push) Has been cancelled
Docker (GHCR) / build-release (arm64, Dockerfile.alpine, alpine, linux/arm64, ubuntu-24.04-arm) (push) Has been cancelled
Docker (GHCR) / merge-release (push) Has been cancelled
Docker (GHCR) / merge-release-alpine (push) Has been cancelled
Co-Authored-By: hexsm <255071365+hexsm@users.noreply.github.com>
2026-08-01 00:13:08 -04:00
Timothy Jaeryang Baek
988c2e8111 refac
Co-Authored-By: Olivier Cornelis <26625900+thiswillbeyourgithub@users.noreply.github.com>
2026-08-01 00:12:54 -04:00
Timothy Jaeryang Baek
f99d2e66e7 refac
Some checks failed
Docker (GHCR) / read-version (push) Has been cancelled
Docker (GHCR) / build-dev (amd64, Dockerfile, default, linux/amd64, ubuntu-latest) (push) Has been cancelled
Docker (GHCR) / build-dev (amd64, Dockerfile.alpine, alpine, linux/amd64, ubuntu-latest) (push) Has been cancelled
Docker (GHCR) / build-dev (arm64, Dockerfile, default, linux/arm64, ubuntu-24.04-arm) (push) Has been cancelled
Docker (GHCR) / build-dev (arm64, Dockerfile.alpine, alpine, linux/arm64, ubuntu-24.04-arm) (push) Has been cancelled
Docker (GHCR) / merge-dev (push) Has been cancelled
Docker (GHCR) / merge-dev-alpine (push) Has been cancelled
Docker (GHCR) / build-release (amd64, Dockerfile, default, linux/amd64, ubuntu-latest) (push) Has been cancelled
Docker (GHCR) / build-release (amd64, Dockerfile.alpine, alpine, linux/amd64, ubuntu-latest) (push) Has been cancelled
Docker (GHCR) / build-release (arm64, Dockerfile, default, linux/arm64, ubuntu-24.04-arm) (push) Has been cancelled
Docker (GHCR) / build-release (arm64, Dockerfile.alpine, alpine, linux/arm64, ubuntu-24.04-arm) (push) Has been cancelled
Docker (GHCR) / merge-release (push) Has been cancelled
Docker (GHCR) / merge-release-alpine (push) Has been cancelled
2026-07-17 16:16:41 -04:00
Timothy Jaeryang Baek
1287e660b0 refac
Some checks are pending
Docker (GHCR) / build-dev (amd64, linux/amd64, ubuntu-latest) (push) Waiting to run
Docker (GHCR) / build-dev (arm64, linux/arm64, ubuntu-24.04-arm) (push) Waiting to run
Docker (GHCR) / read-version (push) Waiting to run
Docker (GHCR) / merge-dev (push) Blocked by required conditions
Docker (GHCR) / build-release (amd64, linux/amd64, ubuntu-latest) (push) Blocked by required conditions
Docker (GHCR) / build-release (arm64, linux/arm64, ubuntu-24.04-arm) (push) Blocked by required conditions
Docker (GHCR) / merge-release (push) Blocked by required conditions
2026-07-17 15:56:22 -04:00
Timothy Jaeryang Baek
6158eefb40 refac 2026-07-17 15:50:34 -04:00
Timothy Jaeryang Baek
ee3f84bb7b refac 2026-07-17 15:45:30 -04:00
Joel Christ
9b7be954c5
fix: support Google Shared Drives in gdrive connector (#72)
The Drive API does not return items from Shared Drives (formerly Team
Drives) unless requests opt in with supportsAllDrives and
includeItemsFromAllDrives. Without them, syncing a folder inside a
Shared Drive listed no files and reported "nothing to do", even with
correct service-account permissions.

Add these flags to all files.list calls in _walk_folder and _find_file,
and pass supportsAllDrives to the file get/get_media download calls so
Shared Drive files can be fetched.

Fixes #52

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-17 15:41:26 -04:00
Timothy Jaeryang Baek
33758a124a refac 2026-07-17 15:40:58 -04:00
Mirko Ceroni
cf65912170
Handle missing Nextcloud folders gracefully (HTTP 404) (#50)
While syncing a Nextcloud source, a single missing folder currently aborts the entire sync process:

PROPFIND ... failed: HTTP 404

This can happen when:

a configured folder has been deleted or renamed;
a shared folder is no longer available;
permissions change between sync runs.

Proposed change:

Catch HTTPStatusError with status code 404 during folder traversal (_walk_folder).
Log a warning indicating that the folder was skipped.
Continue processing the remaining folders/files instead of failing the whole synchronization job.
2026-07-17 15:28:27 -04:00
Mateusz Hajder
9f2f29a6e3
fix(connectors/gitlab): resolve subgroup path parsing dynamically (#36)
Previously, GitLab source parser used a simple split limit to extract the owner namespace and repository name (e.g. `source.split("/", 2)`). This caused parsing failures for repositories located in nested subgroups (e.g., `gitlab:group/subgroup/project/docs/api`), as the subgroup path would get incorrectly split.

This commit fixes subgroup parsing by:
1. Supporting an explicit `project:path` separator format (e.g., `gitlab:group/subgroup/project:docs/api`) in `parse_gitlab_source`.
2. Adding a lazy resolution helper `_ensure_resolved()` to the connector. It probes the segments against the GitLab API (`/projects/{candidate}`) to dynamically identify the boundary between the project path and the repository file path.
3. Merging paths safely and falling back to the default split behavior if the API check fails or the client is offline.
2026-07-17 15:28:09 -04:00
Mateusz Hajder
17ed539047
fix(history): implement thread-safe connection pool for SQLite to fix resource leaks (#35)
Refactors `SyncHistory` to use a `queue.Queue` connection pool instead of `threading.local()`.

Previously, connections tied to `threading.local()` in a background worker pool would remain open until the thread died, leading to a steady leak of open file descriptors and locked connections.

Changes:
- Replaced `threading.local()` with a bounded `queue.Queue` pool (size=5) of `sqlite3.Connection` objects configured with `check_same_thread=False`.
- Safely wrapped the initial schema connection in a `try...finally` block to ensure `close()` is called, fixing a silent file lock leak.
- Added `PRAGMA synchronous=NORMAL` alongside `journal_mode=WAL` for drastically improved concurrent write performance without sacrificing durability.
- Updated all database operations to borrow from the pool using a context manager, allowing true multi-threaded concurrency (concurrent readers/writers via WAL) while strictly bounding the total number of open database connections.
- Updated `close()` to gracefully drain the queue and explicitly terminate all pooled connections.
2026-07-17 15:27:41 -04:00
Mateusz Hajder
ee9b9ed3fc
fix(connectors/filesystem): prevent path traversal in read_file (#34)
Resolve the file path and verify that it remains within the connector's root directory using `is_relative_to()`. Raises a `PermissionError` if a path traversal attempt is detected.
2026-07-17 15:27:21 -04:00
Timothy Jaeryang Baek
61721b1ad7 refac 2026-07-17 15:12:59 -04:00
Timothy Jaeryang Baek
6d3752b2b0 refac 2026-07-17 15:03:59 -04:00
Miika Jukakoski
2b227bf5a1
fix: implement pagination for JIRA issue retrieval using nextPageToken (#69)
Co-authored-by: Miika Jukakoski <miika.jukakoski@teknoware.com>
2026-07-17 15:02:09 -04:00
Mateusz Hajder
487e5e50ba
feat(docker): migrate to alpine, harden container, and update docs (#37)
- Upgrade Docker base image to python:3.14-alpine3.23
- Use Astral uv for multi-stage dependency installs and virtual env management
- Switch to running under non-root appuser (UID/GID 1000)
- Replace healthcheck curl command with wget to support Alpine
- Update docker-compose examples in README.md and docs/guide.md
2026-07-17 15:00:31 -04:00
Mouez
443304642b
feat: add Nextcloud connector (#19)
Some checks failed
Build Docker Image / build (linux/amd64) (push) Has been cancelled
Build Docker Image / build (linux/arm64) (push) Has been cancelled
Build Docker Image / merge (push) Has been cancelled
* feat: add Nextcloud connector

* refactor: extract internal WebDAV client

* fix: guard recursive WebDAV walk
2026-06-12 16:22:47 +01:00
Tim Baek
bebc3a2b59
Merge pull request #17 from expilu/patch-1
Change deprecated JIRA API endpoint to the current one for JQL
2026-06-12 10:22:02 -05:00
Daniel López Lacalle
fb7c13ec6a
Change JIRA API endpoint to use JQL
/rest/api/3/search was deprecated, changes to the current /rest/api/3/search/jql
2026-06-03 12:21:03 +01:00
Timothy Jaeryang Baek
dcf241da7f feat: SharePoint certificate-based authentication (#3)
Add SHAREPOINT_CERTIFICATE_PATH as a secure alternative to
SHAREPOINT_CLIENT_SECRET for authenticating with SharePoint via
Microsoft Graph API.

- JWT assertion flow using cryptography + PyJWT
- SHAREPOINT_CERTIFICATE_PASSWORD for encrypted PEM keys
- Mutual exclusivity validation (secret vs cert)
- New optional extra: pip install oikb[sharepoint-cert]

Closes #3
2026-05-28 16:24:57 -05:00
Timothy Jaeryang Baek
04ccb30d72 0.3.5: minimal status dashboard at GET /
2KB inline HTML page, monospace, dark background. Polls /health
every 10s and renders source statuses with colored dots, last
sync time, duration, file counts. Zero dependencies.
2026-05-21 13:53:05 +04:00