Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
261 commits
Select commit Hold shift + click to select a range
9076388
chore(release): 1.0.7-alpha.6 [skip ci]
semantic-release-bot Oct 28, 2024
046f47a
fix: update notification action
gary-Shen Oct 28, 2024
c040ef4
chore(release): 1.0.7-alpha.7 [skip ci]
semantic-release-bot Oct 28, 2024
8fed078
fix: test notification action
gary-Shen Oct 28, 2024
f96d234
chore(release): 1.0.7-alpha.8 [skip ci]
semantic-release-bot Oct 28, 2024
851818e
fix: test notification action
gary-Shen Oct 28, 2024
55a9af0
chore(release): 1.0.7-alpha.9 [skip ci]
semantic-release-bot Oct 28, 2024
bc63ee5
fix: test notification action
gary-Shen Oct 28, 2024
5ae3c43
chore(release): 1.0.7-alpha.10 [skip ci]
semantic-release-bot Oct 28, 2024
83f43eb
fix: test notification action
gary-Shen Oct 28, 2024
8d372fd
chore(release): 1.0.7-alpha.11 [skip ci]
semantic-release-bot Oct 28, 2024
63286cb
fix: update notification action
gary-Shen Oct 28, 2024
60b5151
chore(release): 1.0.7-alpha.12 [skip ci]
semantic-release-bot Oct 28, 2024
8cf7a9a
chore: merge main
gary-Shen Oct 28, 2024
84ac337
chore(release): 1.0.9-alpha.1 [skip ci]
semantic-release-bot Oct 28, 2024
9f5e698
fix: Upgrade frontend to v5.3.0-alpha.6. See the details in [release …
gary-Shen Oct 28, 2024
760b4e8
chore(release): 1.0.9-alpha.2 [skip ci]
semantic-release-bot Oct 28, 2024
7cb455e
fix: Upgrade frontend to v5.3.0-alpha.7. See the details in [release …
gary-Shen Oct 28, 2024
40152c1
chore(release): 1.0.9-alpha.3 [skip ci]
semantic-release-bot Oct 28, 2024
7b04670
fix: Upgrade frontend to v5.5.0-alpha.1. See the details in [release …
gary-Shen Oct 29, 2024
491cf33
fix: Upgrade frontend to v5.5.0-alpha.2. See the details in [release …
gary-Shen Oct 29, 2024
ea9baed
chore(release): 1.0.9-alpha.4 [skip ci]
semantic-release-bot Oct 29, 2024
dc022fd
fix: Upgrade frontend to v5.5.0-alpha.3. See the details in [release …
gary-Shen Oct 30, 2024
694629c
chore(release): 1.0.9-alpha.5 [skip ci]
semantic-release-bot Oct 30, 2024
38b302a
Merge branch 'alpha' into feat/labelme
gary-Shen Nov 5, 2024
87b03eb
Merge pull request #133 from opendatalab/feat/labelme
gary-Shen Nov 5, 2024
7622524
fix: Upgrade frontend to v5.5.0-alpha.4. See the details in [release …
gary-Shen Nov 5, 2024
516a88d
chore(release): 1.1.0-alpha.1 [skip ci]
semantic-release-bot Nov 5, 2024
2f4d293
Merge pull request #134 from opendatalab/feat/labelme
gary-Shen Nov 5, 2024
22afaf0
chore(release): 1.1.0-alpha.2 [skip ci]
semantic-release-bot Nov 5, 2024
f2645f0
Merge pull request #135 from opendatalab/feat/labelme
gary-Shen Nov 6, 2024
27f27be
fix: Upgrade frontend to v5.5.0-alpha.5. See the details in [release …
gary-Shen Nov 6, 2024
7a4a4e1
chore(release): 1.1.0-alpha.3 [skip ci]
semantic-release-bot Nov 6, 2024
1cf0def
Merge pull request #136 from opendatalab/feat/labelme
gary-Shen Nov 11, 2024
fb4746f
chore(release): 1.1.0-alpha.4 [skip ci]
semantic-release-bot Nov 11, 2024
2d986b8
fix: Upgrade frontend to v5.5.0-alpha.6. See the details in [release …
gary-Shen Nov 11, 2024
672a1cf
chore(release): 1.1.0-alpha.5 [skip ci]
semantic-release-bot Nov 11, 2024
613e622
Merge pull request #137 from opendatalab/feat/labelme
gary-Shen Nov 11, 2024
7dc220a
chore(release): 1.1.0-alpha.6 [skip ci]
semantic-release-bot Nov 11, 2024
9e5b3ab
Merge pull request #140 from opendatalab/feat/json-pre-annotation
gary-Shen Nov 14, 2024
658f1a4
fix: Upgrade frontend to v5.5.0-alpha.7. See the details in [release …
gary-Shen Nov 14, 2024
12d45d5
Merge pull request #141 from opendatalab/feat/json-pre-annotation
gary-Shen Nov 14, 2024
1df8fbb
chore(release): 1.1.0-alpha.7 [skip ci]
semantic-release-bot Nov 14, 2024
1fd712e
Merge pull request #142 from opendatalab/feat/json-pre-annotation
gary-Shen Nov 15, 2024
f2ab8e0
chore(release): 1.1.0-alpha.8 [skip ci]
semantic-release-bot Nov 15, 2024
b2ea80a
fix: Upgrade frontend to v5.5.0-alpha.8. See the details in [release …
gary-Shen Nov 18, 2024
6ef75be
chore(release): 1.1.0-alpha.9 [skip ci]
semantic-release-bot Nov 18, 2024
52d162c
Merge pull request #144 from opendatalab/feat/json-pre-annotation
gary-Shen Nov 18, 2024
16d66fd
fix: Upgrade frontend to v5.5.0-alpha.9. See the details in [release …
gary-Shen Nov 18, 2024
5cbd296
Merge pull request #145 from opendatalab/feat/json-pre-annotation
gary-Shen Nov 18, 2024
456ab2c
chore(release): 1.1.0-alpha.10 [skip ci]
semantic-release-bot Nov 18, 2024
91e70d7
Merge pull request #148 from opendatalab/feat/json-pre-annotation
gary-Shen Nov 19, 2024
e6919bd
chore(release): 1.1.0-alpha.11 [skip ci]
semantic-release-bot Nov 19, 2024
2fd7765
fix: Upgrade frontend to v5.5.0-alpha.10. See the details in [release…
gary-Shen Nov 19, 2024
18079cc
chore(release): 1.1.0-alpha.12 [skip ci]
semantic-release-bot Nov 19, 2024
39bbff7
fix: Upgrade frontend to v5.5.0-alpha.11. See the details in [release…
gary-Shen Nov 19, 2024
06388e5
chore(release): 1.1.0-alpha.13 [skip ci]
semantic-release-bot Nov 19, 2024
95232c8
fix: Upgrade frontend to v5.5.0-alpha.12. See the details in [release…
gary-Shen Nov 20, 2024
12f0e57
chore(release): 1.1.0-alpha.14 [skip ci]
semantic-release-bot Nov 20, 2024
9326d06
fix: Upgrade frontend to v5.6.0-alpha.1. See the details in [release …
gary-Shen Dec 25, 2024
a2fba63
chore(release): 1.1.0-alpha.15 [skip ci]
semantic-release-bot Dec 25, 2024
39b7182
fix: Upgrade frontend to v5.6.0-alpha.2. See the details in [release …
gary-Shen Dec 26, 2024
d305df5
chore(release): 1.1.0-alpha.16 [skip ci]
semantic-release-bot Dec 26, 2024
8ef74dd
fix: Upgrade frontend to v5.6.0-alpha.3. See the details in [release …
gary-Shen Dec 26, 2024
3f8b71c
chore(release): 1.1.0-alpha.17 [skip ci]
semantic-release-bot Dec 26, 2024
77e2913
fix: Upgrade frontend to v5.6.0-alpha.4. See the details in [release …
gary-Shen Dec 26, 2024
1c5ede3
chore(release): 1.1.0-alpha.18 [skip ci]
semantic-release-bot Dec 26, 2024
60707c5
fix: Upgrade frontend to v5.6.0-alpha.5. See the details in [release …
gary-Shen Dec 26, 2024
3331a2d
chore(release): 1.1.0-alpha.19 [skip ci]
semantic-release-bot Dec 26, 2024
632ec09
fix: Upgrade frontend to v5.6.0-alpha.6. See the details in [release …
gary-Shen Dec 27, 2024
eb2404f
chore(release): 1.1.0-alpha.20 [skip ci]
semantic-release-bot Dec 27, 2024
b3c4f00
fix: Upgrade frontend to v5.6.0-alpha.7. See the details in [release …
gary-Shen Dec 27, 2024
a5e0bd0
chore(release): 1.1.0-alpha.21 [skip ci]
semantic-release-bot Dec 27, 2024
2c544f6
fix: Upgrade frontend to v5.6.0-alpha.8. See the details in [release …
gary-Shen Jan 6, 2025
58dbb5a
chore(release): 1.1.0-alpha.22 [skip ci]
semantic-release-bot Jan 6, 2025
752a473
chore: update scripts (#130)
gary-Shen Oct 29, 2024
1bc7b21
fix: delete pre-annotation records after pre-annotation files deleted…
gary-Shen Jan 7, 2025
be7db25
fix: optimize sample_names query
gary-Shen Jan 7, 2025
1b15b7e
Merge branch 'alpha' into fix/0107
gary-Shen Jan 7, 2025
15b304b
Merge pull request #162 from opendatalab/fix/0107
gary-Shen Jan 7, 2025
02a1aab
chore(release): 1.1.0-alpha.23 [skip ci]
semantic-release-bot Jan 7, 2025
1c00150
fix: Upgrade frontend to v5.7.0-alpha.1. See the details in [release …
gary-Shen Jan 7, 2025
cdf6e6b
chore(release): 1.1.0-alpha.24 [skip ci]
semantic-release-bot Jan 7, 2025
8606988
fix: add is_pre_annotated field to the smaple response
gary-Shen Jan 8, 2025
ee8fcd1
fix: Upgrade frontend to v5.7.0-alpha.2. See the details in [release …
gary-Shen Jan 8, 2025
1f9002b
update: add is_pre_annotated field to the sample response
gary-Shen Jan 8, 2025
3aae0cc
chore(release): 1.1.0-alpha.25 [skip ci]
semantic-release-bot Jan 8, 2025
582eb07
fix: Upgrade frontend to v5.7.0-alpha.3. See the details in [release …
gary-Shen Jan 9, 2025
4656e5c
chore(release): 1.1.0-alpha.26 [skip ci]
semantic-release-bot Jan 9, 2025
9b5879e
fix: Upgrade frontend to v5.7.0-alpha.4. See the details in [release …
gary-Shen Jan 14, 2025
eef80f0
fix: no data to export
gary-Shen Jan 14, 2025
599e0a0
chore(release): 1.1.0-alpha.27 [skip ci]
semantic-release-bot Jan 14, 2025
70f6789
fix: Upgrade frontend to v5.7.0-alpha.5. See the details in [release …
gary-Shen Jan 15, 2025
57ee4cb
chore(release): 1.1.0-alpha.28 [skip ci]
semantic-release-bot Jan 15, 2025
d57db71
fix: Upgrade frontend to v5.7.0-alpha.6. See the details in [release …
gary-Shen Jan 16, 2025
a00b3b9
chore(release): 1.1.0-alpha.29 [skip ci]
semantic-release-bot Jan 16, 2025
b9b509b
fix: Upgrade frontend to v5.7.0-alpha.7. See the details in [release …
gary-Shen Feb 11, 2025
c3a4da5
chore(release): 1.1.0-alpha.30 [skip ci]
semantic-release-bot Feb 11, 2025
4255b53
fix: delete attachment when delete sample
Feb 12, 2025
55bc1f7
chore(release): 1.1.0-alpha.31 [skip ci]
semantic-release-bot Feb 12, 2025
576333d
fix: set current version on http response headers (#183)
gary-Shen Feb 12, 2025
086a179
Fix/version (#184)
gary-Shen Feb 12, 2025
a2d3cda
update: poetry config (#185)
gary-Shen Feb 12, 2025
1c0f590
chore(release): 1.1.0-alpha.32 [skip ci]
semantic-release-bot Feb 12, 2025
0f7253e
fix: Upgrade frontend to v5.7.0-alpha.8. See the details in [release …
gary-Shen Feb 12, 2025
f8c4245
chore(release): 1.1.0-alpha.33 [skip ci]
semantic-release-bot Feb 12, 2025
d512215
fix: upgrade frontend to v5.6.11
gary-Shen Feb 12, 2025
2734618
feat: supports mysql database (#187)
gary-Shen Feb 17, 2025
35e8858
Feat/collaboration (#188)
gary-Shen Feb 17, 2025
840a313
chore(release): 1.1.0-alpha.34 [skip ci]
semantic-release-bot Feb 17, 2025
b159c63
feat: supports task collaborators (#189)
gary-Shen Feb 21, 2025
27fcf67
fix: Upgrade frontend to v5.7.0-alpha.9. See the details in [release …
gary-Shen Feb 21, 2025
1a4b46e
fix: Upgrade frontend to v5.7.0-alpha.10. See the details in [release…
gary-Shen Feb 21, 2025
c436b00
fix: update migrate script
gary-Shen Feb 21, 2025
3591bcf
update migrate script (#191)
gary-Shen Feb 21, 2025
f917091
fix: remove owner_id param in list pre_annotations (#192)
gary-Shen Feb 21, 2025
047380a
update: update migration script (#193)
gary-Shen Feb 21, 2025
10ae011
fix: Upgrade frontend to v5.7.0-alpha.11. See the details in [release…
gary-Shen Feb 21, 2025
5bae632
update: update test case
gary-Shen Feb 21, 2025
b22092b
update: update get task
gary-Shen Feb 24, 2025
973ba72
chore(release): 1.1.0-alpha.35 [skip ci]
semantic-release-bot Feb 24, 2025
2f90701
feat: add task ws api router (#196)
gary-Shen Feb 28, 2025
8f88deb
fix: Upgrade frontend to v5.7.0-alpha.12. See the details in [release…
gary-Shen Feb 28, 2025
7624fd9
chore(release): 1.1.0-alpha.36 [skip ci]
semantic-release-bot Feb 28, 2025
6bae992
fix: update default command (#197)
gary-Shen Mar 3, 2025
2a7b969
chore(release): 1.1.0-alpha.37 [skip ci]
semantic-release-bot Mar 3, 2025
d5a8545
fix: update default command (#198)
gary-Shen Mar 4, 2025
5221fd8
fix: Upgrade frontend to v5.7.0-alpha.13. See the details in [release…
gary-Shen Mar 4, 2025
4ea57f9
chore(release): 1.1.0-alpha.38 [skip ci]
semantic-release-bot Mar 4, 2025
5e413ab
fix: main.py -> labelu.py (#199)
gary-Shen Mar 4, 2025
ac5ae35
fix: update command (#200)
gary-Shen Mar 4, 2025
fb6c3e1
fix: labelu.py -> main.py
gary-Shen Mar 4, 2025
634ce0c
update: app -> cli
gary-Shen Mar 4, 2025
a42e8ef
chore(release): 1.1.0-alpha.39 [skip ci]
semantic-release-bot Mar 4, 2025
6b345b9
fix: update default command
gary-Shen Mar 4, 2025
6787477
chore(release): 1.1.0-alpha.40 [skip ci]
semantic-release-bot Mar 4, 2025
948d9af
fix: update default command
gary-Shen Mar 4, 2025
b855e0e
Merge branch 'alpha' of https://github.com/opendatalab/labelU into alpha
gary-Shen Mar 4, 2025
9dad646
chore(release): 1.1.0-alpha.41 [skip ci]
semantic-release-bot Mar 4, 2025
54329c5
fix: Upgrade frontend to v5.7.0-alpha.14. See the details in [release…
gary-Shen Mar 4, 2025
ea9fdd6
chore(release): 1.1.0-alpha.42 [skip ci]
semantic-release-bot Mar 4, 2025
20ef7b3
fix: Upgrade frontend to v5.7.0-alpha.15. See the details in [release…
gary-Shen Mar 5, 2025
ab51a8e
chore(release): 1.1.0-alpha.43 [skip ci]
semantic-release-bot Mar 5, 2025
39f519e
fix: connections -> peers
gary-Shen Mar 7, 2025
62a0b0b
Merge branch 'alpha' of https://github.com/opendatalab/labelU into alpha
gary-Shen Mar 7, 2025
2660132
fix: Upgrade frontend to v5.7.0-alpha.16. See the details in [release…
gary-Shen Mar 7, 2025
7c83c4f
chore(release): 1.1.0-alpha.44 [skip ci]
semantic-release-bot Mar 7, 2025
a874f0b
fix: optimize ws connection
gary-Shen Mar 7, 2025
d713272
Merge branch 'alpha' of https://github.com/opendatalab/labelU into alpha
gary-Shen Mar 7, 2025
7a94abe
fix: Upgrade frontend to v5.7.0-alpha.17. See the details in [release…
gary-Shen Mar 7, 2025
8db71fe
chore(release): 1.1.0-alpha.45 [skip ci]
semantic-release-bot Mar 7, 2025
643cd59
fix: missing task_attachment_ids column in task_sample table
Mar 8, 2025
581a198
update: missing column task_attachment_ids
Mar 8, 2025
8128621
chore(release): 1.1.0-alpha.46 [skip ci]
semantic-release-bot Mar 8, 2025
71f4c4a
fix: update migration script
gary-Shen Mar 10, 2025
928aece
Merge branch 'alpha' of https://github.com/opendatalab/labelU into alpha
gary-Shen Mar 10, 2025
a9d878e
chore(release): 1.1.0-alpha.47 [skip ci]
semantic-release-bot Mar 10, 2025
6d16f34
fix: optimize ws connection
gary-Shen Mar 10, 2025
6452235
chore(release): 1.1.0-alpha.48 [skip ci]
semantic-release-bot Mar 10, 2025
61e23ee
fix: Upgrade frontend to v5.7.0-alpha.18. See the details in [release…
gary-Shen Mar 10, 2025
0d07c09
chore(release): 1.1.0-alpha.49 [skip ci]
semantic-release-bot Mar 10, 2025
43133da
fix: ws message when sample is updated
gary-Shen Mar 11, 2025
9a3fe1a
Merge branch 'alpha' of https://github.com/opendatalab/labelU into alpha
gary-Shen Mar 11, 2025
fca41a3
fix: Upgrade frontend to v5.7.0-alpha.19. See the details in [release…
gary-Shen Mar 11, 2025
33c7b77
chore(release): 1.1.0-alpha.50 [skip ci]
semantic-release-bot Mar 11, 2025
d35101d
fix: Upgrade frontend to v5.7.0-alpha.20. See the details in [release…
gary-Shen Mar 11, 2025
4c54635
chore(release): 1.1.0-alpha.51 [skip ci]
semantic-release-bot Mar 11, 2025
01b40b8
fix: Upgrade frontend to v5.7.0-alpha.21. See the details in [release…
gary-Shen Mar 11, 2025
6086199
chore(release): 1.1.0-alpha.52 [skip ci]
semantic-release-bot Mar 11, 2025
c1f9cca
fix: Upgrade frontend to v5.7.0-alpha.22. See the details in [release…
gary-Shen Mar 11, 2025
ef5b69f
chore(release): 1.1.0-alpha.53 [skip ci]
semantic-release-bot Mar 11, 2025
1e88cb5
fix: Upgrade frontend to v5.7.0-alpha.23. See the details in [release…
gary-Shen Mar 11, 2025
125d1e7
chore(release): 1.1.0-alpha.54 [skip ci]
semantic-release-bot Mar 11, 2025
cc2cd41
fix: Upgrade frontend to v5.7.0-alpha.24. See the details in [release…
gary-Shen Mar 12, 2025
9c33d6a
chore(release): 1.1.0-alpha.55 [skip ci]
semantic-release-bot Mar 12, 2025
2ecf3a6
fix: Upgrade frontend to v5.7.0-alpha.25. See the details in [release…
gary-Shen Mar 12, 2025
9255efc
chore(release): 1.1.0-alpha.56 [skip ci]
semantic-release-bot Mar 12, 2025
a00b4fa
fix: Upgrade frontend to v5.7.0-alpha.26. See the details in [release…
gary-Shen Mar 12, 2025
fe2a902
chore(release): 1.1.0-alpha.57 [skip ci]
semantic-release-bot Mar 12, 2025
accc1bd
fix: Upgrade frontend to v5.7.0-alpha.27. See the details in [release…
gary-Shen Mar 12, 2025
05280b4
chore(release): 1.1.0-alpha.58 [skip ci]
semantic-release-bot Mar 12, 2025
6f03500
chore: merge main
Mar 13, 2025
fa1f861
chore(release): 1.3.0-alpha.1 [skip ci]
semantic-release-bot Mar 13, 2025
e8e02bd
fix: remove unnecessary alembic script
Mar 13, 2025
281e763
chore(release): 1.3.0-alpha.2 [skip ci]
semantic-release-bot Mar 13, 2025
5c392c4
fix: migration db name
Mar 13, 2025
278e408
chore(release): 1.3.0-alpha.3 [skip ci]
semantic-release-bot Mar 13, 2025
94e0761
update: add migration script
gary-Shen Mar 13, 2025
d8125be
update: remove task_attachment_ids
Mar 13, 2025
fbba89a
fix: release alpha
gary-Shen Mar 13, 2025
ed9ebb3
chore(release): 1.3.0-alpha.4 [skip ci]
semantic-release-bot Mar 13, 2025
ced5d8a
fix: update frontend
gary-Shen Mar 13, 2025
988e72a
chore(release): 1.3.0-alpha.5 [skip ci]
semantic-release-bot Mar 13, 2025
51c7d36
fix: optimize attachment upload and download
gary-Shen Mar 18, 2025
df1ed38
chore: merge
gary-Shen Mar 18, 2025
fc84123
chore: merge
gary-Shen Mar 18, 2025
8f91912
update: fix import
gary-Shen Mar 18, 2025
5e06053
update: fix import
gary-Shen Mar 18, 2025
cdaf47b
chore(release): 1.3.0-alpha.6 [skip ci]
semantic-release-bot Mar 18, 2025
cbbbd0f
chore: merge main
gary-Shen Jul 3, 2025
97e3bca
feat: add relation tool
gary-Shen Jul 3, 2025
2656ba8
chore(release): 1.3.0-alpha.7 [skip ci]
semantic-release-bot Jul 3, 2025
4ae1904
fix: update package contact info
gary-Shen Jul 3, 2025
0311ac9
chore(release): 1.3.0-alpha.8 [skip ci]
semantic-release-bot Jul 3, 2025
d13fb61
fix: Upgrade frontend to v5.9.0-alpha.2. See the details in [release …
gary-Shen Jul 3, 2025
1d74104
chore(release): 1.3.0-alpha.9 [skip ci]
semantic-release-bot Jul 3, 2025
69beb62
fix: Upgrade frontend to v5.9.0-alpha.3. See the details in [release …
gary-Shen Jul 4, 2025
a16ed71
chore(release): 1.3.0-alpha.10 [skip ci]
semantic-release-bot Jul 4, 2025
178fc5a
fix: Upgrade frontend to v5.9.0-alpha.4. See the details in [release …
gary-Shen Jul 4, 2025
7e67b12
chore(release): 1.3.0-alpha.11 [skip ci]
semantic-release-bot Jul 4, 2025
0eecc48
fix: Upgrade frontend to v5.9.0-alpha.5. See the details in [release …
gary-Shen Jul 7, 2025
3e77359
chore(release): 1.3.0-alpha.12 [skip ci]
semantic-release-bot Jul 7, 2025
5231ea5
fix: Upgrade frontend to v5.9.0-alpha.6. See the details in [release …
gary-Shen Jul 7, 2025
176df89
chore(release): 1.3.0-alpha.13 [skip ci]
semantic-release-bot Jul 7, 2025
6bbaac5
fix: Upgrade frontend to v5.9.0-alpha.7. See the details in [release …
gary-Shen Jul 7, 2025
224e1fd
chore(release): 1.3.0-alpha.14 [skip ci]
semantic-release-bot Jul 7, 2025
0182ce8
fix: Upgrade frontend to v5.9.0-alpha.8. See the details in [release …
gary-Shen Jul 8, 2025
a2f8363
chore(release): 1.3.0-alpha.15 [skip ci]
semantic-release-bot Jul 8, 2025
d1f5a5a
fix: Upgrade frontend to v5.9.0-alpha.9. See the details in [release …
gary-Shen Jul 9, 2025
66dc356
chore(release): 1.3.0-alpha.16 [skip ci]
semantic-release-bot Jul 9, 2025
b6298af
fix: Upgrade frontend to v5.9.0-alpha.10. See the details in [release…
gary-Shen Jul 9, 2025
39b8ced
chore(release): 1.3.0-alpha.17 [skip ci]
semantic-release-bot Jul 9, 2025
2c42b7e
fix: cli options
gary-Shen Sep 30, 2025
ffcb199
chore: fix test
gary-Shen Sep 30, 2025
8495684
chore: fix tests
gary-Shen Sep 30, 2025
385c0df
chore: fix test
gary-Shen Sep 30, 2025
0457c83
Merge branch 'alpha' of https://github.com/opendatalab/labelU into alpha
gary-Shen Sep 30, 2025
5e56060
chore: fix test
gary-Shen Sep 30, 2025
8b0e966
chore: fix test
gary-Shen Sep 30, 2025
d4d656f
chore: fix test
gary-Shen Sep 30, 2025
5f20eba
chore: fix test
gary-Shen Sep 30, 2025
14510f5
chore: fix test
gary-Shen Sep 30, 2025
fee1343
chore: fix test
gary-Shen Oct 1, 2025
93523b5
chore: fix test
gary-Shen Oct 1, 2025
1548312
chore: fix test
gary-Shen Oct 1, 2025
142b14d
chore: fix test
gary-Shen Oct 1, 2025
b772c5f
chore: fix test
gary-Shen Oct 1, 2025
e36a9c6
chore(release): 1.3.0-alpha.18 [skip ci]
semantic-release-bot Oct 1, 2025
bed89a0
fix(security): prevent path traversal in LocalStorageBackend (unauthe…
Jul 13, 2026
ecac9f5
fix(security): sanitize the directory part of uploaded filenames (arb…
Jul 13, 2026
6e8b12d
fix(security): fix SQL injection in the sample-listing sort parameter…
Jul 13, 2026
23bd33a
fix(security): validate the data source S3 endpoint to prevent SSRF
Jul 13, 2026
ec871fa
fix(security): fix broken access control on samples and exports (IDOR)
Jul 13, 2026
7f879f7
fix(security): fix broken access control on task update (IDOR)
Jul 13, 2026
9f96454
fix(security): fix broken access control on data sources (IDOR)
Jul 13, 2026
ce8273f
fix(security): fix broken access control on pre-annotations (IDOR)
Jul 13, 2026
5a54844
test: make test suite hermetic by isolating DB and media per run
Jul 13, 2026
25f90f1
Merge branch 'claude/admiring-euler-c19891' into fix/security-vulnera…
Jul 13, 2026
4914c66
Merge branch 'alpha' into fix/security-vulnerabilities
gary-Shen Jul 13, 2026
c2e76ba
fix(security): make private S3 endpoints configurable for on-prem dep…
Jul 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion README_zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ conda activate labelu

4. 安装 LabelU:

安装基础版本(使用SQLite)
```bash
pip install labelu
```
Expand All @@ -100,7 +101,7 @@ pip install labelu[mysql]
# pip install labelu mysqlclient
```

5. 运行:
1. 运行:

```bash
labelu
Expand Down
29 changes: 22 additions & 7 deletions labelu/internal/adapter/persistence/crud_sample.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from typing import Any, Dict, List, Union


from sqlalchemy import case, func, text
from sqlalchemy import case, func
from sqlalchemy.orm import Session
from fastapi.encoders import jsonable_encoder

Expand Down Expand Up @@ -39,17 +39,32 @@ def list_by(
whens = {state.value: index for index, state in enumerate(SampleState)}
sort_logic = case(whens, value=TaskSample.state).label(TaskSample.state.key)

# Allowlist of sortable columns mapped to real ORM columns. Only these
# identifiers may reach ORDER BY; anything else is rejected so request
# input can never be interpolated into raw SQL.
sortable_columns = {
"inner_id": TaskSample.inner_id,
"updated_at": TaskSample.updated_at,
"annotated_count": TaskSample.annotated_count,
}

if sorting:
sort_strings = sorting.split(",")
for item in sort_strings:
sort_key = item.split(":")
if sort_key[0] == TaskSample.state.key:
if sort_key[1] == "asc":
query = query.order_by(sort_logic.asc())
else:
query = query.order_by(sort_logic.desc())
column = sort_key[0]
direction = sort_key[1] if len(sort_key) > 1 else "asc"
if direction not in ("asc", "desc"):
continue
if column == TaskSample.state.key:
order_target = sort_logic
elif column in sortable_columns:
order_target = sortable_columns[column]
else:
query = query.order_by(text(f"{sort_key[0]} {sort_key[1]}"))
continue
query = query.order_by(
order_target.asc() if direction == "asc" else order_target.desc()
)

# default order by id, before need select last items
if before:
Expand Down
4 changes: 2 additions & 2 deletions labelu/internal/adapter/routers/datasource.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ async def get(
db: Session = Depends(db_module.get_db),
current_user: User = Depends(get_current_user),
):
data = await service.get(db=db, ds_id=ds_id)
data = await service.get(db=db, ds_id=ds_id, current_user=current_user)
return OkResp[DataSourceResponse](data=data)


Expand Down Expand Up @@ -123,7 +123,7 @@ async def list_objects(
current_user: User = Depends(get_current_user),
):
data = await service.list_objects(
db=db, ds_id=ds_id, prefix=prefix, extension=extension,
db=db, ds_id=ds_id, current_user=current_user, prefix=prefix, extension=extension,
page_token=page_token, size=size,
)
return OkResp[S3ObjectListResponse](data=data)
17 changes: 15 additions & 2 deletions labelu/internal/adapter/routers/sample.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
from labelu.internal.application.response.auto_label import AutoLabelResponse, AutoLabelJobResponse
from labelu.internal.application.response.export import ExportJobResponse
from labelu.internal.adapter.persistence import crud_export_job
from labelu.internal.adapter.persistence import crud_task
from labelu.internal.application.service.access import assert_task_access
from labelu.internal.common.storage import get_storage_backend


Expand Down Expand Up @@ -84,7 +86,9 @@ async def list_by(
page: Union[int, None] = Query(default=None, ge=0),
size: Union[int, None] = 100,
sort: Union[str, None] = Query(
default=None, pattern="(annotated_count|state|inner_id|updated_at):(desc|asc)"
default=None,
pattern=r"^(annotated_count|state|inner_id|updated_at):(desc|asc)"
r"(,(annotated_count|state|inner_id|updated_at):(desc|asc))*$",
),
authorization: HTTPAuthorizationCredentials = Security(security),
db: Session = Depends(db_module.get_db),
Expand All @@ -109,6 +113,7 @@ async def list_by(
page=page,
size=size,
sorting=sort,
current_user=current_user,
)

# response
Expand All @@ -134,7 +139,7 @@ async def get(

# business logic
data = await service.get(
db=db, task_id=task_id, sample_id=sample_id
db=db, task_id=task_id, sample_id=sample_id, current_user=current_user
)

# response
Expand Down Expand Up @@ -329,6 +334,10 @@ async def get_export_status(
status_code=status.HTTP_404_NOT_FOUND,
)

task = crud_task.get(db=db, task_id=job.task_id)
if task is not None:
assert_task_access(task, current_user)

skipped_count, warning_message = _export_progress(
sample_count=job.sample_count,
processed_count=job.processed_count,
Expand Down Expand Up @@ -373,6 +382,10 @@ async def download_export(
status_code=status.HTTP_404_NOT_FOUND,
)

task = crud_task.get(db=db, task_id=job.task_id)
if task is not None:
assert_task_access(task, current_user)

storage = get_storage_backend()
if storage.is_remote:
download_url = storage.get_read_url(job.file_path)
Expand Down
2 changes: 1 addition & 1 deletion labelu/internal/adapter/routers/task.py
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ async def update(
"""

# business logic
data = await service.update(db=db, task_id=task_id, cmd=cmd)
data = await service.update(db=db, task_id=task_id, cmd=cmd, current_user=current_user)

# response
return OkResp[TaskResponse](data=data)
Expand Down
60 changes: 59 additions & 1 deletion labelu/internal/application/command/datasource.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,68 @@
import ipaddress
import socket
from typing import Union
from urllib.parse import urlparse

from pydantic import BaseModel, Field, model_validator
from pydantic import BaseModel, Field, field_validator, model_validator

from labelu.internal.common.config import settings


def validate_s3_endpoint(endpoint: Union[str, None]) -> Union[str, None]:
"""Reject S3 endpoints that could be abused for SSRF.

Only http(s) URLs are allowed. Link-local (cloud metadata
169.254.0.0/16, fe80::/10), multicast, reserved and unspecified
addresses are always rejected — they are never valid S3 endpoints.

Private (RFC1918 / ULA) and loopback addresses are allowed when
``settings.ALLOW_PRIVATE_S3_ENDPOINT`` is true (the default, for on-prem
deployments backed by an internal MinIO/S3-compatible store) and
rejected otherwise (strict mode).
"""
if endpoint is None or endpoint == "":
return endpoint

parsed = urlparse(endpoint)
if parsed.scheme not in ("http", "https"):
raise ValueError("endpoint must be an http(s) URL")
host = parsed.hostname
if not host:
raise ValueError("endpoint must include a host")

try:
infos = socket.getaddrinfo(host, None)
except socket.gaierror:
raise ValueError("endpoint host cannot be resolved")

allow_private = settings.ALLOW_PRIVATE_S3_ENDPOINT
for info in infos:
addr = ipaddress.ip_address(info[4][0])
# Never a legitimate S3 endpoint; always rejected regardless of config.
# Note: the metadata IP (169.254.x) is also flagged is_private on newer
# Python, so link-local is checked here and must win over the private
# carve-out below. Loopback is exempt from the reserved check because
# ::1 is also flagged is_reserved.
if (
addr.is_link_local
or addr.is_multicast
or addr.is_unspecified
or (addr.is_reserved and not addr.is_loopback)
):
raise ValueError("endpoint host resolves to a disallowed address")
# Internal networks (RFC1918 / ULA / loopback): allowed only when
# explicitly permitted via ALLOW_PRIVATE_S3_ENDPOINT.
if (addr.is_private or addr.is_loopback) and not allow_private:
raise ValueError("endpoint host resolves to a private address")
return endpoint


class CreateDataSourceCommand(BaseModel):
name: str = Field(max_length=128, description="Display name")
type: str = Field(default="S3", max_length=32)
endpoint: Union[str, None] = Field(default=None, max_length=512)

_validate_endpoint = field_validator("endpoint")(validate_s3_endpoint)
region: Union[str, None] = Field(default=None, max_length=64)
bucket: str = Field(max_length=256)
prefix: str = Field(default="", max_length=512)
Expand All @@ -20,6 +76,8 @@ class CreateDataSourceCommand(BaseModel):
class UpdateDataSourceCommand(BaseModel):
name: Union[str, None] = Field(default=None, max_length=128)
endpoint: Union[str, None] = Field(default=None, max_length=512)

_validate_endpoint = field_validator("endpoint")(validate_s3_endpoint)
region: Union[str, None] = Field(default=None, max_length=64)
bucket: Union[str, None] = Field(default=None, max_length=256)
prefix: Union[str, None] = Field(default=None, max_length=512)
Expand Down
31 changes: 31 additions & 0 deletions labelu/internal/application/service/access.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
from fastapi import status

from labelu.internal.common.error_code import ErrorCode, LabelUException


def assert_task_access(task, current_user) -> None:
"""Ensure current_user may access the given task's data.

Access is granted to the task owner or any of its collaborators. Any other
authenticated user is rejected with 403, closing IDOR/BOLA on task-scoped
resources (samples, pre-annotations, exports, ...).
"""
collaborator_ids = {c.id for c in task.collaborators}
if task.created_by != current_user.id and current_user.id not in collaborator_ids:
raise LabelUException(
code=ErrorCode.CODE_30001_NO_PERMISSION,
status_code=status.HTTP_403_FORBIDDEN,
)


def assert_owner(resource, current_user) -> None:
"""Ensure current_user owns the resource (created_by).

Used for user-private resources without a collaborator concept
(e.g. data sources).
"""
if resource.created_by != current_user.id:
raise LabelUException(
code=ErrorCode.CODE_30001_NO_PERMISSION,
status_code=status.HTTP_403_FORBIDDEN,
)
14 changes: 12 additions & 2 deletions labelu/internal/application/service/attachment.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,11 +82,21 @@ async def create(

# file relative path
path_filename = cmd.file.filename.split("/")
# filename = str(uuid.uuid4())[0:8] + "-" + path_filename[-1] NOTE: If you want keep filename safe, you can use uuid as filename
# filename = str(uuid.uuid4())[0:8] + "-" + path_filename[-1] NOTE: If you want keep filename safe, you can use uuid as filename
filename = path_filename[-1]
sanitized = re.sub(r'%', '_pct_', filename)
sanitized = re.sub(r'[\\/*?:"<>|#]', '_', sanitized)
path = "/".join(path_filename[:-1])
# Sanitize the directory portion of the filename too: drop traversal
# components ("..", ".", empty) and apply the same character sanitization,
# so a crafted filename can never escape the task's upload directory.
safe_parts = []
for part in path_filename[:-1]:
part = re.sub(r'%', '_pct_', part)
part = re.sub(r'[\\/*?:"<>|#]', '_', part)
if part in ("", ".", ".."):
continue
safe_parts.append(part)
path = "/".join(safe_parts)
attachment_relative_base_dir = Path(settings.UPLOAD_DIR).joinpath(
str(task_id), path
)
Expand Down
8 changes: 7 additions & 1 deletion labelu/internal/application/service/datasource.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from sqlalchemy.orm import Session

from labelu.internal.adapter.persistence import crud_datasource
from labelu.internal.application.service.access import assert_owner
from labelu.internal.application.command.datasource import (
CreateDataSourceCommand,
UpdateDataSourceCommand,
Expand Down Expand Up @@ -110,13 +111,14 @@ async def list_by(
return [_to_response(ds) for ds in items], total


async def get(db: Session, ds_id: int) -> DataSourceResponse:
async def get(db: Session, ds_id: int, current_user: User) -> DataSourceResponse:
ds = crud_datasource.get(db=db, ds_id=ds_id)
if not ds:
raise LabelUException(
code=ErrorCode.CODE_61000_NO_DATA,
status_code=status.HTTP_404_NOT_FOUND,
)
assert_owner(ds, current_user)
return _to_response(ds)


Expand All @@ -129,6 +131,7 @@ async def update(
code=ErrorCode.CODE_61000_NO_DATA,
status_code=status.HTTP_404_NOT_FOUND,
)
assert_owner(ds, current_user)
obj_in = cmd.model_dump(exclude_unset=True)
if "access_key_id" in obj_in and obj_in["access_key_id"] is not None:
obj_in["access_key_id"] = encrypt_value(obj_in["access_key_id"])
Expand All @@ -147,6 +150,7 @@ async def delete(db: Session, ds_id: int, current_user: User) -> None:
code=ErrorCode.CODE_61000_NO_DATA,
status_code=status.HTTP_404_NOT_FOUND,
)
assert_owner(ds, current_user)
with begin_transaction(db):
crud_datasource.soft_delete(db=db, db_obj=ds)

Expand All @@ -156,6 +160,7 @@ async def delete(db: Session, ds_id: int, current_user: User) -> None:
async def list_objects(
db: Session,
ds_id: int,
current_user: User,
prefix: Optional[str] = None,
extension: Optional[str] = None,
page_token: Optional[str] = None,
Expand All @@ -167,6 +172,7 @@ async def list_objects(
code=ErrorCode.CODE_61000_NO_DATA,
status_code=status.HTTP_404_NOT_FOUND,
)
assert_owner(ds, current_user)

client = _build_s3_client(ds)
full_prefix = prefix if prefix is not None else (ds.prefix or "")
Expand Down
Loading