[GH-ISSUE #1565] Bug: API tokens without an exparation always crash (v0.8.5rc50) #2441

Open
opened 2026-03-01 17:59:04 +03:00 by kerem · 2 comments
Owner

Originally created by @nguyenmp on GitHub (Oct 22, 2024).
Original GitHub issue: https://github.com/ArchiveBox/ArchiveBox/issues/1565

Originally assigned to: @benmuth on GitHub.

Describe the bug

When trying out the API with a new API token and no expiration (default), it crashes.

Workaround: set an expiration in the distant future or use username/password basic auth.

Steps to reproduce

  1. Run latest dev release
  2. Add an API key in /admin/api/apitoken/ with no expiration (default, just click save)
  3. Go to /api/v1/docs
  4. Authorize the generated API key (top right, click the lock button, choose any token method, hit "login", then close)
  5. Hit any API endpoint

Screenshots or log output

Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/ninja/operation.py", line 118, in run
    temporal_response = self.api.create_temporal_response(request)
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/archivebox/api/v1_api.py", line 67, in create_temporal_response
    token_expiry = api_token.expires.isoformat() if api_token else 'Never'
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'isoformat'

ArchiveBox version

ArchiveBox v0.8.5rc50 COMMIT_HASH=unknown BUILD_TIME=2024-10-22 03:45:37 1729568737
IN_DOCKER=True IN_QEMU=False ARCH=aarch64 OS=Linux PLATFORM=Linux-6.10.4-linuxkit-aarch64-with-glibc2.36 PYTHON=Cpython
EUID=911:0 UID=911:0 PUID=911:0 FS_UID=911:0 FS_PERMS=644 FS_ATOMIC=True FS_REMOTE=True
DEBUG=False IS_TTY=True SUDO=False ID=c3241add:ca598960 SEARCH_BACKEND=sonic LDAP=False

 Binary Dependencies:
 √  python                3.11.10      sys_pip    /usr/local/bin/python3.11
 √  django                5.1.2        sys_pip    /usr/local/lib/python3.11/site-packages/django/__init__.py
 √  sqlite                2.6.0        sys_pip    /usr/local/lib/python3.11/site-packages/django/db/backends/sqlite3/base.py
 √  pip                   24.0.0       sys_pip    /usr/local/bin/pip
 √  pipx                  1.1.0        sys_pip    /bin/pipx
 √  node                  22.10.0      apt        /usr/bin/node
 √  npm                   10.9.0       apt        /usr/bin/npm
 √  npx                   10.9.0       apt        /usr/bin/npx
 √  playwright            1.48.0       sys_pip    /usr/local/bin/playwright
 √  puppeteer             23.6.0       lib_npm    ~/.npm/bin/puppeteer
 √  ldap                  3.4.4        sys_pip    /usr/local/lib/python3.11/site-packages/ldap/__init__.py
 √  rg                    13.0.0       apt        /usr/bin/rg
 √  sonic                 1.4.9        env        /usr/local/bin/sonic
 √  chrome                130.0.6723   env        /usr/bin/chromium-browser
 √  curl                  8.10.1       apt        /usr/bin/curl
 √  git                   2.39.5       apt        /usr/bin/git
 √  postlight-parser      2.2.3        sys_npm    ~/.npm/bin/postlight-parser
 √  readability-extractor 0.0.11       lib_npm    ~/.npm/bin/readability-extractor
 √  single-file           1.1.54       lib_npm    ~/.npm/bin/single-file
 √  wget                  1.21.3       apt        /usr/bin/wget
 √  yt-dlp                2024.10.7    sys_pip    /usr/local/bin/yt-dlp
 √  ffmpeg                5.1.6        env        /usr/bin/ffmpeg

 Package Managers:
 √  env         /usr/bin/which                                       UID=911  PATH=~/.npm/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
 √  apt         /usr/bin/apt-get                                     UID=0    PATH=/usr/bin:/bin
 -  brew        not available                                        UID=911  PATH=
 √  sys_pip     /usr/local/bin/pip                                   UID=911  PATH=/bin:/usr/local/bin:/usr/bin:~/.local/bin
 -  venv_pip    not available                                        UID=911  PATH=/tmp/NotInsideAVenv/lib/bin
 -  lib_pip     not available                                        UID=911  PATH=./lib/aarch64-linux-docker/pip/venv/bin
 √  sys_npm     /usr/bin/npm                                         UID=911  PATH=~/.npm/bin
 -  lib_npm     /usr/bin/npm                                         UID=911  PATH=./lib/aarch64-linux-docker/npm/node_modules/.bin:./node_modules/.bin:~/.npm/bin
 √  playwright  /usr/local/bin/playwright                            UID=0    PATH=./lib/aarch64-linux-docker/bin:~/.npm/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
 √  puppeteer   /usr/bin/npx                                         UID=911  PATH=./lib/aarch64-linux-docker/bin

 Code locations:
 √  PACKAGE_DIR           33 files        valid     /app/archivebox                                                             
 √  TEMPLATES_DIR         3 files         valid     /app/archivebox/templates                                                   
 -  CUSTOM_TEMPLATES_DIR  missing         unused    ./user_templates                       
 -  USER_PLUGINS_DIR      missing         unused    ./user_plugins                         
 √  LIB_DIR               0 files         valid     /usr/share/archivebox/lib                                                   

 Data locations:
 √  DATA_DIR              19 files @      valid     /data                                                                       
 √  CONFIG_FILE           380.0 Bytes     valid     ./ArchiveBox.conf                      
 √  SQL_INDEX             736.0 KB        valid     ./index.sqlite3                        
 √  QUEUE_DATABASE        156.0 KB        valid     ./queue.sqlite3                        
 √  ARCHIVE_DIR           23 files        valid     ./archive                              
 √  SOURCES_DIR           32 files        valid     ./sources                              
 √  PERSONAS_DIR          1 files         valid     ./personas                             
 √  LOGS_DIR              5 files         valid     ./logs                                 
 √  TMP_DIR               0 files         valid     /tmp/archivebox                                                             
Originally created by @nguyenmp on GitHub (Oct 22, 2024). Original GitHub issue: https://github.com/ArchiveBox/ArchiveBox/issues/1565 Originally assigned to: @benmuth on GitHub. #### Describe the bug When trying out the API with a new API token and no expiration (default), it crashes. Workaround: set an expiration in the distant future or use username/password basic auth. #### Steps to reproduce 1. Run latest dev release 2. Add an API key in `/admin/api/apitoken/` with no expiration (default, just click save) 3. Go to `/api/v1/docs` 4. Authorize the generated API key (top right, click the lock button, choose any token method, hit "login", then close) 5. Hit any API endpoint #### Screenshots or log output ``` Traceback (most recent call last): File "/usr/local/lib/python3.11/site-packages/ninja/operation.py", line 118, in run temporal_response = self.api.create_temporal_response(request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/app/archivebox/api/v1_api.py", line 67, in create_temporal_response token_expiry = api_token.expires.isoformat() if api_token else 'Never' ^^^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'isoformat' ``` #### ArchiveBox version ``` ArchiveBox v0.8.5rc50 COMMIT_HASH=unknown BUILD_TIME=2024-10-22 03:45:37 1729568737 IN_DOCKER=True IN_QEMU=False ARCH=aarch64 OS=Linux PLATFORM=Linux-6.10.4-linuxkit-aarch64-with-glibc2.36 PYTHON=Cpython EUID=911:0 UID=911:0 PUID=911:0 FS_UID=911:0 FS_PERMS=644 FS_ATOMIC=True FS_REMOTE=True DEBUG=False IS_TTY=True SUDO=False ID=c3241add:ca598960 SEARCH_BACKEND=sonic LDAP=False Binary Dependencies: √ python 3.11.10 sys_pip /usr/local/bin/python3.11 √ django 5.1.2 sys_pip /usr/local/lib/python3.11/site-packages/django/__init__.py √ sqlite 2.6.0 sys_pip /usr/local/lib/python3.11/site-packages/django/db/backends/sqlite3/base.py √ pip 24.0.0 sys_pip /usr/local/bin/pip √ pipx 1.1.0 sys_pip /bin/pipx √ node 22.10.0 apt /usr/bin/node √ npm 10.9.0 apt /usr/bin/npm √ npx 10.9.0 apt /usr/bin/npx √ playwright 1.48.0 sys_pip /usr/local/bin/playwright √ puppeteer 23.6.0 lib_npm ~/.npm/bin/puppeteer √ ldap 3.4.4 sys_pip /usr/local/lib/python3.11/site-packages/ldap/__init__.py √ rg 13.0.0 apt /usr/bin/rg √ sonic 1.4.9 env /usr/local/bin/sonic √ chrome 130.0.6723 env /usr/bin/chromium-browser √ curl 8.10.1 apt /usr/bin/curl √ git 2.39.5 apt /usr/bin/git √ postlight-parser 2.2.3 sys_npm ~/.npm/bin/postlight-parser √ readability-extractor 0.0.11 lib_npm ~/.npm/bin/readability-extractor √ single-file 1.1.54 lib_npm ~/.npm/bin/single-file √ wget 1.21.3 apt /usr/bin/wget √ yt-dlp 2024.10.7 sys_pip /usr/local/bin/yt-dlp √ ffmpeg 5.1.6 env /usr/bin/ffmpeg Package Managers: √ env /usr/bin/which UID=911 PATH=~/.npm/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin √ apt /usr/bin/apt-get UID=0 PATH=/usr/bin:/bin - brew not available UID=911 PATH= √ sys_pip /usr/local/bin/pip UID=911 PATH=/bin:/usr/local/bin:/usr/bin:~/.local/bin - venv_pip not available UID=911 PATH=/tmp/NotInsideAVenv/lib/bin - lib_pip not available UID=911 PATH=./lib/aarch64-linux-docker/pip/venv/bin √ sys_npm /usr/bin/npm UID=911 PATH=~/.npm/bin - lib_npm /usr/bin/npm UID=911 PATH=./lib/aarch64-linux-docker/npm/node_modules/.bin:./node_modules/.bin:~/.npm/bin √ playwright /usr/local/bin/playwright UID=0 PATH=./lib/aarch64-linux-docker/bin:~/.npm/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin √ puppeteer /usr/bin/npx UID=911 PATH=./lib/aarch64-linux-docker/bin Code locations: √ PACKAGE_DIR 33 files valid /app/archivebox √ TEMPLATES_DIR 3 files valid /app/archivebox/templates - CUSTOM_TEMPLATES_DIR missing unused ./user_templates - USER_PLUGINS_DIR missing unused ./user_plugins √ LIB_DIR 0 files valid /usr/share/archivebox/lib Data locations: √ DATA_DIR 19 files @ valid /data √ CONFIG_FILE 380.0 Bytes valid ./ArchiveBox.conf √ SQL_INDEX 736.0 KB valid ./index.sqlite3 √ QUEUE_DATABASE 156.0 KB valid ./queue.sqlite3 √ ARCHIVE_DIR 23 files valid ./archive √ SOURCES_DIR 32 files valid ./sources √ PERSONAS_DIR 1 files valid ./personas √ LOGS_DIR 5 files valid ./logs √ TMP_DIR 0 files valid /tmp/archivebox ```
Author
Owner

@nguyenmp commented on GitHub (Oct 22, 2024):

You probably want something like:

api_token.expires.isoformat() if api_token and api_token.expires else 'Never'
<!-- gh-comment-id:2430179552 --> @nguyenmp commented on GitHub (Oct 22, 2024): You probably want something like: ``` api_token.expires.isoformat() if api_token and api_token.expires else 'Never' ```
Author
Owner

@pirate commented on GitHub (Oct 22, 2024):

Thanks for reporting, and yeah it's an easy fix.

<!-- gh-comment-id:2430395872 --> @pirate commented on GitHub (Oct 22, 2024): Thanks for reporting, and yeah it's an easy fix.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/ArchiveBox#2441
No description provided.