Compare commits

...

2826 Commits

Author SHA1 Message Date
Andrey Antukh
cc5b1c950b Merge branch 'translations' into staging 2023-08-30 10:35:47 +02:00
Andrey Antukh
52851f4c6f 📎 Add dutch language 2023-08-30 10:35:33 +02:00
Andrey Antukh
9bd42be771 Merge remote-tracking branch 'weblate/develop' into translations 2023-08-30 10:26:28 +02:00
Andrey Antukh
5f65960d42 Merge pull request #3568 from penpot/eva-fix-tooltip-visibility
🐛 Fix tooltip on toggle visibility and toggle lock buttons
2023-08-29 13:15:54 +02:00
Eva
dc813732c3 🐛 Fix tooltip on toggle visibility and toggle lock buttons 2023-08-29 13:15:40 +02:00
Andrey Antukh
661e4a001a Merge pull request #3569 from penpot/superalex-fix-invalid-file-amount-after-moving-files
🐛 Bugfixing
2023-08-29 13:13:36 +02:00
Alejandro Alonso
53d1624f3f 🐛 Fix deleted pages comments shown in right sidebar 2023-08-29 13:13:12 +02:00
Alejandro Alonso
514ba6604b 🐛 Fix invalid file amount after moving files 2023-08-29 13:13:11 +02:00
Alejandro
0aa361013a Merge pull request #3551 from penpot/niwinz-bugfixes-1
🐛 Fix unexpected output on get-page when invalid object-id is pro…
2023-08-29 13:04:34 +02:00
Andrey Antukh
ddbc828342 🐛 Fix unexpected output on get-page when invalid object-id is provided 2023-08-29 13:04:23 +02:00
Sebastiaan Pasma
67cff1ed74 🌐 Add translations for: Dutch.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-08-28 16:57:12 +02:00
Sebastiaan Pasma
22c88a19e2 🌐 Add translations for: Dutch.
Currently translated at 83.2% (1007 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-08-26 15:54:37 +02:00
Andrey Antukh
159ac92021 Merge pull request #3561 from penpot/superalex-click-flow-tag-open-viewer
 Click on flow tag open viewer
2023-08-25 12:40:10 +02:00
Andrey Antukh
1a92657c7c Merge pull request #3559 from penpot/superalex-fix-alt-l-shortcuts
🐛 Fix alt+l shortcuts
2023-08-25 12:37:10 +02:00
Alejandro Alonso
8669207086 Click on flow tag open viewer 2023-08-25 11:40:56 +02:00
Alejandro Alonso
b82ce671b9 🐛 Fix alt+l shortcuts 2023-08-25 10:54:34 +02:00
Aitor Moreno
ff14208a95 Merge pull request #3555 from penpot/superalex-navigate-up-in-layer-hierarchy-with-shift-enter-shortcut
 Navigate up in layer hierarchy with Shift+Enter shortcut
2023-08-24 13:42:12 +02:00
Aitor
8593ca1310 🐛 Fix scroll automatically to layer item 2023-08-24 13:31:47 +02:00
Alejandro Alonso
f69e141ac1 Navigate up in layer lierarchy with Shift+Enter shortcut 2023-08-24 12:25:03 +02:00
Alejandro
b0497f1352 Merge pull request #3554 from penpot/niwinz-staging-bugfixes-8
🐛 Prevent rollback for idle-in-transaction errors on cron tasks
2023-08-24 12:02:13 +02:00
Alejandro Alonso
aaf9c6e50b Enable access tokens by default 2023-08-24 12:00:56 +02:00
Andrey Antukh
d80aa7593b 🐛 Fix unexpected exception on encoding error response 2023-08-24 11:37:59 +02:00
Andrey Antukh
5275c35002 🐛 Prevent rollback for idle-in-transaction errors on cron tasks 2023-08-24 11:18:56 +02:00
Alejandro Alonso
f02b5765d7 🐛 Fix safe number max values 2023-08-23 14:59:08 +02:00
Alejandro Alonso
1f31722571 📎 Update version.txt file 2023-08-23 09:38:23 +02:00
Alejandro Alonso
834c18323e Revert "📎 Update version.txt file"
This reverts commit a7f39e89f6.
2023-08-23 09:38:07 +02:00
andy
1d2f5b6c0b 🌐 Add translations for: Norwegian Bokmål.
Currently translated at 12.5% (152 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nb_NO/
2023-08-22 11:49:11 +02:00
Alejandro
ab87db099a Merge pull request #3542 from penpot/niwinz-bugfixes-1
🐛 Fix inconsistencies on handlong :file-image attr on import and file-gc task
2023-08-22 06:50:58 +02:00
Andrey Antukh
661a916a5f 🐛 Fix reference counting of file-media objects in :fill-image attr 2023-08-21 19:11:55 +02:00
Andrey Antukh
b8dee17075 🐛 Fix incorrect streams handling on thumbnail_render 2023-08-21 19:11:55 +02:00
Stas Haas
c8d5e4ef35 🌐 Add translations for: German.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-08-19 13:55:24 +02:00
Alejandro Alonso
a7f39e89f6 📎 Update version.txt file 2023-08-18 10:35:12 +02:00
Pablo Alba
70bb34118c Merge pull request #3532 from penpot/hiru-fix-component-modified
🐛 Fix component modified date in v1
2023-08-17 17:18:48 +02:00
Andrés Moya
f409dfd3d1 🐛 Fix component modified date in v1 2023-08-17 16:05:54 +02:00
Alejandro Alonso
e1954b5dd7 🐛 Fix old files with invalid refs for texts and fills 2023-08-17 09:48:18 +02:00
Sebastiaan Pasma
196d57dd5c 🌐 Add translations for: Dutch.
Currently translated at 74.1% (897 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-08-15 15:50:00 +02:00
Alejandro
a1ac839b2a Merge pull request #3517 from penpot/niwinz-enhancements-push-notifications
🎉 Add the ability to send push notifications
2023-08-14 12:24:43 +02:00
Andrey Antukh
1e9a4d74eb 🐛 Add safechecks to binfile exportation 2023-08-14 12:13:31 +02:00
Andrey Antukh
7a9777419c Backport db module improvements from develop 2023-08-14 12:13:31 +02:00
Andrey Antukh
28836d82cd Add minor improvements to error report template 2023-08-14 12:13:31 +02:00
Andrey Antukh
da62a6809c Stop report oidc failed operations as exceptions 2023-08-14 12:13:31 +02:00
Andrey Antukh
5d5d238fec 💄 Add minor cosmetic improvements on dashboard ui component 2023-08-14 12:13:31 +02:00
Andrey Antukh
e5dedb1e3d 🎉 Add push notifications support 2023-08-14 12:13:31 +02:00
Sebastiaan Pasma
4c7cd02f56 🌐 Add translations for: Dutch.
Currently translated at 54.0% (654 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-08-12 14:49:53 +02:00
Alejandro Alonso
b3128bd32b 🐛 Fix overlay manual positioning 2023-08-10 11:15:42 +02:00
Alejandro Alonso
15a9035ed1 🐛 Fix multiple elements export 2023-08-09 12:19:27 +02:00
Vincas Dundzys
82e51d358b 🌐 Add translations for: Lithuanian.
Currently translated at 10.3% (125 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lt/
2023-08-09 09:04:18 +02:00
Alejandro
fbcc2494b4 Merge pull request #3509 from penpot/niwinz-staging-bugfixes-7
 Add improvements to api doc
2023-08-09 08:00:02 +02:00
Andrey Antukh
4a016dce14 📎 Add minor improvements on params formating on error logger 2023-08-08 14:53:55 +02:00
Andrey Antukh
53f40043aa 📎 Fix typo on api doc main template 2023-08-08 14:52:39 +02:00
Alejandro Alonso
937dd5a857 🐛 Fix zip importer for none fills 2023-08-08 13:52:09 +02:00
Andrey Antukh
36b167956c Add improvements to api doc 2023-08-08 13:44:47 +02:00
Alejandro
695152274c Merge pull request #3506 from penpot/niwinz-staging-bugfixes-7
 Improve error report of invalid image
2023-08-08 13:17:34 +02:00
Andrey Antukh
486c638076 🐛 Fix image upload issues on safari with drag&drop 2023-08-08 12:58:39 +02:00
Andrey Antukh
81facd58c9 Improve error report of invalid image 2023-08-08 12:57:49 +02:00
Alejandro
2a0031d23c Merge pull request #3505 from penpot/niwinz-staging-bugfixes-7
💄 Add  minor cosmetic improvement on error report template
2023-08-08 11:07:02 +02:00
Andrey Antukh
63a3186e6d 💄 Add minor cosmetic improvement on error report template 2023-08-08 10:42:26 +02:00
Alejandro Alonso
fcdf33b134 🐛 Fix backend api doc generation for auth required endpoints 2023-08-08 10:39:09 +02:00
Alejandro Alonso
19d88cc1a6 🐛 Fix backend api doc generation 2023-08-08 09:55:32 +02:00
Alejandro
1f68c6164a Merge pull request #3501 from penpot/niwinz-staging-bugfixes-7
 Improve get-user-info implementation (oidc)
2023-08-07 16:36:19 +02:00
Andrey Antukh
c39702fbf7 Improve get-user-info implementation (oidc) 2023-08-07 15:55:54 +02:00
Alejandro Alonso
b3f0683d02 🐛 Fix image validation 2023-08-07 15:06:59 +02:00
Alejandro
211de1bb9c Merge pull request #3498 from penpot/niwinz-staging-bugfixes-6
🐛 Allow nil values on bool content params
2023-08-07 12:57:30 +02:00
Andrey Antukh
fe80aab394 🐛 Allow nil values on bool content params 2023-08-07 11:46:19 +02:00
Alejandro
a494b89bba Merge pull request #3497 from penpot/niwinz-staging-bugfixes-6
🐛 Fix incorrect implementation on error reporting context collection
2023-08-07 11:20:00 +02:00
Andrey Antukh
6e313dff84 🐛 Add workaround for unexpected exception on fix-broken-shapes
which happens when we have a component shape tree with an ephimeral
shape with id ZERO (unused and with invalid children)
2023-08-07 11:12:27 +02:00
Alejandro Alonso
766040198a 🐛 Fix text validation 2023-08-07 09:29:04 +02:00
Andrey Antukh
7afaa9d31f 🐛 Fix incorrect implementation on error reporting context collection 2023-08-04 18:40:47 +02:00
Alejandro Alonso
cf68a9cf1e 🐛 Fix safe number max values 2023-08-04 15:16:43 +02:00
Alejandro
c69f6da2d7 Merge pull request #3493 from penpot/niwinz-staging-bugfixes-6
🐛 Several bugfixes
2023-08-04 13:35:12 +02:00
Andrey Antukh
259b05db51 Add more improvements to error reporting 2023-08-04 13:10:36 +02:00
Andrey Antukh
2ba7996116 🐛 Fix unexpected viewport update on leave workspace 2023-08-04 12:58:27 +02:00
Andrey Antukh
66e877ed40 🐛 Fix stroke-width parsing on svg upload
And refactor a bit the stroke parsing function
2023-08-04 12:58:27 +02:00
Alejandro
f3bf04e1c9 Merge pull request #3488 from penpot/niwinz-staging-bugfixes-5
 Add better error reporting on response encoding middleware
2023-08-03 16:46:05 +02:00
Alejandro Alonso
79e3aadfcf 🐛 Fix undo change for multiple shapes 2023-08-03 16:38:21 +02:00
Andrey Antukh
0527c55398 Add better exception handling on json content type handling 2023-08-03 16:31:35 +02:00
Andrey Antukh
54bb89b2bb ⬆️ Upgrade yetti to v9.16 (fixes exception unwrapping) 2023-08-03 16:31:35 +02:00
Andrey Antukh
9334f935eb Add better error reporting on response encoding middleware 2023-08-03 16:10:41 +02:00
Alejandro
fed31d366f Merge pull request #3480 from penpot/azazeln28-bugfixing-1
🐛 Bug fixing
2023-08-03 07:28:28 +02:00
Aitor Moreno
55b7bba944 Merge pull request #3484 from penpot/superalex-fix-duplicate-board
🐛 Fix duplicate board
2023-08-02 18:27:18 +02:00
Alejandro Alonso
3ff13f1d8f 🐛 Fix duplicate board 2023-08-02 18:22:46 +02:00
Aitor
4b28685a6d 🐛 Fix prototype selects preventing ctrl-z 2023-08-02 16:15:08 +02:00
Alejandro
53001921d5 Merge pull request #3481 from penpot/niwinz-staging-hotfix-4
🐛 Bugfixes & Improvements
2023-08-02 16:08:12 +02:00
Andrey Antukh
046f501152 Improve error reporting context 2023-08-02 14:51:12 +02:00
Andrey Antukh
00f7c94377 Improve database error reporter 2023-08-02 13:43:53 +02:00
Andrey Antukh
eae5dfc828 🐛 Don't send empty changes on fix broken shape links 2023-08-02 13:43:53 +02:00
Andrey Antukh
88261c2ec3 Increase network timeout on exporter dockerfile 2023-08-02 13:43:53 +02:00
Andrey Antukh
1bfc28f63d Add missing index on server_error_report table 2023-08-02 13:43:53 +02:00
Alejandro Alonso
e7a82579c1 🐛 Fix paste groups without shapes attr 2023-08-02 11:17:20 +02:00
Alejandro
30c786741f Merge pull request #3478 from penpot/niwinz-staging-hotfix-4
🐛 Fix broken shape relations on workspace initialization
2023-08-02 11:13:39 +02:00
Andrey Antukh
3eb2569465 Add better exception reporting on commit-changes 2023-08-02 10:45:11 +02:00
Andrey Antukh
7efeeec9b1 Add workspace initialization fix for broken shape references
Is the code that executes at workspace initialization that checks all
the shape children for broken references and proceed to emit a special
event that fixes the shape children references.
2023-08-02 10:45:11 +02:00
Aitor
67f56dd0f8 🐛 Fix color picker not working when using shortcut 2023-08-02 10:18:40 +02:00
Alejandro
2ec5a3ba6a Merge pull request #3476 from penpot/niwinz-staging-hotfix-4
 Improve ws-conn handling on session expiration
2023-08-01 14:41:15 +02:00
Andrey Antukh
958931d264 Improve ws-conn handling on session expiration 2023-08-01 13:09:51 +02:00
Alejandro Alonso
e3f69bcc98 🐛 Fix path validation 2023-08-01 12:39:33 +02:00
Alejandro
9c53a33bac Merge pull request #3472 from penpot/niwinz-staging-hotfix-3
🐛 Ensure :shapes attr on importing an svg with an empty group
2023-07-31 16:33:06 +02:00
Andrey Antukh
f72206bba3 🐛 Ensure :shapes attr on importing an svg with an empty group
This commit should not not be backported to, because the affected
code is already refactored and the issue is already fixed on develop
branch
2023-07-31 16:26:03 +02:00
Alejandro
37a19aa6b5 Merge pull request #3471 from penpot/niwinz-staging-hotfix-3
🐛 Hot Fixes
2023-07-31 16:20:47 +02:00
Andrey Antukh
17ea8300ed 🐛 Accept nil values for :fill-color-gradient attr 2023-07-31 15:58:32 +02:00
Andrey Antukh
aac044fa0a 🐛 Fix incorrect schema on bool-content 2023-07-31 15:49:42 +02:00
Alejandro
e935ccae76 Merge pull request #3469 from penpot/niwinz-staging-hotfix-2
🐛 Allow nil values for x,y,width and height on paths
2023-07-31 13:41:22 +02:00
Andrey Antukh
13312dc467 🐛 Allow nil values for x,y,width and height on paths 2023-07-31 13:36:28 +02:00
Alejandro Alonso
0ec49e5e95 🐛 Fix remove content from boolean 2023-07-31 13:02:52 +02:00
Alejandro
a49999186f Merge pull request #3466 from penpot/niwinz-staging-hotfix-1
🐛 Remove limits that can cause unexpected exceptions
2023-07-31 12:09:58 +02:00
Andrey Antukh
fc416ee4af 🐛 Make grid params type optional 2023-07-31 12:06:31 +02:00
Andrey Antukh
37bd537bfd 🐛 Remove limits that can cause unexpected exceptions 2023-07-31 11:54:29 +02:00
Alejandro
17798dbf40 Merge pull request #3459 from penpot/niwinz-staging-bugfixes
🐛 Bugfixes & Enhancements
2023-07-31 10:20:44 +02:00
Alejandro
4e1dfcce32 Merge pull request #3453 from penpot/azazeln28-fix-thumbnail-rendering-flashing
🐛 Fix thumbnail rendering flashing
2023-07-31 09:21:55 +02:00
Aitor
c28da17515 🐛 Fix thumbnail rendering flashing 2023-07-31 09:03:33 +02:00
Alejandro
9f0e65a042 Merge pull request #3450 from penpot/azazeln28-fix-ctrl-z-select-issue
🐛 Fix CTRL+Z in workspace select
2023-07-31 08:46:51 +02:00
Aitor
f1cf5d8ba8 🐛 Fix ctrl+z in workspace select issue 2023-07-31 08:38:48 +02:00
Eva Marco
cc682a382f Merge pull request #3455 from penpot/azazeln28-fix-layers-scroll-breaking-new-css-system
Fix layers scroll breaking new css system
2023-07-31 08:03:34 +02:00
Andrey Antukh
1f98b168ba 🐛 Set correct modification date on projects on file move operation 2023-07-28 13:20:57 +02:00
Andrey Antukh
21430cbd7d Show project modified date consistently 2023-07-28 13:20:57 +02:00
Andrey Antukh
f174264f7f 🎉 Add flex layout playground template to the dashboard carousel 2023-07-28 13:20:57 +02:00
Aitor Moreno
6eaa905f0c Merge pull request #3456 from penpot/niwinz-bugfixes
🐛 Bugfixes & Enhancements
2023-07-28 11:51:36 +02:00
Andrey Antukh
1c23e4e8be 🎉 Add v1.19 release notes dialog 2023-07-28 11:27:23 +02:00
Andrey Antukh
e0ad6c0b95 🐛 Fix unexpected exception on saving boolean shapes 2023-07-28 10:43:03 +02:00
Aitor
f1d73d5662 🐛 Fix layers scroll breaking new css system 2023-07-28 10:37:17 +02:00
Aitor Moreno
bbe3021aed Merge pull request #3448 from penpot/superalex-bugfixing-19
🐛 Bugfixing
2023-07-26 15:16:53 +02:00
Alejandro Alonso
934c6c5aae 🐛 Avoid just white spaces for old password 2023-07-26 15:12:35 +02:00
Alejandro Alonso
7036dddad1 🐛 Fix enable undo just after using pencil 2023-07-26 07:37:23 +02:00
Alejandro Alonso
92ee6320f5 🐛 Fix enable comment mode and insert image keeps on comment mode 2023-07-26 06:18:24 +02:00
Alejandro Alonso
8a3c580d0f 🐛 Fix undo layer mode preview 2023-07-26 06:18:08 +02:00
Aitor Moreno
08a11929ca Merge pull request #3442 from penpot/eva-bugfixing-11
Bugfixing
2023-07-25 17:42:05 +02:00
Alejandro
b460a8f64e Merge pull request #3447 from penpot/superalex-fix-retrieve-unread-comment-threads-extra-calls
🐛 Fix retrieve unread comment threads extra calls
2023-07-25 14:56:21 +02:00
Alejandro Alonso
1aa7960863 🐛 Fix retrieve unread comment threads extra calls 2023-07-25 14:50:42 +02:00
Alejandro
89edcb5651 Merge pull request #3446 from penpot/niwinz-improve-connection-error-handling-on-save
 Improve connection errors handling on workspace save operation
2023-07-25 13:56:37 +02:00
Eva
653bc66b8f 🐛 Fix dropdown width 2023-07-25 13:27:07 +02:00
Andrey Antukh
bec09fb5d1 Improve connection errors handling on workspace save operation 2023-07-25 12:52:47 +02:00
Eva
9048c01308 🐛 Fix copy color information in several formats 2023-07-25 11:57:41 +02:00
Eva
959e069ea9 🐛 Fix unnecessary button 2023-07-25 11:57:39 +02:00
Eva
955bf0ef9e 🐛 Fix empty reply comments 2023-07-25 11:57:20 +02:00
Eva Marco
9a60ac477f Merge pull request #3434 from penpot/superalex-bugfixing-18
🐛 Superalex bugfixing
2023-07-25 10:36:32 +02:00
Alejandro Alonso
ec131382b3 🐛 Fix error when a user different than the thread creator edits a comment 2023-07-25 10:32:11 +02:00
Alejandro Alonso
ea2e25b46d 🐛 Making old-password non required again 2023-07-25 10:32:11 +02:00
Alejandro Alonso
db7c4a9265 🐛 Fix export multiple images when only one of them has export settings 2023-07-25 10:32:11 +02:00
Alejandro Alonso
1b31a02c14 🐛 Fix when user deletes one file during import it is impossible to finish importing of second file 2023-07-25 10:32:09 +02:00
Alejandro
dcbf57d8d2 Merge pull request #3443 from penpot/palba-fix-incorrect-style-layers-tab-titles
Fix incorrect style for layers tab titles
2023-07-25 09:55:18 +02:00
Pablo Alba
6e73e7cc71 Fix incorrect style for layers tab titles 2023-07-25 09:45:52 +02:00
Aitor
44e31f1890 📚 Add missing change in CHANGES.md 2023-07-25 09:05:59 +02:00
Aitor
fb4ee4a355 🐛 Fix text gradient handlers 2023-07-25 06:56:25 +02:00
Yaron Shahrabani
1a92bd0478 🌐 Add translations for: Hebrew.
Currently translated at 99.7% (1206 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2023-07-24 21:05:43 +02:00
Alejandro
d254184057 Merge pull request #3428 from penpot/alotor-bugfixes-6
Bugfixes
2023-07-24 07:42:03 +02:00
AlexTECPlayz
cd55adefb8 🌐 Add translations for: Romanian.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2023-07-18 15:02:57 +02:00
Andrey Antukh
7e73ac307a Merge pull request #3426 from penpot/alotor-undo-transaction-fixes
Create guard for undo transactions
2023-07-14 17:25:17 +02:00
alonso.torres
f611584bb3 🐛 Create guard for undo transactions 2023-07-14 15:37:49 +02:00
alonso.torres
e1faba2ddc 🐛 Fix absolute positioned layouts not showing flex properties 2023-07-14 15:06:50 +02:00
Alejandro Alonso
0f60f115f5 🐛 Fix focus list for texts 2023-07-14 14:59:06 +02:00
Eva Marco
13560bc866 Merge pull request #3422 from penpot/palba-fix-library-title-style
🐛 Fix incorrect style for asset libraries titles
2023-07-14 14:43:43 +02:00
alonso.torres
c670089c03 🐛 Fix problem with skew transformations 2023-07-14 14:30:26 +02:00
alonso.torres
b1f0d09501 🐛 Fix assets right click button for multiple selection 2023-07-14 14:30:26 +02:00
alonso.torres
53b4c6383b 🐛 Fix undo when updating several texts 2023-07-14 14:30:26 +02:00
Eva Marco
e9819ab063 Merge pull request #3423 from penpot/fix-invite-cursor-position
🐛 Fix position of text cursor is a bit too high in Invitations se…
2023-07-14 14:05:05 +02:00
Pablo Alba
9b9f2c39b9 🐛 Fix duplicate a component copy missing shape-ref 2023-07-14 12:36:13 +02:00
Pablo Alba
203b6c63a4 🐛 Fix incorrect style for asset libraries titles 2023-07-14 12:27:42 +02:00
Pablo Alba
217ca66720 🐛 Fix position of text cursor is a bit too high in Invitations section 2023-07-14 12:25:01 +02:00
Stas Haas
3006ed7966 🌐 Add translations for: German.
Currently translated at 99.8% (1207 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-07-14 10:49:25 +02:00
Alejandro
1106ebc377 Merge pull request #3418 from penpot/alotor-fix-safari-thumbs
🐛 Fix problem with safari thumbnails
2023-07-14 07:34:13 +02:00
alonso.torres
9bcb3e9e7f 🐛 Fix problem with Safari thumbnails 2023-07-13 17:05:25 +02:00
Andrey Antukh
6c13925930 🐛 Fix bad interaction of file migrations components-v2 and pointer-map feature 2023-07-13 15:00:28 +02:00
Alejandro
39b46b3bc7 Merge pull request #3417 from penpot/azazeln28-fix-previous-thumbnail-rendered
🐛 Fix previous thumbnail rendered
2023-07-13 13:34:38 +02:00
Alejandro
529ef75058 Merge pull request #3414 from penpot/azazeln28-improve-layers-autoscroll
  Improve layers autoscroll
2023-07-13 13:14:51 +02:00
Aitor
2977709468 🐛 Fix previous thumbnail being rendered when fill is transparent 2023-07-13 13:14:41 +02:00
Alejandro
c4ca40da16 Merge pull request #3410 from penpot/eva-fix
🐛 Some frontend fixes
2023-07-13 13:13:45 +02:00
Alejandro
a6818a8a55 Merge pull request #3407 from penpot/azazeln28-fix-svg-text-thumbnail-rendering
🐛 Fix SVG text rendering on thumbnails
2023-07-13 12:59:20 +02:00
Aitor
a72e50f674 🐛 Fix SVG text rendering on thumbnails 2023-07-13 12:47:15 +02:00
Eva
965c4fe243 🐛 Fix create empty comments 2023-07-13 12:45:01 +02:00
Eva
13b1762873 🐛 Fix exports menu on viewer mode 2023-07-13 12:45:01 +02:00
Eva
ee73384993 🐛 Fix create typography with section closed 2023-07-13 12:45:01 +02:00
Eva
a940c7e912 🐛 Fix onboarding modal height 2023-07-13 12:44:59 +02:00
Pablo Alba
119b3a405c 🐛 Fix duplicate page with comnponents duplicates the components 2023-07-13 11:42:31 +02:00
Alejandro Alonso
fc018b18b3 🐛 Fix rotate several elements in bulk 2023-07-13 11:28:17 +02:00
Aitor
f57ed6a763 Set smooth/instant autoscroll depending on distance 2023-07-13 10:52:49 +02:00
Aitor Moreno
8b7f791509 Merge pull request #3400 from penpot/alotor-bugfixes-4
Bugfixes
2023-07-12 13:11:16 +02:00
alonso.torres
369192a353 🐛 Locks shapes when moved inside a locked parent 2023-07-12 13:06:42 +02:00
alonso.torres
1b0a6b26ce 🐛 Fix problem with bool contents 2023-07-12 13:06:42 +02:00
alonso.torres
fc35b0b853 🐛 Fix retrieve user comments in dashboard 2023-07-12 13:06:42 +02:00
alonso.torres
872648d393 🐛 Fix new-file button on project not redirecting to the new file 2023-07-12 13:06:42 +02:00
alonso.torres
5631204567 🐛 Fix paste elements at bottom of frame 2023-07-12 13:06:42 +02:00
alonso.torres
9f121cb38b 🐛 Fix problem with comments not sticking 2023-07-12 13:06:42 +02:00
alonso.torres
5072c903c5 🐛 Fix bad frame-id for certain componentes 2023-07-12 13:06:42 +02:00
alonso.torres
66559d3ce3 🐛 Fix error screen on image upload failure 2023-07-12 13:06:42 +02:00
alonso.torres
7e0a612818 🐛 Fix problem when sliding color picker in selected-colors 2023-07-12 13:06:40 +02:00
Alejandro
e9ce327eef Merge pull request #3390 from penpot/hiru-fix-overlay
Fix several bugs related to interaction overlays
2023-07-12 10:57:18 +02:00
Andrés Moya
491251f5ce 🐛 Fix overlay position with elements fixed when scrolling 2023-07-12 09:46:46 +02:00
Andrés Moya
65598aa724 🐛 Fix overlay position when it has shadow or blur 2023-07-12 09:46:46 +02:00
Andrés Moya
e563611c05 🐛 Fix overlay close from an artboard 2023-07-12 09:46:46 +02:00
Andrés Moya
a2d1ce8120 🐛 Fix overlay position in open-overlay 2023-07-12 09:46:45 +02:00
Aitor Moreno
91037caa55 Merge pull request #3406 from penpot/eva-bugfixing-10
🐛 Fix several frontend errors
2023-07-11 16:21:12 +02:00
Eva
b94885a764 🐛 Fix shortcut translation 2023-07-11 13:31:59 +02:00
Eva
52545692df 🐛 Fix border radius values with decimals 2023-07-11 13:31:59 +02:00
Eva
3dcd640a99 🐛 Fix search bar width on layer tab 2023-07-11 13:31:59 +02:00
Eva
2e461b3070 🐛 Fix text menu order on design tab 2023-07-11 13:31:59 +02:00
Eva
41924246aa 🐛 Fix text decoration on button 2023-07-11 13:31:58 +02:00
Alejandro
2b37a3c613 Merge pull request #3405 from penpot/niwinz-bugfixes-2023-w26-2
🐛 Bugfixes & Enhancements
2023-07-11 12:55:27 +02:00
Andrey Antukh
f30ba5876e Add performance oriented changes to dashboard teams section 2023-07-11 12:00:16 +02:00
Andrey Antukh
23c8043f34 🐛 Fix incorrect message on sending invitation to a member 2023-07-11 12:00:16 +02:00
Alejandro
a6fc60a88d Merge pull request #3403 from penpot/palba-fix-library-backup-order
🐛 Fix library backup assets order
2023-07-11 11:12:39 +02:00
Alejandro
3c9d3bd5af Merge pull request #3404 from penpot/superalex-fix-select-text-javascript-function
🐛 Fix select text javascript function
2023-07-11 10:42:14 +02:00
Alejandro Alonso
8e1c4238cb 🐛 Fix select text javascript function 2023-07-11 10:17:39 +02:00
Pablo Alba
2d57523e00 Merge pull request #3402 from penpot/superalex-bugfixing-16
🐛 Alex bugfixing
2023-07-11 08:10:56 +02:00
Pablo Alba
8e0c6da1d6 🐛 Fix library backup assets order 2023-07-11 08:05:56 +02:00
Alejandro Alonso
8007794cba 🐛 Fix dissolve interaction 2023-07-11 07:45:29 +02:00
Alejandro Alonso
8b81f700a5 Refactor select all on pending numeric input 2023-07-11 07:45:12 +02:00
Alejandro
ea753da0ae Merge pull request #3401 from penpot/niwinz-bugfixes-2023-w26-2
🐛 Bugfixes
2023-07-10 15:19:49 +02:00
Andrey Antukh
d1a7c58c53 Report error on something goes wrong on image processing 2023-07-10 15:07:17 +02:00
Andrey Antukh
e5a7edeaf6 Always fetch fresh library templates 2023-07-10 15:07:17 +02:00
Andrey Antukh
d0a422e8bd 💄 Add cosmetic improvement to backend main ns 2023-07-10 15:07:17 +02:00
Andrey Antukh
7ea92529f9 Make template thumbnails available offline 2023-07-10 15:07:17 +02:00
Andrey Antukh
494c585e2f Make builtin templates download ondemand if cache is not present 2023-07-10 15:07:17 +02:00
Andrey Antukh
02b41abaf8 Improve builtin template fetching management 2023-07-10 13:58:45 +02:00
Andrey Antukh
a665339c98 ♻️ Move dashboard libraries templates to other namespace
And refactor its internal state management
2023-07-10 13:58:45 +02:00
Alejandro
9c0e594294 Merge pull request #3388 from penpot/niwinz-bugfixes-2023-w26-2
 Add backward compatibility layer for v1.20 and other fixes
2023-07-10 12:48:43 +02:00
Andrey Antukh
ad53d0b55a 🐛 Update project modified-at field after file import 2023-07-10 12:44:24 +02:00
Andrey Antukh
decaeda2fe 🐛 Set bigger maximum token length on backend validation 2023-07-10 12:44:24 +02:00
Andrey Antukh
60130d4db2 🐛 Use correct fullname after OICD registration process 2023-07-10 12:44:24 +02:00
Andrey Antukh
f85a9011ee 🐛 Fix excessive data fetching on workspace comments 2023-07-10 12:44:24 +02:00
Andrey Antukh
9dbf6ffd14 🐛 Fix focus handling on comment edition 2023-07-10 12:44:24 +02:00
Andrey Antukh
992dd04b47 💄 Add cosmetic improvements to comments ns 2023-07-10 12:44:24 +02:00
Andrey Antukh
010a3ef3a7 💄 Add minor cosmetic chanes to workspace comments ns 2023-07-10 12:44:24 +02:00
Andrey Antukh
3da0d85d8f 🐛 Set correct project modified-at on moving files between projects
Happens when you use drag and drop on dashboard for moving files between
projects, but also if you use a context menu actions
2023-07-10 12:44:22 +02:00
Andrey Antukh
7a837110f0 Add proper on-accept callback on features related restriction error
Which redirects user to the dashboard if the team-id and project-id
is available in stante; if not just flushes hard refresh
2023-07-10 12:44:07 +02:00
Andrey Antukh
09d28d8583 Add better file feature handling on file retrieval 2023-07-10 12:44:07 +02:00
Andrey Antukh
90f5b4b631 Qualify json encoding warning log messages as errors 2023-07-10 12:44:07 +02:00
Alejandro
52ad26d4e7 Merge pull request #3391 from penpot/alotor-bugfixes-3
Alotor bugfixes 3
2023-07-10 12:39:48 +02:00
Andrey Antukh
5c92ad727d Merge pull request #3398 from penpot/superalex-fix-nginx-locations-with-regex
🐛 Fix nginx locations with regex
2023-07-10 12:22:22 +02:00
Alejandro Alonso
7823a3270a 🐛 Fix nginx locations with regex 2023-07-10 12:00:29 +02:00
alonso.torres
b565e20f1a 🐛 Fix problem with slashes in layers names for exporter 2023-07-10 09:56:06 +02:00
alonso.torres
735170debf 🐛 Fix problem with HSV color picker 2023-07-10 09:56:06 +02:00
alonso.torres
a2fbf93ec1 🐛 Fix problem with importation process 2023-07-07 14:15:14 +02:00
Andrey Antukh
7b887d3188 Merge pull request #3389 from penpot/superalex-bugfixing-15
🐛 bugfixing
2023-07-07 13:03:15 +02:00
Alejandro Alonso
c1dd4e5e6f 🐛 Fix popup 'Create a group' appears each time after single graphics is moving into already existed group 2023-07-07 13:01:56 +02:00
Alejandro Alonso
7d7b4074b2 🐛 Fix picking a gradient color in recent colors for a new color in the assets tab 2023-07-07 13:01:56 +02:00
Alejandro Alonso
51462ba476 🐛 Fix finalize editor state to consider existing position-data 2023-07-07 12:00:23 +02:00
Alejandro Alonso
99693f0fc2 🐛 Fix cut/delete text layer when while creating text 2023-07-07 12:00:22 +02:00
Andrey Antukh
fdbabe49df Merge pull request #3382 from penpot/alotor-bugfixes-2
Bugfixes
2023-07-07 10:54:48 +02:00
alonso.torres
996a614ed7 🐛 Fix grid not being cutted in frames 2023-07-07 10:18:28 +02:00
alonso.torres
7a499bfc90 🐛 Fix problem with images patterns repeating 2023-07-07 10:18:28 +02:00
alonso.torres
647beec1e8 🐛 Fix problem with comments when user left the team 2023-07-07 10:18:28 +02:00
alonso.torres
dd9f637f02 🐛 Fix problem with comments mode not staying 2023-07-07 10:18:28 +02:00
alonso.torres
00450565c8 🐛 Makes height priority for the rows/columns grids 2023-07-07 10:18:27 +02:00
Alejandro Alonso
cf9fb7face 🐛 Fix 404 errors 2023-07-06 19:00:10 +02:00
Alejandro
44514a0961 Merge pull request #3383 from penpot/niwinz-bugfixes-2023-w26-2
🐛 Bugfixes
2023-07-06 18:27:04 +02:00
Alejandro Alonso
bfc490bd63 🐛 Fix 404 errors 2023-07-06 15:22:55 +02:00
Andrey Antukh
0a9cad76c3 💄 Add minor cosmetic improvements to typography menu components 2023-07-06 12:46:51 +02:00
Andrey Antukh
26ef8df79c ⬆️ Update frontend dependencies (only bugfixes) 2023-07-06 12:46:51 +02:00
Andrey Antukh
cd2f50fdb4 🐛 Fix react warnings on font-selector 2023-07-06 12:46:51 +02:00
Andrey Antukh
59d02314e2 ⬆️ Update google fonts 2023-07-06 12:46:51 +02:00
Andrey Antukh
88ac27788b 🐛 Fix whitespace handling on color assets name 2023-07-06 12:46:51 +02:00
Andrey Antukh
c16de52b49 ♻️ Add minor refactor to shared-link dialog component
Fixes the issue of creating incorrect link when only non-current pages
are selected on the shared link permissions
2023-07-06 12:46:51 +02:00
Andrey Antukh
8d6d589a0c 💄 Add minor cosmetic change to viewer-page component 2023-07-06 12:29:33 +02:00
Andrey Antukh
0817c4e140 Print js trace on exceptional state error is raised 2023-07-06 12:29:33 +02:00
Andrey Antukh
aad70d9df8 💄 Add minor cosmetic improvement to viewer events ns 2023-07-06 12:29:33 +02:00
Andrey Antukh
bbcf9c00a5 🐛 Remove conditional cache handling from get-view-only-bundle rpc method
The cond/etag handling is the cause of incorrect number of shared links
returned by the endpoint. Because of incorrect cache invalidation.
2023-07-06 12:29:33 +02:00
Eva
49df4a9404 🐛 Fix several frontend validations 2023-07-06 12:28:47 +02:00
Eva
acfeae8638 🐛 Fix select all checkbox on shared link config 2023-07-06 12:28:47 +02:00
Eva
7216a514e6 🐛 Fix context menu z-index 2023-07-06 12:28:47 +02:00
Eva
48d9541d46 🐛 Fix scroll of comment list on viewer 2023-07-06 12:28:47 +02:00
Alejandro Alonso
01ec22d662 🐛 Fix finalize text editor state when blur 2023-07-05 13:22:50 +02:00
Alejandro Alonso
b43d09e5ce 🐛 Fix email change validation 2023-07-05 13:22:50 +02:00
Alejandro Alonso
009236bbe3 🐛 Fix export from shared prototype 2023-07-05 13:22:50 +02:00
Alejandro Alonso
0d87dc5680 🐛 Fix drag and drop in the dashboard generates import file error message 2023-07-05 13:22:50 +02:00
Alejandro
8b0339bbab Merge pull request #3379 from penpot/alotor-bugfixes
Alotor bugfixes
2023-07-05 10:58:48 +02:00
alonso.torres
302bfd3007 🐛 Fix problems with locked frames 2023-07-05 08:44:59 +02:00
alonso.torres
302750bd7e 🐛 Fix issue with paths line to curve and concurrent editing 2023-07-05 08:10:54 +02:00
alonso.torres
66e32e9cbd 🐛 Fix problem with selection shortcuts 2023-07-05 08:10:50 +02:00
alonso.torres
e40245e187 🐛 Fixed problem with styles inside def for svg import 2023-07-05 08:09:48 +02:00
Alejandro
16854e7e83 Merge pull request #3376 from penpot/niwinz-bugfixes-2023-w26-2
🐛 Bugfixes
2023-07-05 06:25:37 +02:00
Kristijan Žic
53ed1404e7 🌐 Add translations for: Croatian.
Currently translated at 84.9% (1027 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/hr/
2023-07-05 04:17:05 +02:00
Andrey Antukh
5a8df0dfae Add better validation of profile rpc methods 2023-07-04 19:28:52 +02:00
Andrey Antukh
8f8d90abbc Revert some changes to the audit validation 2023-07-04 19:28:52 +02:00
Alejandro
bf297539ae Merge pull request #3374 from penpot/niwinz-bugfixes-2023-w26-2
🐛 Bugfixes
2023-07-04 16:27:17 +02:00
Andrey Antukh
be652b909e Add stronger validationt to auth/register rpc methods 2023-07-04 14:36:31 +02:00
Andrey Antukh
068d2f13f4 Add min-max validation to word-string schema 2023-07-04 13:55:58 +02:00
Andrey Antukh
1464f5da90 Ensure that all emails are under 250chars 2023-07-04 13:55:58 +02:00
Andrey Antukh
7b0d3bdcab Add stricter validation on events endpoint 2023-07-04 13:55:58 +02:00
Alejandro
5d42631c7a Merge pull request #3370 from penpot/niwinz-improvements
 Add some improvements to the oidc module
2023-07-04 12:36:39 +02:00
Andrey Antukh
e0c0b251a9 💄 Add minor cosmetic change to CHANGES.md file 2023-07-04 11:19:19 +02:00
Andrey Antukh
a868dcf8e6 🐛 Don't allow empty strings and whitespace-only strings on media name 2023-07-04 11:19:19 +02:00
Andrey Antukh
b64a9f0cf4 🐛 Fix graphic item rename on assets pannel 2023-07-04 11:19:19 +02:00
Alejandro
45a909f5ff Merge pull request #3371 from penpot/niwinz-bugfixes-2023-w26
🐛 Don't allow empty or whitespace-only names on components
2023-07-04 06:52:05 +02:00
Andrey Antukh
dcc15e485d 🐛 Don't allow empty or whitespace-only names on components 2023-07-03 17:03:18 +02:00
Alejandro
6849a5b0e0 Merge pull request #3357 from penpot/eva-bugfixin-8
🐛 Fix some bugs
2023-07-03 14:04:42 +02:00
Eva
ef3fedee59 🐛 Fix some warnings and format some files 2023-07-03 13:58:58 +02:00
Eva
8955f87d5a 🐛 Fix z-index nillable input when static position 2023-07-03 13:58:57 +02:00
Eva
94b5c98042 🐛 Fix context menu outside screen 2023-07-03 13:58:40 +02:00
Eva
82183ec71a 🐛 Fix create and account only with spaces 2023-07-03 13:58:22 +02:00
Eva
e75b53ff8d 🐛 Fix search font visualitation 2023-07-03 13:58:01 +02:00
Eva
9a880f007c 🐛 Fix focus title on layers sidebar 2023-07-03 13:57:48 +02:00
Eva
02466d603c 🐛 Fix allow team name to be all blank 2023-07-03 13:57:47 +02:00
Eva
4d4e9703cc 🐛 Fix drag projects on dahsboard 2023-07-03 13:57:30 +02:00
Eva
a737c125d5 🐛 Fix unpublish more than one library at the same time 2023-07-03 13:57:15 +02:00
Alejandro Alonso
e461745479 📎 Update CHANGES.md file and version.txt 2023-07-03 13:32:36 +02:00
Andrey Antukh
8cda8924df Add the ability to select user info source
using the PENPOT_OIDC_USER_INFO_SOURCE environment variable
with two possible values: token and userinfo
2023-07-03 10:46:29 +02:00
Andrey Antukh
dda67af5cc Update oidc impl with latest buddy-sign improvements 2023-07-03 10:46:25 +02:00
Andrey Antukh
cadcc1607d Increase default argon2id iterations 2023-07-03 10:43:26 +02:00
Andrey Antukh
63c8798264 ⬆️ Update backend and common dependencies 2023-07-03 10:43:26 +02:00
Alejandro Alonso
74dd4f1ff8 🐛 Fix text content validation 2023-07-03 09:35:55 +02:00
Alejandro Alonso
53cee87701 🐛 Fix deleted fonts present in recent block 2023-07-03 09:35:55 +02:00
Alejandro Alonso
d939a86e75 🐛 Fix null vlaues for grid columns/rows 2023-07-03 09:28:57 +02:00
Linerly
f691f8d5b5 🌐 Add translations for: Indonesian.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2023-07-02 19:52:28 +02:00
Amine Gdoura
2c68e8309e 🌐 Add translations for: Arabic.
Currently translated at 61.4% (743 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2023-07-02 19:52:27 +02:00
Amerey.eu
dce8b5b37c 🌐 Add translations for: Czech.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/cs/
2023-07-01 14:52:54 +02:00
Mikel Larreategi
6546bfc889 🌐 Add translations for: Basque.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/eu/
2023-07-01 14:52:52 +02:00
Linerly
b915abb2d2 🌐 Add translations for: Indonesian.
Currently translated at 97.0% (1173 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2023-07-01 14:52:51 +02:00
Alejandro
050646506e Merge pull request #3358 from penpot/niwinz-oidc-improvements
 Add the ability to parse OIDC JWT token
2023-06-28 10:17:11 +02:00
Andrey Antukh
6339b07fba Add the ability to parse OIDC JWT token
If jwks-uri is provided or properly discovered, they will be used
for unsign JWT token and get use info data from that token instead
of making an additional call to the userinfo endpoint
2023-06-28 00:25:48 +02:00
Pablo Alba
e61aaaecf3 🐛 Fix libraries are truncated on 'Libraries' page 2023-06-27 14:47:23 +02:00
Alejandro
3ea5b1a8de Merge pull request #3356 from penpot/superalex-fix-file-etag-calculation
🐛 fix file etag calculation
2023-06-27 14:10:50 +02:00
Andrey Antukh
17731db28b 🐛 Fix file etag calculation considering the profile id too 2023-06-27 13:55:55 +02:00
Aitor
5b40fdf3f0 🔧 Add VSCode settings 2023-06-27 13:54:07 +02:00
Alejandro Alonso
9ab067b6d8 🐛 Fix add group to graphics and components 2023-06-27 13:53:17 +02:00
Pablo Alba
2648dc3d27 🐛 Fix menu for create annotation appears on components that already have annotation 2023-06-27 13:31:12 +02:00
Pablo Alba
9d06a34df4 🐛 Fix Annotation is not shown on View mode 2023-06-27 13:17:40 +02:00
Pablo Alba
1770bb995b 🐛 Fix annotations size: adjust textarea height according to annotation content 2023-06-27 13:08:39 +02:00
Pablo Alba
85e1899f6b 🐛 Fix '(...)' is truncated for 'Typographies' section in Library view 2023-06-27 12:47:22 +02:00
Pablo Alba
0716aaeff6 🐛 Fix missing view for empty library on Libraries page 2023-06-27 12:47:22 +02:00
Alejandro Alonso
af114ee9d0 Merge branch 'astudentinearth-astudentinearth-change-radius-tooltips' into staging 2023-06-27 10:53:09 +02:00
Alejandro Alonso
2249bf9745 📎 Update CHANGES.md file 2023-06-27 10:52:56 +02:00
astudentinearth
c3c6112ade 🐛 Change independent corner radius input tooltips
Make the inputs show a tooltip for the relevant corner(e.g. "Top left") instead of "Radius"

Signed-off-by: Burak Yeniçeri <burak.yn.dev@gmail.com>
2023-06-27 10:52:56 +02:00
Alejandro
5ea80c018f Merge pull request #3352 from penpot/niwinz-bugfixes
 Improvements & bugfixes
2023-06-27 10:40:30 +02:00
Alejandro Alonso
287213cfaf Refactor select all on input text click 2023-06-27 10:32:50 +02:00
Andrey Antukh
51d829a4b3 🐛 Fix incorrect handling of SSL param on email sending subsystem
Fixes #3213
2023-06-27 09:50:05 +02:00
Andrey Antukh
f166fe1926 🐛 Add proper validation of registration domain whitelist on oidc
Fixes #3348
2023-06-26 18:14:56 +02:00
Andrey Antukh
f60d09eb8f 🎉 Add uuid->short-id helper
Mainly helps encode a safer subset of bits (96) of an uuid using
a more compact encoding (base62) which is compatible with CSS and
URL's
2023-06-26 18:03:16 +02:00
Andrey Antukh
339903f567 🐛 Fix incorrect handling of error on thumbnail renderer 2023-06-26 14:51:49 +02:00
Andrey Antukh
7f16a79af5 🐛 Fix email printing to the logging subsystem
Fixes #3239
2023-06-26 11:16:37 +02:00
Andrey Antukh
97af5f71eb Merge branch 'staging' into develop 2023-06-26 10:21:34 +02:00
Andrey Antukh
ba4ef66cdc Merge branch 'main' into staging 2023-06-26 10:19:58 +02:00
Alejandro Alonso
7191fe847c Merge remote-tracking branch 'origin/staging' into develop 2023-06-26 09:49:54 +02:00
Alejandro
dad13ed826 Merge pull request #3350 from penpot/superalex-fix-internal-error-on-team-settings
🐛 Fix internal server error occurred when user wants to open team…
2023-06-26 09:49:34 +02:00
Alejandro Alonso
6cab413a8f 🐛 Fix internal server error occurred when user wants to open team settings 2023-06-26 09:41:08 +02:00
Alejandro
a895eaf61c Merge pull request #3347 from penpot/niwinz-fonts-local-caching
🐛 Fix several bugs related to fonts and components migration
2023-06-23 16:36:39 +02:00
Andrey Antukh
7977d75e3d Reduce the dashboard thumbnail size 2023-06-23 16:28:52 +02:00
Andrey Antukh
7746649eb8 🐛 Fix minor issues with fonts caching 2023-06-23 16:28:52 +02:00
Andrey Antukh
840801ea15 🐛 Don't update modified_at field on applying components migration 2023-06-23 16:28:52 +02:00
Andrey Antukh
cacaf2bf95 ⬆️ Update devenv dockerfile 2023-06-23 16:28:52 +02:00
Alejandro
4607d9f210 Merge pull request #3342 from penpot/niwinz-fonts-local-caching
 Add several improvements to fonts loading
2023-06-23 14:07:25 +02:00
Andrey Antukh
8f0a4e8333 🎉 Add local caching of gfonts styles 2023-06-23 13:32:38 +02:00
Andrey Antukh
ef5c9babe1 Merge remote-tracking branch 'origin/staging' into develop 2023-06-23 13:22:33 +02:00
Alejandro Alonso
f75b111564 🐛 Fix impossible to add group to typographies 2023-06-23 13:21:36 +02:00
Alejandro Alonso
a8e058ada6 🐛 Fix add asset color, invalid color appears 2023-06-23 13:21:36 +02:00
Alejandro Alonso
c988d54925 🐛 Fix hide rulers option not working 2023-06-23 13:21:36 +02:00
Alejandro
921ea61e6c Merge pull request #3344 from penpot/alotor-fix-viewer-scroll
🐛 Fix problem with scroll in viewer mode
2023-06-23 13:12:23 +02:00
Alejandro
71a6ee51fa Merge pull request #3343 from penpot/niwinz-onmpremise-improvements
 Add minor improvements for onpremise users
2023-06-23 13:10:14 +02:00
Andrey Antukh
b138550c0d 🐛 Fix issue on awsns http handler 2023-06-23 13:05:48 +02:00
Andrey Antukh
81658c90d1 Add the ability to disable dashboard templates section 2023-06-23 13:05:48 +02:00
alonso.torres
ca1e6c342f 🐛 Fix problem with scroll in viewer mode 2023-06-23 12:55:49 +02:00
Andrey Antukh
7feda98eb3 Add the ability to disable the google fonts provider 2023-06-23 12:55:22 +02:00
Alejandro
33e0e6293b Merge pull request #3341 from penpot/niwinz-bugfix-thumbnails
🐛 Fix thumbnails handling on dashboard libraries
2023-06-23 12:53:18 +02:00
Andrey Antukh
2a81d8563a 🐛 Fix thumbnails handling on dashboard libraries 2023-06-23 12:24:49 +02:00
Alejandro Alonso
ae9d6b627d Merge remote-tracking branch 'origin/staging' into develop 2023-06-22 14:38:12 +02:00
Alejandro
2db5925e60 Merge pull request #3337 from penpot/superalex-fix-text-fills-with-gradient
🐛 Fix text fills with gradient
2023-06-22 14:37:19 +02:00
Alejandro Alonso
d02f3ba011 🐛 Fix text fills with gradient 2023-06-22 14:08:21 +02:00
Alejandro
74e8081574 Merge pull request #3272 from penpot/azazeln28-thumbnail-renderer
🎉 Add thumbnail renderer service
2023-06-22 13:45:07 +02:00
Pablo Alba
1817d4ce38 🐛 It is possible to create empty component annotation (2) 2023-06-22 13:34:27 +02:00
Andrey Antukh
433b1b68c3 🐛 Improve fonts loading related to thumbnals rendering 2023-06-22 13:19:48 +02:00
Pablo Alba
776159c1e8 🐛 It is possible to create empty component annotation 2023-06-22 12:44:44 +02:00
Pablo Alba
45e76bc38b 🐛 Fix delete component annotation 2023-06-22 12:44:44 +02:00
Pablo Alba
54cee6ea72 🐛 Fix annotation is not duplicated together with main component 2023-06-22 12:44:44 +02:00
Pablo Alba
0ae4988908 🐛 Fix Internal server error occurred after clicking on '3 dots' menu of copy component on Design tab 2023-06-22 10:08:26 +02:00
Andrey Antukh
a97929992e Convert to schema some specs on file-thumbnails rpc methods 2023-06-22 09:34:13 +02:00
Alejandro Alonso
a53176489a 🐛 Fix extra line framing dashboard cards 2023-06-22 09:27:46 +02:00
Andrés Moya
d8121364ad 🐛 Fix touched on adding shapes to a component copy and undo 2023-06-22 09:27:27 +02:00
Alejandro Alonso
a66a952573 Merge remote-tracking branch 'origin/staging' into develop 2023-06-22 09:08:56 +02:00
Alejandro Alonso
d4fe810813 🐛 Fix shared link broken 2023-06-22 08:01:15 +02:00
Andrey Antukh
10205e51cc 🔥 Remove atom wrapping on several config props 2023-06-21 20:10:49 +02:00
Andrey Antukh
0aefd044dc Remove atom wrapping on public-uri 2023-06-21 20:10:49 +02:00
Andrey Antukh
d11b007795 Add thumbnail renderer
And integrate the dashboard thumbnails to use that service
2023-06-21 20:10:49 +02:00
Alejandro Alonso
5af2489315 Merge remote-tracking branch 'origin/staging' into develop 2023-06-21 17:06:47 +02:00
Alejandro Alonso
64ddfa0c31 📎 Update CHANGES.md file 2023-06-21 17:06:29 +02:00
Alejandro Alonso
6242c62bcb 📎 Update CHANGES.md file 2023-06-21 17:05:09 +02:00
Andrés Moya
e8dde477a5 🐛 Fix restore remote component 2023-06-21 17:04:46 +02:00
Alejandro Alonso
69969d9815 Merge remote-tracking branch 'origin/staging' into develop 2023-06-21 17:03:54 +02:00
Alejandro Alonso
1b0848389c 📎 Update CHANGES.md file 2023-06-21 17:03:42 +02:00
Pablo Alba
4f02cc3e86 Merge pull request #3331 from penpot/hiru-restore-comp-missing-lib
🐛 Disallow restore component when the library has been detached
2023-06-21 16:46:16 +02:00
Andrés Moya
749d60be48 🐛 Disallow restore component when the library has been detached 2023-06-21 16:39:17 +02:00
Alejandro Alonso
a0535de30c 📎 Update CHANGES.md file 2023-06-21 12:53:47 +02:00
Alejandro Alonso
bb8a523208 📎 Update CHANGES.md file 2023-06-21 12:52:13 +02:00
Alejandro Alonso
4d3e7f9a75 Merge remote-tracking branch 'origin/staging' into develop 2023-06-21 12:50:49 +02:00
Alejandro Alonso
9bd658661d Merge remote-tracking branch 'origin/staging' 2023-06-21 12:50:11 +02:00
Alejandro Alonso
2edbc10851 📎 Update CHANGES.md file 2023-06-21 12:50:04 +02:00
Alejandro Alonso
5fc303a05d Merge remote-tracking branch 'origin/staging' into develop 2023-06-21 12:45:54 +02:00
Alejandro Alonso
50bdad3450 Merge remote-tracking branch 'origin/staging' 2023-06-21 12:44:56 +02:00
Alejandro Alonso
9a45ce80a6 🐛 Fix comments navigation 2023-06-21 12:41:49 +02:00
Pablo Alba
3645d1af20 Merge pull request #3327 from penpot/superalex-fix-right-click-options-over-layer-or-shape
🐛 Fix right click options over layer or shape
2023-06-21 12:22:24 +02:00
Alejandro Alonso
d2bfd98a05 🐛 Fix right click options over layer or shape 2023-06-20 13:29:07 +02:00
Andrey Antukh
ecedf46c2a 📎 Add missing changelog entries for the 1.18.5 2023-06-20 11:21:09 +02:00
Andrey Antukh
73d42c03d5 Allow override the default nginx resolver
using the PENPOT_INTERNAL_RESOLVER environment variable
2023-06-20 11:21:09 +02:00
Pablo Alba
e96bedc1c8 🎉 Create multiple componentes 2023-06-20 11:07:33 +02:00
Aitor Moreno
c5f37fadba Merge pull request #3323 from penpot/alotor-fix-reload
 Not hotreload cursors
2023-06-19 16:15:59 +02:00
Aitor
8052c5f973 📎 Add [data-test] to page-items 2023-06-19 16:13:48 +02:00
Andrés Moya
c499c8a323 🐛 Small fix 2023-06-19 16:09:16 +02:00
alonso.torres
6b9962b2b3 Not hotreload cursors 2023-06-19 14:57:51 +02:00
Eva Marco
0a81ae1ea0 Merge pull request #3313 from penpot/azazeln28-fix-cursors
🐛 Fix creation cursors not being displayed
2023-06-19 13:55:19 +02:00
Stas Haas
5cb5df63d9 🌐 Add translations for: German.
Currently translated at 99.8% (1207 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-06-19 13:49:09 +02:00
Stas Haas
74552a4989 🌐 Add translations for: Russian.
Currently translated at 63.1% (763 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2023-06-19 13:49:08 +02:00
Alejandro
c6d71ea902 Merge pull request #3321 from penpot/niwinz-bugfixes-export
Niwinz bugfixes export
2023-06-19 13:16:44 +02:00
Andrey Antukh
4d850ebe6e 🐛 Add proper features initialization on render entrypoint 2023-06-19 13:08:11 +02:00
Andrey Antukh
dac18e876f 🐛 Fix validation error on password recovery submit operation 2023-06-19 13:07:46 +02:00
Andrey Antukh
d016876710 🐛 Add missing file-id validation on get-page rpc method 2023-06-19 13:07:26 +02:00
Andrey Antukh
ddeb540df6 🐛 Fix pointer map related issues on get-page rpc method
mainly used on render.html endpoint which is used by exporter
2023-06-19 13:06:44 +02:00
Pablo Alba
7733bc4419 🐛 Fix ungroup component 2023-06-19 12:29:54 +02:00
Alejandro Alonso
128fe29619 Show interactions on click as default setting at the view mode 2023-06-19 12:00:08 +02:00
Alejandro Alonso
23e200dece 🐛 Fix user select layer mode 2023-06-19 11:05:51 +02:00
Pablo Alba
d9375c1dd1 Fix duplicate shape in a component copy maintains its ref 2023-06-19 10:33:17 +02:00
K.B.Dharun Krishna
b72b8a6d53 🌐 Add translations for: Tamil.
Currently translated at 4.2% (51 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ta/
2023-06-17 11:51:35 +02:00
Mikel Larreategi
0a74696874 🌐 Add translations for: Basque.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/eu/
2023-06-17 11:51:35 +02:00
Stas Haas
6548fe069e 🌐 Add translations for: German.
Currently translated at 99.4% (1202 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-06-17 11:51:33 +02:00
Alejandro Alonso
aeebed6ef7 Merge remote-tracking branch 'origin/staging' into develop 2023-06-16 14:13:51 +02:00
Pablo Alba
498ba257b6 Merge pull request #3290 from penpot/hiru-fix-update-notifications
🐛 Solve error in notification of library changes
2023-06-16 14:07:35 +02:00
Andrés Moya
6edba71c12 🐛 Fix calculation of component modified and remove unneeded check 2023-06-16 13:24:41 +02:00
Andrés Moya
a559e7310a 🐛 Solve error in notification of library changes
(See main.data.workspace.notifications/schema:handle-file-change)
2023-06-16 12:23:11 +02:00
Andrés Moya
ebd172ab05 🐛 Fix detection of libraries needing to update 2023-06-16 12:22:14 +02:00
Pablo Alba
cdc3367d1b Merge pull request #3286 from penpot/superalex-fix-add-flow-option-for-frames
🐛 Fix add flow option in contextual menu for frames
2023-06-16 12:17:48 +02:00
Pablo Alba
8d37d63a27 Merge pull request #3292 from penpot/hiru-fix-export-components
🐛 Fix export components for v2
2023-06-16 12:12:01 +02:00
Aitor
95f0f63276 🐛 Fix creation cursors not being displayed 2023-06-16 12:04:16 +02:00
Pablo Alba
5cab599a06 Merge pull request #3285 from penpot/hiru-fill-problems
🐛 Revert #9de962bb and solve the fill issues in a different way
2023-06-16 11:56:39 +02:00
Alejandro Alonso
24715a85e5 Deleted fonts auto match 2023-06-16 11:07:16 +02:00
Alejandro
559c03550d Merge pull request #3298 from penpot/superalex-improve-invitations-validation
 Improve invitations validation
2023-06-16 10:51:57 +02:00
Alejandro
b8137d80cc Merge pull request #3314 from penpot/superalex-fix-survey-issues-2
🐛 Fix survey select 'other' options
2023-06-16 10:49:58 +02:00
Alejandro Alonso
0d7cac28c4 🐛 Fix survey select 'other' options 2023-06-16 10:35:37 +02:00
Alejandro Alonso
ae4fe73ac9 🐛 Fix survey select default options 2023-06-16 08:40:29 +02:00
Alejandro
1c1397a5d8 Merge pull request #3307 from penpot/eva-fix-color-context
🐛 Fix number of color bullets shown on context menu
2023-06-15 12:17:30 +02:00
Eva
cbebf9a94c 🐛 Fix number of color bullets shown on context menu 2023-06-15 11:51:25 +02:00
Alejandro
119b3e7884 Merge pull request #3306 from penpot/eva-fix-shortcuts
🐛 Fix shortcuts translation error
2023-06-15 11:03:27 +02:00
Eva
13607adf86 🐛 Fix shortcuts translation error 2023-06-15 10:59:40 +02:00
Eva Marco
247c950cce Merge pull request #3304 from penpot/alotor-fix-shape-to-path
🐛 Fix problem when transforming shape to path
2023-06-15 10:36:41 +02:00
Eva Marco
1555d4abaf Merge pull request #3303 from penpot/azazeln28-cursors
 Add CSS cursor classes
2023-06-15 08:10:44 +02:00
Alejandro
77a16a6074 Merge pull request #3301 from penpot/juan-shorcuts-ui-redesign
Shorcuts UI redesign
2023-06-15 08:03:12 +02:00
Alejandro
28b1c9c6d6 Merge pull request #3302 from penpot/superalex-fix-survey-issues
🐛 Fix some onboarding survey issues
2023-06-15 07:38:47 +02:00
Alejandro Alonso
1bb1734448 🐛 Fix some onboarding survey issues 2023-06-15 07:33:11 +02:00
alonso.torres
dd472bee64 🐛 Fix problem when transforming shape to path 2023-06-14 18:07:33 +02:00
Aitor
216454f66f Add CSS cursor classes 2023-06-14 16:27:14 +02:00
elhombretecla
ca85854baf 🎉 Adds basic shortcuts structure 2023-06-14 13:12:50 +02:00
Eva Marco
0682ed101d Merge pull request #3297 from penpot/alotor-global-styles
 Fix new styles leaking for scroll
2023-06-13 11:54:58 +02:00
Alejandro Alonso
8a9a3cbf37 Improve invitations validation 2023-06-13 11:51:03 +02:00
alonso.torres
c74ccfaa8d Fix new styles leaking for scroll 2023-06-13 11:50:21 +02:00
Andrés Moya
f2fcd0f82f 🐛 Fix export components for v2 2023-06-12 17:13:10 +02:00
Andrés Moya
a43d439b31 🐛 Revert #9de962bb and solve the fill issues in a different way 2023-06-09 21:13:43 +02:00
Alejandro
b73ab97556 Merge pull request #3284 from penpot/hiru-fix-blend-mode-validation
🐛 Flix blend mode validation when importing svg
2023-06-09 11:26:02 +02:00
Alejandro Alonso
baca9a8ce5 🐛 Fix survey spanish typo 2023-06-09 10:49:03 +02:00
Alejandro Alonso
bc64fdb1bc 🐛 Fix add flow option in contextual menu for frames 2023-06-09 09:28:27 +02:00
Stas Haas
22d852fca8 🌐 Add translations for: German.
Currently translated at 98.6% (1193 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-06-09 03:52:52 +02:00
王世阳
17c2f44780 🌐 Add translations for: Chinese (Simplified).
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2023-06-09 03:52:51 +02:00
Andrés Moya
1d5d5e2499 🐛 Flix blend mode validation when importing svg 2023-06-08 09:52:34 +02:00
Pablo Alba
8b29a50577 Fix paste shapes from another components should detach them 2023-06-07 16:46:52 +02:00
Pablo Alba
55a821f193 🐛 Fix copy paste can produce nested components in copies 2023-06-07 13:08:17 +02:00
Pablo Alba
291180816a 🐛 Fix go to main component on another page 2023-06-07 11:53:56 +02:00
Pablo Alba
27695f5ae1 Merge pull request #3270 from penpot/hiru-bugtixes-3
Hiru bugfixes 3
2023-06-06 16:18:51 +02:00
Pablo Alba
69d3bda01f 🐛 Remove graphics from assets filter for components v2 2023-06-06 16:11:09 +02:00
Alejandro
1632530b21 Merge pull request #3280 from penpot/superalex-fix-develop-2
🐛 Fix align.cljc lint
2023-06-06 14:11:16 +02:00
Alejandro Alonso
c89f2fc627 🐛 Fix align.cljc lint 2023-06-06 14:03:08 +02:00
Alejandro Alonso
d0c68dbc23 🎉 Updage CHANGES.md 2023-06-06 13:23:34 +02:00
Alejandro
e41c36f534 Merge pull request #3267 from dfelinto/fix-distribute
🐛 Distribute vertical spacing failing for overlapped text
2023-06-06 13:21:51 +02:00
Andrés Moya
9de962bbc9 🐛 Do not render fills block when there is no fill. 2023-06-06 13:16:28 +02:00
Sebastiaan Pasma
40286c81d4 🌐 Add translations for: Dutch.
Currently translated at 11.6% (141 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/nl/
2023-06-06 10:49:44 +02:00
Aitor Moreno
4947169a7c Merge pull request #3268 from penpot/superalex-file-libraries-colors-order
 Improve file libraries colors order
2023-06-06 10:43:52 +02:00
Andrés Moya
f425a5866b 🐛 Allow empty fills in text content 2023-06-05 17:37:41 +02:00
Andrés Moya
3e30d4776a 🐛 Avoid unneeded component update, that was generating loops 2023-06-05 15:43:57 +02:00
Andrés Moya
bca90c54e9 🐛 Preserve root shape position on parent when create component 2023-06-05 15:43:57 +02:00
Andrés Moya
8c3f90fe36 🐛 Fix erroneous touched state when delete a copy and then undo 2023-06-05 15:43:57 +02:00
Andrés Moya
0b316d6828 🐛 Fix touched erroneously set after a text component sync 2023-06-05 15:43:57 +02:00
alonso.torres
8772e51bd2 🐛 Fix problem with padding input 2023-06-05 11:23:08 +02:00
Alejandro Alonso
7e8afb4228 Merge remote-tracking branch 'origin/staging' into develop 2023-06-05 10:19:43 +02:00
Alejandro
6659ab110c Merge pull request #3273 from penpot/alotor-fix-gap
🐛 Fix problem with undefined gaps
2023-06-05 10:04:26 +02:00
alonso.torres
3b8c3647fa 🐛 Fix problem with undefined gaps 2023-06-05 09:56:03 +02:00
Alejandro Alonso
4fc8ac61f1 ❤️ Add thanks for Dalai Felinto 2023-06-05 06:41:07 +02:00
Alejandro Alonso
5b475f9206 ❤️ Add thanks for Dalai Felinto 2023-06-05 06:40:30 +02:00
Alejandro
c228f2fd68 Merge pull request #3266 from dfelinto/fix-distribute-enable
🐛 Distribute fix enabled when two elements were selected
2023-06-05 06:38:33 +02:00
Stas Haas
3b262f2ae5 🌐 Add translations for: German.
Currently translated at 97.5% (1179 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-06-04 14:49:45 +02:00
Ņikita K
80dd910d58 🌐 Add translations for: Latvian.
Currently translated at 98.8% (1195 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2023-06-03 02:50:25 +02:00
王世阳
21a066ec64 🌐 Add translations for: Chinese (Simplified).
Currently translated at 99.8% (1207 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2023-06-03 02:50:24 +02:00
Dalai Felinto
395fbef19e 🐛 Distribute vertical spacing failing for overlapped text
The code was doing what it was designed to, however there is no
reason to prevent elements with a bit of overlap to also be
equally distributed.

closes #3141

Signed-off-by: Dalai Felinto <dalai@blender.org>
2023-06-02 18:45:35 +02:00
Dalai Felinto
a6155f9f83 🐛 Distribute fix enabled when two elements were selected
The distribute operations only make sense when there are at least 3
selected elements.

-----------------

Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

(a) The contribution was created in whole or in part by me and I
    have the right to submit it under the open source license
    indicated in the file; or

(b) The contribution is based upon previous work that, to the best
    of my knowledge, is covered under an appropriate open source
    license and I have the right under that license to submit that
    work with modifications, whether created in whole or in part
    by me, under the same open source license (unless I am
    permitted to submit under a different license), as indicated
    in the file; or

(c) The contribution was provided directly to me by some other
    person who certified (a), (b) or (c) and I have not modified
    it.

(d) I understand and agree that this project and the contribution
    are public and that a record of the contribution (including all
    personal information I submit with it, including my sign-off) is
    maintained indefinitely and may be redistributed consistent with
    this project or the open source license(s) involved.

Signed-off-by: Dalai Felinto <dalai@blender.org>
2023-06-02 18:43:37 +02:00
Pablo Alba
a89d47b5c5 🐛 Fix 'upate main component' and 'reset overrides' shows in context menu of untouched copies 2023-06-02 17:56:33 +02:00
andy
29c091a26b 🌐 Added translation for: Dutch. 2023-06-02 17:17:44 +02:00
Alejandro
531d640d38 Merge pull request #3274 from penpot/azazeln28-fix-thankyou
📚 Fix broken THANKYOU.md links
2023-06-02 15:46:56 +02:00
Aitor Moreno
3505834014 Merge pull request #3258 from penpot/superalex-add-color-asset-from-selected-layer
🐛 Fix create color asset from selected layer
2023-06-02 15:26:23 +02:00
Aitor
cc0b981938 📚 Fix broken THANKYOU.md links 2023-06-02 15:15:34 +02:00
Pablo Alba
380b632dd0 🐛 Fix can't add fill color to a component without fill 2023-06-01 15:00:01 +02:00
Pablo Alba
fc038998d5 🐛 Fix copy paste can produce nested components 2023-06-01 13:45:37 +02:00
Alejandro Alonso
b8ef6dffb9 Improve file libraries colors order 2023-06-01 13:28:59 +02:00
Eva
33fb979b2c 🐛 Fix broken file 2023-06-01 12:51:51 +02:00
Ņikita K
b249cd1b72 🌐 Add translations for: Latvian.
Currently translated at 96.5% (1167 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2023-06-01 08:51:33 +02:00
Andrey Antukh
b87f0bd5e8 🐛 Fix issue on features handling function 2023-06-01 06:28:00 +02:00
Pablo Alba
69069afb0a Merge pull request #3260 from penpot/hiru-component-outline-color
🐛 Detect correctly color of outlines and controls of components
2023-05-31 17:02:08 +02:00
Andrés Moya
9c79c80fd7 🐛 Detect correctly color of outlines and controls of components 2023-05-31 11:36:29 +02:00
Pablo Alba
dcb5194252 🐛 After restore a component, make the action 'go to main component' 2023-05-31 11:27:28 +02:00
Pablo Alba
4582ffb440 🐛 Fix show main component 2023-05-31 11:27:28 +02:00
Alejandro Alonso
3ca7cae6e0 Merge remote-tracking branch 'origin/staging' into develop 2023-05-31 11:15:28 +02:00
Alejandro
2a1619d71e Merge pull request #3263 from penpot/alotor-fix-modifiers-error
🐛 Fix problem with nil child
2023-05-31 11:14:45 +02:00
Alejandro Alonso
893c7a7d2e ⬆️ Update deps 2023-05-31 11:05:21 +02:00
Alejandro Alonso
274a201dba ❤️ Add thanks for Vaibhav Shukla 2023-05-31 10:43:59 +02:00
Alejandro Alonso
917f0d2b20 🐛 Fix create color assets opacity specs 2023-05-31 10:19:38 +02:00
Alejandro Alonso
5a733c84be Merge remote-tracking branch 'origin/staging' into develop 2023-05-31 10:14:45 +02:00
alonso.torres
ffdd4d1ee9 🐛 Fix problem with nil child 2023-05-31 10:04:42 +02:00
Alejandro
2b60c71a4c Merge pull request #3262 from penpot/superalex-fix-color-assets-opacity-specs
🐛 Fix create color assets opacity specs
2023-05-31 09:59:57 +02:00
Alejandro Alonso
6f59c80d86 🐛 Fix create color assets opacity specs 2023-05-31 09:48:35 +02:00
Andrés Moya
d8861bbf48 🐛 Refix commit f3754d0c55, lost in merge conflict 2023-05-30 14:41:54 +02:00
Andrés Moya
63e920828b 🐛 Fix frame components lost fill when migrated to v2 2023-05-30 10:55:12 +02:00
Andrés Moya
eeaee5fd13 🐛 Fix error first time doing a component change operation 2023-05-30 10:55:12 +02:00
Andrés Moya
fd6001090e 🐛 Detach shapes when dragged out of their component 2023-05-30 10:55:12 +02:00
Andrés Moya
968dcefc28 🐛 Maintain ids of main shapes to keep existing copies in sync 2023-05-30 10:55:12 +02:00
Pablo Alba
61cad18bcc 🐛 Use update position for align 2023-05-29 15:40:25 +02:00
Alejandro Alonso
78551cea61 🐛 Fix create color asset from selected layer 2023-05-29 15:27:21 +02:00
Alejandro Alonso
c189b5e638 🐛 Disable old urls when moving files between projects 2023-05-29 11:56:42 +02:00
Pablo Alba
2c007e7303 🐛 Remove duplicate component context menu item 2023-05-29 08:48:23 +02:00
Pablo Alba
610e34e05b Merge pull request #3245 from penpot/hiru-fix-nesting-loop
🐛 Avoid infinite loop nesting copies inside components
2023-05-26 19:00:27 +02:00
Alejandro
bd83292a85 Merge pull request #3252 from penpot/niwinz-bugfix-1
🐛 Fix incorrect impl of go-to-main-component
2023-05-26 15:55:51 +02:00
Andrey Antukh
1a420476c5 🐛 Fix incorrect impl of go-to-main-component 2023-05-26 15:51:29 +02:00
Alejandro Alonso
038d327b50 🐛 Fix project navigation from workspace 2023-05-26 15:11:35 +02:00
Alejandro Alonso
cb5ae99e1d 🐛 Fix svg import making it more resilient 2023-05-26 14:14:04 +02:00
Alejandro Alonso
00d625ee33 🐛 Avoid nil values for position-data 2023-05-26 14:14:04 +02:00
Alejandro Alonso
f3f708ee9d 🐛 Fix svg import with null fill-opacity 2023-05-26 14:14:04 +02:00
diacritica
4d094961b7 💄 Fixed link for penpotfest landing page
A simple github's friendly markdown fix to get link right
2023-05-26 12:31:37 +02:00
diacritica
97b5abb47b 📚 Added Penpot Fest link to README
This is a temporary change to let people know about Penpot Fest's open
registration
2023-05-26 12:24:56 +02:00
Alejandro
3106058637 Merge pull request #3248 from penpot/azazeln28-refactor-unnecessary-encode-decode
♻️ Refactor svg to data-uri code
2023-05-26 11:10:45 +02:00
Aitor
4068413f9f ♻️ Refactor svg to data-uri code 2023-05-26 10:43:12 +02:00
Andrey Antukh
ccafbec485 🔥 Remove testing keys from backend repl script 2023-05-26 10:19:15 +02:00
Alejandro
6000dc251d Merge pull request #3206 from penpot/niwinz-workspace-assets-component-performance
 Improve performance of workspace assets sidebar
2023-05-26 08:10:53 +02:00
Andrey Antukh
b85b479396 Add more improvements to workspace initialization 2023-05-26 08:04:01 +02:00
Andrey Antukh
5d892d14d5 Move sidebar ns to correct location 2023-05-26 08:04:01 +02:00
Andrey Antukh
da5209001b Hide all messages on enter workspace
move the logic from component to event
2023-05-26 08:04:01 +02:00
Andrey Antukh
a6659601f4 Make workspace readiness state more robust 2023-05-26 08:04:01 +02:00
Andrey Antukh
bd834ba840 Improve component renaming process on workspace 2023-05-26 08:04:01 +02:00
Andrey Antukh
0ea07fbe01 ♻️ Refactor selection management on workspace assets component 2023-05-26 08:04:01 +02:00
Andrey Antukh
8f72faf27d 🐛 Fix issues on penpot file import and components-v2 2023-05-26 08:04:01 +02:00
Andrey Antukh
68c0b0e8a7 Add minor perf improvement on components-v2 migration 2023-05-26 08:04:01 +02:00
Andrey Antukh
0078c0e601 🐛 Fix missing pointer persistence on file gc task 2023-05-26 08:04:01 +02:00
Andrey Antukh
1d4bd34dfc Move fressian to common module 2023-05-26 08:04:01 +02:00
Andrey Antukh
ff00043811 Improve workspace initialization flow 2023-05-26 08:04:01 +02:00
Andrey Antukh
8ca6055935 🐛 Fix backend shape validation after changes apply 2023-05-26 08:04:01 +02:00
Andrey Antukh
390f2b35fc 🐛 Ensure verify! works as expected on production builds 2023-05-26 08:04:01 +02:00
Andrey Antukh
02fbce13f0 Add minor performance improvements to workspace left toolbar 2023-05-26 08:04:01 +02:00
Andrey Antukh
5d8562e072 Fix react warnings on workspace shortcuts panel 2023-05-26 08:04:01 +02:00
Andrey Antukh
ca439cf604 Add minor performance improvements to workspace main components 2023-05-26 08:04:01 +02:00
Andrey Antukh
bdb0e24c40 Refactor state management of workspace header 2023-05-26 08:03:59 +02:00
Andrey Antukh
fcc4f4eed8 Refactor state management of workspace assets sidebar 2023-05-26 07:57:28 +02:00
Andrey Antukh
ef27301238 Add arity-1 to d/nilv that returns a transducer 2023-05-26 07:57:28 +02:00
Andrey Antukh
d1e74b0da9 Increase default stacktrace size on cljs 2023-05-26 07:57:28 +02:00
Andrey Antukh
a1819e78e4 ⬆️ Update rumext dependency 2023-05-26 07:57:28 +02:00
Andrey Antukh
a455fc015b 🐛 Fix several issues related to pointer-map and components-v2 2023-05-26 07:57:28 +02:00
Eva Marco
af2c10f2ab Merge pull request #3235 from penpot/akshay-gupta7-akshayg7-preview-blend-modes
🎉 Implement functionality to preview layer blend modes
2023-05-25 14:26:35 +02:00
Andrés Moya
82ba39f99c 🐛 Avoid infinite loops nesting a copy inside its own component 2023-05-25 10:53:01 +02:00
alonso.torres
471c9d5526 🐛 Fix problem with select method 2023-05-25 10:04:56 +02:00
Alejandro Alonso
9df6de2673 Merge branch 'akshay-gupta7-akshayg7-navigate-to-project-new-window' into develop 2023-05-25 09:58:47 +02:00
Alejandro Alonso
1c10bde4b1 🎉 Updage CHANGES.md 2023-05-25 09:58:33 +02:00
Akshay Gupta
64eba585d9 🎉 Add feature to open project name in new tab from workspace
Signed-off-by: Akshay Gupta <gravity.akshay@gmail.com>
2023-05-25 09:57:49 +02:00
Alejandro Alonso
6eb5c75ad4 🐛 Fix preview layer blend modes on multiselection and avoid
persisting data while previewing
2023-05-25 08:58:52 +02:00
Andrey Antukh
23f0ee9e55 Refactor select and layer-menu components 2023-05-25 07:32:31 +02:00
Akshay Gupta
eec2fd00a2 🎉 Implement ability to preview layer blend modes
Signed-off-by: Akshay Gupta <gravity.akshay@gmail.com>
2023-05-25 07:32:31 +02:00
Pablo Alba
749fc61885 🐛 Fix right button in frame title produces an internal error 2023-05-24 17:17:35 +02:00
Eva Marco
df1c56da2d Merge pull request #3236 from penpot/akshay-gupta7-akshayg7-add-shadows-reorder
🎉 Add ability to change shadows' order and place new shadows at first
2023-05-24 13:42:52 +02:00
Aitor
48b0df8e75 🐛 Fix thumbnails being rendered with previous size 2023-05-24 13:09:28 +02:00
Pablo Alba
fb3655506f 🐛 Fixes context menu action for duplicate main component 2023-05-24 12:26:27 +02:00
Pablo Alba
6929347da7 🎉 Change main shape name along with component name 2023-05-24 12:17:58 +02:00
Alejandro Alonso
1dab570907 🐛 Fix some limit situations on shadow reorder 2023-05-24 11:40:29 +02:00
Alejandro Alonso
1719f24b57 🐛 Fix develop branch after merge 2023-05-24 11:08:40 +02:00
Alejandro Alonso
2801431fab Merge remote-tracking branch 'origin/staging' into develop 2023-05-24 11:00:54 +02:00
Pablo Alba
8c915d1687 🐛 Fix paste component to another file 2023-05-23 09:10:54 +02:00
Pablo Alba
7d8a62664a Merge pull request #3223 from penpot/hiru-bugfixes
hiru bugfixing
2023-05-22 17:28:35 +02:00
Andrés Moya
9d5b59e9bb 🐛 Fix grouping of undo transactions 2023-05-22 17:26:53 +02:00
Andrés Moya
f73d7111b4 🐛 Avoid crash when renaming a page with double click 2023-05-22 17:26:53 +02:00
Andrés Moya
42a044fd22 🔥 Remove unused code 2023-05-22 17:26:53 +02:00
Andrés Moya
19ea85d9cc 🐛 Launch component sync when adding or removing shapes 2023-05-22 17:26:53 +02:00
Eva
defec189e2 🐛 Fix extra long names on typography assets 2023-05-22 16:32:19 +02:00
Eva
fbfff07dec 🐛 Fix background property changing it for background-color 2023-05-22 16:32:19 +02:00
Aitor Moreno
1a836bd0fc Merge pull request #3227 from penpot/alotor-fix-delete-reflow
🐛 Fix problem with layout not reflowing on shape deletion
2023-05-22 16:18:22 +02:00
alonso.torres
35e3ac5841 🐛 Fix problem with layout not reflowing on shape deletion 2023-05-22 16:11:06 +02:00
Aitor Moreno
19ce4c1cb7 Merge pull request #3219 from penpot/palba-zoom-picking-color
🐛 Fix zooming while color picker breaks UI
2023-05-22 16:00:33 +02:00
Eva
36b016a37b Add new palette UI 2023-05-22 15:59:49 +02:00
Pablo Alba
e8b87b0db1 🐛 Fix zooming while color picker breaks UI 2023-05-22 15:44:06 +02:00
Andrey Antukh
a09dd953ff Add incomplete performance enhancements to shadow menu
It is imposible to make this commponent efficient because of
the design limitations of numeric-input component
2023-05-22 14:15:08 +02:00
Andrey Antukh
73ed37f57a 💄 Add cosmetic changes to stoke related functions frontend 2023-05-22 14:15:08 +02:00
Andrey Antukh
98a6c63ad6 💄 Add cosmetic changes to shadow-add and reorder-shadow fns 2023-05-22 14:15:04 +02:00
Akshay Gupta
1eb6e30369 🎉 Add ability to change shadows order and place new shadows at top by default
Signed-off-by: Akshay Gupta <gravity.akshay@gmail.com>
2023-05-22 12:57:01 +02:00
Andrey Antukh
68c1d9afaf Merge remote-tracking branch 'origin/staging' into develop 2023-05-22 11:01:47 +02:00
Aitor
42cd9a59b9 🐛 Fix color picker broken images 2023-05-22 10:56:46 +02:00
Andrey Antukh
b7e1e54a92 Add general performance micro optimizations 2023-05-22 10:56:46 +02:00
Andrey Antukh
78f62cc5e1 🐛 Fix incorrect level for debug and trace log messages (cljs only) 2023-05-22 10:56:46 +02:00
Aitor
48834f96d3 ♻️ Refactor thumbnail rendering on workspace 2023-05-22 10:56:46 +02:00
Pablo Alba
1d69da1ca5 🐛 Minor style tweaks for component annotations 2023-05-19 13:01:08 +02:00
Eva Marco
4c17d7d160 Merge pull request #3225 from penpot/alotor-demo-fixes
🐛 Fix problems with position absolute and code generation
2023-05-19 12:55:22 +02:00
alonso.torres
7ee685ca18 🐛 Fix problems with position absolute and code generation 2023-05-19 12:36:23 +02:00
alonso.torres
8ddc7220f7 🐛 Fix problem with file-builder 2023-05-19 12:31:26 +02:00
Pablo Alba
2704c3f3de 🐛 Fix libraries had different sizes 2023-05-19 12:30:41 +02:00
Pablo Alba
65c695e830 🐛 Fix delete page with components 2023-05-19 10:37:10 +02:00
Alejandro Alonso
a1c09057c1 🎉 Move survey to local resources 2023-05-18 12:17:03 +02:00
Pablo Alba
b6d60773e3 Merge pull request #3220 from penpot/hiru-bugfixes
Component bugfixes
2023-05-18 11:09:34 +02:00
Andrés Moya
8636a15f4b 🐛 Fix crash in reset overrides 2023-05-17 16:26:32 +02:00
Alejandro
96782bfa8e Merge pull request #3188 from penpot/niwinz-experiments-6
♻️ Refactor validation subsystem
2023-05-17 16:11:45 +02:00
Andrey Antukh
97d2af048c 🐛 Fix srepl get-file helper (add support for pointer map) 2023-05-17 16:05:31 +02:00
Andrey Antukh
049ebdd542 🐛 Fix intermitent exception on viewport ref ns 2023-05-17 16:05:31 +02:00
Andrey Antukh
bf3888585a Add some minor performance improvements to dashboard components 2023-05-17 16:05:31 +02:00
Andrey Antukh
35969e9f26 🐛 Fix incorrect assertion on dashboard ns 2023-05-17 16:05:31 +02:00
Andrey Antukh
9cb5df31d1 🐛 Fix react warning for missing key on context-menu-a11y component 2023-05-17 16:05:31 +02:00
Andrey Antukh
cf03cb4ca4 🐛 Fix unexpected exception on thumbnails & raf 2023-05-17 16:05:31 +02:00
Andrey Antukh
63f4ef97fb 🐛 Fix pointermap issue on file export 2023-05-17 16:05:31 +02:00
Andrey Antukh
8e0abec876 💄 Add some cosmetic improvements on access-tokens components 2023-05-17 16:05:31 +02:00
Andrey Antukh
5ca3d01ea1 🎉 Add malli based validation and coersion subsystem 2023-05-17 16:05:29 +02:00
Andrey Antukh
dbc08ba80f 📎 Fix linter issues on frontend 2023-05-17 15:47:21 +02:00
Andrey Antukh
47e3279302 ⬆️ Update some frontend dependencies 2023-05-17 15:47:21 +02:00
Andrey Antukh
06f25c3950 ⬆️ Update nodejs on exporter dockerfile 2023-05-17 15:47:21 +02:00
Andrey Antukh
e96fc32cc1 ⬆️ Update devenv dockerfile 2023-05-17 15:47:21 +02:00
Andrey Antukh
444b7d5aae ⬆️ Update to JDK19 on backend dockerfile 2023-05-17 15:47:21 +02:00
Andrey Antukh
01404ba581 🎉 Add the ability to delete and search profiles to manage.py 2023-05-17 15:47:21 +02:00
Andrey Antukh
0dc7f4e07e Add test for orphaned teams deletion 2023-05-17 15:47:21 +02:00
Andrey Antukh
730c26f1e2 📎 Remove worker explicitly from test initialization 2023-05-17 15:47:21 +02:00
Andrey Antukh
e30d1a40bc Avoid vthread pinning on invitations 2023-05-17 15:47:21 +02:00
Andrey Antukh
4e7f32aa88 Improve retry mechanism and macros 2023-05-17 15:47:21 +02:00
Pablo Alba
44a3f651c2 Merge pull request #3189 from penpot/hiru-sync-notifications
 Notify library updates when really needed
2023-05-17 15:35:06 +02:00
Andrés Moya
8a42a53522 Notify library updates when really needed 2023-05-17 14:12:49 +02:00
Andrés Moya
25f7c14f97 🐛 Fix deactivation of show distances when alt-tab is used
Alt key with a shape selected activates show-distances mode.

If you press Alt+tab, in many window managers the window is switched,
and thus the alt keydown event is sent to other app and does not reach
Penpot. So, we need to deactivate the mode also on window blur.
2023-05-17 13:53:22 +02:00
Andrés Moya
568338ad68 🐛 Avoid spec failure if not path or annotations 2023-05-16 12:22:10 +02:00
Andrés Moya
30dd9c5222 🐛 Fix undo when deleting shapes inside instances (ok) 2023-05-16 11:11:47 +02:00
Pablo Alba
68367b002e Components annotations 2023-05-16 11:06:54 +02:00
Andrés Moya
cd1825d97a Revert "🐛 Fix undo when deleting shapes inside instances"
This reverts commit c421059e97.
2023-05-12 16:40:38 +02:00
Andrés Moya
c421059e97 🐛 Fix undo when deleting shapes inside instances 2023-05-12 16:20:48 +02:00
Andrés Moya
58a6f437c4 🐛 Fix display of library view 2023-05-12 13:27:45 +02:00
Andrés Moya
e032736c27 🐛 Fix crash in libraries view 2023-05-12 12:50:16 +02:00
Andrés Moya
eb0d499ddf 🐛 Fix touched detection for texts 2023-05-10 17:21:03 +02:00
Alejandro Alonso
54ab57d8f6 Merge remote-tracking branch 'origin/staging' into develop 2023-05-09 14:39:23 +02:00
Alejandro Alonso
eeb71982c8 Merge remote-tracking branch 'origin/staging' 2023-05-09 14:39:07 +02:00
Alejandro
ee8f071025 Merge pull request #3202 from penpot/superalex-fix-move-file-from-one-team-to-another
🐛 Fix move file between teams
2023-05-09 14:38:46 +02:00
Alejandro Alonso
b6bc8f2a25 🐛 Fix move file between teams 2023-05-09 14:26:09 +02:00
Alejandro Alonso
8352c9c6fd Merge remote-tracking branch 'origin/staging' 2023-05-09 10:22:55 +02:00
Alejandro Alonso
179b23ed6a Merge remote-tracking branch 'origin/staging' into develop 2023-05-09 10:22:17 +02:00
Alejandro Alonso
353de39d4d 📎 Update CHANGES.md file 2023-05-09 10:20:06 +02:00
Alejandro Alonso
d97be7043a Merge remote-tracking branch 'origin/staging' into develop 2023-05-09 09:39:08 +02:00
Alejandro Alonso
517c8f0d24 🐛 Fix typo 2023-05-09 09:38:54 +02:00
Alejandro
2ce676885f Merge pull request #3193 from penpot/niwinz-thumbnails-1
🎉 Allow submit thumbnails using multipart
2023-05-08 16:11:11 +02:00
Alejandro
cf0a42c6eb Merge pull request #3197 from penpot/azazeln28-fix-rules-rendering
🐛 Fix rules rendering
2023-05-08 11:56:28 +02:00
Aitor
0214cfa299 🐛 Fix rules rendering 2023-05-08 09:58:37 +02:00
Alejandro Alonso
81fff2b5e8 Merge branch 'ondrejkonec-ondrej-design-token-implementation' into develop 2023-05-08 08:27:04 +02:00
Ondřej Konečný
e5612a7373 🐛 Fix sidebar collapse icon
Signed-off-by: Ondřej Konečný <ondrej.konecny@gmail.com>
2023-05-08 08:26:49 +02:00
Alejandro Alonso
969106e2b6 📎 Update CHANGES.md file 2023-05-08 06:16:42 +02:00
Alejandro Alonso
6bad9ac629 Merge branch 'akshay-gupta7-akshayg7-focus-input-search-from-dashboard' into develop 2023-05-08 06:15:04 +02:00
Akshay Gupta
c1187dd457 🎉 Add feature to focus input on search when searching a file at projects dashboard
Signed-off-by: Akshay Gupta <gravity.akshay@gmail.com>
2023-05-08 06:13:48 +02:00
Andrey Antukh
e8ffcbae69 🎉 Add support for multipart upload of thumbnails
and improve the thumbnails storage to offloading it
to the storage subsystem
2023-05-05 17:00:35 +02:00
Andrey Antukh
c2b6b40554 💄 Add cosmetic changes (and comments) to toggle-file-thumbnail-selected function 2023-05-05 17:00:35 +02:00
Andrey Antukh
541a372f01 💄 Add cosmetic changes to duplicate-page function 2023-05-05 17:00:35 +02:00
Andrey Antukh
64cef9bb7d 📎 Add missing access-token middleware tests 2023-05-05 17:00:35 +02:00
Alejandro Alonso
70be668c1a Merge branch 'ondrejkonec-ondrej-suggestions-for-improvement' into develop 2023-05-05 11:20:25 +02:00
Ondřej Konečný
3ac8bf363a removed sizing variables from radius
Signed-off-by: Ondřej Konečný <ondrej.konecny@gmail.com>
2023-05-05 11:20:00 +02:00
Alejandro
9e66231218 Merge pull request #3187 from penpot/azazeln28-rules-performance
 better rules performance
2023-05-05 11:07:24 +02:00
Alejandro Alonso
e55cf2bdf9 Merge branch 'ryanbreen-patch-1' into develop 2023-05-05 10:59:45 +02:00
Ryan Breen
0a5263be35 🐛 rect filter bounds math fix
get-rect-filter-bounds was incorrectly applying delta-blur to x1 twice and to y1 never

Signed-off-by: Ryan Breen
2023-05-05 10:59:15 +02:00
Alejandro
5dd1fa0f98 Merge pull request #3171 from penpot/niwinz-enhancements-3
 Improve file-gc task
2023-05-05 10:55:14 +02:00
Alejandro Alonso
82b2f920c1 Merge branch 'akshay-gupta7-akshayg7-click-to-select-full-values-design-sidebar' into develop 2023-05-05 10:49:49 +02:00
Akshay Gupta
1c0e1237c2 🎉 Add feature to select full values on click at the design sidebar 2023-05-05 10:49:25 +02:00
Andrey Antukh
ceeed73dea Merge remote-tracking branch 'origin/staging' into develop 2023-05-04 22:15:18 +02:00
Alejandro Alonso
890583a13a Add mvp access-token support 2023-05-04 22:14:55 +02:00
Alejandro Alonso
21c6730dc7 🐛 Fix emails from header 2023-05-04 15:46:52 +02:00
Aitor
19727a648d better rules performance 2023-05-04 12:46:37 +02:00
Alejandro Alonso
b90aef4e1d Merge branch 'akshay-gupta7-akshayg7-set-line-height-to-auto' into develop 2023-05-04 12:34:28 +02:00
Akshay Gupta
412ffe4b46 🎉 Add feature to set line-height to auto as 1.2 2023-05-04 12:34:10 +02:00
Alejandro Alonso
c5cfe7e2e9 Change libraries and templates order 2023-05-04 08:51:14 +02:00
Akshay Gupta
45356ae1fc 🎉 Add feature to focus input on search when searching a file at projects dashboard 2023-05-03 14:15:59 +02:00
Eva
86b0e95458 :sparkles:Add new layers panel UI design 2023-04-27 12:26:26 +02:00
Pablo Alba
90fb619dfc Fix restore main component when it was inside a group 2023-04-26 13:30:23 +02:00
Andrey Antukh
5e89aa2726 Improve file-gc task
make it more aware of fragments referenced on changes snapshots
2023-04-26 13:28:32 +02:00
Alejandro Alonso
82dad3217b 🐛 Fix translations typo 2023-04-26 12:38:02 +02:00
Alejandro Alonso
47cb228e30 Merge branch 'akshay-gupta7-akshayg7-empty-state-for-color-typographies' into develop 2023-04-26 12:36:39 +02:00
Akshay Gupta
35c0b94e0d 🎉 Add message for empty state for color and typography palettes 2023-04-26 12:36:31 +02:00
Pablo Alba
a7015f2517 Fix restore and instanciate (in copy and paste) components with parent 2023-04-26 11:34:26 +02:00
Pablo Alba
4f471f39da Merge pull request #3166 from penpot/hiru-frame-titles
 Hide frame titles for component copies
2023-04-25 21:33:56 +02:00
Pablo Alba
f14641396f Merge pull request #3165 from penpot/hiru-board-selection
 Give frames that are components more priority on selection
2023-04-25 21:31:01 +02:00
Alejandro
d97bbdf140 Merge pull request #3169 from penpot/niwinz-enhancements-2
 Add the abiltiy to forward command params as query-string
2023-04-25 16:33:03 +02:00
Andrey Antukh
f1c42a698d 📎 Increase http socket backlog 2023-04-25 16:25:49 +02:00
Andrey Antukh
8fb62628d2 Add the abiltiy to forward command params as query-string 2023-04-25 16:25:30 +02:00
Andrey Antukh
5026bfa6c1 📎 Fix linter issues introduced in previous merge 2023-04-25 13:35:26 +02:00
Andrey Antukh
b37a92aaf7 Merge remote-tracking branch 'origin/staging' into develop 2023-04-25 13:34:28 +02:00
Alejandro
c44e2a9526 Merge pull request #3167 from penpot/niwinz-bugfixes-12
 Improve OICD attrs lookup mechanism
2023-04-25 12:26:42 +02:00
Andrey Antukh
c0ccc4a5c5 Improve OICD attrs lookup mechanism 2023-04-25 12:18:06 +02:00
Alejandro
364dadc93f Merge pull request #3164 from penpot/niwinz-bugfixes-10
🎉 Enable several languages
2023-04-25 12:16:59 +02:00
Andrés Moya
b45bdb52b2 Hide frame titles for component copies 2023-04-25 11:55:03 +02:00
Andrés Moya
7c612d8bcf Give frames that are components more priority on selection 2023-04-25 11:21:24 +02:00
Andrey Antukh
3311bf6ac0 📎 Remove duplicated file 2023-04-25 11:11:58 +02:00
Andrey Antukh
b5c160732e 🎉 Add ukranian lang 2023-04-25 11:11:58 +02:00
Andrey Antukh
f8d00c0e7f 🎉 Add latvian lang 2023-04-25 11:11:58 +02:00
Andrey Antukh
42acae3ae3 🎉 Add korean lang 2023-04-25 11:11:58 +02:00
Andrey Antukh
571439871b 🎉 Add faroese lang 2023-04-25 11:11:58 +02:00
Andrey Antukh
e051e26dad 🎉 Add czech lang 2023-04-25 11:11:51 +02:00
Pablo Alba
4ddd3811b2 🐛 Fix copy and paste components between files 2023-04-25 10:27:06 +02:00
Alejandro
da54557aab Merge pull request #3163 from penpot/niwinz-bugfixes-9
🐛 🔥 Fix merge bugs and remove deprecated code
2023-04-25 10:26:47 +02:00
Aitor
52763ceaf7 Merge pull request #3138 from penpot/fix-bad-undo-group-association-in-alt-copy
🐛 Fix bad undo group associations
2023-04-25 09:42:22 +02:00
Andrey Antukh
c0ccbaebaf 🔥 Remove deprecated queries and mutations 2023-04-24 20:18:14 +02:00
Andrey Antukh
36953eef1a 🐛 Use proper commands (instead of queries) on render frontend namespace 2023-04-24 19:47:28 +02:00
Andrey Antukh
84c8a6eced 🐛 Use correct parameters on password update on login 2023-04-24 19:46:42 +02:00
Andrey Antukh
1f023eebeb 🔥 Remove unused code 2023-04-24 18:21:48 +02:00
Hosted Weblate
e2a0a40704 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/
2023-04-24 16:55:45 +02:00
Andrey Antukh
6af783ea91 Merge remote-tracking branch 'origin/staging' into develop 2023-04-24 16:55:18 +02:00
Alejandro
cea0c7277c Merge pull request #3161 from penpot/niwinz-bugfixes-8
🎉 Bugfixes and translation updates
2023-04-24 16:43:42 +02:00
Andrey Antukh
8e860ec5a6 🎉 Add Indonesian lang to the supported languages 2023-04-24 16:22:31 +02:00
Andrey Antukh
7b93c0bb09 📎 Sort all translation strings 2023-04-24 16:22:04 +02:00
Andrey Antukh
3ae8da7d22 Merge remote-tracking branch 'weblate/develop' into niwinz-bugfixes-8 2023-04-24 16:10:34 +02:00
Andrey Antukh
c31eb2df42 🐛 Fix OICD auth provider roles checking mechanism 2023-04-24 15:13:24 +02:00
Alejandro Alonso
d657f5df49 Merge remote-tracking branch 'origin/staging' 2023-04-24 09:16:52 +02:00
Alejandro Alonso
e89378453a Merge remote-tracking branch 'origin/staging' into develop 2023-04-24 09:15:22 +02:00
Alejandro
3a57b436a4 Merge pull request #3140 from penpot/azazeln28-fix-project-file-count
🐛 Fix project file count
2023-04-24 09:14:59 +02:00
Aitor
657ce4fa0a 🐛 Fix project file count 2023-04-24 09:14:44 +02:00
Alejandro
dde7063da0 Merge pull request #3145 from penpot/azazeln28-fix-page-context-menu
🐛 Fix page item context menu
2023-04-24 09:11:55 +02:00
Aitor
b3c4ff4dc0 🐛 Fix page item context menu 2023-04-24 09:04:09 +02:00
Alejandro Alonso
b7d1488aa3 Merge branch 'akshay-gupta7-akshayg7-duplicate-with-drag-and-alt' into develop 2023-04-24 08:22:28 +02:00
Akshay Gupta
d586f82da1 🎉 Implement functionality to duplicate objects via drag + alt 2023-04-24 08:22:14 +02:00
Alejandro Alonso
a658493ac5 Merge branch 'akshay-gupta7-akshayg7-typography-palette-order' into develop 2023-04-24 07:44:06 +02:00
Akshay Gupta
eaaeef2335 🎉 Update Typography palette order 2023-04-24 07:43:47 +02:00
Alejandro Alonso
bef9bbaa6a Merge branch 'abstractalgo-patch-1' into develop 2023-04-24 06:39:22 +02:00
Dragan Okanovic
32810f2ecd 🐛 Fix broken link in README 2023-04-24 06:38:17 +02:00
Ally Tiago
8856a635ed 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2023-04-24 05:54:38 +02:00
Radek Sawicki
d6bd4ac7fd 🌐 Add translations for: Polish.
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pl/
2023-04-21 23:52:22 +02:00
Radek Sawicki
efa5fb609c 🌐 Add translations for: Polish.
Currently translated at 93.5% (1108 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pl/
2023-04-20 17:52:11 +02:00
王世阳
2f920ba651 🌐 Add translations for: Chinese (Simplified).
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2023-04-15 15:47:45 +02:00
Alejandro Alonso
ed164ce69b Merge remote-tracking branch 'origin/staging' into develop 2023-04-14 13:28:26 +02:00
Alejandro Alonso
974bbd5ff4 Merge remote-tracking branch 'origin/staging' 2023-04-14 13:27:34 +02:00
Alejandro Alonso
e1652d17d9 Update material design template to version 3 2023-04-14 13:27:06 +02:00
Pablo Alba
33656f8eb4 Merge pull request #3115 from penpot/hiru-components-boards
🎉 Now all component roots are frames
2023-04-14 12:40:32 +02:00
Andrés Moya
bbd561a772 🔧 Fix test cases 2023-04-14 12:31:04 +02:00
Andrés Moya
2790111405 🎉 Now all component roots are frames 2023-04-14 12:31:03 +02:00
Alejandro Alonso
47b791e938 Board as ruler origin 2023-04-14 09:22:43 +02:00
Pablo Alba
47b432e307 🐛 Fix bad undo group associations 2023-04-13 18:44:40 +02:00
Alejandro Alonso
ce341a05e1 Merge remote-tracking branch 'origin/staging' into develop 2023-04-13 16:34:22 +02:00
Alejandro Alonso
b992c876e9 Merge remote-tracking branch 'origin/staging' 2023-04-13 16:33:27 +02:00
alonso.torres
9a750bad93 🐛 Fix problem with rulers not placing correctly 2023-04-13 16:32:19 +02:00
alonso.torres
d127177029 🐛 Fix problem when "show in view mode" flag 2023-04-13 16:32:02 +02:00
Alejandro
724b8990be Merge pull request #3136 from penpot/alotor-hotfix-1.18.3
Alotor hotfix 1.18.3
2023-04-13 16:28:58 +02:00
Suhwan Kim
9b7506ee8d 🌐 Add translations for: Korean.
Currently translated at 15.5% (184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ko/
2023-04-13 14:51:00 +02:00
王世阳
176d48707f 🌐 Add translations for: Chinese (Simplified).
Currently translated at 93.5% (1108 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2023-04-13 14:50:50 +02:00
alonso.torres
452dcb5eec 🐛 Fix problem when "show in view mode" flag 2023-04-13 14:16:03 +02:00
alonso.torres
ae3de34033 🐛 Fix problem with rulers not placing correctly 2023-04-13 14:15:49 +02:00
Alejandro Alonso
45fc55dee9 Merge remote-tracking branch 'origin/staging' into develop 2023-04-13 12:24:52 +02:00
Alejandro Alonso
c3a4dbb871 Merge remote-tracking branch 'origin/staging' 2023-04-13 12:24:39 +02:00
Alejandro
9a695a76ed Merge pull request #3135 from penpot/palba-fix-first-level-boards-show-in-view-mode2
🐛 Fix first level board "Show in view mode" is automatically unchecked
2023-04-13 12:23:58 +02:00
Pablo Alba
36bd82ceb4 🐛 Fix first level board "Show in view mode" is automatically unchecked 2023-04-13 12:15:08 +02:00
Alejandro
067b76ebd8 Merge pull request #3134 from penpot/niwinz-bugfixes-7
🐛 Fix upload-file-media-object rpc method
2023-04-13 11:07:15 +02:00
Andrey Antukh
cb02b07395 🐛 Fix upload-file-media-object rpc method 2023-04-13 10:55:15 +02:00
Alejandro Alonso
81d718570d 🐛 Fix backend import 2023-04-13 09:21:57 +02:00
Alejandro Alonso
ee1b9e861e Merge remote-tracking branch 'origin/staging' into develop 2023-04-13 09:17:06 +02:00
Alejandro Alonso
3905ba4ce2 Merge remote-tracking branch 'origin/staging' 2023-04-13 09:16:52 +02:00
Alejandro
0f9b50de50 Merge pull request #3127 from penpot/niwinz-bugfixes-6
🐛 Fix inconsistencies on drop datauri images (mainly for firefox …
2023-04-13 09:16:17 +02:00
Andrés Moya
271b83de2e 🐛 Fix features activation by devtools console 2023-04-12 16:14:36 +02:00
Andrey Antukh
7ef07385c6 🐛 Fix inconsistencies on drop datauri images (mainly for firefox browser) 2023-04-12 13:18:24 +02:00
Alejandro Alonso
aaca901fd9 🎉 Create typography style from a selected text layer 2023-04-12 09:30:41 +02:00
Pablo Alba
ccaac2a5c7 Merge pull request #3120 from penpot/superalex-default-naming-of-text-layers
🎉 Default naming of text layers
2023-04-11 17:50:53 +02:00
Pablo Alba
147beb3963 Merge pull request #3100 from penpot/hiru-detach-top-level-only
🎉 Detach component now only affects top instance, not subinstances
2023-04-11 15:19:20 +02:00
Pablo Alba
e481f1cc99 Merge pull request #3081 from penpot/hiru-cancel-remove-graphics
 Allow to cancel and resume later remove graphics
2023-04-11 15:16:05 +02:00
Alejandro
5cec969ee3 Merge pull request #3124 from penpot/niwinz-bugfixes-6
 Improve audit props for upload-file-media-objects rpc method
2023-04-11 13:03:15 +02:00
Andrey Antukh
12ac01a9cb Improve audit props for upload-file-media-objects rpc method 2023-04-11 12:40:59 +02:00
Pablo Alba
c1ed5a5b33 Merge pull request #3097 from penpot/hiru-fix-features-detect
♻️ Enhance features loading to avoid race conditions
2023-04-11 09:55:11 +02:00
Alejandro Alonso
4d8f471eca Merge remote-tracking branch 'origin/staging' into develop 2023-04-11 06:52:35 +02:00
Alejandro Alonso
0dcb3e94ce Merge remote-tracking branch 'origin/staging' 2023-04-11 06:51:09 +02:00
Alejandro
3233c78130 Merge pull request #3123 from penpot/alotor-hotfix
Hotfix page hangs
2023-04-11 06:50:30 +02:00
alonso.torres
dfb1a79179 🐛 Fix problem when closing paths for big imported SVGs 2023-04-11 06:43:53 +02:00
andy
9758b2722e 🌐 Added translation for: Burmese. 2023-04-10 16:45:59 +02:00
Alejandro Alonso
5993b9855e 🎉 Default naming of text layers 2023-04-10 13:16:26 +02:00
Andrey Antukh
6abca96da1 📎 Add improved docstring for penpot_secret_key 2023-04-07 08:57:08 +02:00
Andrey Antukh
6972227b8d 📎 Add improved docstring for penpot_secret_key 2023-04-07 08:55:53 +02:00
Ņikita K
1c13ab6de5 🌐 Add translations for: Latvian.
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2023-04-06 12:35:17 +02:00
Suhwan Kim
7e403c65c2 🌐 Add translations for: Korean.
Currently translated at 5.4% (64 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ko/
2023-04-06 12:34:52 +02:00
Alejandro Alonso
08c6ebe10c 🐛 Fix metrics and doc endpoints 2023-04-05 20:08:20 +02:00
Alejandro
73b913065f Merge pull request #3110 from penpot/alotor-fixes
🐛 Fix problem with frame title rotation
2023-04-05 09:28:03 +02:00
alonso.torres
8db3f2b277 🐛 Fix problem with frame title rotation 2023-04-05 09:23:51 +02:00
Alejandro Alonso
408de63ea3 Merge remote-tracking branch 'origin/staging' into develop 2023-04-05 07:35:36 +02:00
Alejandro
6d3baaae47 Merge pull request #3109 from penpot/niwinz-bugfixes-5
🐛 Add missing storage dependency to dbg routes module
2023-04-05 06:59:27 +02:00
Andrey Antukh
30e1c7d54e 🐛 Add missing storage dependency to dbg routes module 2023-04-04 19:20:10 +02:00
Andrey Antukh
28d3402793 Merge branch 'leonekmi-patch-1' into staging 2023-04-04 19:10:38 +02:00
Leon
e9daaa2eb8 🐛 Fix default port for penpot-exporter on nginx entrypoint
By default, penpot-frontend will try to reach penpot-export on port 80,
this is wrong, the exporter listens by default to port 6061.
2023-04-04 19:09:44 +02:00
Andrés Moya
e66f9597a9 Update component copy icon 2023-04-04 15:04:40 +02:00
Alejandro
dc7e62245d Merge pull request #3102 from penpot/alotor-bugfixing-16
SVG Uploading fixes
2023-04-04 10:14:10 +02:00
alonso.torres
da953f0bc0 🐛 Fix problems with imported SVG embedded images and transforms 2023-04-04 09:52:15 +02:00
alonso.torres
4b086ab2bc 🐛 Fix problems with imported SVG shadows 2023-04-04 09:52:15 +02:00
Alejandro
cd9bc1d8d7 Merge pull request #3104 from penpot/niwinz-bugfixes-4
🐛 Enable by default mattermost webhook error reporter
2023-04-04 08:45:10 +02:00
Andrey Antukh
cdaf63afa0 🐛 Enable by default mattermost webhook error reporter 2023-04-04 08:38:05 +02:00
Alejandro
7ebc185b3a Merge pull request #3103 from penpot/niwinz-bugfixes-3
🐛 Fix incorrect metrics reference on rpc methods middleware
2023-04-04 06:46:22 +02:00
Andrey Antukh
3222583a69 🐛 Fix incorrect metrics reference on rpc methods middleware 2023-04-03 23:09:39 +02:00
Ņikita K
85fe0130c3 🌐 Add translations for: Latvian.
Currently translated at 13.0% (154 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/lv/
2023-04-03 14:21:30 +02:00
Alejandro Alonso
f7e37924e5 🐛 Fix backend update-profile-password! call 2023-04-03 12:53:04 +02:00
elhombretecla
1afecf23aa 🐛 Fix onboarding slides typo 2023-04-03 12:52:53 +02:00
Alejandro Alonso
68b26d5f41 Merge remote-tracking branch 'origin/staging' into develop 2023-04-03 12:21:12 +02:00
Alejandro Alonso
4926c826af Merge remote-tracking branch 'origin/staging' 2023-04-03 12:09:48 +02:00
Andrés Moya
a27fa8b317 🎉 Detach component now only affects top instance, not subinstances 2023-04-03 11:52:26 +02:00
elhombretecla
6b724d9572 Add new optimized gifs 2023-04-03 11:22:59 +02:00
elhombretecla
2789ecc22a Add new spacing optimized gif 2023-04-03 11:07:37 +02:00
Alejandro
2eba317797 Merge pull request #3099 from penpot/alotor-bugfixing-15
🐛 Fix problem with opacity in imported SVG's
2023-04-03 09:49:52 +02:00
alonso.torres
5856e3cc03 🐛 Fix problem with opacity in imported SVG's 2023-04-03 09:24:54 +02:00
Andrés Moya
8cd59c39ed 🌐 Added translation for: Latvian. 2023-04-03 09:22:22 +02:00
Andrés Moya
18efa4ff2c ♻️ Enhance features loading to avoid race conditions 2023-03-31 16:13:11 +02:00
Aimee
722e95abf2 🌐 Add translations for: French.
Currently translated at 88.5% (1048 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-03-31 15:37:52 +02:00
Alejandro
04b7d8e1e2 Merge pull request #3094 from penpot/hotfix-1.17
🐛 Fix problem with invalid geometry
2023-03-31 14:10:36 +02:00
Pablo Alba
b33e469501 🎉 Copy paste components, even to another page 2023-03-31 14:04:06 +02:00
Alejandro
cc469b116d Merge pull request #3093 from penpot/alotor-bugfixing-14
Alotor bugfixing 14
2023-03-31 13:56:25 +02:00
Andrey Antukh
9fe49b5546 🐛 Fix unexpected responste truncation related to shared links
that contains old data that is not used but can be still present
on the table; we should consider right now to proceed to delete
the row completly
2023-03-31 12:48:24 +02:00
Andrey Antukh
0c89b7cdb1 🐛 Fix some issues on read-only database connection 2023-03-31 12:48:24 +02:00
Andrey Antukh
90d48c1d30 Add the ability to check read-only state of connection
on the db ns helper; previously it only worked with datasource
instances
2023-03-31 12:48:24 +02:00
alonso.torres
2792c22ec9 🐛 Fix problem with overlays positioning 2023-03-31 12:22:16 +02:00
alonso.torres
745cf1c79d 🐛 Fix problem with invalid geometry 2023-03-31 12:05:59 +02:00
alonso.torres
a838dac01b 🐛 Fix problem when calculating group bounds 2023-03-31 11:20:42 +02:00
Alejandro Alonso
d5bbc7b1aa 🐛 Fix hide grid keyboard shortcut 2023-03-31 09:57:24 +02:00
Alejandro
e1e6816544 Merge pull request #3089 from penpot/alotor-bugfixing-13
Alotor bugfixing 13
2023-03-31 08:49:46 +02:00
alonso.torres
64c0273554 🐛 Fix problem when reorder layers removes show in viewer 2023-03-30 16:30:21 +02:00
alonso.torres
532caea169 🐛 Fix relative position overlay positioning 2023-03-30 16:20:37 +02:00
alonso.torres
0c8d8d92ba 🐛 Fix precision for wrap in flex 2023-03-30 16:20:36 +02:00
Alejandro Alonso
af428ab0ae 🐛 Fix view mode header buttons overlapping in small resolutions 2023-03-30 16:16:24 +02:00
Alejandro Alonso
85b3605c33 🐛 Fix dashboard scrolling using 'Page Up' and 'Page Down' 2023-03-30 16:16:24 +02:00
Alejandro
f1431b7b77 Merge pull request #3086 from penpot/release-info-1.18
Add new onboarding slides 1.18 info
2023-03-30 14:37:38 +02:00
elhombretecla
1ea1d53971 Add new 1.18 info 2023-03-30 14:35:10 +02:00
Alejandro Alonso
8bf01858bb 🐛 Fix alt+P combination while left bar buttons focused 2023-03-29 16:26:34 +02:00
Alejandro Alonso
f05f527336 🐛 Fix allow change team image for editor role users 2023-03-29 16:26:34 +02:00
Alejandro Alonso
fa4c7a1eb7 🐛 Fix last update project timer update after creating new file 2023-03-29 16:26:34 +02:00
Alejandro Alonso
3e6b3bcdc4 🐛 Fix unpublish and delete shared library warning messages 2023-03-29 16:26:34 +02:00
Alejandro
aca242046e Merge pull request #3082 from penpot/alotor-bugfixing-12
🐛 Fix problem with invalid SVG shape
2023-03-29 16:05:57 +02:00
alonso.torres
be27ce4914 🐛 Fix problem with invalid SVG shape 2023-03-29 16:00:07 +02:00
Andrés Moya
e8d49fae13 Allow to cancel and resume later remove graphics 2023-03-29 12:57:21 +02:00
Alejandro
190b77ff95 Merge pull request #3080 from penpot/alotor-bugfixing-11
🐛 Fix problem with SVG and flex layout
2023-03-29 11:47:09 +02:00
alonso.torres
6e78745ed5 🐛 Fix problem with SVG and flex layout 2023-03-29 11:22:26 +02:00
Alejandro
f03def32fd Merge pull request #3078 from penpot/alotor-bugfixing-10
Alotor bugfixing 10
2023-03-29 09:32:18 +02:00
alonso.torres
a98ae69a03 🐛 Disable empty names on rename files 2023-03-29 09:18:22 +02:00
alonso.torres
43fe2390c8 🐛 Fix problem with copy/paste shapes 2023-03-29 09:12:03 +02:00
alonso.torres
d54e152a3d 🐛 Fix problem creating files in project page 2023-03-29 09:12:03 +02:00
alonso.torres
ac23c7bb4a 🐛 Remove "show in view mode" flag when moving frame to frame 2023-03-29 09:12:03 +02:00
alonso.torres
66444e27b1 🐛 Fix problem with selection colors and texts 2023-03-29 09:12:03 +02:00
Alejandro Alonso
92baf75ccd 🐛 Fix import typo 2023-03-29 08:53:10 +02:00
Alejandro Alonso
0714dc34c5 🐛 Fix spelling mistake in confirmation after importing only 1 file 2023-03-28 17:25:44 +02:00
Alejandro Alonso
aa068c70c2 🐛 Fix expanded typography on assets sidebar is moving 2023-03-28 17:25:44 +02:00
Alejandro Alonso
70974efc74 🐛 Fix dashboard left sidebar, the [x] overlaps the field 2023-03-28 17:25:44 +02:00
Alejandro Alonso
acccba6ed4 🐛 Fix invalid files amount after moving on dashboard 2023-03-28 17:25:44 +02:00
Alejandro Alonso
2e549b164f 🐛 Fix internal error on imported svgs 2023-03-28 17:25:44 +02:00
Alejandro Alonso
3df2b80427 🐛 Fix rename option is absent in RMB menu for file 2023-03-28 17:25:44 +02:00
Alejandro Alonso
0ec89e8bbe 🐛 Fix enter emails on onboarding new user creating team 2023-03-28 17:25:44 +02:00
Alejandro Alonso
694497803b 🐛 Fix don't show invite user hero to users with editor role 2023-03-28 17:25:44 +02:00
Pablo Alba
b73ce14560 Merge pull request #2967 from penpot/hiru-refactor-instances
🔧 Read component shapes from pages
2023-03-28 12:00:10 +02:00
Alejandro
88db456127 Merge pull request #3075 from penpot/alotor-bugfixes-9
Alotor bugfixes 9
2023-03-28 09:08:45 +02:00
alonso.torres
6832b4a304 🐛 Fix problem with text carring over next line when changing to fixed 2023-03-27 17:06:45 +02:00
alonso.torres
5079582e1f 🐛 Fix problem with round corners scaling 2023-03-27 13:26:24 +02:00
alonso.torres
4313c45870 🐛 Fix sending invitation to existing members 2023-03-27 13:18:52 +02:00
alonso.torres
1f9e7f2ae8 🐛 Fix markdown message 2023-03-27 13:18:52 +02:00
alonso.torres
f7bba745ab 🐛 Changes to the header menu 2023-03-27 13:18:52 +02:00
alonso.torres
391ba77da9 🐛 Fix scaling of texts 2023-03-27 13:18:52 +02:00
alonso.torres
1d7b43ffbc 🐛 Fix problem with outer stroke in texts 2023-03-27 13:18:52 +02:00
alonso.torres
7256759488 🐛 Fix problem with color picker not able to change hue 2023-03-27 13:18:52 +02:00
alonso.torres
f11c782c0f 🐛 Fix problem when copy/pasting shapes 2023-03-27 13:18:52 +02:00
Pablo Alba
26aec7d129 🐛 Fix usiong padding/marging value on updating with shift 2023-03-27 13:18:08 +02:00
Pablo Alba
d61c799846 🐛 Fix padding/gap/margin remain glowing when the shape is deselected and selected again 2023-03-27 13:18:08 +02:00
Pablo Alba
c3c41c5b7d 🐛 Fix rotate board breaks paddings 2023-03-27 13:18:08 +02:00
Pablo Alba
eeb76b1e50 🐛 Fix during scale paddings glow 2023-03-27 13:18:08 +02:00
Pablo Alba
caf462e9b8 🐛 Fix padding prediction does not work with one shape 2023-03-27 13:18:08 +02:00
Pablo Alba
4d70d3b909 🐛 Bad padding gui on nil sizing 2023-03-27 13:18:08 +02:00
Pablo Alba
6a1115ddda 🐛 Fix usiong padding/marging value on updating with shift 2023-03-27 11:55:23 +02:00
Pablo Alba
d3ae53e3ef 🐛 Fix padding/gap/margin remain glowing when the shape is deselected and selected again 2023-03-27 11:55:23 +02:00
Pablo Alba
4774cc4859 🐛 Fix rotate board breaks paddings 2023-03-27 11:55:23 +02:00
Pablo Alba
bc07dad4ae 🐛 Fix during scale paddings glow 2023-03-27 11:55:23 +02:00
Pablo Alba
0f9ad0907e 🐛 Fix padding prediction does not work with one shape 2023-03-27 11:55:23 +02:00
Pablo Alba
300ad15f5a 🐛 Bad padding gui on nil sizing 2023-03-27 11:55:23 +02:00
Andrés Moya
ad786ab95f 🎉 Group component sync changes in a single undo 2023-03-27 10:39:35 +02:00
Andrés Moya
fe898315c3 🐛 Fix absorb libraries 2023-03-27 10:39:35 +02:00
Andrés Moya
96540af2b1 🎉 Instantiate component with duplicate 2023-03-27 10:39:35 +02:00
Pablo Alba
6889440014 🐛 Fix wrong shape-ref on duplicate component 2023-03-27 10:39:35 +02:00
Pablo Alba
e59d106315 🐛 Fix duplicate component in assets generates wrong main copy 2023-03-27 10:39:35 +02:00
Andrés Moya
7391a4086a 🔧 Refactor delete/restore components 2023-03-27 10:39:35 +02:00
Andrés Moya
b91f1959b4 🎉 Update tests 2023-03-27 10:39:35 +02:00
Andrés Moya
0711fa700b 🔧 Read component shapes from pages 2023-03-27 10:39:33 +02:00
Alejandro Alonso
a4dd5fccff 🐛 Fix develop branch after merge 2023-03-24 13:06:16 +01:00
Alejandro Alonso
4fad2ab619 Merge remote-tracking branch 'origin/staging' into develop 2023-03-24 12:33:14 +01:00
Alejandro Alonso
91e81823a5 🐛 Fix deleted files appear in search results 2023-03-24 12:20:00 +01:00
Alejandro Alonso
d0ab0bccb9 🐛 Fix drag and drop files from browser or file explorer under circumstances 2023-03-24 12:20:00 +01:00
Alejandro Alonso
b2b91bfa57 🐛 Fix change email and password for users signed in via social login 2023-03-24 12:20:00 +01:00
Alejandro
fc857aad08 Merge pull request #3068 from penpot/alotor-bugfixes-8
Alotor bugfixes 8
2023-03-24 08:32:38 +01:00
alonso.torres
5874922367 🐛 Fix problem with guides not showing when moving over nested frames 2023-03-23 17:13:04 +01:00
alonso.torres
1657f06a48 🐛 Select children after ungroup action 2023-03-23 16:41:00 +01:00
alonso.torres
2ad9c3cc72 🐛 Forbid empty names for assets 2023-03-23 16:11:23 +01:00
alonso.torres
fae76f6d4e 🐛 Fix problem with geometry of groups 2023-03-23 12:03:25 +01:00
alonso.torres
d0878aa805 🐛 Fix visual problem in select options 2023-03-23 12:03:25 +01:00
alonso.torres
020454e701 🐛 Fix header not showing when exiting fullscreen mode in viewer 2023-03-23 12:03:25 +01:00
alonso.torres
eedb83e863 🐛 Fix problem with text out of borders when changing from auto-width to fixed 2023-03-23 12:03:25 +01:00
alonso.torres
8a6809848e 🐛 Show warning when trying to invite a user that is already in members 2023-03-23 12:03:25 +01:00
Alejandro Alonso
3b2083134e 🐛 Fix multiplayer username sometimes is not displayed correctly 2023-03-23 09:14:58 +01:00
Alejandro Alonso
b5fc074e35 🐛 Fix horizontal margins drag don't always start from place 2023-03-23 09:14:58 +01:00
Alejandro
bc794816db Merge pull request #3066 from penpot/alotor-bugfixes-7
Alotor bugfixes 7
2023-03-22 16:28:19 +01:00
alonso.torres
f1b5ac27a9 🐛 Fix path options not showing when editing rects or ellipses 2023-03-22 14:45:19 +01:00
alonso.torres
ea438d3626 🐛 Add tooltip for text alignment options 2023-03-22 14:25:32 +01:00
alonso.torres
6d93501dc7 🐛 Fix shortcuts for alignment 2023-03-22 14:25:24 +01:00
alonso.torres
09d0a9e3f8 🐛 Fix problem when assigning color from palette or assets 2023-03-22 12:36:40 +01:00
alonso.torres
2fef90e7eb 🐛 Fix problem with selected colors and texts 2023-03-22 11:58:33 +01:00
Alejandro Alonso
c851f60de4 🐛 Fix deleted files appear in search results 2023-03-22 09:47:03 +01:00
Alejandro Alonso
6b4bca50ee bug: Fix manipulate duplicated project 2023-03-22 09:47:03 +01:00
Alejandro Alonso
f05e37590a 🐛 Fix font kerning on export 2023-03-22 09:30:07 +01:00
Alejandro Alonso
fbf06a4de0 Use tabulators to navigate layers 2023-03-22 09:23:06 +01:00
Alejandro
25014a81c3 Merge pull request #3062 from penpot/alotor-bugfixes-6
Bugfixes
2023-03-22 07:29:43 +01:00
Andrés Moya
ce3e30ea02 🐛 Fix linter issues 2023-03-21 17:12:54 +01:00
Andrés Moya
1d026ab085 🎉 Added 'go to main component' to components context menu 2023-03-21 17:12:54 +01:00
alonso.torres
5d77f7e5b1 🐛 Fix linter issues 2023-03-21 17:11:23 +01:00
alonso.torres
131e4f2446 🐛 Fix nested frame interaction created flow in wrong frame 2023-03-21 16:50:59 +01:00
alonso.torres
8ab264af80 🐛 Fix problem in Firefox with scroll jumping when changin pages 2023-03-21 16:43:04 +01:00
Andrey Antukh
60d629a0c6 Merge branch 'connecting-line-height-values-to-variables' into develop 2023-03-19 18:37:56 +01:00
Ondřej Konečný
d337dbfa5d ♻️ Connect line-heigh values to variables and set scale
Signed-off-by: Ondřej Konečný <ondrej.konecny@gmail.com>
2023-03-19 18:37:40 +01:00
Ally Tiago
e735b9f90e 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2023-03-18 22:41:11 +01:00
Renan Mayrinck
95fb3dfcd2 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2023-03-18 22:41:10 +01:00
Andrey Antukh
582ec187f8 Merge remote-tracking branch 'origin/staging' into develop 2023-03-17 10:19:04 +01:00
Alejandro
40ca804d93 Merge pull request #3051 from penpot/niwinz-experiments-2
🐛 Fix many issues related to the concurrency refactor PR
2023-03-17 08:25:31 +01:00
Alejandro
b32e0f458c Merge pull request #3050 from penpot/alotor-fixes-layout
Alotor fixes layout
2023-03-17 08:24:30 +01:00
Alejandro
484a50949a Merge pull request #3049 from penpot/alotor-bugfixes-5
Bugfixes
2023-03-17 08:23:39 +01:00
alonso.torres
a118f34b49 🐛 Add version to presence and fixes off-page updates 2023-03-17 08:23:03 +01:00
Andrey Antukh
2818666a1a 📎 Fix minnor cosmetic issue on instant and duration pretty printing 2023-03-16 22:33:35 +01:00
Andrey Antukh
9143639357 🐛 Fix incorrect webhook url validation 2023-03-16 22:33:35 +01:00
Andrey Antukh
f18d2ea629 🐛 Add missing fragment persistence on creating file
Related with storage/pointer-map feature.
2023-03-16 22:33:35 +01:00
Andrey Antukh
938890c04c 🐛 Fix vthread pining on get-file-data-for-thumbnail rpc method 2023-03-16 22:33:35 +01:00
Andrey Antukh
9173c73eca 🐛 Forward var bindings on climit submit operation 2023-03-16 22:33:35 +01:00
Andrey Antukh
69c8a89dd2 🎉 Add the ability to specify the output format from query string 2023-03-16 22:33:35 +01:00
Andrey Antukh
b462ac019a 🐛 Fix typo on error type 2023-03-16 22:33:35 +01:00
Andrey Antukh
3011d24905 📎 Enable storage features on start-dev and repl scripts 2023-03-16 22:33:35 +01:00
alonso.torres
120d3005ea 🐛 Fix change layer index when moving absolute positioned shape 2023-03-16 17:39:11 +01:00
alonso.torres
2272977d67 🐛 Fix problem when editing gap/margins in layout 2023-03-16 17:11:46 +01:00
alonso.torres
cbe8587db3 🐛 Fix problem with z positioning of elements 2023-03-16 15:08:49 +01:00
alonso.torres
6a4d505033 🐛 Fix problem with alt getting stuck when alt+tab 2023-03-16 15:08:03 +01:00
alonso.torres
bd44f49175 🐛 Fix problem with board titles misplaced 2023-03-15 15:51:30 +01:00
alonso.torres
acdcf82c6c 🐛 Fix filter in layers z-index 2023-03-15 15:48:45 +01:00
Alejandro
afb09919ed Merge pull request #3001 from penpot/niwinz-experiments-2
♻️ Refactor concurrency model (start using JDK19 virtual threads on RPC and WebSockets)
2023-03-15 11:34:25 +01:00
Alejandro Alonso
d685888720 Merge remote-tracking branch 'origin/staging' into develop 2023-03-15 09:44:44 +01:00
Alejandro
bda2468a86 Merge pull request #3046 from penpot/alotor-bugfixes-4
Alotor bugfixes 4
2023-03-15 09:43:48 +01:00
alonso.torres
2dea2d9d27 🐛 Ignore remote changes in size 2023-03-15 09:28:46 +01:00
alonso.torres
107d607d37 🐛 Fix error with empty curves 2023-03-15 09:28:46 +01:00
alonso.torres
2c6513ac85 🐛 Fix problems with touch devices and Wacom tablets 2023-03-15 09:28:46 +01:00
Pablo Alba
8ae1148ef9 🎉 Go to main component from context menu or with double click on the asset 2023-03-14 17:15:53 +01:00
alonso.torres
5bd4be1950 🐛 No select frames without fill should happen only on ctrl click 2023-03-14 15:42:46 +01:00
alonso.torres
dad88cb42e 🐛 Fix close colorpicker on Firefox when mouse-up is outside the picker 2023-03-14 15:42:45 +01:00
Alejandro
b6e01077ed Merge pull request #3044 from penpot/azazeln28-improve-rotate-matrix
Improve rotate matrix
2023-03-14 13:42:31 +01:00
Aitor
538a05b359 improve rotate matrix 2023-03-14 13:05:52 +01:00
Alejandro
1b3281457e Merge pull request #3042 from penpot/azazeln28-fix-scaling-frame-proportionally
Fix scaling frame proportionally
2023-03-14 12:33:04 +01:00
Andrey Antukh
c9ec5234d3 ♻️ Refactor local in-memory cache api 2023-03-14 12:30:27 +01:00
Andrey Antukh
76b931108e Increase strenght of password hashing algorithm
And enable password update mechanism on login
2023-03-14 12:30:27 +01:00
Andrey Antukh
84dc3c8fd9 🔥 Remove debugging prn 2023-03-14 12:30:27 +01:00
Andrey Antukh
2cddc49463 Remove several reflection calls 2023-03-14 12:30:27 +01:00
Andrey Antukh
91b5a0afdd Add missing type hints on matrix type functions 2023-03-14 12:30:27 +01:00
Andrey Antukh
dfdc9c9fa5 ♻️ Refactor storage internal concurrency model 2023-03-14 12:30:27 +01:00
Andrey Antukh
aafbf6bc15 ♻️ Refactor cocurrency model on backend
Mainly the followin changes:

- Pass majority of code to the old and plain synchronous style
  and start using virtual threads for the RPC (and partially some
  HTTP server middlewares).
- Make some improvements on how CLIMIT is handled, simplifying code
- Improve considerably performance reducing the reflection and
  unnecesary funcion calls on the whole stack-trace of an RPC call.
- Improve efficiency reducing considerably the total threads number.
2023-03-14 12:30:27 +01:00
Andrey Antukh
2e717882f1 ♻️ Refactor websockets impl to use virtual threads
Removing the use of core.async code and implement code using
plain old and familiar synchronous code
2023-03-14 12:30:27 +01:00
Andrey Antukh
14b53a4d5e Don't log duplicate traceback 2023-03-14 12:30:27 +01:00
Andrey Antukh
04b321caae Add several improvements to internal worker impl
Mainly for make the cron jobs do not block the scheduled executor
and offload all work to a separate threads
2023-03-14 12:30:27 +01:00
Andrey Antukh
cad1851e95 🔥 Replace own scheduled executor with the one defined in promesa lib 2023-03-14 12:30:27 +01:00
Andrey Antukh
012ead65b5 🎉 Add missing ::us/atom global spec 2023-03-14 12:30:27 +01:00
Andrey Antukh
d549fcb2ae 🐛 Pass a valid executor instance to yetti http server 2023-03-14 12:30:27 +01:00
Andrey Antukh
4c85e55176 📎 Improve tests performance making all tables as unlogged 2023-03-14 12:30:27 +01:00
Andrey Antukh
1eb593703f 📎 Update clj-kondo config 2023-03-14 12:30:27 +01:00
Andrey Antukh
771fc1788c 📎 Update backend repl script 2023-03-14 12:30:27 +01:00
Andrey Antukh
ae9886080e 📎 Add better database configuration for devenv 2023-03-14 12:30:27 +01:00
Andrey Antukh
d76baa3266 ⬆️ Update promesa dependency
And adapt all code for breaking changes
2023-03-14 12:30:27 +01:00
Alejandro
37b20571d2 Merge pull request #3041 from penpot/azazeln28-improve-scale-matrix
Improve scale matrix
2023-03-14 12:27:32 +01:00
Alejandro
4661fb26dc Merge pull request #3039 from penpot/alotor-fix-text-sync
Fix text sync problems
2023-03-14 12:22:14 +01:00
Eva
adffdb31f3 Add css variables and theme switch 2023-03-14 11:48:31 +01:00
Aitor
b9559d99da Improve scale matrix computation 2023-03-14 11:24:15 +01:00
alonso.torres
aa4a3ef940 🐛 Fix apply structure modifiers to children 2023-03-14 11:02:11 +01:00
alonso.torres
3a2e1b5c94 Adapt scale to flex elements 2023-03-14 11:02:10 +01:00
Aitor
44c35e6aee 🐛 Fix scaling frame proportionally 2023-03-14 11:01:57 +01:00
alonso.torres
a56dc25fae 🐛 Fix problems with text synchronization 2023-03-13 13:15:36 +01:00
Pablo Alba
4eeef41ed4 🐛 Fix flex layout gaps showing for nested items 2023-03-13 11:52:00 +01:00
Alejandro Alonso
b77f85b697 📎 Prepare new development cycle 2023-03-13 10:39:58 +01:00
Alejandro Alonso
9cd207595f 📎 Prepare new development cycle 2023-03-13 10:37:34 +01:00
Alejandro
c21e0739f2 Merge pull request #3037 from penpot/alotor-bugfixes-3
Bug fixes
2023-03-13 10:34:35 +01:00
alonso.torres
83367dd519 🐛 Fix viewer layers styles 2023-03-13 10:30:12 +01:00
alonso.torres
0d9695de1d 🐛 Fix shortcuts for zoom now take into account the mouse position 2023-03-13 10:30:12 +01:00
alonso.torres
468e61e1e0 🐛 Fix snap pixel when moving path points on high zoom 2023-03-13 10:30:12 +01:00
alonso.torres
481e9b0d32 🐛 Fix unlink library color when blur color picker input 2023-03-13 10:30:12 +01:00
alonso.torres
ce85a1b1d5 🐛 Fix problem with text editor in Safari 2023-03-13 10:22:57 +01:00
Alejandro Alonso
da74d0d732 🐛 Fix viewer wrong translations 2023-03-13 10:21:53 +01:00
Pablo Alba
e6306e5109 Add visualization and mouse control to paddings, margins and gaps in frames with layout 2023-03-10 13:59:50 +01:00
Alejandro
5fae9526d6 Merge pull request #3028 from penpot/alotor-bugfixes-fixes
Fixes after QA revision
2023-03-09 17:39:23 +01:00
alonso.torres
37f52cafc9 🐛 Fix problem with rules when changing pages 2023-03-09 17:28:21 +01:00
alonso.torres
2a632512b3 🐛 Fix select in area of hidden children elements 2023-03-09 16:15:11 +01:00
alonso.torres
079cff0bc0 🐛 Fix problem with undo transactions 2023-03-09 15:53:10 +01:00
Alejandro
7954ad0edf Merge pull request #3025 from penpot/alotor-bugfixes2
Bug fixes
2023-03-09 13:21:32 +01:00
alonso.torres
2500d192e8 🐛 Changed the text dominant-baseline to use ideographic 2023-03-09 10:57:49 +01:00
Pablo Alba
480a72b6e2 🐛 Fix paddings and gaps prediction on create layout 2023-03-09 09:25:10 +01:00
alonso.torres
b2c3dc1504 🐛 Fix problem when loading fonts 2023-03-08 15:22:31 +01:00
alonso.torres
e170011e3c 🐛 Fix problem on selection numeric inputs on Firefox 2023-03-08 15:22:31 +01:00
alonso.torres
f3f611848c 🐛 Improve deeps selection of nested arboards 2023-03-08 15:22:31 +01:00
Alejandro Alonso
c3ce0eb794 Merge remote-tracking branch 'origin/staging' into develop 2023-03-08 07:25:19 +01:00
alonso.torres
1643287775 🐛 Fix problem with area selection 2023-03-07 15:55:39 +01:00
Alejandro Alonso
9e35229ebd 🐛 Fix components texts not displayed in assets panel 2023-03-07 15:22:24 +01:00
alonso.torres
046bd59726 🐛 Fix style for absolute positioning 2023-03-07 14:16:42 +01:00
Alejandro
e8027d3316 Merge pull request #3010 from penpot/niwinz-docker-frontend-2
🐳 Add backend and exporter uri env vars to frontend docker image
2023-03-07 13:08:59 +01:00
Andrey Antukh
ad34ebff89 🐳 Add backend and exporter uri env vars to frontend docker image 2023-03-07 13:08:38 +01:00
Alvaro Araoz
0ead390ef4 🌐 Add translations for: Spanish.
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/
2023-03-07 12:37:50 +01:00
Pablo Hinojosa
aefa73a06f 🌐 Add translations for: Spanish.
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/
2023-03-07 12:37:50 +01:00
Alejandro Alonso
f733497f0f 🐛 Fix some typos on english translation 2023-03-07 10:57:37 +01:00
Alejandro Alonso
ed917fa194 🐛 Fix font translations not detected as markdown 2023-03-07 10:57:37 +01:00
Alejandro Alonso
313df74202 🐛 Fix handle correctly slashes in emails 2023-03-07 10:51:31 +01:00
Alejandro
db7c234053 Merge pull request #3019 from penpot/alotor-bugfixes
Alotor bugfixes
2023-03-07 10:49:57 +01:00
Alejandro Alonso
91c12ca34f 🐛 Fix change colors from selected colors 2023-03-07 10:42:58 +01:00
Alejandro Alonso
9f66e8e5d1 🐛 Fix search field shared styles 2023-03-07 10:37:11 +01:00
alonso.torres
b5be938480 🐛 Improve behavior for undo on text edition 2023-03-07 09:11:51 +01:00
alonso.torres
36583d1171 🐛 Allow selection of empty board by partial rect 2023-03-06 16:27:50 +01:00
alonso.torres
05e13ad05f 🐛 Fix problem when undoing multiple selected colors 2023-03-06 16:27:50 +01:00
alonso.torres
475ce08d3e 🐛 Fix selecting children from hidden parent layers 2023-03-06 16:27:50 +01:00
alonso.torres
6962e15b6d 🐛 Fix error streen when uploading wrong SVG 2023-03-06 16:27:50 +01:00
alonso.torres
7b72906096 🐛 Fix problem on finalize page 2023-03-06 16:27:13 +01:00
Eva Marco
9d43bb4252 Merge pull request #3011 from penpot/alotor-poc-css-modules
 Adds CSS modules to the build pipeline
2023-03-06 15:59:13 +01:00
alonso.torres
7dd24bb79b Merge remote-tracking branch 'origin/staging' into develop 2023-03-06 14:52:43 +01:00
Alejandro
82e402c271 Merge pull request #3012 from penpot/alotor-bug-redo
🐛 Fix problem with redo shortcut
2023-03-06 14:37:28 +01:00
alonso.torres
827ce6c42a 🐛 Fix problem with redo shortcut 2023-03-06 14:23:26 +01:00
alonso.torres
94a98a1866 Adds CSS modules to the build pipeline 2023-03-06 14:20:18 +01:00
Alejandro
0e585cd585 Merge pull request #3002 from penpot/alotor-fixes-rules
🐛 Fix problem with rules position on changing pages
2023-03-06 09:56:50 +01:00
alonso.torres
cd505ecced 🐛 Fix problem with rules position on changing pages 2023-03-03 14:20:53 +01:00
Alejandro
c8360b1994 Merge pull request #2996 from penpot/alotor-grid-layout
Partial merge of the grid layout infrastructure
2023-03-03 11:15:32 +01:00
alonso.torres
a12baf684c Review fixes 2023-03-03 10:53:46 +01:00
Alejandro Alonso
910352280c Merge remote-tracking branch 'origin/staging' into develop 2023-03-03 10:36:29 +01:00
Alejandro Alonso
dec854a012 🐛 Fix full screen not clickable on inspect mode after user entered full screen 2023-03-03 10:31:04 +01:00
Alejandro
03d4e97ad7 Merge pull request #2997 from penpot/alotor-fix-shadow-multi-selection
🐛 Fix problem withs shadows and blur on multiple selection
2023-03-02 16:35:24 +01:00
alonso.torres
e061ba8123 🐛 Fix problem with shadows and blur on multiple selection 2023-03-02 16:32:21 +01:00
alonso.torres
23104b28b6 Edition mode for grid 2023-03-02 14:05:51 +01:00
alonso.torres
b497de0dae UI Integration 2023-03-02 13:56:11 +01:00
Eva
284fc2acbc Add grid cell options 2023-03-02 13:56:11 +01:00
Eva
cc8347a871 Add options to sidebar 2023-03-02 13:56:11 +01:00
alonso.torres
eb425dc4f2 Edit cell panel 2023-03-02 13:56:11 +01:00
alonso.torres
4b7e93ab84 First draft of cell display 2023-03-02 13:56:11 +01:00
alonso.torres
6f99209a62 Grid layout editor interface 2023-03-02 13:51:41 +01:00
alonso.torres
a0cd94cfae Grid layout infrastructure 2023-03-02 13:51:27 +01:00
alonso.torres
2030f987db Performance improvements 2023-03-01 16:38:09 +01:00
Alejandro Alonso
94e87f8a7d Merge remote-tracking branch 'origin/staging' into develop 2023-03-01 16:08:57 +01:00
Alejandro Alonso
9a272f69c7 🐛 Fix height 100% cropped 2023-03-01 14:19:48 +01:00
Alejandro Alonso
fc1f2b2a9f 🐛 Fix some layout tooltips cropped 2023-03-01 14:19:48 +01:00
Alejandro Alonso
89fbe28ed1 🐛 Fix wrap and nowrap spelling issues 2023-03-01 14:19:48 +01:00
Alejandro Alonso
216d101e56 🐛 Fix flex layout min height bigger than board when height is 100% 2023-03-01 14:19:48 +01:00
Aitor
e57262136c Scale content now scales strokes, shadows, blur and corners 2023-03-01 14:11:03 +01:00
Alejandro
0b9bef066b Merge pull request #2989 from penpot/alotor-fix-position-absolute-auto
Fix position absolute auto
2023-03-01 08:38:43 +01:00
alonso.torres
4111cee3d6 🐛 Fix clipping overlay 2023-02-28 15:22:04 +01:00
alonso.torres
0ef5a37e33 🐛 Allow set position when position absolute 2023-02-28 15:22:04 +01:00
alonso.torres
8b5a36a49f 🐛 Fix problem with auto layout an absolute positioning 2023-02-28 15:22:04 +01:00
Eva
c6d1f80af2 🐛 Fix toggle collapse layer icon 2023-02-28 13:09:43 +01:00
Alejandro Alonso
b73b40b23c Merge remote-tracking branch 'origin/staging' into develop 2023-02-28 10:53:09 +01:00
Alejandro Alonso
ccf91a129c 🐛 Fix custom fonts not rendered correctly 2023-02-28 10:43:59 +01:00
Alejandro
1f3f6ce1e9 Merge pull request #2980 from penpot/eva-fix-paste-nested-boards
🐛 Fix copy paste a very nested boards inside itself
2023-02-28 09:51:21 +01:00
Eva
8f2e3d5fe4 🐛 Fix copy paste a very nested boards inside itself 2023-02-28 09:51:12 +01:00
Alejandro
b581752bd5 Merge pull request #2981 from penpot/alotor-small-fixes-flex
🐛 Fix problem when moving absolute positioned element
2023-02-28 09:46:06 +01:00
Alejandro
47481986a1 Merge pull request #2987 from penpot/alotor-fix-layout-from-selected
🐛 Fix problem when creating layout from selection
2023-02-28 09:40:18 +01:00
alonso.torres
9af0e6ca44 🐛 Fix problem when creating layout from selection 2023-02-27 16:43:59 +01:00
Alejandro Alonso
9c419ef114 Merge remote-tracking branch 'origin/staging' into develop 2023-02-27 10:39:11 +01:00
Alejandro Alonso
24fa4f71ad 📎 Update version.txt file 2023-02-27 10:37:39 +01:00
Andrey Antukh
fa21dc4cf9 📎 Fix tests 2023-02-25 10:35:00 +01:00
Andrey Antukh
9b5a321a62 📎 Fix tests 2023-02-25 10:24:41 +01:00
Andrey Antukh
738cf6407c 📎 Fix liner issue 2023-02-25 10:24:22 +01:00
Andrey Antukh
1d21ee7089 Merge remote-tracking branch 'origin/staging' into develop 2023-02-24 18:30:05 +01:00
Alejandro
2460f36bab Merge pull request #2983 from penpot/niwinz-invitations-fixes
Fix issues with invitation user flow
2023-02-24 15:50:40 +01:00
Andrey Antukh
4d627f8993 🐛 Fix incorrect invitation flow 2023-02-24 15:44:29 +01:00
Andrey Antukh
7771467aa0 🐛 Fix missing member-id field on invitation copy-link 2023-02-24 15:41:15 +01:00
Andrey Antukh
01b361fd3c Fix minor issue on contributing.md rendering output 2023-02-24 14:58:56 +01:00
alonso.torres
4d46460f90 🐛 Fix problem when moving absolute positioned element 2023-02-24 14:26:33 +01:00
alonso.torres
e9942e5527 🐛 Fix position absolute showing on first-level flex containers 2023-02-24 13:18:21 +01:00
Alejandro
8aa0e96377 Merge pull request #2979 from penpot/alotor-small-fixes-absolute
🐛 Fix problems with position absolute
2023-02-24 12:05:56 +01:00
alonso.torres
a12fce1c1f Change names for flex items 2023-02-24 11:24:23 +01:00
alonso.torres
e9d50eb10d 🐛 Fix problems with position absolute 2023-02-24 10:57:56 +01:00
Alejandro
0e97182ef0 Merge pull request #2977 from penpot/niwinz-invitations-1
 Add proper audit log for invitations
2023-02-24 10:57:13 +01:00
Andrey Antukh
f0c0e5e43a Add proper audit log for invitations 2023-02-24 10:28:07 +01:00
Alejandro
8c618f95f7 Merge pull request #2976 from penpot/alotor-flex-position-absolute
Flex position absolute & z-index
2023-02-24 07:42:43 +01:00
alonso.torres
d309628e1d Add z-index option to flex items elements 2023-02-24 07:37:37 +01:00
alonso.torres
f3f1dbc2d1 Allow for absolute positioned elements inside layout 2023-02-24 07:37:35 +01:00
alonso.torres
664f73b8a5 🐛 Fix problem when converting an empty frame to layout 2023-02-24 07:37:11 +01:00
Alejandro
94f2681223 Merge pull request #2970 from penpot/palba-layout-padding-display
 Add visualization and mouse control to paddings in frames with layout
2023-02-24 07:32:48 +01:00
Eva
a182ca3ab7 🚑 Fix CI 2023-02-23 11:03:54 +01:00
Ondřej Konečný
be865af1fc ♻️ connect values with variables in CSS and remove unused code
Signed-off-by: Ondřej Konečný <ondrej.konecny@gmail.com>
2023-02-23 10:58:27 +01:00
Prithvi Tharun
c6ad8ee110 Improves tooltip content for Corner and Padding options (#2971)
Improves tooltip content for Corner and Padding options

Closes #2964

Signed-off-by: Prithvi Tharun <ptrithu8@gmail.com>
2023-02-23 10:41:43 +01:00
Alex Howell
b814a8821c 🌐 Add translations for: Romanian.
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2023-02-22 19:37:28 +01:00
Pablo Alba
4d90d36225 Add visualization and mouse control to paddings in frames with layout 2023-02-22 17:19:29 +01:00
Alejandro
fd673b39a4 Merge pull request #2959 from penpot/azazeln28-visual-feedback-scale-k
 add visual feedback to scale text
2023-02-22 12:39:19 +01:00
Aitor
1758b34eed add visual feedback to scale text 2023-02-22 12:38:55 +01:00
Alejandro Alonso
16bd5e2ebc Merge remote-tracking branch 'origin/staging' into develop 2023-02-22 11:48:41 +01:00
Alejandro
475b6ff6e0 Merge pull request #2969 from penpot/alotor-fix-redo-curve-tool
🐛 Fix problem with redo curve drawings
2023-02-22 11:25:40 +01:00
alonso.torres
a1f41c80a2 🐛 Fix problem with redo curve drawings 2023-02-22 10:43:51 +01:00
Eva Marco
4297b6fda8 Merge pull request #2968 from penpot/alotor-bug-width-fill
🐛 Fix problem with align center and width 100%
2023-02-21 16:25:08 +01:00
Eva
c892411484 📎 Update changes file 2023-02-21 15:56:23 +01:00
alonso.torres
28dce3cc8b 🐛 Fix problem with align center and width 100% 2023-02-21 15:44:13 +01:00
Locness
9dead29ac3 🌐 Add translations for: French.
Currently translated at 85.6% (1014 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-02-20 22:39:47 +01:00
Aitor
96ce475206 Merge pull request #2952 from penpot/eva-ally-context-3
Add new accessibility functionality to the dashboard
2023-02-20 13:30:42 +01:00
Andrey Antukh
788dc9b3f8 Merge branch 'staging' into develop 2023-02-20 13:29:03 +01:00
Andrey Antukh
3c650ae47e Merge branch 'main' into staging 2023-02-20 13:28:51 +01:00
Andrey Antukh
80af0bb148 Merge branch 'main' into develop 2023-02-20 13:28:01 +01:00
Eva
fcb8b15ef2 Add new accessibility functionalities to dashboard 2023-02-17 15:17:24 +01:00
Alejandro
1806200613 Merge pull request #2947 from penpot/alotor-performance-improvement
 Performance improvement
2023-02-16 09:38:05 +01:00
alonso.torres
ed22e2c6d1 Performance improvement 2023-02-15 15:17:50 +01:00
Alejandro
0487539b23 Merge pull request #2946 from penpot/alotor-bug-new-frame
🐛 Fix problem with new frame inside layout
2023-02-15 13:48:57 +01:00
Alejandro
9e190d9810 Merge pull request #2945 from penpot/palba-layout-predictive-gap2
 Adds paddings and gaps prediction on layout creation
2023-02-15 13:43:01 +01:00
alonso.torres
fd15ff940f 🐛 Fix problem with new frame inside layout 2023-02-15 13:38:03 +01:00
Pablo Alba
85a47e36b5 Adds paddings and gaps prediction on layout creation 2023-02-15 12:42:23 +01:00
Alejandro
ece6193260 Merge pull request #2939 from penpot/palba-fix-undo-duplicate-with-alt
Fix duplicate with alt and undo only undo one step
2023-02-15 12:21:00 +01:00
Pablo Alba
813a188e24 🐛 Fix duplicate with alt and undo only undo one step 2023-02-15 12:20:47 +01:00
Alejandro
0f07def536 Merge pull request #2940 from penpot/alotor-layout-improvements
 Add space-evenly option
2023-02-15 12:08:36 +01:00
alonso.torres
490f5f19f1 Add space-evenly option 2023-02-15 12:08:22 +01:00
Alejandro
b3216000fd Merge pull request #2941 from penpot/alotor-fix-frame-opacity
🐛 Fix problem with opacity in frames
2023-02-15 11:57:10 +01:00
Alejandro
2ef3e4b325 Merge pull request #2944 from penpot/alotor-fix-unhandled-error
🐛 Fix crash when resizing frame
2023-02-15 11:49:17 +01:00
alonso.torres
70edd2c290 🐛 Fix crash when resizing frame 2023-02-15 09:59:28 +01:00
alonso.torres
02543b1a4f 🐛 Fix problem with opacity in frames 2023-02-14 17:54:51 +01:00
Alex Howell
0dac87f2bc 🌐 Add translations for: Romanian.
Currently translated at 98.6% (1168 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2023-02-13 20:36:42 +01:00
Alejandro
4852882c28 Merge pull request #2938 from penpot/alotor-fix-size-auto-center-align
🐛 Fix problem with align center and size auto
2023-02-13 16:58:15 +01:00
Alejandro
094556926e Merge pull request #2932 from penpot/eva-change-onboarding-images
💄 Update onboarding images with new style
2023-02-13 16:54:23 +01:00
alonso.torres
f3c5aed5d0 🐛 Fix problem with align center and size auto 2023-02-13 16:47:28 +01:00
Renan Castro
e4b17bdbcf 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2023-02-12 03:37:37 +01:00
Andrey Antukh
c0eb20d31d 🐛 Add missing require on rpc ns 2023-02-11 00:59:08 +01:00
Andrey Antukh
f23d29deb7 🐛 Fix unexpected exception on logger caused by log4j2 plugin 2023-02-11 00:52:23 +01:00
Vin
28b0a8f7d7 🌐 Add translations for: Russian.
Currently translated at 64.3% (762 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2023-02-10 22:35:42 +01:00
alonso.torres
cdd268afbc Merge remote-tracking branch 'origin/staging' into develop 2023-02-10 15:06:23 +01:00
Andrey Antukh
1ed3b3cf75 📎 Add missing restart policy to some containers
on default compose file
2023-02-10 14:07:12 +01:00
Eva
1637e82018 💄 Update onboarding images with new style 2023-02-10 13:52:53 +01:00
Andrey Antukh
c467d04d50 🐛 Fix permission issue on docker images 2023-02-10 13:37:33 +01:00
Andrey Antukh
8d19c067e8 🐛 Fix incorrect mountpoint on docker compose 2023-02-10 13:23:22 +01:00
Alejandro
a99fb7ada3 Merge pull request #2922 from penpot/palba-fix-middle-button-drags-guides
🐛 Fix middle button panning can drag guides
2023-02-09 14:27:28 +01:00
Alejandro
2f1d1a6c41 Merge pull request #2921 from penpot/eva-fix-invite-members-btn
🐛 Fix invite members text on modal button
2023-02-09 14:23:40 +01:00
Eva
7f963edf9e 🐛 Fix invite members text on modal button 2023-02-09 13:51:43 +01:00
Eva Marco
9c99d86e08 Merge pull request #2927 from penpot/alotor-fix-auto-size
Fix auto size
2023-02-09 13:51:03 +01:00
Eva
6a5bfdd7fb ❤️ Add thanks for ondrejkonec 2023-02-09 13:36:26 +01:00
Ondřej Konečný
a98ba72c12 added width property to avoid shrinking on icons 2023-02-09 13:33:06 +01:00
Eva Marco
b2b224e5a7 Merge pull request #2923 from ondrejkonec/BUG-fix-icon-resizing-on-small-displays
🐛 Add min-width property to avoid shrinking on icons
2023-02-09 13:17:34 +01:00
alonso.torres
ee42dd8b01 🐛 Fix layout on multiple selection 2023-02-09 11:18:37 +01:00
alonso.torres
da209b7507 🐛 Fix problem with auto sizes 2023-02-09 10:41:18 +01:00
Pablo Alba
d49e1f1641 🐛 Fix middle button panning can drag guides 2023-02-09 08:53:42 +01:00
Stas Haas
f9c964b65e 🌐 Add translations for: German.
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-02-08 15:36:48 +01:00
Ondřej Konečný
4b9d6fc794 added width property to avoid shrinking on icons 2023-02-08 12:16:34 +01:00
Pablo Alba
8e35ad0f7f Merge pull request #2896 from penpot/eva-bugfixing-6
🐛 Fix paste a frame inside itself
2023-02-08 12:16:09 +01:00
Eva
be3a973d09 🐛 Fix paste a frame inside itself 2023-02-08 12:01:11 +01:00
Pablo Alba
c3c6e533e3 Merge pull request #2903 from ondrejkonec/a11y-udpate-change-hover-color-for-zoom-widget-button
 Added darker color for hover button in zoom widget to improve a11y
2023-02-08 11:40:38 +01:00
Pablo Alba
af30df58dc Merge pull request #2902 from glippi/drop-shadow-negative-spread
 Allow negative values for shadow spread
2023-02-08 11:31:23 +01:00
Andrey Antukh
78aea0f24e 🐛 Fix incorrect props cleaning on auditlog 2023-02-08 10:35:57 +01:00
Alejandro
3587362c4a Merge pull request #2909 from penpot/niwinz-refactor-remove-legacy
🔥 Remove legacy code and internal refactor of storage module
2023-02-08 10:34:18 +01:00
Andrey Antukh
06a30316c2 🐛 Fix logging initialization on exporter 2023-02-07 19:10:57 +01:00
Andrey Antukh
8161d3ae09 🐛 Fix incorrect props cleaning on auditlog 2023-02-07 18:38:54 +01:00
Andrey Antukh
ea470068bb ⬆️ Update jdk and postgresql-client on devenv 2023-02-07 18:17:36 +01:00
Andrey Antukh
e3378181ee 📎 Update docker log4j config 2023-02-07 18:17:08 +01:00
Andrey Antukh
9162f0e1fd 🐛 Fix auth flag handling on rpc metadata 2023-02-07 18:16:55 +01:00
Andrey Antukh
69556f19ac Add more logging to OIDC providers 2023-02-07 18:16:55 +01:00
Andrey Antukh
ab3b9cba45 ♻️ Refactor storage and assets related modules
- improve internal error handling
- add more specs and more asserts
2023-02-07 18:16:55 +01:00
Andrey Antukh
4b4f78b4cc Add minor change to srepl module options
Replace unqualified attrs with fully qualified
2023-02-07 18:16:55 +01:00
Andrey Antukh
0c48f76911 Add better spec validation on http module 2023-02-07 18:16:55 +01:00
Andrey Antukh
3cf4a3facc Improve db/pool initialization and reusability 2023-02-07 18:16:55 +01:00
Andrey Antukh
41d34de9e1 🔥 Remove zmq mentions on devenv log4j config 2023-02-07 18:16:55 +01:00
Andrey Antukh
dfdebc35c8 💄 Improve readability on error report templates 2023-02-07 18:16:55 +01:00
Andrey Antukh
bd2745d1fe ♻️ Clean email related namespaces
- Remove legacy and outdated mjml directory
- Rename namespace to a proper name
- Add more specs
2023-02-07 18:16:55 +01:00
Andrey Antukh
64f2d874fe Merge remote-tracking branch 'origin/staging' into develop 2023-02-07 18:16:37 +01:00
Andrey Antukh
6e1ce62aad Merge branch 'staging' 2023-02-07 17:06:42 +01:00
Alejandro
070ea135e5 Merge pull request #2919 from penpot/niwinz-docker-oidc-fixes
🐛 Docker & OIDC fixes
2023-02-07 16:56:22 +01:00
Andrey Antukh
5ae1fe5867 📎 Add nano editor to backend docker image 2023-02-07 16:50:58 +01:00
Andrey Antukh
eef2cba976 🐛 Fix incorrect registration flag handling on frontend
registration flag should not prevent include register on the
router because a registration process can be started from oidc
auth process
2023-02-07 16:50:52 +01:00
Andrey Antukh
1c4dcf1574 Add minor improvements to logging on docker images 2023-02-07 15:06:35 +01:00
Andrey Antukh
220b80799d Add more logging to OIDC providers 2023-02-07 14:49:12 +01:00
Andrey Antukh
58668c11f3 Merge remote-tracking branch 'origin/staging' into develop 2023-02-07 14:46:18 +01:00
elhombretecla
bab1a417df Update README.md 2023-02-07 11:55:32 +01:00
elhombretecla
b16718bfe4 Update README.md 2023-02-07 11:54:48 +01:00
elhombretecla
8f58bb4f2c Update README.md 2023-02-07 11:51:16 +01:00
elhombretecla
9cdb25344b Update README.md 2023-02-07 11:49:45 +01:00
Alejandro Alonso
22b6d4241d 📎 Update version.txt file 2023-02-07 11:47:50 +01:00
elhombretecla
96ce631784 review readme 2023-02-07 11:32:59 +01:00
Alejandro
fa02df7106 Merge pull request #2914 from penpot/alotor-small-fixes
Small fixes
2023-02-07 11:23:54 +01:00
Andrey Antukh
5d6462b2a7 🐛 Fix compatibility issues on docker upgrade path 2023-02-07 11:19:46 +01:00
Alejandro
3464842c1e Merge pull request #2917 from penpot/eva-bugfixing-7
🐛 Fix tooltips on left toolbar
2023-02-07 11:18:43 +01:00
Pablo Alba
d74af6ddc1 Revert "🐛 Fix line-height inconsistent"
This reverts commit 3974a4778a.
2023-02-07 11:18:01 +01:00
Alejandro
8cb33dc19c Merge pull request #2908 from penpot/niwinz-bugfix-oidc-autidiscover
🐛 Fix issue with oidc autodiscover
2023-02-07 11:16:00 +01:00
Eva
4912107fcc 🐛 Fix tooltips on left toolbar 2023-02-07 10:03:18 +01:00
alonso.torres
d5c7a6e547 🐛 Fix problem with auto-width and space-around 2023-02-07 00:17:16 +01:00
Andrey Antukh
f1085aadd1 🐛 Fix compatibility issues on docker upgrade path 2023-02-06 19:21:55 +01:00
alonso.torres
ca5b59f102 🐛 Fix sizing when moving shapes into/out of a layout 2023-02-06 17:50:59 +01:00
alonso.torres
a0898fbabd 🐛 Named redis volume 2023-02-06 17:00:42 +01:00
Yaron Shahrabani
bd5f19cbd0 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2023-02-06 16:38:02 +01:00
Fernando Krik
cf1fa99399 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 96.4% (1142 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2023-02-06 16:38:01 +01:00
Alvaro Araoz
4c3025ab24 🌐 Add translations for: Spanish.
Currently translated at 99.8% (1182 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/
2023-02-06 16:38:00 +01:00
Andrey Antukh
aaf332ed18 🐛 Fix issue with oidc autodiscover 2023-02-06 14:20:57 +01:00
Christian Clauss
b05ca4bb82 🐛 Fix undefined name RuntimeException on manage.py script
Python defines [`RuntimeError`](https://docs.python.org/3.7/library/exceptions.html#RuntimeError)
but it does not define `RuntimeException` so a `NameError` will be raised when any of these lines
are executed.

% `python3 -c "RuntimeException('This is a test...')"`
```
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'RuntimeException' is not defined
```

% `flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics`
```
./backend/scripts/manage.py:22:15: F821 undefined name 'RuntimeException'
        raise RuntimeException(f"invalid PREPL_URI: {PREPL_URI}")
              ^
./backend/scripts/manage.py:25:15: F821 undefined name 'RuntimeException'
        raise RuntimeException(f"invalid PREPL_URI: {PREPL_URI}")
              ^
./backend/scripts/manage.py:49:23: F821 undefined name 'RuntimeException'
                raise RuntimeException("unexpected response from PREPL")
                      ^
3     F821 undefined name 'RuntimeException'
3
```
2023-02-05 11:19:41 +01:00
Christian Clauss
b46b23b027 🐛 Fix undefined name RuntimeException on manage.py script
Python defines [`RuntimeError`](https://docs.python.org/3.7/library/exceptions.html#RuntimeError)
but it does not define `RuntimeException` so a `NameError` will be raised when any of these lines
are executed.

% `python3 -c "RuntimeException('This is a test...')"`
```
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'RuntimeException' is not defined
```

% `flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics`
```
./backend/scripts/manage.py:22:15: F821 undefined name 'RuntimeException'
        raise RuntimeException(f"invalid PREPL_URI: {PREPL_URI}")
              ^
./backend/scripts/manage.py:25:15: F821 undefined name 'RuntimeException'
        raise RuntimeException(f"invalid PREPL_URI: {PREPL_URI}")
              ^
./backend/scripts/manage.py:49:23: F821 undefined name 'RuntimeException'
                raise RuntimeException("unexpected response from PREPL")
                      ^
3     F821 undefined name 'RuntimeException'
3
```
2023-02-05 11:19:28 +01:00
Andrey Antukh
01d463b4aa Merge branch 'cclauss-patch-1' into develop 2023-02-05 11:19:12 +01:00
Christian Clauss
58001f367a 🐛 Fix undefined name RuntimeException on manage.py script
Python defines [`RuntimeError`](https://docs.python.org/3.7/library/exceptions.html#RuntimeError)
but it does not define `RuntimeException` so a `NameError` will be raised when any of these lines
are executed.

% `python3 -c "RuntimeException('This is a test...')"`
```
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'RuntimeException' is not defined
```

% `flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics`
```
./backend/scripts/manage.py:22:15: F821 undefined name 'RuntimeException'
        raise RuntimeException(f"invalid PREPL_URI: {PREPL_URI}")
              ^
./backend/scripts/manage.py:25:15: F821 undefined name 'RuntimeException'
        raise RuntimeException(f"invalid PREPL_URI: {PREPL_URI}")
              ^
./backend/scripts/manage.py:49:23: F821 undefined name 'RuntimeException'
                raise RuntimeException("unexpected response from PREPL")
                      ^
3     F821 undefined name 'RuntimeException'
3
```
2023-02-05 11:18:01 +01:00
Mario Bašić
29c0190b7a 🐛 Add mailcatch to penpot network on docker compose
Without this the backend complains that it cannot connect to the smtp host (when using mailcatcher). The reason is because the mailcatcher is not on the same network as the backend application.
2023-02-05 11:16:34 +01:00
Mario Bašić
f1b09e763e 🐛 Add mailcatch to penpot network on docker compose
Without this the backend complains that it cannot connect to the smtp host (when using mailcatcher). The reason is because the mailcatcher is not on the same network as the backend application.
2023-02-05 11:16:07 +01:00
Andrey Antukh
517210eeb5 Merge branch 'mabasic-patch-1' into develop 2023-02-05 11:15:49 +01:00
Mario Bašić
22034c22c6 🐛 Add mailcatch to penpot network on docker compose
Without this the backend complains that it cannot connect to the smtp host (when using mailcatcher). The reason is because the mailcatcher is not on the same network as the backend application.
2023-02-05 11:15:01 +01:00
im424
33a67bc61c 🌐 Add translations for: Chinese (Traditional).
Currently translated at 52.5% (622 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2023-02-04 12:38:27 +01:00
Yaron Shahrabani
b0e89ed563 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2023-02-04 12:38:27 +01:00
Stas Haas
5eb08d9c4e 🌐 Add translations for: German.
Currently translated at 99.4% (1177 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-02-04 12:38:26 +01:00
Dias Stebanäk
59ec8c5c78 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 93.6% (1109 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2023-02-04 12:38:25 +01:00
Ondřej Konečný
9fae26765a added darker color for hover button in zoom widget to improve a11y 2023-02-03 13:19:21 +01:00
Alejandro
2e5e772392 Merge pull request #2900 from penpot/alotor-fix-space-around-bounds
🐛 Fix problem with space-around
2023-02-02 19:47:41 +01:00
alonso.torres
ecd4bb54c9 🐛 Fix problem with space-around 2023-02-02 19:31:02 +01:00
Alejandro Alonso
3cfc432c23 Merge remote-tracking branch 'origin/staging' 2023-02-02 18:07:20 +01:00
Alejandro Alonso
2ea81c0114 Merge remote-tracking branch 'origin/staging' into develop 2023-02-02 18:06:59 +01:00
Alejandro
a4cef16ef2 Merge pull request #2895 from penpot/niwinz-refactor-logging
♻️ Refactor logging and error reporting
2023-02-02 18:05:47 +01:00
Alejandro
e426425cb5 Merge pull request #2898 from penpot/alotor-fix-safari-thumbnails
🐛 Temporary deactivate thumbnails in Safari
2023-02-02 17:37:25 +01:00
alonso.torres
3a0cc63fa7 🐛 Temporary deactivate thumbnails in Safari 2023-02-02 17:32:12 +01:00
Alejandro
88a8370e8d Merge pull request #2897 from penpot/alotor-pro-fixes
Fixes
2023-02-02 16:08:30 +01:00
alonso.torres
e8972dd802 🐛 Fix problem with thumbnail updating 2023-02-02 15:34:35 +01:00
Andrey Antukh
1325e46192 Improve internal state validation on db module 2023-02-02 14:20:13 +01:00
Andrey Antukh
071ecca875 🐛 Fix internal executor naming issue 2023-02-02 13:38:04 +01:00
Andrey Antukh
d91e6e381e 🔧 Do not compile clj source (allow dynamic instrumentation on runtime) 2023-02-02 13:38:04 +01:00
Andrey Antukh
b54bf2bba4 📎 Add helpers for instrumenting vars 2023-02-02 13:38:04 +01:00
Andrey Antukh
32b8a2c243 ⬆️ Update dependencies on backend and common 2023-02-02 13:38:04 +01:00
Andrey Antukh
bb055a3c84 ♻️ Refactor logging subsystem and error reporting 2023-02-02 13:38:04 +01:00
alonso.torres
3e52bef6d4 🐛 Fix problem with multiple selection of layout items 2023-02-02 13:37:34 +01:00
alonso.torres
7c215dc11b 🐛 Align-items center/end weren't respected when layout was outside bounds 2023-02-02 13:37:34 +01:00
alonso.torres
48c3e3e00b 🐛 Fix problem with Safari canvas behavior 2023-02-02 13:37:34 +01:00
Alejandro
412dcae01a Merge pull request #2894 from penpot/fix-social-urls
🐛 Fix social links broken
2023-02-02 13:20:25 +01:00
Pablo Alba
cc5f245209 🐛 Fix social links broken 2023-02-02 13:13:24 +01:00
Alejandro
dc4aabe263 Merge pull request #2893 from penpot/palba-fix-can-move-shape-with-lens-zoom
🐛 Fix can move shape with lens zoom active
2023-02-02 13:12:34 +01:00
Pablo Alba
708a8ce27b 🐛 Fix can move shape with lens zoom active 2023-02-02 12:59:02 +01:00
Alejandro
7c1d9ce06f Merge pull request #2892 from penpot/alotor-fix-safari-problem
🐛 Fix problem with thumbnails in safari
2023-02-02 11:36:19 +01:00
Aitor
b0cbf09950 Merge pull request #2885 from penpot/eva-bugfixing-5
Some bug fixing
2023-02-02 11:33:25 +01:00
Aitor
f31bc7457f Merge branch 'staging' into eva-bugfixing-5 2023-02-02 11:31:49 +01:00
alonso.torres
e47ce3235e 🐛 Fix problem with thumbnails in safari 2023-02-02 11:31:10 +01:00
Alejandro
fe76e0fab6 Merge pull request #2884 from penpot/alotor-post-release-fixes
Post release fixes
2023-02-02 11:22:53 +01:00
glippi
57a89b733e Allow negative values for shadow spread 2023-02-02 10:56:58 +01:00
Alejandro
297ba10e9d Merge pull request #2886 from penpot/hiru-dashboard-names
🐛 Fix weird numeration creating elements in dashboard
2023-02-02 10:51:26 +01:00
Andrés Moya
dd2321a37b 🐛 Fix weird numeration creating elements in dashboard 2023-02-02 10:19:36 +01:00
Eva
f98630a46b 🐛 Fix invitations input on team management and onboarding modal 2023-02-02 09:37:21 +01:00
Eva
82d6ba790c 🐛 Fix button spacing on delete account modal 2023-02-02 09:37:19 +01:00
Eva
575aec209c 🐛 Fix button spacing on delete acount modal 2023-02-02 09:37:00 +01:00
alonso.torres
00e265695c Change parent/children constraint for problematic configurations 2023-02-02 09:18:53 +01:00
alonso.torres
071ac0366c 🐛 Fix problem with max-size 0 2023-02-02 09:18:53 +01:00
alonso.torres
1a2a90f829 🐛 Fix problems with strange file 2023-02-02 09:18:53 +01:00
alonso.torres
028c084b22 🐛 Add limit to growth fill shapes to the bounds of the layout 2023-02-02 09:18:53 +01:00
alonso.torres
e7e80e99bd 🐛 Fix thumbnail not updating when changing pages 2023-02-02 09:18:53 +01:00
alonso.torres
70fa169d0d 🐛 Fix problem with selection on nested boards 2023-02-02 09:18:53 +01:00
Andrey Antukh
50ee0ad3fd Merge remote-tracking branch 'origin/staging' into develop 2023-02-01 23:25:25 +01:00
Alejandro
6be83fc6d6 Merge pull request #2889 from penpot/palba-fix-commad-z-in-mac
🐛 Fix typing CMD+Z on MacOS turns the cursor into a Zoom cursor
2023-02-01 22:45:26 +01:00
Pablo Alba
1e9ece43d0 🐛 Fix typing CMD+Z on MacOS turns the cursor into a Zoom cursor 2023-02-01 21:56:30 +01:00
Andrés Moya
b7c55b4700 💄 Move all README images to a subfolder 2023-02-01 21:09:17 +01:00
Alejandro
965c0d6fa2 Merge pull request #2888 from penpot/hiru-move-readme-images
💄 Move all README images to a subfolder
2023-02-01 20:40:14 +01:00
Andrés Moya
950d5dcc2f 💄 Move all README images to a subfolder 2023-02-01 19:31:12 +01:00
Andrey Antukh
43d034798c Merge branch 'staging' 2023-02-01 18:06:50 +01:00
Andrey Antukh
86712f977d 🐛 Skip unnecesary mutation events from audit log 2023-02-01 18:06:12 +01:00
im424
9f52da90c3 🌐 Add translations for: Chinese (Traditional).
Currently translated at 48.2% (571 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2023-02-01 17:38:09 +01:00
Linerly
fac6e8a20e 🌐 Add translations for: Indonesian.
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2023-02-01 17:38:09 +01:00
Stas Haas
38ebf9c3b4 🌐 Add translations for: German.
Currently translated at 99.1% (1174 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-02-01 17:38:08 +01:00
Andrey Antukh
6240323704 💄 Add minor cosmetic changes to common.spec ns 2023-02-01 16:39:59 +01:00
Andrey Antukh
d666564112 🐛 Fix loading issue on app.rpc ns 2023-02-01 16:39:59 +01:00
Andrey Antukh
f4d4559cd4 💄 Add cosmetic improvemnts on http client validation 2023-02-01 16:39:59 +01:00
Alejandro Alonso
e9c3b0567b Merge remote-tracking branch 'origin/staging' into develop 2023-02-01 13:24:39 +01:00
Alejandro Alonso
707e6c2a33 Merge remote-tracking branch 'origin/staging' 2023-02-01 13:12:34 +01:00
Alejandro
3dfd87eee1 Merge pull request #2883 from penpot/palba-fix-components-groups-names-in-list-mode
🐛 Fix components groups items show the component name in list mode
2023-02-01 10:41:33 +01:00
Alejandro
037ba19e87 Merge pull request #2882 from penpot/niwinz-webhooks-fix
🐛 Fix incorrect state management on webhooks crud
2023-02-01 10:38:33 +01:00
Pablo Alba
cdbab2c098 🐛 Fix components groups items show the component name in list mode 2023-02-01 10:23:51 +01:00
Andrey Antukh
e8ea61ee78 🐛 Fix incorrect state management on webhooks crud 2023-02-01 10:15:25 +01:00
Andrey Antukh
56cf7064f5 Merge remote-tracking branch 'origin/staging' into develop 2023-01-31 23:04:26 +01:00
Andrey Antukh
7ab91f68af Merge branch 'staging' 2023-01-31 23:02:22 +01:00
Andrey Antukh
91ececa59e 🐛 Fix backend flags on docker compose sample file 2023-01-31 23:01:58 +01:00
Andrey Antukh
8758723200 Merge pull request #2874 from penpot/niwinz-hotfix-1
🐛 Fix docker images issues in the latest release
2023-01-31 23:00:30 +01:00
Alejandro Alonso
8a968dc081 🐛 Fix upload team image 2023-01-31 22:29:05 +01:00
Andrey Antukh
f8cb505196 🐛 Fix arguments handling on docker/images/build.sh script 2023-01-31 19:48:41 +01:00
Andrey Antukh
14e3439cae 🔥 Remove admin mention from compose, still not working correctly 2023-01-31 19:08:38 +01:00
Andrey Antukh
7dd55c7f9d Revert JRE/JLINK changes from Dockerfile.backend file 2023-01-31 18:50:53 +01:00
Alejandro Alonso
e8e3398a74 🐛 Fix default nginx configuration for docker images 2023-01-31 17:42:28 +01:00
Alejandro Alonso
95cad24c18 Merge remote-tracking branch 'origin/staging' 2023-01-31 13:57:30 +01:00
Alejandro
d31138db72 Merge pull request #2868 from penpot/alotor-fix-layout-problems
Fix layout problems
2023-01-31 12:19:20 +01:00
Alejandro Alonso
2c5f35e192 🐛 Fix penpot.app urls 2023-01-31 12:10:06 +01:00
Alejandro Alonso
5a8f8ba349 🐛 Fix create team and invite 2023-01-31 12:09:13 +01:00
alonso.torres
3fe5cd3752 🐛 Fix problem when resizing layout to zero size 2023-01-31 12:07:17 +01:00
alonso.torres
da60911d81 🐛 Create new layouts without clip content 2023-01-31 12:03:23 +01:00
Alejandro Alonso
a905f49721 Merge remote-tracking branch 'origin/staging' into develop 2023-01-31 10:29:41 +01:00
Alejandro
f4f1f80050 Merge pull request #2864 from penpot/alotor-fix-hug-compacting
🐛 Fix problem with size 100% and auto parent
2023-01-31 10:29:06 +01:00
alonso.torres
18445ea5f4 🐛 Fix problem with size 100% and auto parent 2023-01-31 09:40:01 +01:00
Alejandro
2d28e02742 Merge pull request #2865 from penpot/superalex-fix-onboarding-poll
🐛 Fix onboarding poll
2023-01-31 09:30:32 +01:00
Alejandro Alonso
b0b963fb7c 🐛 Fix onboarding poll 2023-01-31 09:24:50 +01:00
im424
9328065954 🌐 Add translations for: Chinese (Traditional).
Currently translated at 43.4% (515 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2023-01-30 18:46:13 +01:00
nautilusx
c7a8d977ec 🌐 Add translations for: German.
Currently translated at 98.9% (1172 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-01-30 18:46:13 +01:00
Alejandro Alonso
5cfee13956 🐛 Remove beta word 2023-01-30 17:35:18 +01:00
Alejandro Alonso
11db7590eb Merge remote-tracking branch 'origin/staging' into develop 2023-01-30 15:39:17 +01:00
Alejandro
7271e98df3 Merge pull request #2862 from penpot/niwinz-multipart-encodign-bugfix
⬆️ Update yetti to v9.12
2023-01-30 15:38:44 +01:00
Andrey Antukh
f0386ef7b0 ⬆️ Update yetti to v9.12
Fixes encoding bug on multipart uploads
2023-01-30 15:29:53 +01:00
Alejandro
185cabb2fa Merge pull request #2861 from penpot/alotor-regenerate-empty-thumbnails
🐛 Try to refresh thumbnails on empty stored data in back
2023-01-30 14:05:57 +01:00
alonso.torres
3a19223264 🐛 Try to refresh thumbnails on empty stored data in back 2023-01-30 13:45:56 +01:00
Alejandro Alonso
2c38f31aa9 🐛 Fix clean archived auditlog 2023-01-30 13:11:50 +01:00
Andrés Moya
e1d1ecbc24 Merge remote-tracking branch 'origin/staging' into develop 2023-01-30 12:47:20 +01:00
Alejandro
a1dcb11261 Merge pull request #2860 from penpot/palba-fix-paste-texts-typos
🐛 Fix copy paste texts with typography assets linked
2023-01-30 12:32:32 +01:00
Pablo Alba
9f8d86a80e 🐛 Fix copy paste texts with typography assets linked 2023-01-30 12:26:31 +01:00
Alejandro Alonso
c59fc87fc4 🐛 Fix styling info at the libraries modal 2023-01-30 12:22:50 +01:00
Alejandro Alonso
3421e6ef57 🐛 Fix viewer misalignment when expanding code tab 2023-01-30 11:54:18 +01:00
Alejandro Alonso
40349c8ece 🐛 Fix line-height inconsistent 2023-01-30 11:44:20 +01:00
Alejandro
5a53376b01 Merge pull request #2859 from penpot/alotor-fix-code-generator-hangs
🐛 Fix problem with code view hanging
2023-01-30 11:18:55 +01:00
Alejandro
d4dfdaff57 Merge pull request #2854 from penpot/palba-fix-incorrect-state-after-undo-page-creation
🐛 Fix incorrect state after undo page creation
2023-01-30 11:14:17 +01:00
Pablo Alba
c7f87d0f26 🐛 Fix incorrect state after undo page creation 2023-01-30 11:13:59 +01:00
alonso.torres
c7954990f0 🐛 Fix problem with code view hanging 2023-01-30 11:13:05 +01:00
Alejandro
fe118819ce Merge pull request #2858 from penpot/info-release-1.17
Info release 1.17
2023-01-30 10:42:39 +01:00
Alejandro
073ec9ea2b Merge pull request #2856 from penpot/alotor-fix-transform-precision
🐛 Fix problem with transform when a coordinate was very close to …
2023-01-30 09:57:50 +01:00
Alejandro
f85a731969 Merge pull request #2855 from penpot/alotor-migration-fix-frame-id
🐛 Add migration to fix problem with frame-id
2023-01-30 09:39:18 +01:00
Alejandro
a3a88d7a0a Merge pull request #2850 from penpot/alotor-fix-frame-overlay
🐛 Fix frame overlays in workspace
2023-01-30 07:19:08 +01:00
Alejandro
1660dd634e Merge pull request #2857 from penpot/palba-fix-resend-invitation-doesnt-reset-expiration
🐛 Fix resend invitation doesn't reset the expiration date
2023-01-30 06:55:47 +01:00
im424
eb556fab10 🌐 Add translations for: Chinese (Traditional).
Currently translated at 35.5% (421 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hant/
2023-01-28 17:44:53 +01:00
Pablo Alba
6e698110d6 🐛 Fix resend invitation doesn't reset the expiration date 2023-01-27 16:56:19 +01:00
alonso.torres
951c67a2d5 🐛 Fix problem with transform when a coordinate was very close to zero 2023-01-27 16:09:44 +01:00
Alejandro
50b7337b8c Merge pull request #2852 from penpot/eva-bugfixing-4
Eva bugfixing 4
2023-01-27 15:07:20 +01:00
Eva
15e62ff649 🐛 Remove copy all button in fills and strokes 2023-01-27 14:58:53 +01:00
Eva
e7ddd6055f ♻️ Improve a case 2023-01-27 14:53:32 +01:00
Eva
aa3438f800 ♻️ Improve some functions 2023-01-27 14:53:31 +01:00
Eva
a45380a91c 🐛 Fix typo 2023-01-27 14:53:08 +01:00
alonso.torres
86b68aeca4 🐛 Add migration to fix problem with frame-id 2023-01-27 14:43:55 +01:00
alonso.torres
d69d392362 🐛 Fix duplicate frames 2023-01-27 13:41:20 +01:00
Andrés Moya
506c2b8d7b 🔧 Add script to rename some layout attrs in existing files 2023-01-27 13:11:46 +01:00
Eva
b463ebc17b 🐛 Fix layout spec with proper names 2023-01-27 13:11:46 +01:00
alonso.torres
f90fda2c90 🐛 Fix frame overlays in workspace 2023-01-27 11:26:35 +01:00
Eva Marco
87c5aa71a3 Merge pull request #2847 from penpot/superalex-text-weight-inspect-code
🐛 Fix text weight on inspect code
2023-01-27 10:09:11 +01:00
Alejandro Alonso
4f82f6bde4 🐛 Fix text weight on inspect code 2023-01-27 10:00:54 +01:00
Alejandro
545b3860b4 Merge pull request #2844 from penpot/alotor-fix-transparent-thumbnails
🐛 Fix problem with transparent frame thumbnails
2023-01-27 09:29:26 +01:00
alonso.torres
d4921c8eb9 🐛 Fix problem with transparent frame thumbnails 2023-01-27 09:27:18 +01:00
Alejandro Alonso
18652d0b6f 🐛 Fix outline corner radius 2023-01-27 09:26:10 +01:00
Alejandro Alonso
2dbeda1d8f 🐛 Fix outline corner radius 2023-01-27 09:14:11 +01:00
elhombretecla
9422d1e9e2 Fix wording 2023-01-27 07:45:31 +01:00
Alejandro
e0441bc16a Merge pull request #2845 from penpot/palba-text-shortcuts-multi-layer
 Apply text format shortcuts to several layers
2023-01-27 07:03:11 +01:00
Pablo Alba
d7d6166232 Apply text format shortcuts to several layers (even inside groups) 2023-01-26 18:46:16 +01:00
Yaron Shahrabani
bf60fc6d82 🌐 Add translations for: Hebrew.
Currently translated at 94.0% (1114 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2023-01-26 17:52:24 +01:00
Linerly
53761bf802 🌐 Add translations for: Indonesian.
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2023-01-26 17:52:24 +01:00
Stas Haas
3bf4ac6ea1 🌐 Add translations for: German.
Currently translated at 98.1% (1162 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2023-01-26 17:52:23 +01:00
Oğuz Ersen
45f12de546 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1184 of 1184 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2023-01-26 17:52:22 +01:00
Alejandro
6fd6205634 Merge pull request #2841 from penpot/alotor-polishing-11
Polishing
2023-01-26 16:27:05 +01:00
Eva
7cd6f5ba70 🐛 User icons are not centered 2023-01-26 15:56:21 +01:00
Eva
9cc3cceb06 💄 Change layout flex by flex layout text 2023-01-26 15:56:21 +01:00
Eva
6f6bcd2f7e 💄 Improve warning message css in fonts 2023-01-26 15:56:21 +01:00
Alejandro Alonso
f9f3b3951f 🐛 Fix external borders not considered for thumbnails 2023-01-26 15:43:11 +01:00
Andrés Moya
22ded62000 🐛 Fix paths not flagged as modified when resized 2023-01-26 15:29:20 +01:00
Alejandro Alonso
71d104f768 🐛 Fix fills and strokes on inspect code 2023-01-26 15:18:26 +01:00
alonso.torres
5a36cbceb7 Enter to select children allow for multiselection 2023-01-26 14:27:14 +01:00
Pablo Alba
f2033c46f3 🐛 Fix ctrl+z shows zoom icon 2023-01-26 14:07:21 +01:00
alonso.torres
6b225a10b5 🐛 Fix problem with align and flex layout 2023-01-26 13:44:40 +01:00
alonso.torres
38fe6e856a 🐛 Fix problems with content between/around and auto-width 2023-01-26 12:55:40 +01:00
alonso.torres
1984109436 🐛 Fix problem with change frame groups 2023-01-26 12:55:40 +01:00
alonso.torres
9f9d9277a6 🐛 Fix problem with space-around and auto-width/height 2023-01-26 12:55:40 +01:00
alonso.torres
e041f93680 🐛 Fix space-between preserves gap distances 2023-01-26 12:55:40 +01:00
alonso.torres
2d779a4414 🐛 Fix problem with empty text rendering 2023-01-26 12:55:40 +01:00
Alejandro
21fc9289a6 Merge pull request #2835 from penpot/palba-fix-multiplayer-shadow
🐛 Fix multiuser - "Shadow" element is not updating immediately
2023-01-26 07:33:47 +01:00
Pablo Alba
b40ea3fb2a 🐛 Fix multiuser - "Shadow" element is not updating immediately 2023-01-25 17:48:40 +01:00
Pablo Alba
444e9a3081 Merge pull request #2833 from penpot/hiru-fix-unwanted-popup
🐛 Fix unneeded popup when updating local components
2023-01-25 16:51:29 +01:00
Andrés Moya
f93d305545 🐛 Fix unneeded popup when updating local components 2023-01-25 16:50:41 +01:00
Pablo Alba
09a91c87be Merge pull request #2834 from penpot/superalex-fix-ctrl-c-in-inspect-code
🐛 Fix ctrl+c on inspect code
2023-01-25 16:23:38 +01:00
Alejandro Alonso
e71d569cda 🐛 Fix ctrl+c on inspect code 2023-01-25 16:11:58 +01:00
alonso.torres
a56a9868dc 🐛 Fix error on thumbnail generation 2023-01-25 13:20:06 +01:00
Pablo Alba
a09198b46e 🐛 Fix wrong pop on setup shortcuts 2023-01-25 13:05:03 +01:00
Alejandro
c7e9c658cd Merge pull request #2827 from penpot/eva-flex-bugfixing-2
🐛 Fix missing flex props on code generation
2023-01-25 11:46:34 +01:00
Alejandro
58d7bc5c14 Merge pull request #2831 from penpot/azazeln28-fix-viewer-all-mouse-wheel-issues
Fix all viewer mouse wheel issues
2023-01-25 11:38:31 +01:00
Alejandro
e939db927e Merge pull request #2825 from penpot/palba-text-formatting-shortcuts
🎉 Shortcuts for text formatting
2023-01-25 11:33:17 +01:00
Pablo Alba
efe50479de 🎉 Shortcuts for text formatting 2023-01-25 11:32:59 +01:00
Eva
ea1b3bd058 🐛 Fix missing flex props on code generation 2023-01-25 08:19:33 +01:00
Aitor
4751d7d385 🐛 Fix all viewer mouse wheel issues 2023-01-24 17:44:15 +01:00
Hosted Weblate
bc88e30efa Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/
2023-01-24 16:17:30 +01:00
Andrés Moya
9623dbfbd6 📚 Validate translations 2023-01-24 16:17:30 +01:00
Andrés Moya
f177de6661 Merge remote-tracking branch 'weblate/develop' into translations 2023-01-24 16:17:30 +01:00
Alejandro
43043e2dc1 Merge pull request #2830 from penpot/alotor-polishing-10
Small bugfixes
2023-01-24 15:53:16 +01:00
Hosted Weblate
4a46cf2ab7 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/
2023-01-24 15:44:15 +01:00
Andrés Moya
30725af367 📚 Validate translations 2023-01-24 15:42:34 +01:00
Andrés Moya
ece324a76f Merge remote-tracking branch 'weblate/develop' into translations 2023-01-24 15:39:47 +01:00
alonso.torres
05d21d7d07 🐛 Fix reorder layers with keys not refreshing layout 2023-01-24 15:30:20 +01:00
Amerey.eu
2ea69a84b2 🌐 Add translations for: Czech.
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/cs/
2023-01-24 15:27:43 +01:00
Mikel Larreategi
f2f0d292e0 🌐 Add translations for: Basque.
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/eu/
2023-01-24 15:27:40 +01:00
Ahmad HosseinBor
fc0fad29d0 🌐 Add translations for: Persian.
Currently translated at 59.9% (728 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2023-01-24 15:27:40 +01:00
Linerly
9a954ab430 🌐 Add translations for: Indonesian.
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2023-01-24 15:27:39 +01:00
Vin
90caaaa14a 🌐 Add translations for: Russian.
Currently translated at 68.3% (831 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2023-01-24 15:27:36 +01:00
GradelerM
98360ed9e8 🌐 Add translations for: French.
Currently translated at 93.1% (1132 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2023-01-24 15:27:35 +01:00
Rubén
f64a74e7b9 🌐 Add translations for: Catalan.
Currently translated at 95.8% (1164 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ca/
2023-01-24 15:27:35 +01:00
alonso.torres
02aab37ee7 🐛 Fix bold typefaces in thumbnails 2023-01-24 15:08:58 +01:00
elhombretecla
d3aee1afa3 Add new images 2023-01-24 15:01:18 +01:00
elhombretecla
ac361cdb36 Adds new 1.17 onboarding info 2023-01-24 14:53:12 +01:00
Aitor
7ac6f49c08 Merge pull request #2808 from penpot/superalex-fix-font-vertical-metrics
🐛 Fix font vertical metrics
2023-01-24 14:26:14 +01:00
Alejandro Alonso
d3e11433bf 🐛 Fix font vertical metrics 2023-01-24 14:21:16 +01:00
Pablo Alba
771d1d9194 🐛 Fix double click and lens zoom 2023-01-24 14:19:14 +01:00
Alejandro
4a3a53182b Merge pull request #2797 from penpot/palba-lens-tool
🎉 Zoom lense tool
2023-01-24 13:34:23 +01:00
Pablo Alba
c25cf043fa 🎉 Zoom lense tool 2023-01-24 13:34:04 +01:00
elhombretecla
7440d38c94 Add new login image 2023-01-24 13:19:16 +01:00
Alejandro
a8c0d437ce Merge pull request #2828 from penpot/superalex-update-changes
 Update changes
2023-01-24 12:55:35 +01:00
Alejandro
8d683beae4 Merge pull request #2829 from penpot/fix-safari-thumbnails
🐛 Fix thumbnails for Safari browsers
2023-01-24 12:36:15 +01:00
Alejandro Alonso
4007d8713c Update changes 2023-01-24 12:26:17 +01:00
alonso.torres
ead64a1820 🐛 Fix thumbnails for Safari browsers 2023-01-24 11:56:59 +01:00
Alejandro Alonso
aae78055c8 Merge remote-tracking branch 'origin/staging' into develop 2023-01-24 10:00:51 +01:00
Alejandro
88e2a5c56e Merge pull request #2826 from penpot/alotor-thumbnails-performance
Thumbnails performance
2023-01-24 09:59:20 +01:00
alonso.torres
9782d9077f Improved and fixed thumbnail generation 2023-01-24 09:44:56 +01:00
Alejandro
b4c4511d9d Merge pull request #2823 from penpot/alotor-polishing-9
Improved thumbnails behavior
2023-01-23 17:18:53 +01:00
alonso.torres
316b3d4539 🐛 Try to remove cases when the thumbnail could be empty 2023-01-23 14:07:51 +01:00
alonso.torres
1c54e9fa4d Allow debug in for release build 2023-01-23 14:03:28 +01:00
alonso.torres
3d064b804b Improve performance on multiple options 2023-01-23 14:03:02 +01:00
Alejandro Alonso
6b25bf6c4f Merge remote-tracking branch 'origin/staging' into develop 2023-01-23 11:06:05 +01:00
alonso.torres
088a8af345 🐛 Fix problem with empty styles 2023-01-23 11:05:28 +01:00
Alejandro
125e6238d1 Merge pull request #2821 from penpot/niwinz-dev-bugfixes
🐛 Bugfixes + unit tests
2023-01-23 10:35:55 +01:00
Andrés Moya
77cd645e25 🔧 Update docker-compose without needing config file 2023-01-23 10:34:00 +01:00
Andrey Antukh
504f75a1cf 🐛 Fix health check http endpoint 2023-01-23 09:59:55 +01:00
Andrey Antukh
fa17ce5d40 📎 Avoid email index change on profile indexes migration 2023-01-23 09:56:21 +01:00
Andrey Antukh
14f39b8028 🎉 Add unit tests for access tokens rpc methods 2023-01-23 09:56:21 +01:00
Andrey Antukh
7e9a5c4a8f Merge remote-tracking branch 'origin/staging' into develop 2023-01-23 09:55:50 +01:00
Alejandro
8ee7915c1d Merge pull request #2820 from penpot/eva-typos
🐛 Fix some typos on translation
2023-01-23 09:54:24 +01:00
Eva
ea8755ce24 🐛 Fix some typos on translation 2023-01-23 09:41:16 +01:00
Prithvi Tharun
381aae735d Improves empty state content
Reads in neutral content without alarming the users

Signed-off-by: Prithvi Tharun <ptrithu8@gmail.com>
2023-01-23 09:38:52 +01:00
Prithvi Tharun
a4826eddcd Improves empty state content
Better instructions explaining multiple ways people can add files to library. Also, reads in neutral tone withour blaming and alarming the users

Signed-off-by: Prithvi Tharun <ptrithu8@gmail.com>
2023-01-23 09:38:52 +01:00
Prithvi Tharun
31e2fff4d4 Improves tooltip
X and Y position tooltips updated to communicate more info

Signed-off-by: Prithvi Tharun <ptrithu8@gmail.com>
2023-01-23 09:38:52 +01:00
Alejandro
021c714867 Merge pull request #2817 from penpot/niwinz-docker-and-admin
 Improvements on PREPL
2023-01-23 09:12:06 +01:00
Andrey Antukh
231ac00934 🎉 Add manage.py script for docker images 2023-01-20 17:14:32 +01:00
Andrey Antukh
578ff944a6 📎 Use name instead of pr-str of error type 2023-01-20 16:52:58 +01:00
Andrey Antukh
bf8a514871 Add more flexible prepl api for external tools 2023-01-20 16:52:58 +01:00
Andrey Antukh
8d60b3fc3e 🐛 Add missing hint on duplicate profile exception 2023-01-20 16:52:58 +01:00
Andrey Antukh
8468e7af24 🎉 Add admin example service to default docker compose file 2023-01-20 16:52:58 +01:00
Alejandro Alonso
b8043a9755 Merge remote-tracking branch 'origin/staging' into develop 2023-01-20 15:52:04 +01:00
Alejandro
50eee3f597 Merge pull request #2816 from penpot/eva-bugfix-2
Eva polishing
2023-01-20 15:50:59 +01:00
Eva Marco
b9b3fcdb6a Merge pull request #2813 from penpot/superalex-fix-svg-import
🐛 Fix svg import
2023-01-20 14:36:59 +01:00
Eva
f0d74ab63e 🐛 Fix hsla information in viewer 2023-01-20 14:30:17 +01:00
Alejandro
dad5d953ce Merge pull request #2814 from penpot/alotor-polishing-8
Fix some mask issues
2023-01-20 14:04:45 +01:00
Alejandro Alonso
da517f2d35 Merge remote-tracking branch 'origin/staging' into develop 2023-01-20 13:58:08 +01:00
Alejandro
f6058aa71e Merge pull request #2815 from penpot/alotor-debug-names
 Add debug tool to display name and id for shapes
2023-01-20 13:57:18 +01:00
alonso.torres
85d56e6057 Add debug tool to display name and id for shapes 2023-01-20 13:47:40 +01:00
Eva
c353d3703b Add some accessibility on shortcuts panel 2023-01-20 12:39:07 +01:00
Andrés Moya
9367788898 Small improvement 2023-01-20 12:04:47 +01:00
Andrés Moya
2b978777d7 🐛 Fix import/export components with boards inside 2023-01-20 12:04:47 +01:00
Eva
2a30c23334 🐛 Fix hidden shapes inside hidden group 2023-01-20 11:15:14 +01:00
Alejandro Alonso
2f188e7fb4 🐛 Fix regression with library svgs 2023-01-20 11:01:22 +01:00
alonso.torres
0743b07667 🐛 Fix problem with mask disappearing in root frame 2023-01-20 10:56:55 +01:00
alonso.torres
f38197b227 Remove restriction to move mask layers 2023-01-20 10:56:55 +01:00
alonso.torres
bc9be7846a 🐛 Fix problem with empty mask on layout 2023-01-20 10:56:55 +01:00
Andrey Antukh
62aa6569f2 Merge remote-tracking branch 'origin/staging' into develop 2023-01-20 09:59:56 +01:00
Alejandro
42e97f8be1 Merge pull request #2793 from penpot/niwinz-access-tokens
🎉 ♻️ Refactor & Access Tokens (part 1)
2023-01-20 09:36:47 +01:00
Eva Marco
28114b166c Merge pull request #2812 from penpot/hiru-avoid-bad-nested-component
Avoid creating component with shapes that belong to other one
2023-01-20 09:22:25 +01:00
Alejandro Alonso
be74cd2c7b 🐛 Fix import svgs with currentColor as stroke fill 2023-01-20 09:17:04 +01:00
Eva Marco
b329de6487 Merge pull request #2807 from penpot/hiru-fix-layout-sync
Fix layout attributes sync in components
2023-01-20 09:06:36 +01:00
Alejandro Alonso
9c66998530 🐛 Fix svg import 2023-01-20 07:35:21 +01:00
Eva
8b377ac556 💄 Add entry on changes 2023-01-19 19:33:00 +01:00
Andrés Moya
8c6f07ab65 🐛 Fix right sidebar component options menu 2023-01-19 16:54:30 +01:00
Andrés Moya
dc89610d07 🐛 Avoid creating component with shapes that belong to other one 2023-01-19 16:40:27 +01:00
Eva
40195a4f52 🐛 Fix index on layout created over group 2023-01-19 16:16:22 +01:00
Eva
6a257503ae 🐛 Fix create layout over mask destroy mask 2023-01-19 16:16:22 +01:00
Eva Marco
a3e583d745 Merge pull request #2809 from penpot/hiru-fix-asset-with-board
🐛 Fix display of components with frame root in assets panel
2023-01-19 15:47:52 +01:00
alonso.torres
685a071e87 🐛 Fix rounding error with matrices 2023-01-19 15:47:25 +01:00
Andrey Antukh
73658c47f3 🐛 Fix issues on rlimit module 2023-01-19 15:41:12 +01:00
Andrey Antukh
d98fd76032 🎉 Add namespace with a set of helpers for access throught the BREPL 2023-01-19 15:41:12 +01:00
Andrey Antukh
2fef3dc881 🎉 Add prepl support
And rename the current repl to urepl (user-repl).
2023-01-19 15:41:12 +01:00
Eva Marco
a1a0444cc7 Merge pull request #2806 from penpot/alotor-polishing-7
Changes to paths and fixed reorder
2023-01-19 14:42:51 +01:00
Andrés Moya
792c17fe46 🐛 Fix display of components with frame root in assets panel 2023-01-19 14:18:55 +01:00
Andrés Moya
77d71abb5d 🐛 Sync correctly all layout attributes 2023-01-19 13:44:28 +01:00
alonso.torres
75d6e21af8 Show tools on path creation. Change snap while drawing 2023-01-19 13:39:21 +01:00
alonso.torres
0632111e96 🐛 Fix reorder layers with keys 2023-01-19 13:39:21 +01:00
Eva Marco
fe77ef4438 Merge pull request #2802 from penpot/alotor-polishing-6
Polishing after confluence test
2023-01-19 12:55:59 +01:00
Andrey Antukh
9a407ab714 🎉 Add namespace with a set of helpers for access throught the BREPL 2023-01-19 12:42:39 +01:00
alonso.torres
e7ac7ff7fb 🐛 Fix problem with disappearing titles 2023-01-19 11:51:53 +01:00
alonso.torres
d78ad30e23 Enter on containers selects children 2023-01-19 11:51:53 +01:00
alonso.torres
4b5caf5fb9 Shift+move ignores snap-pixel on the axis moving 2023-01-19 11:51:53 +01:00
alonso.torres
4e1eb2d6e9 🐛 Fix problem when flipping a mask 2023-01-19 11:51:53 +01:00
alonso.torres
ab7683f1e3 Improved text layout handling 2023-01-19 11:51:53 +01:00
alonso.torres
89371e10d1 🐛 Fix problem moving shapes inside a group inside a layout 2023-01-19 11:51:53 +01:00
alonso.torres
9fd6c65d93 🐛 Fix problem with empty paths 2023-01-19 11:51:53 +01:00
Eva
1f9c89fb32 🐛 Fix add svg did not update layout 2023-01-19 11:31:46 +01:00
Eva
61e83d7e01 🐛 Add selected colors on rightbar when selecting a board 2023-01-19 11:31:46 +01:00
Eva
a1a3d09998 🐛 Remove numbers in layer creation 2023-01-19 11:31:46 +01:00
Eva
de7a1d34c0 🐛 Fix board preset size selector css 2023-01-19 11:31:46 +01:00
Eva
f93d0e1c4d 🐛 Fix snap to pixel on path creation and edit 2023-01-19 11:31:46 +01:00
andrés gonzález
750e00c981 Merge pull request #2803 from iprithvitharun/2791-renaming-export-board-option
 Renamed Export boards to PDF option
2023-01-19 09:55:18 +01:00
Prithvi Tharun
d2847e9507 Renamed Export boards to PDF option
Two instances of this changed

Signed-off-by: Prithvi Tharun <ptrithu8@gmail.com>
2023-01-18 23:09:39 +05:30
Andrey Antukh
8a5afefc1c 🎉 Add prepl support
And rename the current repl to urepl (user-repl).
2023-01-18 17:14:22 +01:00
Eva Marco
c5d8d77070 Merge pull request #2799 from penpot/alotor-polishing-5
Polishing
2023-01-18 11:38:40 +01:00
Andrey Antukh
3dd65db651 Use commands instead of mutations for assets upload
And properly deprecate media rpc mutations
2023-01-18 11:20:36 +01:00
alonso.torres
c18d3c66a8 Changes to snap to pixel 2023-01-18 11:04:24 +01:00
alonso.torres
0d96b5b798 🐛 Fix problems with mask elements modifiers when moving child 2023-01-18 11:04:24 +01:00
alonso.torres
24f45fafbf 🐛 Fix problem with disappearing frame titles 2023-01-18 11:04:13 +01:00
Andrey Antukh
1e1f551383 Move share link mutations to commands 2023-01-18 10:51:58 +01:00
Andrey Antukh
4258a840ac ♻️ Use proper namespace qualified access to pool 2023-01-18 10:51:58 +01:00
Andrey Antukh
bca98f91e4 🎉 Add rpc methods for access tokens 2023-01-18 10:51:58 +01:00
Andrey Antukh
a79d2cf899 🔥 Remove deprecated teams mutations and queries 2023-01-18 10:51:58 +01:00
Andrey Antukh
6a699d7f09 Properly move viewer queries to commands
And change deprecation version on viewer queries
2023-01-18 10:51:58 +01:00
Andrey Antukh
ba2729fa4a Move fonts queries and mutations to commands 2023-01-18 10:51:58 +01:00
Andrey Antukh
dba7a9d424 Move projects queries and mutations to commands 2023-01-18 10:51:58 +01:00
Andrey Antukh
dc77c6b655 Remove deprecated code and reoganize file related methods 2023-01-18 10:51:58 +01:00
Andrey Antukh
ed87814f50 🐛 Properly handle storage features on binfile import 2023-01-18 10:51:58 +01:00
Andrey Antukh
d8faff47a8 ♻️ Move profile queries and mutations to commands 2023-01-18 10:51:58 +01:00
Andrey Antukh
ecb757bcaf 🎉 Move user feedback http handler to RPC command method 2023-01-18 10:51:58 +01:00
Andrey Antukh
73a6f0a347 📎 Update backend scripts/repl file 2023-01-18 10:51:58 +01:00
Andrey Antukh
db689d151e ♻️ Refactor profile and session handling
- makes the profile access more efficient (replace in-app joins to a
  simple select query on profile table
- add partial support for access-tokens (still missing some RPC methods)
- move router definitions to specific modules and simplify the main http
  module definitions to simple includes
- simplifiy authentication code related to access-tokens and sessions
- normalize db parameters with proper namespaced props
- more work on convert all modules initialization to use proper specs
  with fully-qualified keyword config props
2023-01-18 10:51:58 +01:00
Alejandro
ca8df3a8d8 Merge pull request #2788 from penpot/niwinz-bugfix-binfile-import-storage-features
🐛 Properly handle storage features on binfile import
2023-01-18 09:52:51 +01:00
Ahmad HosseinBor
6bdd25b5d1 🌐 Add translations for: Persian.
Currently translated at 56.3% (685 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2023-01-18 06:48:14 +01:00
Eva
d14f4c5c4a 🐛 Fix open color palette from colorpicker 2023-01-17 23:28:02 +01:00
Eva
f6ff80a3d4 🐛 Fix Apply library colors to gradient points 2023-01-17 23:28:02 +01:00
Eva
b2d8f807f9 🐛 Fix alignment inside dropdown 2023-01-17 23:28:02 +01:00
Eva
03b3b441b5 🐛 Fix create mask inside layout 2023-01-17 23:28:02 +01:00
Andrey Antukh
523539e403 🐛 Properly handle storage features on binfile import 2023-01-17 10:14:30 +01:00
Alejandro
3280a6853e Merge pull request #2784 from penpot/palba-fix-undo-in-multiplayer
🐛 Fix undo corner case in multiplayer
2023-01-17 09:32:52 +01:00
andrés gonzález
a7ec9d7d1f Merge pull request #2790 from iprithvitharun/2789-inconsistent-casing-fixes
  Fixes wrong casing
2023-01-17 08:58:03 +01:00
Eva
fb060cb806 🐛 Fix padding values and add tooltip 2023-01-16 18:24:48 +01:00
Eva
8892cebb6f 🐛 Fix create layout flex around component 2023-01-16 18:24:48 +01:00
Eva
6fb97e54a9 🐛 Fix context menu when two elements where selected 2023-01-16 18:24:48 +01:00
Eva Marco
1c3470ca53 Merge pull request #2785 from penpot/azazeln28-fix-mousewheel-on-viewer-inspector
🐛 Fix mouse wheel on viewer inspector
2023-01-16 18:00:52 +01:00
alonso.torres
0ae42be851 🐛 Fix pipeline for thumbnails 2023-01-16 17:42:17 +01:00
alonso.torres
ff6f0b2744 🐛 Fix debugging util 2023-01-16 17:33:28 +01:00
Aitor
a3a2ab1ecd 🐛 Fix mouse wheel on viewer inspector 2023-01-16 17:30:18 +01:00
Alejandro Alonso
7f9911f164 Merge remote-tracking branch 'origin/staging' into develop 2023-01-16 17:14:56 +01:00
Eva Marco
01ba68fd6f Merge pull request #2786 from penpot/alotor-fix-text-loop
Fix problem with text hanging the application
2023-01-16 17:14:01 +01:00
alonso.torres
1ab669cc7b 🐛 Fix problems with texts looping 2023-01-16 17:05:34 +01:00
Prithvi Tharun
0e07617877 Fixes wrong casing
several casings fixed

Signed-off-by: Prithvi Tharun <ptrithu8@gmail.com>
2023-01-16 21:04:50 +05:30
Alejandro Alonso
c78cb89943 Merge remote-tracking branch 'origin/staging' into develop 2023-01-16 16:21:35 +01:00
Rubén
42b8c3669f 🌐 Add translations for: Catalan.
Currently translated at 95.5% (1161 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ca/
2023-01-16 15:50:44 +01:00
Pablo Alba
ab421ac3f9 🐛 Fix undo corner case in multiplayer 2023-01-16 11:43:42 +01:00
Pablo Alba
0faa0b21a4 Merge pull request #2776 from penpot/superalex-justify-text-is-stretched
🐛 Fix justify text is stretched
2023-01-16 07:09:24 +01:00
Alejandro Alonso
4ca6a89e6f 🐛 Fix justify text is stretched 2023-01-13 16:55:00 +01:00
Alejandro Alonso
6c0a8afba2 Merge remote-tracking branch 'origin/staging' into develop 2023-01-13 15:00:30 +01:00
Eva Marco
ab5fd68689 Merge pull request #2777 from penpot/alotor-polishing-4
Polishing
2023-01-13 14:58:38 +01:00
Alejandro Alonso
19bac6bd10 Merge remote-tracking branch 'origin/staging' into develop 2023-01-13 14:37:06 +01:00
Alejandro
275eb993ce Merge pull request #2775 from penpot/niwinz-bugfixes-1
🐛 Several backend bugfixes
2023-01-13 14:33:46 +01:00
Alejandro
88143cfb8b Merge pull request #2778 from penpot/palba-filter-gfonts-variants
🐛 Filter gfonts variants for figma exporter plugin
2023-01-13 14:33:32 +01:00
alonso.torres
5f0f3abeae 🐛 Fix problem when dropping indices in flipped frames 2023-01-13 14:23:11 +01:00
alonso.torres
b203c87dbb 🐛 Fix problem with rotated texts inside flex layout 2023-01-13 14:23:11 +01:00
alonso.torres
7a796bc83f 🐛 Fix problem with thumbnails when duplicating artboards 2023-01-13 14:23:11 +01:00
alonso.torres
196e193281 🐛 Fix error message when the thumbnail fails to be added 2023-01-13 14:23:11 +01:00
alonso.torres
d0a15cda96 🐛 Fix issue when mirroring artboard 2023-01-13 14:23:11 +01:00
Pablo Alba
c3733ed2e1 🐛 Filter gfonts variants for figma exporter plugin 2023-01-13 14:19:57 +01:00
Pablo Alba
379623d629 Merge pull request #2773 from penpot/azazeln28-fix-library-list-spacing
🐛 Fix library list spacing
2023-01-13 13:32:13 +01:00
Pablo Alba
cb2553a8ca Merge pull request #2772 from penpot/azazeln28-fix-cannot-move-vertical-scroll-in-viewer
🐛 Fixes vertical scroll in viewer (code mode)
2023-01-13 13:30:10 +01:00
Aitor
1b7ea6ed53 Adds method to-fixed to math
Changes matrix/toString to use `to-fixed`
2023-01-13 11:43:50 +01:00
Eva
57a569a07a 🐛 Fix alignment on justify content space between 2023-01-13 11:43:05 +01:00
Andrey Antukh
a5006b1687 🐛 Remove www-form encoding from webhooks
It is broken by design, so we just do not support it
2023-01-13 10:34:56 +01:00
Aitor
24dc40a1b0 🐛 Fix library list spacing 2023-01-13 10:34:02 +01:00
Andrey Antukh
b4fc39f73c 📎 Disable quotes by default 2023-01-13 10:23:00 +01:00
Andrey Antukh
095dc2ad11 Do not merge path params into params
makes conflict with possible params coming from user
2023-01-13 10:19:39 +01:00
Andrey Antukh
fcbbe8e5c7 🐛 Fix incorrect logging context setup 2023-01-13 10:19:39 +01:00
Andrey Antukh
bafe3ec087 Revert some changes related to admin that are no longer necessary 2023-01-13 10:19:39 +01:00
andrés gonzález
1f5fb43454 Merge pull request #2771 from iprithvitharun/2770-update-position-x-y-tooltips
 Improves tooltip
2023-01-13 09:48:52 +01:00
Aitor
5d44d75465 🐛 Fixes vertical scroll in viewer (code mode) 2023-01-12 16:57:15 +01:00
Prithvi Tharun
cd3f1d5ded Improves tooltip
X and Y position tooltips updated to communicate more info

Signed-off-by: Prithvi Tharun <ptrithu8@gmail.com>
2023-01-12 20:57:46 +05:30
Alejandro Alonso
47c983ed88 Merge remote-tracking branch 'origin/staging' into develop 2023-01-12 13:33:23 +01:00
Alejandro
44102050ee Merge pull request #2768 from penpot/palba-more-undo-tuning
🐛 Fix undo ungroup (shift+g) scrambles positions
2023-01-12 13:31:59 +01:00
Eva Marco
cae436f365 Merge pull request #2766 from penpot/alotor-polishing-3
Polishing
2023-01-12 13:24:04 +01:00
alonso.torres
e6d80e34b9 Drawing shapes over flex layout checks its drop index 2023-01-12 13:18:38 +01:00
Alejandro Alonso
c39c58198d Merge remote-tracking branch 'origin/staging' into develop 2023-01-12 13:14:25 +01:00
Alejandro
fbec07bd48 Merge pull request #2767 from penpot/azazeln28-fix-ignore-file-library-sync-status
🐛 Fix ignore file library sync status
2023-01-12 13:13:54 +01:00
Pablo Alba
a555028ee2 🐛 Fix undo ungroup (shift+g) scrambles positions 2023-01-12 12:54:07 +01:00
Aitor
d91e8c349e 🐛 Fix ignore file library sync status
- Adds missing `update` of `:features` using `db/decode-pgarray`
2023-01-12 12:38:26 +01:00
alonso.torres
abe26007d7 🐛 Fix problem with measures for frames 2023-01-12 12:35:20 +01:00
alonso.torres
2da421bb7a 🐛 Fix error on path editing 2023-01-12 12:35:20 +01:00
alonso.torres
7d48b86e46 ❇️ Debugging panel for development 2023-01-12 12:35:20 +01:00
alonso.torres
28663b5ff6 Improved performance of svg paths 2023-01-12 12:29:02 +01:00
Alejandro Alonso
651d4f794b 🐛 Fix copy paste line break 2023-01-12 12:28:05 +01:00
alonso.torres
58aa6b3666 🐛 Fix problem with gap-row/gap-column 2023-01-12 12:17:26 +01:00
Eva
131c2f331e 🐛 Fix gap 2023-01-12 12:17:26 +01:00
Eva
8df861faaa 🐛 Fix some undo while actions in flex 2023-01-12 12:17:26 +01:00
Eva
4f81f9636a ♻️ Change uuid/next for js/Symbol on undo-id for transactions 2023-01-12 12:17:26 +01:00
Eva
31dfdf51c9 🐛 Fix some errors on flex layout 2023-01-12 12:17:26 +01:00
Pablo Alba
acf51ea744 💄 Use css color variable instead of fixed value 2023-01-12 09:21:57 +01:00
Pablo Alba
a54f5484e8 🎉 Added a tag to mark read only mode (now on pages) 2023-01-11 17:25:49 +01:00
Pablo Alba
3a8486f4b0 🐛 Fix share prototype styles on hover: color and tooltip 2023-01-11 17:16:43 +01:00
Pablo Alba
43c3d67521 🐛 Fix max height in library dialog 2023-01-11 17:10:56 +01:00
Aitor Moreno
4b2d82e100 :fix: react warning duplicate keys 2023-01-11 15:10:53 +01:00
Aitor Moreno
f2fd380979 Improves matrix serialization 2023-01-11 15:03:18 +01:00
Alejandro
984187037c Merge pull request #2757 from penpot/palba-fix-expanded-code
🐛 Fix switching tabs produces strange behaviour when "expanded" v…
2023-01-11 12:55:33 +01:00
Alejandro
173e5da98e Merge pull request #2759 from penpot/palba-read-only-tag
🎉 Added a tag to mark read only mode
2023-01-11 12:53:10 +01:00
Alejandro Alonso
76c9f11922 Merge remote-tracking branch 'origin/staging' into develop 2023-01-11 12:45:05 +01:00
Pablo Alba
2ab3ed9ab4 🎉 Added a tag to mark read only mode 2023-01-11 12:06:42 +01:00
Aitor
74e4273549 Merge pull request #2754 from penpot/superalex-fix-move-boards-with-comments
🐛 Fix move boards with comments
2023-01-11 10:28:04 +01:00
Pablo Alba
12392a4038 🐛 Fix switching tabs produces strange behaviour when "expanded" view mode was used for Code 2023-01-10 17:19:45 +01:00
Pablo Alba
987b7f44f4 🐛 Fix layer orders messed up on move, group, reparent and undo 2023-01-10 16:45:08 +01:00
Alejandro
3480d6979b Merge pull request #2755 from penpot/eva-fix-icon
🐛 Fix pin icon in project
2023-01-10 15:55:23 +01:00
Eva
9ca1efc128 🐛 Fix pin icon in project 2023-01-10 14:26:52 +01:00
Alejandro Alonso
81a95d362c 🐛 Fix move boards with comments 2023-01-10 13:55:41 +01:00
Alejandro Alonso
a25f069f8e Merge remote-tracking branch 'origin/staging' into develop 2023-01-10 11:27:38 +01:00
Eva Marco
a7dfda515b Merge pull request #2753 from penpot/alotor-polishing-2
Fix problems with text positons
2023-01-10 11:26:49 +01:00
andrés gonzález
d87bc5fa1b Merge pull request #2682 from iprithvitharun/2678-updating-custom-fonts-empty-state-content
 Improves empty state content
2023-01-10 11:17:09 +01:00
andrés gonzález
5a482298e8 Merge pull request #2683 from iprithvitharun/2679-updating-empty-state-content-libraries-section
 Improves empty state content
2023-01-10 11:16:00 +01:00
alonso.torres
b5c1199f4d 🐛 Fix problem with texts randomly moving 2023-01-10 11:02:40 +01:00
alonso.torres
4aa8baa129 Add debug history overlay 2023-01-10 11:02:40 +01:00
Alejandro
553f2f5576 Merge pull request #2748 from penpot/eva-workspace-visual-changes
Bugfixing
2023-01-10 10:35:32 +01:00
Alejandro
b132837432 Merge pull request #2743 from penpot/niwinz-enhancements-2
🐛 Bugfixes
2023-01-10 09:56:45 +01:00
Eva
36bc276d93 🐛 Fix outline in color type selector on view mode 2023-01-10 09:40:24 +01:00
Alejandro Alonso
34d874f56d Merge remote-tracking branch 'origin/staging' into develop 2023-01-09 16:41:40 +01:00
Eva Marco
35aa391129 Merge pull request #2749 from penpot/hiru-fix-ghost-sync
🐛 Fix ghost shapes after sync groups in components
2023-01-09 16:20:20 +01:00
Eva
2c2755b35e 🐛 Fix allow names selection in dashboard 2023-01-09 16:06:00 +01:00
Andrés Moya
bedaef961b 🐛 Fix ghost shapes after sync groups in components 2023-01-09 14:21:29 +01:00
Eva
fe7f4004f1 🐛 Fix scape key to clear focus on input 2023-01-09 13:01:15 +01:00
Eva
eef42acf79 🐛 Fix component list on update 2023-01-09 13:01:15 +01:00
Eva
937713311e 🐛 Fix some visual errors 2023-01-09 13:01:15 +01:00
Alejandro
762681a421 Merge pull request #2747 from penpot/azazeln28-fix-import-dialog-react-duplicate-key-warning
🐛 Fix import dialog React duplicate key warning
2023-01-09 12:44:04 +01:00
Alejandro
94fc067286 Merge pull request #2744 from penpot/alotor-fix-svg-upload
🐛 Fix problem uploading svg with style tag
2023-01-09 12:43:32 +01:00
Alejandro
ae6ea7744e Merge pull request #2738 from penpot/alotor-polishing
Polishing
2023-01-09 12:35:43 +01:00
Aitor Moreno
b73ab37c94 🐛 Fix import dialog React duplicate key warning 2023-01-09 12:28:41 +01:00
Andrey Antukh
f628955a15 🐛 Set the same tenant default on backend and exporter 2023-01-09 11:57:13 +01:00
Andrey Antukh
6cdf696fc4 🐛 Fix issues on ldap provider and rpc method 2023-01-09 11:57:13 +01:00
alonso.torres
c42ef7c5b0 🐛 Fix problem uploading svg with style tag 2023-01-09 11:56:02 +01:00
Andrey Antukh
853be27780 🐛 Fix issues on database logger 2023-01-09 11:43:26 +01:00
Andrey Antukh
b235d3f0f2 Improve update-file webhook batching
make it per user
2023-01-09 11:43:02 +01:00
Alejandro
04dc9f7881 Merge pull request #2736 from penpot/superalex-fix-text-sync-hotfix
🐛 Fix text content sync and touched detection in shape displacement
2023-01-09 11:35:59 +01:00
alonso.torres
1fdf09a692 🐛 Fix problem with snap-pixel for very big shapes 2023-01-09 11:06:09 +01:00
alonso.torres
c2e0b18f26 🐛 Fix problem with thumbnails uploading 2023-01-09 11:05:31 +01:00
K.B.Dharun Krishna
0039585848 🌐 Add translations for: Tamil.
Currently translated at 2.7% (34 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ta/
2023-01-06 11:48:00 +01:00
alonso.torres
672cfa4ecc 🐛 Fix problem when forcing persistence on screen change 2023-01-05 16:20:37 +01:00
alonso.torres
c459c56f37 Improved performance of snap to distances 2023-01-05 16:20:37 +01:00
Alejandro Alonso
df5ccb6e77 Merge remote-tracking branch 'origin/staging' into develop 2023-01-05 13:30:16 +01:00
Andrés Moya
0863a96f93 🐛 Fix text content sync and touched detection in shape displacement 2023-01-05 13:26:33 +01:00
Andrey Antukh
97a884018f Move media mutations to commands 2023-01-05 13:23:57 +01:00
Andrey Antukh
1718f49a90 💄 Fix code consistency issues on comments rpc methods
related to the ::rpc/profile-id usage.
2023-01-05 13:23:57 +01:00
Alejandro
2c1fb1424c Merge pull request #2734 from penpot/hiru-fix-text-sync
🐛 Fix text content sync and touched detection in shape displacement
2023-01-05 12:13:30 +01:00
Andrés Moya
5e1cabc857 🐛 Fix text content sync and touched detection in shape displacement 2023-01-05 10:23:34 +01:00
Andrés Moya
be5e7f1536 💄 Fix line removed by merge 2023-01-05 09:59:30 +01:00
Andrés Moya
d68f53733d Merge remote-tracking branch 'origin/staging' into develop 2023-01-05 09:58:20 +01:00
Andrés Moya
6f72ea0530 💄 Clean up CHANGES.md (staging) 2023-01-05 09:57:10 +01:00
Andrés Moya
dba90726c1 💄 Clean up CHANGES.md 2023-01-05 09:54:33 +01:00
Alejandro Alonso
84dcd8f89c Merge remote-tracking branch 'origin/staging' into develop 2023-01-05 09:45:14 +01:00
Alejandro
c2d8c1994c Merge pull request #2671 from penpot/hiru-sync-groups
🐛 Fix group/ungroup shapes inside a component
2023-01-05 09:21:58 +01:00
Andrés Moya
985d5cc20c 🐛 Fix group/ungroup shapes inside a component 2023-01-05 09:21:42 +01:00
Alejandro
a0364e8835 Merge pull request #2728 from penpot/eva-bugfixin-flex
🐛 Fix some bugs reported on flex feedback
2023-01-05 08:54:55 +01:00
Alejandro Alonso
3b0bded82c Merge remote-tracking branch 'origin/staging' into develop 2023-01-05 07:40:25 +01:00
Alejandro
b273bd44c5 Merge pull request #2733 from penpot/alotor-performance
Performance enhancements
2023-01-05 07:39:57 +01:00
Alejandro
ec2fff31a0 Merge pull request #2732 from penpot/palba-create-group-form-enter
🐛 Fix confirm group name with enter doesn't work in assets modal
2023-01-05 07:07:58 +01:00
Pablo Alba
53a8718e8d 🐛 Fix confirm group name with enter doesn't work in assets modal 2023-01-05 07:07:43 +01:00
Alejandro
216a43cc43 Merge pull request #2731 from penpot/superalex-fix-enter-events-hotfix
🐛 Fix enter events
2023-01-05 07:02:34 +01:00
alonso.torres
10439934d4 Use the function hypot for distances 2023-01-04 16:21:41 +01:00
alonso.torres
84e9f69213 Improved text rendering performance 2023-01-04 16:12:12 +01:00
alonso.torres
837b52aea1 Improved performand for hug content in layout 2023-01-04 16:12:12 +01:00
alonso.torres
98698cf2db Improved modifiers lens 2023-01-04 16:12:12 +01:00
alonso.torres
d5ab0eea1a Removed reflow in viewport 2023-01-04 16:12:12 +01:00
Pablo Alba
333acacbbf Merge pull request #2730 from penpot/superalex-fix-enter-events
🐛 Fix enter events
2023-01-04 14:37:15 +01:00
Eva
598959cd3f 🐛 Fix some bugs reported on flex feedback 2023-01-04 14:00:13 +01:00
Alejandro Alonso
05431cc757 🐛 Fix enter events 2023-01-04 13:23:05 +01:00
Alejandro Alonso
f56b8be33d 🐛 Fix enter events 2023-01-04 13:09:39 +01:00
Alejandro Alonso
dd0ac64e28 Merge remote-tracking branch 'origin/staging' into develop 2023-01-04 09:25:30 +01:00
alonso.torres
644854a651 Reorder layers through keys in flex layout 2023-01-04 09:24:47 +01:00
alonso.torres
e926b11fef Changes to the margin-item and min/max width/height 2023-01-04 09:24:42 +01:00
alonso.torres
40da1c302a Support hidden elements in flex layout 2023-01-04 09:24:35 +01:00
Alejandro Alonso
aa56e2cdcf Merge remote-tracking branch 'origin/staging' into develop 2023-01-02 14:18:00 +01:00
Alejandro Alonso
b5e53b57d1 🎉 Dynamic alignment only in sight 2023-01-02 14:12:14 +01:00
Alejandro Alonso
07ac43ec0e Merge remote-tracking branch 'origin/staging' into develop 2023-01-02 14:07:56 +01:00
Alejandro
e8d561ac7f Merge pull request #2724 from penpot/hiru-fix-component-board
Avoid extra group when creating a component from a board
2023-01-02 13:52:14 +01:00
Alejandro Alonso
31661d5484 Merge remote-tracking branch 'origin/staging' into develop 2023-01-02 13:48:36 +01:00
Alejandro
cf87c54ed4 Merge pull request #2726 from penpot/palba-error-import-file
🐛 Fix export/import svg + json format isn't working
2023-01-02 13:48:14 +01:00
Pablo Alba
3ce1540331 🐛 Fix export/import svg + json format isn't working 2023-01-02 13:36:49 +01:00
Alejandro
cda2dade95 Merge pull request #2725 from penpot/alotor-bug-fixing
Bug fixing
2023-01-02 11:56:51 +01:00
Andrés Moya
baf4dfdecc 🐛 Allow to create component from frame 2023-01-02 11:33:58 +01:00
alonso.torres
ade13d3bca 🐛 Fix problem with auto-height text resize 2023-01-02 11:25:53 +01:00
alonso.torres
ff9b2090cf 🐛 Fix problem with shapes moving randomly 2023-01-02 11:25:53 +01:00
alonso.torres
733b35dd53 ⬆️ Updated potok dependency 2023-01-02 11:25:53 +01:00
Alejandro
466e018411 Merge pull request #2700 from penpot/palba-orphans-st
🐛 Add function to reparent orphan shapes
2023-01-02 11:16:22 +01:00
alonso.torres
32d39c35e4 🐛 Fix problem with flipped shapes 2023-01-02 11:12:59 +01:00
Alejandro
5f77df1996 Merge pull request #2713 from penpot/palba-show-color-name-inspect
🐛 Show color name on inspect
2023-01-02 10:35:36 +01:00
Alejandro
24538add3f Merge pull request #2723 from penpot/eva-a11y-bugfixing
🐛 Fix some visual errors
2023-01-02 10:33:23 +01:00
Eva
407831ffd1 🐛 Fix some visual errors 2023-01-02 09:46:42 +01:00
Alejandro
379997f9db Merge pull request #2716 from penpot/palba-fix-internal-error-set-text-style
🐛 Fix internal error at setting text style
2023-01-02 09:41:48 +01:00
Alejandro
b1d99232a9 Merge pull request #2718 from penpot/niwinz-bugfixes
🐛 Bugfixes
2023-01-02 09:23:39 +01:00
Alejandro Alonso
7e21d827c9 🐛 Fix duplicate frame issues 2023-01-02 08:52:45 +01:00
Alejandro
443d8b21c1 Merge pull request #2719 from penpot/niwinz-quotes
🎉 Quotes & Soft Quotes
2023-01-02 08:13:14 +01:00
Andrey Antukh
e372e8ba3e 🐛 Fix s3 client issues with s3 compatible services 2022-12-31 16:37:42 +01:00
Andrey Antukh
27451b9796 ♻️ Refactor comments RPC methods and add tests 2022-12-31 12:00:57 +01:00
Andrey Antukh
73a3e0c0ae 🎉 Add usage quotes 2022-12-31 11:22:36 +01:00
Andrey Antukh
d68be0869b Improve error report on point constructor 2022-12-31 11:11:22 +01:00
Andrey Antukh
7a8b0e710b Improve trace reporting on unhandled exception 2022-12-31 11:11:17 +01:00
Andrey Antukh
3b61a7dd91 🐛 Fix incorrect arguments to process-changes 2022-12-31 11:11:13 +01:00
Andrey Antukh
941aa6ad5d 🔥 Remove unused configuration attrs 2022-12-31 09:22:57 +01:00
Pablo Alba
42b69df671 🐛 Fix internal error at setting text style 2022-12-30 13:34:47 +01:00
Pablo Alba
4442246e08 Merge pull request #2714 from penpot/superalex-fix-ignoring-boolean-operations-on-ctrl-click-actions
🐛 Fix ignore booleans on ctrl + click selection
2022-12-30 12:11:30 +01:00
Pablo Alba
d1dbc3850d 🐛 Show color name on inspect 2022-12-30 11:59:46 +01:00
Alejandro Alonso
ed4a5f6c60 🐛 Fix ignore booleans on ctrl + click selection 2022-12-30 11:33:03 +01:00
Alejandro
0144939f34 Merge pull request #2702 from penpot/palba-fix-boolean-shapes-color
🐛 Fix incorrect color in properties of multiple bool shapes
2022-12-30 08:06:48 +01:00
Pablo Alba
ede07e4f44 🐛 Fix incorrect color in properties of multiple bool shapes 2022-12-30 08:05:26 +01:00
Alejandro Alonso
9c44cd343f Merge remote-tracking branch 'origin/staging' into develop 2022-12-30 07:46:38 +01:00
Alejandro
b2c55c79a4 Merge pull request #2710 from penpot/palba-convert-current-color-in-svg
🐛 Fix "currentColor" is not converted when importing SVG
2022-12-30 07:45:05 +01:00
Pablo Alba
0b2ffbe1fa 🐛 Fix "currentColor" is not converted when importing SVG 2022-12-30 07:44:47 +01:00
Alejandro
ebfe651b7d Merge pull request #2711 from penpot/palba-create-component-menu
🐛 Fix missing create component menu for frames
2022-12-30 07:40:20 +01:00
Pablo Alba
dac11d1606 🐛 Fix missing create component menu for frames 2022-12-30 07:28:27 +01:00
Alejandro
c8bd1e89d6 Merge pull request #2708 from penpot/palba-fix-selection-stroke-on-multiple-fonts
🐛 Fix selection stroke missing in properties of multiple texts
2022-12-30 07:25:50 +01:00
Alejandro Alonso
2d22f575a0 Merge remote-tracking branch 'origin/staging' into develop 2022-12-29 14:26:00 +01:00
Alejandro
8111db1110 Merge pull request #2709 from penpot/eva-bugfixing-css
🐛 Fix some visual errors
2022-12-29 14:25:30 +01:00
Eva
0a8dfde0a2 🐛 Fix some visual errors 2022-12-29 14:20:02 +01:00
Pablo Alba
9f6a3cbc23 🐛 Fix selection stroke missing in properties of multiple texts 2022-12-29 13:53:35 +01:00
Alejandro Alonso
87a264ae40 Merge remote-tracking branch 'origin/staging' into develop 2022-12-29 13:15:15 +01:00
Alejandro
6592456085 Merge pull request #2707 from penpot/alotor-remove-handoff-references
Remove handoff references
2022-12-29 13:14:55 +01:00
alonso.torres
3bbf632121 ♻️ Changed handoff for inspect everywhere 2022-12-29 13:06:16 +01:00
Alejandro
690090acb4 Merge pull request #2706 from penpot/alotor-flex-improvements
Flex improvements
2022-12-29 12:06:47 +01:00
Alejandro
104059a7b1 Merge pull request #2703 from penpot/palba-add-loading-icon-shared-libraries
🐛 Fix missing loading icon on shared libraries
2022-12-29 11:56:00 +01:00
Pablo Alba
f75af88877 🐛 Fix missing loading icon on shared libraries 2022-12-29 11:47:31 +01:00
alonso.torres
3c5be31222 Reorder layers through keys in flex layout 2022-12-29 11:16:54 +01:00
alonso.torres
a66b40d79e Changes to the margin-item and min/max width/height 2022-12-29 11:11:37 +01:00
alonso.torres
7e31c55e37 Support hidden elements in flex layout 2022-12-29 11:11:36 +01:00
Alejandro Alonso
9e30f974ef Merge remote-tracking branch 'origin/staging' into develop 2022-12-29 10:07:20 +01:00
Alejandro Alonso
d4360be96e 🐛 Fix guides inside frames issues 2022-12-29 09:50:04 +01:00
Fernando Krik
5e6d079fea 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 99.9% (1214 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2022-12-29 00:47:37 +01:00
Alejandro Alonso
4cc841d629 Merge remote-tracking branch 'origin/staging' into develop 2022-12-28 13:17:11 +01:00
Andrey Antukh
dcf95a7502 ⬇️ Downgrade promesa library
Causes incorect release build for some unknown reasons
2022-12-28 13:15:35 +01:00
Pablo Alba
4fc3f316e0 🐛 Add function to reparent orphan shapes 2022-12-28 12:49:07 +01:00
Alejandro Alonso
1497e8ef0f Merge remote-tracking branch 'origin/staging' into develop 2022-12-28 11:55:30 +01:00
Alejandro
83c8e7f03a Merge pull request #2699 from penpot/alotor-bugfixes
Alotor bugfixes
2022-12-28 11:53:57 +01:00
alonso.torres
074864a6bf 🐛 Fix problem when drawing boxes won't detect mouse-up 2022-12-28 11:48:38 +01:00
alonso.torres
aed7f0ad43 🐛 Fix problem when moving texts with keyboard 2022-12-28 11:48:36 +01:00
alonso.torres
cd2df41e87 🐛 Fix problems with transparent frames thumbnails 2022-12-28 11:48:14 +01:00
alonso.torres
00fbfd6e9e 🐛 Fix problem when moving shape inside frame 2022-12-28 11:48:14 +01:00
alonso.torres
93726cf8fe 🐛 Fix wrong interaction between comments and panning modes 2022-12-28 11:48:14 +01:00
Andrey Antukh
1dc6464974 🐛 Fix unexpected behavior of font-variant query
Missing coersion of team-id parameter
2022-12-28 11:30:27 +01:00
Alejandro
81cebb2aa8 Merge pull request #2693 from penpot/palba-fix-non-persistent-display-type-st
🐛 Fix display type of component library not persistent
2022-12-28 11:23:47 +01:00
Pablo Alba
6c8144a18a 🐛 Fix display type of component library not persistent 2022-12-28 11:15:42 +01:00
Alejandro Alonso
47bf758ad7 🐛 Fix guides spec failure 2022-12-28 11:14:51 +01:00
Alejandro
13cfe56301 Merge pull request #2698 from penpot/palba-interaction-bad-positioning-when-fixed
🐛 Fix bad element positioning on interaction with fixed scroll
2022-12-28 11:02:23 +01:00
Pablo Alba
33f7cec933 🐛 Fix bad element positioning on interaction with fixed scroll 2022-12-28 10:57:45 +01:00
Alejandro
1f00d91dd7 Merge pull request #2694 from penpot/niwinz-enhancements-6
🐛 Bugfixes
2022-12-28 09:57:07 +01:00
Andrey Antukh
c1a8437b6d Merge pull request #2697 from penpot/palba-outline-rounded-rect
🐛 Fix show outline with rounded corners on rects
2022-12-28 09:33:01 +01:00
Pablo Alba
5cb3aa5dbc 🐛 Fix show outline with rounded corners on rects 2022-12-28 09:23:11 +01:00
Andrey Antukh
de72dc5769 🐛 Fix race conditions issues on concurrent edition 2022-12-28 09:10:06 +01:00
Andrey Antukh
b827037f90 📎 Add experimental label on admin image on compose file 2022-12-28 09:10:06 +01:00
Andrey Antukh
60fb3f3d0e 🐛 Fix storage/pointer-map support issues on thumbnails and libs loading 2022-12-28 09:10:06 +01:00
Andrey Antukh
84fd952471 Improve storage/* features support on srepl helpers 2022-12-28 09:10:06 +01:00
Andrey Antukh
e37fc00351 🐛 Fix pointer-map support issue on get-team-shared-files RPC method 2022-12-28 09:10:06 +01:00
Andrey Antukh
4164c8f012 ⬆️ Update dependencies 2022-12-28 09:10:06 +01:00
Alejandro
c86af68349 Merge pull request #2695 from penpot/alotor-safari-fix-texts
🐛 Fix problems with Safari texts
2022-12-28 07:16:05 +01:00
Fernando Krik
4c392e3a31 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-12-27 23:22:16 +01:00
alonso.torres
4302ab05e4 🐛 Fix problems with Safari texts 2022-12-27 15:22:28 +01:00
Alejandro
777e2fb0a3 Merge pull request #2692 from penpot/palba-fix-style-team-invite
🐛 Fix style for team invite in deutsch
2022-12-27 12:49:05 +01:00
Alejandro Alonso
f7412ccbd7 📎 Fix version number and changelog 2022-12-27 12:05:42 +01:00
Alejandro Alonso
145d6f831a 📎 Prepare new development cycle 2022-12-27 12:04:02 +01:00
Alejandro
fe11b37b8f Merge pull request #2686 from penpot/niwinz-enhancements-5
General enhancements & Bugfixes
2022-12-27 11:58:22 +01:00
Pablo Alba
c469bd5757 🐛 Fix style for team invite in deutsch 2022-12-27 09:10:19 +01:00
Andrey Antukh
7d817eb080 🎉 Add new version of docker-compose.yaml
That not depends on config.env file and has better examples
2022-12-22 16:42:45 +01:00
Andrey Antukh
2840cb893e 🎉 Add login-with-password flag
As replacement to `login` flag
2022-12-22 16:42:45 +01:00
Andrey Antukh
7f5491f45b 💄 Add minor cosmetic changes to manage.sh script 2022-12-22 16:42:45 +01:00
Andrey Antukh
ef9dcf391d 🐛 Fix slow exit of exporter docker container 2022-12-22 16:42:45 +01:00
Andrey Antukh
81ecb26f8b Make exporter docker image run on non-root user 2022-12-22 16:42:45 +01:00
Andrey Antukh
35fd3ce150 Make backend docker image run on non-root user 2022-12-22 16:42:45 +01:00
Andrey Antukh
68d2afc75d Add missing type hints on backend code 2022-12-22 16:42:45 +01:00
Andrey Antukh
d094eb3595 Use custom jre for backend docker image
Reduces in 230M the image size.
Also updates JRE.
2022-12-22 16:42:45 +01:00
Andrey Antukh
f0d4ad4b20 🎉 Add local docker image building to manage.sh 2022-12-22 16:42:45 +01:00
Andrey Antukh
b929564fa7 ♻️ Add admin facilities on the code base
- Fix bugs related to orphan teams on profile deletion
- Separate session based profile-id param from api user provided
2022-12-22 16:42:45 +01:00
Andrey Antukh
53d9b547c3 🐛 Fix several rpc events not emiting webhooks 2022-12-22 16:42:45 +01:00
Andrey Antukh
50c17e1261 🐛 Fix invitation link translations issues 2022-12-22 16:42:45 +01:00
Andrey Antukh
a113a64554 🐛 Fix invitation link validation issue 2022-12-22 16:42:41 +01:00
matl-17
8aa1f29865 🌐 Add translations for: Czech.
Currently translated at 15.8% (192 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/cs/
2022-12-22 01:45:30 +01:00
Midka
62b730f5f0 🌐 Add translations for: Finnish (fin_FI).
Currently translated at 5.0% (61 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fin_FI/
2022-12-20 21:48:51 +01:00
Prithvi Tharun
f35095e053 Improves empty state content
Better instructions explaining multiple ways people can add files to library. Also, reads in neutral tone withour blaming and alarming the users

Signed-off-by: Prithvi Tharun <ptrithu8@gmail.com>
2022-12-20 23:30:37 +05:30
Prithvi Tharun
9e3515619d Improves empty state content
Reads in neutral content without alarming the users

Signed-off-by: Prithvi Tharun <ptrithu8@gmail.com>
2022-12-20 22:35:05 +05:30
andy
de7fb393c9 🌐 Added translation for: Finnish (fin_FI). 2022-12-19 10:22:15 +01:00
Ahmad HosseinBor
fed320be36 🌐 Add translations for: Persian.
Currently translated at 55.3% (673 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-12-17 17:49:47 +01:00
Andrey Antukh
c13730dca7 🐛 Fix incorrect request flow handling on session middleware
an issue introduced in previous commits
2022-12-16 16:59:34 +01:00
Prithvi Tharun
498ec29e47 Improves empty state content
Closes #2643 Reads positive and appreciative of their effort to keep up-to-date with the team. Plus, communicates when they'll see new notifications.

Signed-off-by: Prithvi Tharun <ptrithu8@gmail.com>
2022-12-16 16:12:41 +01:00
Alejandro
880d01368f Merge pull request #2669 from penpot/alotor-layout-fixes
🐛 Fix problem with auto-width and transforms
2022-12-16 14:07:20 +01:00
alonso.torres
1fe1a352c3 🐛 Fix problem with auto-width and transforms 2022-12-16 13:11:20 +01:00
Alejandro
8ffe023d3e Merge pull request #2667 from penpot/hiru-fix-sync-path
🐛 Fix component sync when shape is converted to path
2022-12-16 13:02:06 +01:00
Andrés Moya
16f30316c0 🐛 Fix component sync when shape is converted to path 2022-12-16 12:57:10 +01:00
Alejandro
ac7cb3c8c7 Merge pull request #2654 from penpot/eva-a11y-dashboard
 Improve dashboard accessibility
2022-12-16 12:52:53 +01:00
Alejandro
61c1b65072 Merge pull request #2661 from penpot/niwinz-enhancements-3
Enhancements & Bugfixes
2022-12-16 12:09:57 +01:00
Alejandro Alonso
ef994548c1 🐛 Fix typos 2022-12-16 12:09:45 +01:00
Alejandro Alonso
159085fd83 Merge branch 'niwinz-enhancements-3' of github.com:penpot/penpot into niwinz-enhancements-3 2022-12-16 11:39:50 +01:00
Andrey Antukh
84bee9fb93 🐛 Fix minor issue on logging when cause is nil 2022-12-16 10:31:48 +01:00
Andrey Antukh
2dcb4a155e Add import, export and management events to webhooks 2022-12-16 10:31:48 +01:00
Andrey Antukh
abf397fe5b Remove share-id from comments webhook 2022-12-16 10:31:48 +01:00
Andrey Antukh
0087447b01 Remove nils from audit/webhook props 2022-12-16 10:31:48 +01:00
Andrey Antukh
f47c20e079 🐛 Fix params inconsistency between mutation and commands 2022-12-16 10:31:48 +01:00
Andrey Antukh
4b26b6fc02 🐛 Fix incorrect output on webhook internal queries 2022-12-16 10:31:48 +01:00
Andrey Antukh
abeec9f869 📎 Add missing doc metadata on comments commands 2022-12-16 10:31:48 +01:00
Andrey Antukh
c9c070b5f4 Use new retry mechanism on comment thread creation 2022-12-16 10:31:48 +01:00
Andrey Antukh
d80a24b1e3 Add font events to webhooks 2022-12-16 10:31:48 +01:00
Andrey Antukh
ae8000df26 🔥 Remove unused code on RPC main ns 2022-12-16 10:31:48 +01:00
Andrey Antukh
f239c401e2 🐛 Fix incorrect auth cookie decoding on first stage session middleware 2022-12-16 10:31:48 +01:00
Andrey Antukh
f2e2700c79 💄 Change worker logging 2022-12-16 10:31:48 +01:00
Andrey Antukh
d38c495807 Add more project events to webhooks 2022-12-16 10:31:44 +01:00
Andrey Antukh
025cd44eae 🐛 Fix incorrect deduplication of tasks on webhooks 2022-12-16 10:31:13 +01:00
Andrey Antukh
8ac96d09cd 🐛 Properly remove qualified keys on audit/replace-props 2022-12-16 10:31:13 +01:00
Andrey Antukh
8f2a02ae72 🎉 Add webhooks to the API doc 2022-12-16 10:31:13 +01:00
Andrey Antukh
710878a667 Improve webhook URI validation 2022-12-16 10:31:13 +01:00
Andrey Antukh
350e4a1d1b Improve default update-file webhook batch timeout 2022-12-16 10:31:13 +01:00
Andrey Antukh
801d926946 💄 Fix linter issues 2022-12-16 10:31:13 +01:00
Andrey Antukh
e50ecd70c6 📎 Add some cosmetic changes to kondo config 2022-12-16 10:31:13 +01:00
Andrey Antukh
f11da06637 🎉 Add the ability to copy team invitation link 2022-12-16 10:31:13 +01:00
Andrey Antukh
a6b26f0563 🔥 Remove deprecated RPC methods 2022-12-16 10:31:13 +01:00
Andrey Antukh
dbf743d58a 📎 Add missing doc/added metadata on fonts related RPC methods 2022-12-16 10:31:13 +01:00
Andrey Antukh
d35e35acde 🔥 Remove old deprecated method from fonts queries RPC 2022-12-16 10:31:13 +01:00
Andrey Antukh
36f2ca6bb2 Add generic (blocking) retry macro
And use it on audit handling
2022-12-16 10:31:13 +01:00
Andrey Antukh
c570557203 ♻️ Move teams queries and mutations to commands 2022-12-16 10:31:13 +01:00
Andrey Antukh
797ae22526 Use the same value for created_at and tracked_at on audit 2022-12-16 10:31:13 +01:00
Andrey Antukh
4e1e67fc3d 🐛 Fix unexpected redirect on invitation acceptation 2022-12-16 10:31:13 +01:00
Alejandro Alonso
76a83bece9 Merge remote-tracking branch 'origin/staging' into develop 2022-12-16 10:29:42 +01:00
Alejandro Alonso
5605ac2769 📎 Increment version number. 2022-12-16 10:28:28 +01:00
Alejandro Alonso
e88d6d88a8 🐛 Fix strage cursor behaviour after clicking viewport with text pool 2022-12-16 10:09:20 +01:00
Andrey Antukh
0cc6c76cdb 🐛 Fix minor issue on logging when cause is nil 2022-12-16 09:41:32 +01:00
Andrey Antukh
fa7cf70cee Add import, export and management events to webhooks 2022-12-16 09:41:32 +01:00
Andrey Antukh
e25cf13783 Remove share-id from comments webhook 2022-12-16 09:41:32 +01:00
Andrey Antukh
6b199bef89 Remove nils from audit/webhook props 2022-12-16 09:41:32 +01:00
Andrey Antukh
74e6c01213 🐛 Fix params inconsistency between mutation and commands 2022-12-16 09:41:32 +01:00
Andrey Antukh
970dc04bc6 🐛 Fix incorrect output on webhook internal queries 2022-12-16 09:41:32 +01:00
Andrey Antukh
aefdbfa8ef Merge pull request #2662 from penpot/palba-fix-cant-select-text-assets-inputs
🐛 Fix unable to select text at assets inputs in firefox
2022-12-16 09:35:00 +01:00
Andrey Antukh
1b3976da47 📎 Add missing doc metadata on comments commands 2022-12-16 09:33:55 +01:00
Andrey Antukh
c52046d25b Use new retry mechanism on comment thread creation 2022-12-16 09:33:55 +01:00
Andrey Antukh
609fa87fe2 Add font events to webhooks 2022-12-16 09:33:52 +01:00
Andrey Antukh
9ca2450813 🔥 Remove unused code on RPC main ns 2022-12-16 09:33:24 +01:00
Andrey Antukh
408d33bdec 🐛 Fix incorrect auth cookie decoding on first stage session middleware 2022-12-16 09:33:24 +01:00
Andrey Antukh
226afe98e0 💄 Change worker logging 2022-12-15 11:33:10 +01:00
Andrey Antukh
db7920435b :sparkless: Add more project events to webhooks 2022-12-15 11:28:18 +01:00
Andrey Antukh
bdd00be5e4 🐛 Fix incorrect deduplication of tasks on webhooks 2022-12-15 11:27:43 +01:00
Andrey Antukh
6eedb5315b 🐛 Properly remove qualified keys on audit/replace-props 2022-12-15 11:26:19 +01:00
Eva
7045496a39 Improve dashboard accessibility 2022-12-15 09:17:14 +01:00
Andrey Antukh
02f29ed4d0 🎉 Add webhooks to the API doc 2022-12-15 08:18:29 +01:00
Andrey Antukh
6ea0279c9e Improve webhook URI validation 2022-12-14 16:22:13 +01:00
Andrey Antukh
6a7a25121e Improve default update-file webhook batch timeout 2022-12-14 16:22:13 +01:00
Andrey Antukh
a8f65ba69e 💄 Fix linter issues 2022-12-14 16:22:13 +01:00
Andrey Antukh
096b5f096c 📎 Add some cosmetic changes to kondo config 2022-12-14 16:22:13 +01:00
Andrey Antukh
842463ed1b 🎉 Add the ability to copy team invitation link 2022-12-14 16:22:13 +01:00
Andrey Antukh
7d2e3a0864 🔥 Remove deprecated RPC methods 2022-12-14 16:22:13 +01:00
Andrey Antukh
c2ced974b1 📎 Add missing doc/added metadata on fonts related RPC methods 2022-12-14 16:22:13 +01:00
Andrey Antukh
653b6bdb42 🔥 Remove old deprecated method from fonts queries RPC 2022-12-14 16:22:13 +01:00
Andrey Antukh
c820c49fc5 Add generic (blocking) retry macro
And use it on audit handling
2022-12-14 16:22:13 +01:00
Andrey Antukh
7a9172560d ♻️ Move teams queries and mutations to commands 2022-12-14 16:22:13 +01:00
Andrey Antukh
be5053ce22 Use the same value for created_at and tracked_at on audit 2022-12-14 16:22:13 +01:00
Andrey Antukh
44e87e75e6 🐛 Fix unexpected redirect on invitation acceptation 2022-12-14 16:22:13 +01:00
Alejandro
c9ad82edc3 Merge pull request #2642 from penpot/niwinz-backend-webhooks-4
🎉 Add webhooks processing & errors UI integration
2022-12-14 15:53:11 +01:00
Alejandro
430752383b Merge pull request #2664 from penpot/alotor-improve-thumbnails
 Improve thumbnail generation
2022-12-14 15:26:41 +01:00
alonso.torres
e9064611cf Improve thumbnail generation 2022-12-14 14:38:56 +01:00
alonso.torres
2ce36ce052 Merge remote-tracking branch 'origin/staging' into develop 2022-12-14 13:01:23 +01:00
Alejandro
56870ad68e Merge pull request #2663 from penpot/alotor-hotfix-problem-with-texts
🐛 Fix problem with auto-width/auto-height + lock-proportions
2022-12-14 12:50:18 +01:00
alonso.torres
7507a3b74f 🐛 Fix problem with auto-width/auto-height + lock-proportions 2022-12-14 12:47:12 +01:00
Pablo Alba
84903ae1f2 🐛 Fix unable to select text at assets inputs in firefox 2022-12-14 12:00:06 +01:00
Andrey Antukh
507800ae4e Merge pull request #2659 from penpot/alotor-flex-layout-features
Flex layout features
2022-12-14 09:07:40 +01:00
Andrey Antukh
d56082307b 🎉 Add update-file (batched) to webhooks 2022-12-13 23:14:55 +01:00
Andrey Antukh
782f2ed57d 🎉 Enable comments events on webhooks 2022-12-13 23:13:48 +01:00
Andrey Antukh
d7459db292 🎉 Add task deduplication by label 2022-12-13 23:13:11 +01:00
Pablo Alba
fd7d189bb7 💄 Change style of cancel button on webhooks modal 2022-12-13 22:22:21 +01:00
alonso.torres
5aaaab4f80 Show ghost when moving elemets from/into layout 2022-12-13 17:45:47 +01:00
alonso.torres
03228a9801 🐛 Fix problem with snap pixel 2022-12-13 17:45:47 +01:00
alonso.torres
2fbd1d8078 🐛 Fix problem with hug and item margins 2022-12-13 17:45:47 +01:00
alonso.torres
029efefb62 Import/export layout data 2022-12-13 16:43:28 +01:00
Andrey Antukh
ae79ee435e 🎉 Add many rpc calls to webhooks registry 2022-12-13 16:17:31 +01:00
Andrey Antukh
240e480b2e 🎉 Allow application/json on Accept header 2022-12-13 16:17:31 +01:00
Andrey Antukh
f2b60261f8 🎉 Add tests for webhooks rpc and logger 2022-12-13 16:17:31 +01:00
Andrey Antukh
21abd98b95 Integrate error handling for webhooks UI 2022-12-13 16:17:31 +01:00
Andrey Antukh
edaa62b05b 💄 Replace us/assert with us/assert! on dashboard data ns 2022-12-13 16:17:31 +01:00
Andrey Antukh
5b9f0ed0b1 🎉 Add webhook processing worker 2022-12-13 16:17:31 +01:00
Andrey Antukh
d768711caa Improve null handling on more db helpers 2022-12-13 16:17:31 +01:00
Andrey Antukh
d584ae5a0f Improve json encode/decode api 2022-12-13 16:17:31 +01:00
Andrey Antukh
9debfa3b27 📎 Minor cange on exception formating 2022-12-13 16:17:31 +01:00
Andrey Antukh
c0a4b7dc76 Improve worker queue management
and add specific worker instance for webhooks
2022-12-13 16:17:31 +01:00
Andrey Antukh
7f589b09ca ♻️ Move audit http handler to RPC 2022-12-13 16:17:31 +01:00
Andrey Antukh
27c4cdb5f9 Merge pull request #2658 from penpot/palba-inspect-bugs
Fix inspect bugs
2022-12-13 13:16:27 +01:00
Andrey Antukh
fb0cf6fcbc 📎 Revert some hacky code from previous commit 2022-12-13 13:14:44 +01:00
Andrey Antukh
7ca74c0467 📎 Fix unexpected linter issue 2022-12-13 12:58:57 +01:00
Pablo Alba
cd6aa8f691 🐛 Fix can't select a board in inspect mode 2022-12-13 12:57:32 +01:00
Pablo Alba
90bc9943bc 🐛 Fix expand right sidebar on workspace inspect 2022-12-13 12:46:53 +01:00
Andrey Antukh
fe7b4331d1 Merge pull request #2653 from penpot/alotor-poc-improve-transform
♻️ Changed transform calculation
2022-12-13 12:37:18 +01:00
alonso.torres
e1de3ba5e7 ♻️ Changed transform calculation 2022-12-13 12:36:54 +01:00
Eva Marco
5cd108c21a Merge pull request #2657 from penpot/palba-inspect-bugfixing
🐛 Fix flex elemen info doesn't show on inspect tab
2022-12-13 11:59:54 +01:00
Andrey Antukh
c53420c1f5 Merge pull request #2655 from penpot/eva-fix-login-icon
🐛 Fix home icon in login page
2022-12-13 08:47:45 +01:00
Pablo Alba
05e437ee06 🐛 Fix flex elemen info doesn't show on inspect tab 2022-12-12 16:56:25 +01:00
Eva
d0d63169e2 🐛 Fix home icon in login page 2022-12-12 16:53:05 +01:00
Andrey Antukh
c148326d1c Merge pull request #2648 from penpot/palba-empty-inspect
🎉 Add placeholder for empty inspect tab
2022-12-12 15:32:18 +01:00
Pablo Alba
76a19a82c3 🎉 Add placeholder for empty inspect tab 2022-12-12 15:26:36 +01:00
Andrey Antukh
4d1a22bd11 Merge pull request #2606 from penpot/eva-a11y-login
 Improve login accessibility
2022-12-12 13:53:15 +01:00
Eva
95a18fce8d Improve login accessibility 2022-12-12 13:52:58 +01:00
Andrey Antukh
8bc265a598 Merge pull request #2647 from penpot/alotor-flex-ui-changes
 Changes to the flex UI
2022-12-12 13:50:30 +01:00
alonso.torres
de6cba8c0b Changes to the flex UI 2022-12-12 13:50:14 +01:00
Andrey Antukh
f2fe1dd6f8 Merge pull request #2645 from penpot/palba-webhooks-flag
🎉 Add flag for enabling webhooks
2022-12-12 13:47:33 +01:00
Andrey Antukh
2ec479afd4 Merge pull request #2651 from penpot/alotor-fix-empty-thumbnails
🐛 Fix problems with empty thumbnails
2022-12-12 13:45:03 +01:00
Andrey Antukh
67682fe211 🐛 Fix shape exportation 2022-12-12 07:34:11 +01:00
Ahmad HosseinBor
1b30d023ef 🌐 Add translations for: Persian.
Currently translated at 54.9% (668 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-12-10 16:48:15 +01:00
Alex Howell
806a818cb3 🌐 Add translations for: Romanian.
Currently translated at 99.5% (1210 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2022-12-10 16:48:15 +01:00
GradelerM
4014fec195 🌐 Add translations for: French.
Currently translated at 92.0% (1119 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-12-10 16:48:14 +01:00
Andrey Antukh
79f27a849c Merge pull request #2652 from ryanbreen/fix-duplicate-require
💄 Remove duplicate require in backend/dev/user.clj
2022-12-10 14:21:08 +01:00
Ryan Breen
f607540f23 💄 Remove duplicate require in backend/dev/user.clj
Cleanup a duplicate require of srepl

Signed-off-by: Ryan Breen <rbreen@zmags.com>
2022-12-10 07:14:00 -05:00
alonso.torres
8609308cb4 🐛 Fix problems with empty thumbnails 2022-12-10 00:08:01 +01:00
Andrey Antukh
28f1e671cb Merge pull request #2650 from ryanbreen/comment-move-fix
🐛 Fix moving comment threads
2022-12-09 23:31:04 +01:00
Ryan Breen
c411ce248e 🐛 Fix moving comment threads
Moving comment threads was failing with assert errors because the speced type is gpt/point whereas update-comment-thread-position was passing a raw map of coordinates.

Signed-off-by: Ryan Breen <rbreen@zmags.com>
2022-12-09 13:35:02 -05:00
Pablo Alba
cae0311db6 🌐 Added translation for: Korean. 2022-12-09 16:36:55 +01:00
Pablo Alba
d283c6418e 🎉 Add flag for enabling webhooks 2022-12-09 13:00:23 +01:00
alonso.torres
415a3cad7b Calculate selrect from points 2022-12-09 11:01:24 +01:00
Andrey Antukh
36d2f72768 Merge pull request #2640 from penpot/alotor-performance-enhance
Flex layout fixes
2022-12-07 15:39:53 +01:00
alonso.torres
a64d92b005 Change default parameters on selection to layout 2022-12-07 15:05:38 +01:00
alonso.torres
172f4c142b Remove unused functions 2022-12-07 15:05:38 +01:00
alonso.torres
4b55c7a8e0 🐛 Fix problem with text not growing the hug container 2022-12-07 15:05:38 +01:00
alonso.torres
7dbe39b1b5 🐛 Fix problems with cache and thumbnails 2022-12-07 15:05:38 +01:00
alonso.torres
6c2d2e142b Improve reflow texts 2022-12-07 15:05:38 +01:00
Andrey Antukh
2183599c8d Merge pull request #2639 from penpot/palba-webhooks-crud
🎉 Add team webhooks section
2022-12-07 14:39:02 +01:00
Pablo Alba
cdbfec4f19 🎉 Add team webhooks section 2022-12-07 14:08:14 +01:00
Pablo Alba
cb7354a19c Merge pull request #2638 from penpot/superalex-fix-move-the-content-of-a-group-generates-orphan-elements
🐛 Fix move content of a group generates orphan elements
2022-12-07 08:57:19 +01:00
Alejandro Alonso
3157ad79a5 🐛 Fix move content of a group generates orphan elements 2022-12-07 08:38:04 +01:00
María Ozámiz
7c6dfef1c6 🌐 Add translations for: Galician.
Currently translated at 33.9% (412 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/gl/
2022-12-06 22:48:04 +01:00
Alex Howell
51440964a7 🌐 Add translations for: Romanian.
Currently translated at 76.4% (929 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2022-12-06 22:48:04 +01:00
Ally Tiago
f7a819fd57 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 99.9% (1214 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-12-06 22:48:03 +01:00
Pablo Alba
02d619ed48 Merge pull request #2635 from penpot/niwinz-backend-webhooks-3
🎉 Add webhook RPC API
2022-12-05 17:06:38 +01:00
Andrey Antukh
d97afa0e6d 📎 Add helper/devenv script for kill nonresponsive repl 2022-12-05 15:20:29 +01:00
Andrey Antukh
baade567ca 📎 Improve bundle run template script 2022-12-05 15:20:29 +01:00
Andrey Antukh
39b9daa3a7 🎉 Add webhooks rpc API 2022-12-05 15:20:29 +01:00
Pablo Alba
d8bb62c498 🐛 Fix layer drag enabled on chrome when is readonly 2022-12-05 10:37:56 +01:00
Alejandro
b45a0a979b Merge pull request #2613 from penpot/niwinz-backend-webhooks-2
♻️ Refactor audit and http client module
2022-12-05 10:34:48 +01:00
Andrey Antukh
861328af3e ⬆️ Update promesa library to 10.0.570 2022-12-05 09:06:24 +01:00
Andrey Antukh
8bad9d8340 ♻️ Refactor loggers/audit, auth/oidc, and http/clent modules 2022-12-05 08:53:00 +01:00
Andrey Antukh
7f7efc5760 Improve exception formating on backend 2022-12-05 08:51:54 +01:00
Salman Hossain Saif
378b9f3f67 🌐 Add translations for: Bengali.
Currently translated at 1.5% (19 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/bn/
2022-12-03 15:47:26 +01:00
María Ozámiz
cb3a7a1da0 🌐 Add translations for: Galician.
Currently translated at 31.1% (379 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/gl/
2022-12-03 15:47:25 +01:00
andy
6f4b533fc7 🌐 Added translation for: Bengali. 2022-12-02 14:10:07 +01:00
alonso.torres
e43fc0feb0 🐛 Fix masks in layout flex 2022-12-02 10:21:34 +01:00
alonso.torres
e53e715861 Disable feature toggle for layout flex 2022-12-02 10:21:34 +01:00
alonso.torres
32350bcf87 Improved performance for auto-width/auto-height texts 2022-12-02 10:21:34 +01:00
alonso.torres
29b1b4dbc9 🐛 Fix problem with hug layout and groups 2022-12-02 10:21:34 +01:00
Andrey Antukh
2c558a6a02 Merge pull request #2625 from penpot/hiru-detect-version-import
 Include features info in exported zipfiles
2022-12-02 09:19:28 +01:00
Andrey Antukh
95876c271c Merge pull request #2619 from penpot/hiru-fix-blank-page-import
🐛 Fix adding an extra blank page on import
2022-12-01 17:55:51 +01:00
Andrey Antukh
ccff27ac23 Merge pull request #2628 from penpot/hiru-fix-touched-import
🐛 Avoid setting touched flags in imported components
2022-12-01 17:55:30 +01:00
Andrés Moya
148f6cb3c2 🐛 Fix adding an extra blank page on import 2022-12-01 17:15:20 +01:00
alonso.torres
c9dbeec689 🐛 Fix right sidebar style 2022-12-01 17:12:08 +01:00
Andrés Moya
2b7c967920 🐛 Avoid setting touched flags in imported components 2022-12-01 16:01:51 +01:00
Andrés Moya
94cdd4a481 Include features info in exported zipfiles 2022-12-01 15:33:13 +01:00
Andrey Antukh
296b6c646e 🐛 Fix incorrect flag parsing on frontend features 2022-12-01 15:02:56 +01:00
Alejandro Alonso
ad491ccc8f Merge remote-tracking branch 'origin/staging' into develop 2022-12-01 14:50:26 +01:00
Andrey Antukh
ca7ebdcc8f Merge pull request #2626 from penpot/superalex-fix-paste-svg-leads-to-internal-server-error
🐛 Fix paste svg leads to internal server error
2022-12-01 14:29:33 +01:00
Alejandro
efb4b2cb7d Merge pull request #2623 from penpot/niwinz-parse-frontend-features-from-flags
 Parse frontend features from flags
2022-12-01 14:28:19 +01:00
Alejandro Alonso
92403f2afe 🐛 Fix paste svg leads to internal server error 2022-12-01 14:25:35 +01:00
Andrey Antukh
0e949679d9 Parse frontend features from flags
Simplifies setting features on deployments.
2022-12-01 13:43:57 +01:00
Alejandro
1b8e4dfdfa Merge pull request #2621 from penpot/superalex-fix-develop
🐛 Fix develop branch
2022-12-01 11:48:34 +01:00
GradelerM
dbdc656e3e 🌐 Add translations for: French.
Currently translated at 89.1% (1083 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-12-01 11:47:02 +01:00
Alejandro Alonso
afe8883e37 🐛 Fix develop branch 2022-12-01 11:42:18 +01:00
Andrey Antukh
d5398e672f Merge pull request #2614 from penpot/superalex-support-library-colors-on-library-build
🎉 Add support assets management via library
2022-12-01 11:32:29 +01:00
Alejandro Alonso
3252088494 🎉 Add support typography management via library 2022-12-01 11:30:37 +01:00
Alejandro Alonso
fffacf3552 🎉 Add support media management via library 2022-12-01 11:30:33 +01:00
Alejandro Alonso
a19417417a 🎉 Add support components managemente via library 2022-12-01 11:30:29 +01:00
Alejandro Alonso
4c1f2cfded 🎉 Add support color management via library 2022-12-01 11:30:24 +01:00
Alejandro Alonso
a907041564 Merge remote-tracking branch 'origin/staging' into develop 2022-12-01 10:57:32 +01:00
Andrey Antukh
dff4552549 🐛 Set runtime *assert* value to false on release build 2022-12-01 09:31:38 +01:00
Andrey Antukh
a4acdd1886 📎 Explicitly disable features on code 2022-12-01 08:56:23 +01:00
Pablo Alba
c1a1120137 Merge pull request #2601 from penpot/superalex-fix-paste-elements-from-outside-penpot-respect-hierarchy
🐛 Fix paste elements from outside penpot respect hierarchy
2022-11-30 16:40:30 +01:00
Andrey Antukh
32cd32649e Merge pull request #2617 from penpot/palba-workspace-inspect-tab
🎉 Add inspect tab to workspace
2022-11-30 14:56:52 +01:00
Andrey Antukh
678b6a285f Merge pull request #2616 from penpot/hiru-pretty-debug
💄 Make cleaner debug logs
2022-11-30 14:56:20 +01:00
Andrés Moya
de1a3de433 💄 Make cleaner debug logs 2022-11-30 14:07:56 +01:00
Pablo Alba
412564b418 🎉 Add inspect tab to workspace 2022-11-30 13:55:09 +01:00
Andrey Antukh
c451c7bb9d 🐛 Fix regression on worker task handling 2022-11-30 13:13:11 +01:00
alonso.torres
be24989eab 🐛 Fix problem with hug layout 2022-11-30 12:21:00 +01:00
alonso.torres
a439fb65ce 🐛 Fix multiple selection in layout container and items 2022-11-30 11:49:08 +01:00
Andrey Antukh
c98635bca1 Merge pull request #2610 from penpot/alotor-performance-enhance
Alotor performance enhance
2022-11-30 10:42:09 +01:00
alonso.torres
0d2b228eb7 Keep group constraint behaviour inside flex layout 2022-11-30 10:00:30 +01:00
alonso.torres
c79d549f53 Change modifiers to records 2022-11-30 10:00:30 +01:00
alonso.torres
600f9ef071 Performance improvements 2022-11-30 10:00:30 +01:00
Andrey Antukh
04243be4a5 📎 Update frontend bench namespace 2022-11-30 10:00:30 +01:00
Andrey Antukh
fc4e755f2b Optimize point functions 2022-11-30 10:00:30 +01:00
Andrey Antukh
c28534555b 📎 Add minor microptimizations and tests to points->rect 2022-11-30 10:00:30 +01:00
Andrey Antukh
380cba3a72 📎 Add bench namespace to fronend/dev 2022-11-30 10:00:29 +01:00
Andrey Antukh
89a19dec5b 🎉 Add cljs optimized get-prop helper macro 2022-11-30 10:00:29 +01:00
Andrey Antukh
f6305db2a8 Reorganize a bit the common.data ns 2022-11-30 10:00:29 +01:00
Andrey Antukh
197eff93e8 📎 Fix nodejs compatibility issue on uuid_impl 2022-11-30 10:00:29 +01:00
Andrey Antukh
12cc5c6c97 Merge pull request #2600 from penpot/palba-workspace-read-only
🎉 Add workspace read-only setting
2022-11-29 17:45:37 +01:00
Pablo Alba
cd47c0356a 🎉 Add workspace read-only setting 2022-11-29 17:28:00 +01:00
Dário
797aa68bfa 🌐 Add translations for: Chinese (Simplified).
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2022-11-29 15:48:08 +01:00
HIYIZI
80c17e5dcf 🌐 Add translations for: Chinese (Simplified).
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2022-11-29 15:48:07 +01:00
K.B.Dharun Krishna
7083c4e111 🌐 Add translations for: Tamil.
Currently translated at 2.1% (26 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ta/
2022-11-28 15:06:27 +01:00
HIYIZI
e0e0f0a9b1 🌐 Add translations for: Chinese (Simplified).
Currently translated at 99.5% (1210 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2022-11-28 15:06:27 +01:00
Maemolee
b57c5ec92a 🌐 Add translations for: Chinese (Simplified).
Currently translated at 99.5% (1210 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2022-11-28 15:06:27 +01:00
Andrey Antukh
1c2a462124 Merge pull request #2596 from penpot/niwinz-backend-webhooks
 Improve scalability of the worker abstraction
2022-11-28 12:46:41 +01:00
Andrey Antukh
329b1eb6f3 📎 Fix on test initialization on CI 2022-11-28 12:37:48 +01:00
Andrey Antukh
bcfb4e0f81 🐛 Fix metrics code on rpc.climit 2022-11-28 12:25:30 +01:00
Andrey Antukh
69011007ac Change execution model of storage.tmp cleaner 2022-11-28 12:21:46 +01:00
Andrey Antukh
0600b2abe4 ♻️ Make the worker abstraction more scalable
Start using redis for dispatcher to worker communication
and add the ability to start multiple threads to worker
for increase the concurrency.
2022-11-28 12:21:44 +01:00
Andrey Antukh
13a092b192 ♻️ Normalize internal naming on the worker module 2022-11-28 12:20:58 +01:00
Andrey Antukh
10bf6c5e56 ♻️ Normalize redis api and its usage in msgbus module 2022-11-28 12:20:58 +01:00
Alejandro Alonso
427e43585c 🐛 Fix strokes class 2022-11-28 09:56:52 +01:00
Andrey Antukh
667fabbdc5 Merge pull request #2602 from penpot/alotor-performance-enhance
 Viewport and hug performance enhances
2022-11-28 09:33:12 +01:00
Eva Marco
8413a8eb3e Merge pull request #2599 from penpot/niwinz-restore-search-rpc
🎉 Restore removed by mistake search rpc method
2022-11-28 09:02:05 +01:00
alonso.torres
f579bb0c8d Viewport and hug performance enhances 2022-11-25 16:08:41 +01:00
Alejandro Alonso
a2b70f227c 🐛 Fix paste elements from outside penpot respect hierarchy 2022-11-25 14:09:23 +01:00
Andrey Antukh
706714d557 🎉 Restore removed by mistake search rpc method 2022-11-25 10:42:17 +01:00
Andrey Antukh
399d57ace0 Merge branch 'iprithvitharun-2588-invitations-page-improvements' into develop 2022-11-24 16:53:16 +01:00
Prithvi Tharun
f2525f8159 Add several improvements to invitations page 2022-11-24 16:53:00 +01:00
Andrey Antukh
0fece05cc9 Merge pull request #2598 from penpot/superalex-update-translations-from-develop
 Update translations from develop
2022-11-24 16:45:02 +01:00
Alejandro Alonso
13c7d06353 Update translations from develop 2022-11-24 16:44:36 +01:00
Andrey Antukh
9593ded808 📎 Add missing copy on postgres upgrade script 2022-11-24 13:38:53 +01:00
Andrey Antukh
99adbbe91d 📎 Add postgres-upgrade.sh script 2022-11-24 12:47:41 +01:00
Andrey Antukh
6f1c2f474b 📎 Add missing change on devenv compose 2022-11-24 12:21:58 +01:00
Andrey Antukh
0061b37c13 Merge pull request #2597 from penpot/alotor-performance-enhance
 Improve transforms performance
2022-11-24 11:06:34 +01:00
alonso.torres
69bb4654c9 Improve transforms performance 2022-11-24 10:01:37 +01:00
Eva
694d90d485 Add id functionality to undo transactions 2022-11-24 10:00:32 +01:00
Eva
32746a5960 🐛 Fix some layout errors 2022-11-24 10:00:32 +01:00
Andrey Antukh
7c3f87d7b0 Merge pull request #2585 from penpot/superalex-fix-show-board-miniature-in-manual-overlay-setting
🐛 Fix show board miniature in manual overlay setting
2022-11-24 09:07:17 +01:00
Alejandro Alonso
b4e4a5cab4 🐛 Fix show board miniature in manual overlay setting 2022-11-24 09:06:42 +01:00
Andrey Antukh
c12c9a4419 Merge pull request #2566 from penpot/hiru-remove-graphics-popup
 Enhance modal of convert graphics into components
2022-11-24 09:06:04 +01:00
Andrés Moya
cc60cfc86d Enhance modal of convert graphics into components 2022-11-24 09:05:50 +01:00
Andrey Antukh
879c477ada Merge remote-tracking branch 'origin/staging' into develop 2022-11-24 08:52:35 +01:00
Alejandro
0a72859424 Merge pull request #2594 from penpot/niwinz-compatibility-fixes
🐛 Fix compatibility issue with 1.17.x file table changes
2022-11-23 14:49:16 +01:00
Andrey Antukh
6b7adec617 Merge pull request #2592 from penpot/palba-handoff-improvements
 Add several improvements to handoff
2022-11-23 13:49:36 +01:00
Andrey Antukh
e7865b8643 🐛 Fix compatibility issue with 1.17.x file table changes 2022-11-23 12:44:04 +01:00
Pablo Alba
461e5cb376 Add several improvements to handoff 2022-11-23 09:44:04 +01:00
Andrey Antukh
77a397de0c Merge pull request #2586 from penpot/hiru-fix-min-size
🐛 Fix min size when creating shapes
2022-11-23 09:39:18 +01:00
Andrey Antukh
c656dd146c Merge pull request #2589 from penpot/alotor-fixes
Flex layout fixes
2022-11-22 17:15:40 +01:00
alonso.torres
441e142349 🐛 Fix reflow layout when changes in paths and texts 2022-11-22 17:08:23 +01:00
alonso.torres
54fd836dd4 🐛 Fix problem when dragging layout children with frames 2022-11-22 16:41:44 +01:00
alonso.torres
7ffdf21657 🐛 Fix paste shapes into layout 2022-11-22 16:40:20 +01:00
Andrés Moya
8a6f1d82e5 🐛 Fix min size when creating shapes 2022-11-22 15:38:04 +01:00
Andrey Antukh
87ebb2e24c ⬆️ Update yetti dependency to v9.11 2022-11-22 14:06:14 +01:00
Andrey Antukh
9334138510 🐛 Fix persistence loop on dev code hot reload 2022-11-22 14:06:14 +01:00
Andrey Antukh
1b9dea01e2 🔥 Remove unused d/update-vals function
Already available as clojure.core/update-vals
2022-11-22 14:06:14 +01:00
Andrey Antukh
ccb7c466bf 🎉 Add lazy loading and storage/pointer-map support on viewer 2022-11-22 14:06:14 +01:00
Andrey Antukh
c72be4ae2a ⬆️ Update redis and postgresql on devenv docker 2022-11-22 14:06:14 +01:00
Andrey Antukh
fbd042d4ee 🐛 Remove not working chrono-units on duration constructor 2022-11-22 14:06:14 +01:00
Andrey Antukh
bbf95434d8 🎉 Add lazy loading and storage/pointer-map support on workspace
This also rewrites the workspace load process making it a bit more
efficient independently if lazy loading is used.
2022-11-22 14:06:14 +01:00
alonso.torres
2a46989ec9 🐛 Fix problem with flex direction 2022-11-22 12:06:12 +01:00
alonso.torres
baf9124304 🐛 Fix problem with texts in viewer 2022-11-22 12:05:59 +01:00
Andrey Antukh
c69d4820cb Merge pull request #2584 from penpot/superalex-add-core-ui-to-libraries-and-templates-carousel 2022-11-22 11:50:36 +01:00
Alejandro Alonso
7d48714aa2 🎉 Add core-ui to libraries and templates carousel 2022-11-22 11:50:15 +01:00
Prithvi Tharun
6565655ac3 🐛 Fix the corners icon name
Closes #2581
2022-11-22 11:46:32 +01:00
Andrey Antukh
d886889334 Merge pull request #2578 from penpot/superalex-interaction-open-url-after-delay-duplicate-tab
🐛 Interaction for open url after delay duplicates tab
2022-11-22 11:45:38 +01:00
Alejandro Alonso
a95a7b9f90 🐛 Fix interaction for open url after delay duplicates tab 2022-11-22 11:45:18 +01:00
Pablo Alba
3d381b92d9 Merge pull request #2580 from iprithvitharun/2579-updating-login-error-msg
 Login error message updated
2022-11-21 16:45:53 +01:00
Prithvi Tharun
08399ebac1 Error message updated
Updated to be accurate and concise.
2022-11-21 19:31:33 +05:30
Andrey Antukh
6a296a3e52 Merge pull request #2575 from penpot/hiru-reset-changes-deleted-component 2022-11-21 13:59:05 +01:00
Andrés Moya
af03f720b0 Allow to reset changes from a deleted component 2022-11-21 13:58:31 +01:00
Andrey Antukh
5400fdb293 Merge pull request #2573 from penpot/hiru-delete-copy-elements
🎉 When deleting a shape inside a component copy, just hide it
2022-11-21 11:56:50 +01:00
Andrés Moya
831839080f 🎉 When deleting a shape inside a component copy, just hide it 2022-11-21 11:56:15 +01:00
Andrey Antukh
8b7310032b Merge pull request #2562 from penpot/hiru-show-main-component
 Improve show main component menu
2022-11-20 20:26:07 +01:00
Andrés Moya
848f5125d8 Improve show main component menu 2022-11-20 20:25:53 +01:00
Andrey Antukh
9fd778f9c1 Merge pull request #2561 from penpot/hiru-bulk-import-graphics 2022-11-20 20:24:55 +01:00
Andrés Moya
ce7852329a 🎉 Add the ability to create components in bulk from images 2022-11-20 20:24:33 +01:00
Bogi Napoleon Wennerstrøm
08eb2bceb1 🌐 Add translations for: Faroese.
Currently translated at 14.1% (172 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-11-18 20:48:29 +01:00
Pablo Alba
527e4643da Merge pull request #2565 from penpot/eva-autolayout-code
Eva autolayout code
2022-11-18 13:17:13 +01:00
Eva
e3616ea2b5 🔧 Update highlight.js library 2022-11-18 09:42:50 +01:00
Eva
2a2b5c7dba Add code block to layout elements 2022-11-18 09:42:50 +01:00
Tummas Jóhan Sigvardsen
f439d10128 🌐 Add translations for: Faroese.
Currently translated at 13.2% (161 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-11-17 20:21:01 +01:00
Bogi Napoleon Wennerstrøm
b87022ef28 🌐 Add translations for: Faroese.
Currently translated at 13.2% (161 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-11-17 20:21:01 +01:00
Alejandro Alonso
93bbe1b2f8 Merge remote-tracking branch 'origin/staging' into develop 2022-11-17 12:21:56 +01:00
Alejandro Alonso
dbd8c12ac0 📎 Update changes and version files 2022-11-17 12:14:40 +01:00
Pablo Alba
ff0b031c8b 🐛 Fix colorpicker does not close upon switching to Dashboard 2022-11-17 12:11:30 +01:00
Andrey Antukh
9981bc7c9a Merge pull request #2563 from penpot/superalex-add-extra-info-to-add-asset-to-library-event
 Add extra info to add-asset-to-library event
2022-11-17 11:41:01 +01:00
Andrey Antukh
3de217a52e Merge pull request #2537 from penpot/alotor-autolayout-v2
Autolayout & refactor transformations
2022-11-17 11:35:41 +01:00
Alejandro Alonso
d5bb486de1 Add extra info to add-asset-to-library event 2022-11-17 10:09:40 +01:00
alonso.torres
afa6a97693 Fixes problem with bool shapes 2022-11-17 09:29:47 +01:00
alonso.torres
32756db1c1 Redone the calculus of sizing auto 2022-11-17 09:29:47 +01:00
alonso.torres
efc1b87ab0 Performance improvements 2022-11-17 09:29:47 +01:00
alonso.torres
7b2f0303e8 Fixed problems with masks 2022-11-17 09:29:47 +01:00
alonso.torres
4c5e8f42ce Review changes 2022-11-17 09:29:47 +01:00
alonso.torres
6e35b5c6b6 Fixed problem with new modifiers and text auto-heigh 2022-11-17 09:29:47 +01:00
alonso.torres
39041bb63b Fix problem with constraints 2022-11-17 09:29:47 +01:00
Eva
56efb571be Add add flex layout option in context menu 2022-11-17 09:29:47 +01:00
alonso.torres
c1affe75e1 Fix problem with fixed constraints 2022-11-17 09:29:47 +01:00
alonso.torres
cdaba395c4 Small fixes for flex layout 2022-11-17 09:29:45 +01:00
alonso.torres
e61e76a074 Fix problems with flipped layouts 2022-11-17 09:29:31 +01:00
alonso.torres
a2e26210d1 Renamed modifiers functions 2022-11-17 09:29:31 +01:00
alonso.torres
b5df7bbfc5 Remove constraints when autolayout 2022-11-17 09:29:30 +01:00
alonso.torres
7375eed18f Refactor modifiers 2022-11-17 09:29:03 +01:00
alonso.torres
861eb283e8 Flex layout small fixes 2022-11-17 09:29:03 +01:00
alonso.torres
c86d88834e Fix problems moving frames 2022-11-17 09:29:03 +01:00
alonso.torres
7caf4b9136 Removed constraints when layout child 2022-11-17 09:29:03 +01:00
alonso.torres
4ecc166055 Remove fill/auto when resizing 2022-11-17 09:29:03 +01:00
alonso.torres
7f0054959f Hug content to frames 2022-11-17 09:29:03 +01:00
alonso.torres
0274567d83 Visual adjustments 2022-11-17 09:29:03 +01:00
alonso.torres
cebda20dd4 Adapt to handoff changes 2022-11-17 09:29:03 +01:00
alonso.torres
94602feab1 Updated translation keys 2022-11-17 09:29:03 +01:00
alonso.torres
503a1dabac Align self and stretch fixes 2022-11-17 09:29:03 +01:00
alonso.torres
81d2f9dd9d Adds align-content options 2022-11-17 09:29:03 +01:00
alonso.torres
4b61e3228f Add min/max width/height for elements 2022-11-17 09:29:03 +01:00
alonso.torres
b8c90fdcf3 Refactor flex layout namespace 2022-11-17 09:29:03 +01:00
alonso.torres
58fd20094a Adapted dynamic modifiers and options for new modifiers 2022-11-17 09:29:03 +01:00
alonso.torres
af098bb64d Adds integration with new UI 2022-11-17 09:29:03 +01:00
alonso.torres
11f347941e Refactor for new modifiers 2022-11-17 09:29:03 +01:00
alonso.torres
c3ed46d3ab Move auto-layout children 2022-11-17 09:29:03 +01:00
alonso.torres
025cac0228 Drop-zone autolayout calculation 2022-11-17 09:29:03 +01:00
alonso.torres
8bcb9e1976 Autofill vectors calculation 2022-11-17 09:29:03 +01:00
alonso.torres
bc890a0b33 Refactor frames 2022-11-17 09:29:03 +01:00
alonso.torres
8d9ed4f8af Fill elements in auto-layout 2022-11-17 09:29:03 +01:00
alonso.torres
c01c46041d Adds autolayout positions calculations 2022-11-17 09:29:02 +01:00
alonso.torres
5050c35257 Adds layout items options 2022-11-17 09:26:17 +01:00
Pablo Alba
3c424786a7 Show board miniature in manual overlay setting 2022-11-16 14:31:44 +01:00
Pablo Alba
1affb53a26 Better overlays interactions on boards inside boards 2022-11-16 14:31:44 +01:00
Andrey Antukh
58dbe21544 Merge branch 'hiru-remove-graphics' into develop 2022-11-14 14:44:55 +01:00
Andrés Moya
6b1ecfd89c 📎 Add some code enhancements 2022-11-14 14:44:18 +01:00
Andrés Moya
20738545b8 🎉 Transform graphics into components 2022-11-11 09:56:40 +01:00
Pablo Alba
2cd8b65a5c 🐛 Fix colorpicker does not close upon switching to Dashboard 2022-11-10 15:50:43 +01:00
Andrey Antukh
8852ed815f 🐛 Fix unexpected exception on file-gc cron task 2022-11-10 14:54:50 +01:00
Andrey Antukh
fde03e21b0 🎉 Add conditional reading to RPC 2022-11-10 14:54:50 +01:00
Andrey Antukh
5192b36669 💄 Add some cosmetic adjustements 2022-11-10 14:54:50 +01:00
Andrey Antukh
b20d2badfe Load workspace thumbnails in a separated request 2022-11-10 14:54:50 +01:00
Andrey Antukh
dfb73192b8 📎 Change rpc middleware order (minor) 2022-11-10 14:54:50 +01:00
Andrey Antukh
59ba87d9cd Properly report malformed json error 2022-11-10 14:54:50 +01:00
Andrey Antukh
38ed3b076a 🔥 Remove unused config entry 2022-11-10 14:54:50 +01:00
Andrey Antukh
f3472fcd79 📚 Add documentation to objects and pointer map namespaces 2022-11-08 13:02:14 +01:00
Andrey Antukh
3ef99c287e ♻️ Refactor tests directory structure 2022-11-08 13:02:14 +01:00
Andrey Antukh
12e2d3ad96 📎 Rename app-tests to backend-tests for naming consistency 2022-11-08 13:02:14 +01:00
Andrey Antukh
0dc3dba428 📎 Set definitive fressian handler ids for objects and pointer map 2022-11-08 13:02:14 +01:00
Andrey Antukh
efb0ec46bf 🎉 Add tests for pointer map 2022-11-08 13:02:14 +01:00
Andrey Antukh
aa9e125e31 🎉 Add tests for objects map 2022-11-08 13:02:14 +01:00
Andrey Antukh
16afa90b9c Improve internal impl of objects-map 2022-11-08 13:02:14 +01:00
Andrey Antukh
fa93e5a1a7 ♻️ Refactor backend tests directory tree 2022-11-08 13:02:14 +01:00
Andrey Antukh
1298956d92 Improve srepl helpers for activate profile 2022-11-08 13:02:14 +01:00
Andrey Antukh
67b4d5a1c7 🐛 Fix issues when RPC returns nil values 2022-11-08 13:02:14 +01:00
Andrey Antukh
bfccae2373 🔥 Remove unused namespace 2022-11-08 13:02:14 +01:00
Andrey Antukh
5d9606f4d0 📎 Update .gitignore file 2022-11-08 13:02:14 +01:00
Andrey Antukh
76333cec26 🎉 Integrate storage/pointer-map file feature 2022-11-08 13:02:14 +01:00
Andrey Antukh
a42d7164ad 🎉 Add more helpers on srepl ns 2022-11-08 13:02:14 +01:00
Andrey Antukh
c027de2592 Make nil safe some decode helpers on db ns 2022-11-08 13:02:14 +01:00
Andrey Antukh
ce99ca0aa8 🎉 Add generic PointerMap abstraction 2022-11-08 13:02:14 +01:00
Andrey Antukh
751b99bf47 ⬆️ Update devenv dockerfiles 2022-11-08 13:02:14 +01:00
Andrey Antukh
67fc499001 Merge branch 'niwinz-enhancements' into develop 2022-11-07 16:57:35 +01:00
Andrey Antukh
6713d8eb3f Make metrics more modular 2022-11-07 11:18:22 +01:00
Andrey Antukh
e36d611f19 🔥 Remove obsolete code from scripts/repl 2022-11-07 11:17:49 +01:00
Andrey Antukh
111cf54ff6 ♻️ Refactor common module tests and add generative testing for types 2022-11-07 10:22:16 +01:00
Andrey Antukh
1f73558f1b 📎 Fix linter issues 2022-11-07 10:05:56 +01:00
Andrey Antukh
37ad04d2a6 🎉 Add robust concurrency limiter for RPC 2022-11-07 10:05:56 +01:00
Andrey Antukh
6ad9a5aadb 🐛 Fix many bugs on rlimit module 2022-11-07 08:37:43 +01:00
Andrey Antukh
9c33dc529d Improve error report list template 2022-11-07 08:37:43 +01:00
Andrey Antukh
82d72fd388 🐛 Add missing profile-id on the internal error reports 2022-11-07 08:37:43 +01:00
Andrey Antukh
43ab19f690 ♻️ Refactor (minor) of http session code
The rationale behind the refactor:
- Make available profile data to other middlewares without
  the need to access to the database (mainly for error reporting).
- Align with codestyle with the rest of internal modules.
- Simplify code.
2022-11-07 08:37:43 +01:00
Andrey Antukh
dbe516f725 ⬆️ Update deps (bugfixes on deps) 2022-11-07 08:37:43 +01:00
Stas Haas
17d1c16d9c 🌐 Add translations for: German.
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-11-05 11:09:39 +01:00
Andrey Antukh
2af28fef80 🐛 Fix autodetect language issues 2022-11-03 16:18:14 +01:00
Andrey Antukh
0548fdb43d 🎉 Backport v5 blob format (lz4 framed, less gc) 2022-11-03 16:18:14 +01:00
Andrés Moya
358d25680b 🐛 Yet some more typos 2022-11-03 15:37:05 +01:00
Andrey Antukh
57e7691e66 Merge remote-tracking branch 'origin/staging' into develop 2022-11-03 14:14:27 +01:00
Andrés Moya
ee4f063889 🐛 Fix one more typo 2022-11-03 14:13:31 +01:00
Andrés Moya
38d74b93b3 🐛 Fix some typos in library modals 2022-11-03 14:11:48 +01:00
Andrey Antukh
99aea77355 Merge pull request #2545 from penpot/palba-fix-sleep
🐛 Fix sleep
2022-11-03 09:01:46 +01:00
Pablo Alba
8b988e0f1f 📎 Fix linter (unused line on loki) 2022-11-03 08:57:14 +01:00
Pablo Alba
4be9d58181 🐛 Fix sleep 2022-11-03 08:55:28 +01:00
Tummas Jóhan Sigvardsen
0e3675ce1f 🌐 Add translations for: Faroese.
Currently translated at 11.6% (141 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-11-01 15:29:29 +01:00
Bogi Napoleon Wennerstrøm
92cd4693f4 🌐 Add translations for: Faroese.
Currently translated at 11.6% (141 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-11-01 15:29:28 +01:00
Tatsuto Yamamoto
7905b9fbeb 🌐 Add translations for: Japanese (jpn_JP).
Currently translated at 21.8% (265 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/jpn_JP/
2022-11-01 15:29:28 +01:00
Andrey Antukh
a85a65a554 Merge branch 'staging' into develop 2022-10-31 10:44:15 +01:00
Andrey Antukh
2f423a9add Merge branch 'main' into staging 2022-10-31 10:38:32 +01:00
Andrey Antukh
abbdd13b5d 📎 Update changelog 2022-10-31 10:31:52 +01:00
Andrey Antukh
b681e40af0 Merge tag '1.16.0-beta-hotfix-5' 2022-10-31 10:31:25 +01:00
Andrey Antukh
b669047f83 📎 Update changelog 2022-10-31 10:29:35 +01:00
Andrey Antukh
29ec7ca0c6 Merge remote-tracking branch 'origin/main' into staging 2022-10-31 10:28:50 +01:00
Mikel Larreategi
0b4318b32c 🌐 Add translations for: Basque.
Currently translated at 99.5% (1210 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/eu/
2022-10-29 15:03:18 +02:00
Stas Haas
0fd80bedf2 🌐 Add translations for: German.
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-10-29 15:03:17 +02:00
Marius
380f297af3 🌐 Add translations for: German.
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-10-29 15:03:17 +02:00
Henrik Steffens
f8f0944816 🌐 Add translations for: German.
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-10-29 15:03:17 +02:00
nautilusx
a5f833759a 🌐 Add translations for: German.
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-10-29 15:03:16 +02:00
Pablo Alba
f276910ce3 🐛 fix bad behaviour on hovering and click nested artboards 2022-10-28 11:47:26 +02:00
Tummas Jóhan Sigvardsen
7ab90c6b6f 🌐 Add translations for: Faroese.
Currently translated at 9.0% (110 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-10-27 15:02:46 +02:00
Pablo Alba
a5a0d51ca7 🌐 Add translations for: French.
Currently translated at 87.9% (1069 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-10-27 15:02:46 +02:00
Pablo Alba
508f3161b0 Merge pull request #2534 from penpot/eva-nudge-default
Eva nudge default
2022-10-27 13:24:19 +02:00
Eva
d663d2bebf Add new handoff flex item section" 2022-10-27 12:17:25 +02:00
Andrés Moya
c3fe8c8ebd 🐛 Upgrade gitpod docker file 2022-10-27 11:39:19 +02:00
Eva
21c9c205cb 🐛 Add nudge by default 2022-10-27 09:43:03 +02:00
Pablo Alba
afe4250ea9 Merge pull request #2471 from penpot/eva-unpublish-several-libs
🎉 Add unpublish option on context menu
2022-10-27 07:36:33 +02:00
Pablo Alba
ed3d24bdb4 Merge pull request #2533 from penpot/eva-fix-nudge
🐛 Fix nudge error
2022-10-27 07:16:05 +02:00
Eva
6eb85b2c8c 🐛 Fix nudge error 2022-10-26 17:53:08 +02:00
Eva
2375f9ab83 🎉 Add unpublish option on context menu 2022-10-26 09:25:13 +02:00
Pablo Alba
8f325e4303 Merge pull request #2485 from penpot/niwinz-new-langs
Add new langs and some fixes
2022-10-25 17:12:20 +02:00
Pablo Alba
cc577a21db Merge pull request #2528 from penpot/translations
Translations
2022-10-25 17:08:28 +02:00
Pablo Alba
76b235e608 Update translations 2022-10-25 17:07:07 +02:00
Pablo Alba
b98cf29134 🌐 Add translations for: German.
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-10-25 14:22:23 +02:00
Tummas Jóhan Sigvardsen
cc06bb7755 🌐 Add translations for: Faroese.
Currently translated at 7.7% (94 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-10-25 14:20:35 +02:00
Vin
bd1003e383 🌐 Add translations for: Russian.
Currently translated at 67.1% (816 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2022-10-25 14:20:35 +02:00
Eva Marco
190d67a0cb Merge pull request #2505 from penpot/palba-filter-comments-st
Fix displaying comments settings are not applied via "Comments" menu …
2022-10-25 10:02:00 +02:00
Eva Marco
627f497e7f Merge pull request #2497 from penpot/palba-confirm-unpublish-library
 Confirm unpublish library on libraries popup
2022-10-25 08:59:18 +02:00
Pablo Alba
f4a0b304a9 🐛 Fix displaying comments settings are not applied via "Comments" menu drop-down on the top navbar on view mode 2022-10-24 16:29:30 +02:00
Andrey Antukh
72f6905077 📎 Add commented code for easy debug release modal on ui ns 2022-10-24 12:36:43 +02:00
Andrés Moya
b191df0351 🐛 Fix bug about decoding :features PgArray 2022-10-24 12:27:31 +02:00
Alejandro
6ac08df63f Merge pull request #2473 from penpot/palba-change-email-wrong-message
Fix wrong email in the info message at change email
2022-10-24 11:41:38 +02:00
Pablo Alba
821981e579 🐛 Fix wrong email in the info message at change email 2022-10-24 11:41:02 +02:00
Alejandro Alonso
02382b95f6 🐛 Fix wrong validation text after interaction with 2 and more files 2022-10-24 10:37:10 +02:00
Alejandro
a1c9503fea Merge pull request #2499 from penpot/palba-boards-names-focus-mode
🐛 Fix boards name do not disappear in focus mode
2022-10-24 09:42:47 +02:00
Pablo Alba
ab86d5238a 🐛 Fix boards name do not disappear in focus mode 2022-10-24 09:05:04 +02:00
Bogi Napoleon Wennerstrøm
76675e1949 🌐 Add translations for: Faroese.
Currently translated at 6.5% (80 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-10-22 14:05:04 +02:00
Pablo Alba
66055a0b14 Confirm unpublish library on libraries popup 2022-10-21 16:25:25 +02:00
Alejandro Alonso
2ee15c3147 Merge remote-tracking branch 'origin/staging' into develop 2022-10-21 13:22:34 +02:00
Alejandro
318563858b Merge pull request #2496 from penpot/alotor-hotfix-snap-to-pixel
🐛 Fixed problem with snap to pixel
2022-10-21 13:21:58 +02:00
alonso.torres
b8a83a3479 🐛 Fixed problem with snap to pixel 2022-10-21 12:44:43 +02:00
Alejandro Alonso
52239a9670 Merge remote-tracking branch 'origin/staging' into develop 2022-10-20 12:44:58 +02:00
Alejandro
9fddc4611a Merge pull request #2490 from penpot/juan-fix-onboarding-img
🐛 Fix onboarding images
2022-10-20 12:34:05 +02:00
elhombretecla
a8b2f8868d 🐛 Fix onboarding images 2022-10-20 12:27:15 +02:00
Alejandro Alonso
e6b2c40441 Merge remote-tracking branch 'origin/staging' into develop 2022-10-20 12:12:54 +02:00
Alejandro Alonso
490d295f3a 🐛 Fix auto-width for texts can make text appear stretched 2022-10-20 11:57:18 +02:00
Eva
e16da8bd2d 🎉 Add new flex layout menu 2022-10-20 11:53:32 +02:00
Andrey Antukh
f51e35aa9c 🐛 Prevent duplicate locale watcher on hot code reload 2022-10-20 00:11:20 +02:00
Andrey Antukh
6323c3ac92 🐛 Fix autodetect language issues 2022-10-20 00:06:50 +02:00
Andrey Antukh
59e6ef5609 🎉 Add new langs (gl, ja_jp, pt_pt, hr) 2022-10-20 00:02:24 +02:00
nautilusx
eafb723415 🌐 Add translations for: German.
Currently translated at 100.0% (1215 of 1215 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-10-20 00:02:23 +02:00
Andrey Antukh
5463671db1 Merge pull request #2477 from penpot/palba-cleanup-translations
Cleanup translations
2022-10-19 16:32:07 +02:00
Pablo Alba
c24596b7f9 📎 Clean old translations 2022-10-19 16:23:24 +02:00
Pablo Alba
47be9a21f4 🎉 New script to find unused translations 2022-10-19 16:23:01 +02:00
Andrey Antukh
4c133ec880 📎 Add commented code for easy debug release modal on ui ns 2022-10-19 11:17:30 +02:00
Andrés Moya
39c601a51f 🐛 Fix small import problem 2022-10-19 11:14:07 +02:00
Elhombretecla
6c2c843f0a 🎉 Fix wording 2022-10-19 11:01:02 +02:00
Elhombretecla
e227e49ea6 🎉 Add new release images 2022-10-19 11:00:57 +02:00
Elhombretecla
d53741b8fd 🎉 Add new release info 2022-10-19 11:00:57 +02:00
Alejandro Alonso
666631a4bd 🐛 Fix firefox changing layer color type is not applied 2022-10-19 09:58:02 +02:00
Alejandro Alonso
0a529943a2 🐛 Fix text out of borders with "auto width" and center align 2022-10-19 09:29:43 +02:00
Alejandro Alonso
08a5550547 🐛 Fix text justify align text left 2022-10-19 09:29:43 +02:00
Alejandro Alonso
6894d90137 Merge remote-tracking branch 'origin/staging' into develop 2022-10-19 09:06:11 +02:00
Andrey Antukh
3f5ac58c73 🐛 Fix unexpected exception audit archive task 2022-10-19 08:48:23 +02:00
Alejandro Alonso
cdb4524c45 Merge remote-tracking branch 'origin/staging' into develop 2022-10-19 07:56:54 +02:00
Alejandro Alonso
3e21b0d8cc 📎 Update CHANGES.md file 2022-10-19 07:55:00 +02:00
Hosted Weblate
89a27e298d Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/
2022-10-18 20:20:18 +02:00
Hosted Weblate
9df8935d48 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/
2022-10-18 20:20:15 +02:00
Tummas Jóhan Sigvardsen
fb3d6b04af 🌐 Add translations for: Faroese.
Currently translated at 5.5% (67 of 1216 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-10-18 20:20:13 +02:00
Yaron Shahrabani
66c086d4d3 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (1216 of 1216 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2022-10-18 20:20:13 +02:00
nautilusx
5e55dddd87 🌐 Add translations for: German.
Currently translated at 100.0% (1216 of 1216 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-10-18 20:20:12 +02:00
Oğuz Ersen
bc0f0064ed 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1216 of 1216 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2022-10-18 20:20:12 +02:00
Tummas Jóhan Sigvardsen
ca8919dff0 🌐 Add translations for: Faroese.
Currently translated at 4.7% (58 of 1214 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-10-18 20:20:11 +02:00
Stas Haas
5aeac28f36 🌐 Add translations for: German.
Currently translated at 100.0% (1214 of 1214 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-10-18 20:20:11 +02:00
Pablo Alba
a6113df552 🐛 Remove unused translation 2022-10-18 20:14:41 +02:00
Andrey Antukh
f28b62cd3d 🐛 Fix inconsistencies on common/types specs 2022-10-18 15:49:18 +02:00
Andrey Antukh
8de1ae0478 📎 Add update-file process time log entry 2022-10-18 15:49:18 +02:00
Andrey Antukh
4fe767c169 Add missing type hints on binfile ns 2022-10-18 15:49:18 +02:00
Andrey Antukh
e50137d186 Minor improvement on internal RPC metadata api 2022-10-18 15:49:18 +02:00
Andrey Antukh
8e6b93e2a7 📎 Set correct license holder on common module sources 2022-10-18 15:49:18 +02:00
Andrey Antukh
2befad433f Remove unnecesary index building on :mov-objects 2022-10-18 15:49:18 +02:00
Andrey Antukh
96af4e26b0 Improve performance issues on backend shape validation 2022-10-18 15:49:18 +02:00
Andrey Antukh
3dc2c52f64 🐛 Fix compatibility issues with jdk19 on util/async ns 2022-10-18 15:49:18 +02:00
Andrey Antukh
b2cbb1e60f Update srepl helpers 2022-10-18 15:49:18 +02:00
Andrey Antukh
c0eab96253 Do not return the whole file on file rename 2022-10-18 15:49:18 +02:00
Andrey Antukh
951b3eb4fe Integrate objects-map and introduce file feature flags 2022-10-18 15:49:18 +02:00
Andrey Antukh
69f084e1df Add deleted at index to file table 2022-10-18 15:49:18 +02:00
Andrey Antukh
c4104c816b 🎉 Add serialization optimized ObjectsMap data type 2022-10-18 15:49:18 +02:00
Andrey Antukh
4ece0cdeda Make transit module extensible 2022-10-18 15:49:18 +02:00
Andrey Antukh
b1296ef765 Make fressian module extensible 2022-10-18 15:49:18 +02:00
Andrey Antukh
5fe3842d1e 🎉 Add v5 blob format (lz4 framed, less gc) 2022-10-18 15:49:18 +02:00
Andrey Antukh
d71c5e4105 📎 Add another print preference method 2022-10-18 15:49:18 +02:00
Andrey Antukh
8ad4dfe454 📎 Minor changes on user namespace 2022-10-18 15:49:18 +02:00
Andrés Moya
c23167a455 Merge pull request #2474 from penpot/translations
Update Translations
2022-10-18 15:33:11 +02:00
Pablo Alba
5a6b7800d7 Update translation files 2022-10-18 13:05:14 +02:00
Pablo Alba
3e118177d0 Merge remote-tracking branch 'weblate/develop' into translations 2022-10-18 12:58:17 +02:00
Andrey Antukh
aaf645bad4 Merge pull request #2459 from penpot/hiru-refactor-types
♻️ Move internal.xxx namespaces to separated files
2022-10-18 11:58:46 +02:00
Bogi Napoleon Wennerstrøm
00e724ce09 🌐 Add translations for: Faroese.
Currently translated at 4.4% (54 of 1214 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-10-18 10:01:34 +02:00
Tummas Jóhan Sigvardsen
8451444861 🌐 Add translations for: Faroese.
Currently translated at 4.4% (54 of 1214 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-10-18 10:01:34 +02:00
Stas Haas
ef5bc687ab 🌐 Add translations for: German.
Currently translated at 100.0% (1214 of 1214 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-10-18 10:01:34 +02:00
Andrés Moya
8463d501cd ♻️ Remove some undeclared namespaces 2022-10-18 09:54:47 +02:00
Andrey Antukh
a59ca5b781 Merge pull request #2443 from penpot/palba-figma-plugin
🎉 Basic changes to use penpot as a library
2022-10-18 09:07:33 +02:00
Pablo Alba
369dc8ffb5 🎉 Basic changes to use penpot as a library 2022-10-18 08:51:28 +02:00
Andrés Moya
04f8bbb1f2 📚 Fix copyright 2022-10-17 16:32:00 +02:00
Alejandro Alonso
10e0cf121b Merge remote-tracking branch 'origin/staging' into develop 2022-10-17 15:21:11 +02:00
Alejandro
b23ece88c2 Merge pull request #2434 from penpot/eva-fix-dragging
🐛 Fix draggin projects css
2022-10-17 15:18:51 +02:00
Eva
0765587373 🐛 Fix draggin projects css 2022-10-17 15:05:51 +02:00
Eva Marco
5c8710b8cb Merge pull request #2458 from penpot/palba-upload-font-fails-silent2
🐛 Fix custom font upload fails silently for unsupported formats
2022-10-17 13:16:32 +02:00
Pablo Alba
88cd19d21a 🐛 Fix custom font upload fails silently for unsupported formats 2022-10-17 13:10:45 +02:00
Eva Marco
ac3251b29e Merge pull request #2464 from penpot/superalex-remove-imported-and-updated-extra-words
🎉 Remove imported and updated extra words
2022-10-17 13:09:15 +02:00
Alejandro Alonso
a8150e1b05 🎉 Remove imported and updated extra words 2022-10-17 13:03:59 +02:00
Eva Marco
e2f6274ff2 Merge pull request #2454 from penpot/superalex-fix-assertion-error-trying-to-move-board
🐛 Fix assertion error trying to move board if path tool selected
2022-10-17 12:10:41 +02:00
Alejandro Alonso
c670d81a20 🐛 Fix assertion error trying to move board if path tool selected 2022-10-17 12:00:39 +02:00
Eva Marco
a8e6516059 Merge pull request #2442 from penpot/superalex-fix-grid-not-syncing-in-multi-user
🐛 Fix grid not syncing in multi user
2022-10-17 09:33:43 +02:00
Alejandro Alonso
87d323bb4c 🐛 Fix grid not syncing in multi user 2022-10-17 09:28:38 +02:00
Eva Marco
4b52612682 Merge pull request #2456 from penpot/superalex-show-spinner-while-loading-viewer-file
🎉 Show spinner while loading viewer file
2022-10-17 09:02:12 +02:00
Bogi Napoleon Wennerstrøm
948bda7cc8 🌐 Add translations for: Faroese.
Currently translated at 1.0% (13 of 1214 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-10-16 15:49:43 +02:00
Tummas Jóhan Sigvardsen
8baaae1770 🌐 Add translations for: Faroese.
Currently translated at 1.0% (13 of 1214 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fo/
2022-10-16 15:49:43 +02:00
ascarida
ea10ec22c2 🌐 Add translations for: Galician.
Currently translated at 30.6% (372 of 1214 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/gl/
2022-10-16 15:49:42 +02:00
Yaron Shahrabani
160e0d218b 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (1214 of 1214 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2022-10-16 15:49:42 +02:00
Andrés Moya
7e70f0ce30 ♻️ Move internal.xxx namespaces to separated files 2022-10-14 18:25:04 +02:00
Pablo Alba
0618aa32a0 Merge pull request #2407 from penpot/hiru-restore-remote-comp
🐛 Make restore component work in external libraries
2022-10-14 18:08:23 +02:00
Pablo Alba
e1403d74bd Merge pull request #2453 from penpot/superalex-support-multi-style-texts
🐛 Fix comments section not scrolling
2022-10-14 18:02:49 +02:00
Alejandro Alonso
41f5fb9621 🐛 Fix comments section not scrolling 2022-10-14 18:02:07 +02:00
Alejandro Alonso
563a6da83c 🐛 Fix partially missing english translation 2022-10-14 14:50:40 +02:00
Alejandro Alonso
3395fcb697 🎉 Show spinner while loading viewer file 2022-10-14 14:12:17 +02:00
Pablo Alba
b7d5960ec3 Merge pull request #2455 from penpot/superalex-fix-notification-for-newsletter-shown-in-all-cases
🐛 Fix notification for newsletter shown in all cases
2022-10-14 12:38:09 +02:00
Alejandro Alonso
c690a71b3e 🐛 Fix notification for newsletter shown in all cases 2022-10-14 12:26:59 +02:00
Eva Marco
b5ab9af5c9 Merge pull request #2441 from penpot/palba-gradient-handlers
🐛 Fix gradient handlers are under resize handlers
2022-10-13 16:29:29 +02:00
Pablo Alba
1e07c16633 🐛 Fix gradient handlers are under resize handlers 2022-10-13 15:55:36 +02:00
Eva Marco
9e6f12cb82 Merge pull request #2445 from penpot/palba-boards-grouped-titles
🐛 Fix boards grouped shouldn't show the title
2022-10-13 14:35:19 +02:00
Pablo Alba
00180f4fba 🐛 Fix boards grouped shouldn't show the title 2022-10-13 13:44:39 +02:00
Eva
ea15735372 🐛 Fix loading placeholder 2022-10-13 12:53:49 +02:00
Pablo Alba
0f5ba91f44 Merge pull request #2440 from penpot/eva-update-icon
💄 Update action icon
2022-10-13 12:41:09 +02:00
Eva
13cb186c70 💄 Update action icon 2022-10-13 12:24:48 +02:00
Alejandro
8b1e8408f2 Merge pull request #2435 from penpot/eva-fix-loading-placeholder
🐛 Fix loading placeholder
2022-10-11 15:59:17 +02:00
Eva
796211c655 🐛 Fix loading placeholder 2022-10-11 14:16:17 +02:00
Alejandro Alonso
0afef0fa44 Merge remote-tracking branch 'origin/staging' into develop 2022-10-11 14:02:51 +02:00
Alejandro Alonso
1dbaaf12fa Merge remote-tracking branch 'origin/main' into staging 2022-10-11 14:02:38 +02:00
Alejandro
adb19d0c83 Merge pull request #2433 from penpot/eva-fix-register-css
🐛 Fix social buttons in register form
2022-10-11 13:56:43 +02:00
Eva
d5d1cff420 🐛 Fix social buttons in register form 2022-10-11 13:36:11 +02:00
Alejandro Alonso
5ef390f07e WIP 2022-10-11 09:11:45 +02:00
Stas Haas
fca26f4022 🌐 Add translations for: German.
Currently translated at 99.0% (1203 of 1214 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-10-10 19:35:00 +02:00
Oğuz Ersen
5caaa2d593 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1214 of 1214 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2022-10-10 19:34:59 +02:00
Alejandro Alonso
c4c419b971 Merge remote-tracking branch 'origin/staging' into develop 2022-10-10 18:10:52 +02:00
Alejandro Alonso
0f7295dd7c Merge remote-tracking branch 'origin/main' into staging 2022-10-10 18:07:05 +02:00
Alejandro
556c0d0c2a Merge pull request #2431 from penpot/niwinz-event-handling-dashboard
 Improve consistency on event handling on dashboard
2022-10-10 18:02:51 +02:00
Andrey Antukh
582a20d369 Improve consistency on event handling on dashboard 2022-10-10 17:50:04 +02:00
Eva Marco
bcd9aa7ba7 Merge pull request #2411 from penpot/hiru-bug-sync-undo
🐛 Fix component sync in undo
2022-10-10 17:23:46 +02:00
Alejandro
cad2201c54 Merge pull request #2412 from penpot/niwinz-fixes-on-profile-deletion
🐛 Fix issues on profile deletion procedure
2022-10-10 10:54:41 +02:00
Alejandro
274e034033 Merge pull request #2430 from penpot/fix-text
💄 Fix text grammar
2022-10-10 10:47:01 +02:00
Andrés Moya
dec9c339cd 💄 Fix text grammar 2022-10-10 10:39:35 +02:00
ascarida
5423999913 🌐 Add translations for: Galician.
Currently translated at 30.2% (366 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/gl/
2022-10-10 10:05:33 +02:00
Valentina Chapellu
670365acb7 🌐 Add translations for: Italian.
Currently translated at 43.5% (526 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2022-10-10 10:05:33 +02:00
Shuaib Zahda
9915990e10 🌐 Add translations for: Arabic.
Currently translated at 66.6% (806 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2022-10-10 10:05:32 +02:00
Andrey Antukh
748ab5f75e Merge branch 'translations' into develop 2022-10-10 10:05:11 +02:00
Andrey Antukh
b995830693 📎 Sort translation files 2022-10-10 10:04:11 +02:00
Andrey Antukh
d47d4c2d58 Merge remote-tracking branch 'weblate/develop' into translations 2022-10-10 09:58:38 +02:00
Andrey Antukh
4b2b7278a7 Merge branch 'luzpaz-source-typos' into develop 2022-10-10 09:52:06 +02:00
Andrey Antukh
85bd44e37b 📎 Update translation files 2022-10-10 09:51:37 +02:00
luz paz
374909e05e 🔧 Fix typos in source code (follow-up)
This is a follow-up to e30bea0b6f but fixes source typos.
2022-10-10 09:48:38 +02:00
Eva Marco
ec19ec9280 Merge pull request #2414 from penpot/superalex-fix-artboard-border-radius
🐛 Fix artboard border radius
2022-10-10 09:30:36 +02:00
Eva Marco
fe371c088b Merge pull request #2416 from penpot/superalex-fix-viewer-dashboard-link
🐛 Fix viewer dashboard link
2022-10-10 09:20:53 +02:00
Alejandro Alonso
e3f0c2eaeb 🌐 Added translation for: Faroese. 2022-10-10 08:47:38 +02:00
K.B.Dharun Krishna
919fb96b34 🌐 Add translations for: Tamil.
Currently translated at 2.0% (25 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ta/
2022-10-07 04:17:08 +02:00
Alejandro Alonso
ac5412301e 🐛 Fix viewer dashboard link 2022-10-06 11:12:17 +02:00
Andrey Antukh
c0b778b67a 📎 Minor change on changelog file 2022-10-06 10:12:15 +02:00
Andrey Antukh
1309b51320 📎 Update bundle build script 2022-10-06 10:11:19 +02:00
Alejandro Alonso
9391cc9a41 🐛 Fix artboard border radius 2022-10-06 09:17:24 +02:00
Andrey Antukh
cc1dff4d3d ⬆️ Update exporter yarn dependencies 2022-10-05 11:39:40 +02:00
Andrey Antukh
6e28bb9df8 🐛 Fix issues on profile deletion procedure 2022-10-05 11:27:11 +02:00
Alejandro Alonso
c5ff785ff5 Merge remote-tracking branch 'origin/staging' into develop 2022-10-05 11:17:13 +02:00
Alejandro Alonso
02c0c867d6 Merge remote-tracking branch 'origin/main' into staging 2022-10-05 11:16:41 +02:00
Alejandro Alonso
796fcee1d8 🐛 Fix twitter feedback link 2022-10-05 11:14:53 +02:00
Andrés Moya
66cd60e02c 🐛 Fix component sync in undo 2022-10-05 10:39:32 +02:00
Alejandro Alonso
da33d539bf Merge remote-tracking branch 'origin/staging' into develop 2022-10-05 09:34:18 +02:00
Alejandro Alonso
80463536a8 Merge remote-tracking branch 'origin/main' into staging 2022-10-05 09:33:58 +02:00
Andrey Antukh
5a06749664 🐛 Disable broadcast-channel when it is not available (mainly safari) 2022-10-05 09:33:41 +02:00
Alejandro
5ad385cf93 Merge pull request #2409 from penpot/niwinz-hotfix
Fix compatibility issues with safari >=14 & < 16
2022-10-05 09:22:11 +02:00
Andrey Antukh
c534a40923 ⬆️ Update versions on default docker compose file 2022-10-05 08:42:14 +02:00
Andrey Antukh
348bc48db4 📎 Minor change on docker build script 2022-10-05 08:41:56 +02:00
Andrey Antukh
7fa44aa256 🐛 Disable broadcast-channel when it is not available (mainly safari) 2022-10-04 23:19:28 +02:00
Andrey Antukh
f1c3c41455 🐛 Fix compatibility issues with some bigint api and safari 2022-10-04 21:03:37 +02:00
Denys M
c925528212 🌐 Add translations for: Ukrainian (ukr_UA).
Currently translated at 19.6% (238 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2022-10-04 20:22:42 +02:00
Zvonimir Juranko
fc44610893 🌐 Add translations for: Croatian.
Currently translated at 93.0% (1125 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/hr/
2022-10-04 20:22:41 +02:00
Kevin Nowald
ccb17e68e2 🌐 Add translations for: Polish.
Currently translated at 94.8% (1147 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pl/
2022-10-04 20:22:41 +02:00
Youkho
5bdc2cc25d 🌐 Add translations for: Arabic.
Currently translated at 65.0% (786 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2022-10-04 20:22:40 +02:00
Antonio
f466d7a484 🌐 Add translations for: Catalan.
Currently translated at 96.2% (1164 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ca/
2022-10-04 20:22:40 +02:00
Alejandro Alonso
cbe51fcabd Merge remote-tracking branch 'origin/staging' into develop 2022-10-04 16:00:46 +02:00
Alejandro Alonso
65da328b25 Merge remote-tracking branch 'origin/main' into staging 2022-10-04 15:59:21 +02:00
Andrey Antukh
fadb1dfba6 Merge remote-tracking branch 'origin/staging' into develop 2022-10-04 15:33:00 +02:00
Andrés Moya
eb7f93d2e6 🐛 Make restore component work in external libraries 2022-10-04 15:26:14 +02:00
Andrey Antukh
c53152f027 📎 Update manage.sh 2022-10-04 15:14:25 +02:00
Andrey Antukh
953607fc4a 📎 Update changes and version files 2022-10-04 14:16:36 +02:00
Andrey Antukh
50af997f55 Merge pull request #2386 from penpot/palba-newsletter-subscription-st
 Newsletter suscription
2022-10-04 14:00:22 +02:00
Andrey Antukh
fc01acffc7 Merge pull request #2379 from penpot/hiru-gc-deleted-comp
 Add garbage collect of deleted components
2022-10-04 13:59:53 +02:00
Andrés Moya
687e4dce2a 🔧 Adjust code style 2022-10-04 13:50:23 +02:00
Andrés Moya
c5b875c925 Add garbage collect of deleted components 2022-10-04 13:50:23 +02:00
Andrey Antukh
a08b9adeee 📎 Fix merge issues from staging to develop 2022-10-04 13:31:06 +02:00
Andrey Antukh
c2158b0f3c Merge remote-tracking branch 'origin/staging' into develop 2022-10-04 13:29:03 +02:00
Andrey Antukh
97c36ce86c Merge pull request #2405 from penpot/eva-fix-colorpicker-library
🐛 Fix color bullets in colorpicker modal on libraries
2022-10-04 13:17:39 +02:00
Eva
b41ca75512 🐛 Fix color bullets in colorpicker modal on libraries 2022-10-04 13:15:36 +02:00
Pablo Alba
5bbfe376cf Merge pull request #2390 from penpot/hiru-delete-comp-assets
🐛 Fix delete component from assets panel in v2
2022-10-04 11:47:28 +02:00
Alejandro
d468c74851 Merge pull request #2403 from penpot/niwinz-websockets-internal-fixes
♻️ Refactor internal websocket connection stage management
2022-10-04 11:19:31 +02:00
Alejandro
7d0f2d76e8 Merge pull request #2384 from penpot/hiru-interactions-nested-boards
 Improve interactions with nested boards
2022-10-04 11:15:59 +02:00
Alejandro
8b721d2024 Merge pull request #2382 from penpot/niwinz-lazy-load-graphics-assets
🎉 Add lazy load for graphic assets thumbnails
2022-10-04 11:02:26 +02:00
Alejandro
3044d0abcc Merge pull request #2381 from penpot/niwinz-chunked-exports
 Make the exportation streaming directly to response
2022-10-04 10:55:49 +02:00
Alejandro
b2fd13e6bf Merge pull request #2371 from penpot/eva-fix-viewmode-login
🐛 Fix view mode login size
2022-10-04 10:45:12 +02:00
Andrey Antukh
c9ba5ff31e Merge branch 'schalkneethling-2395-switch-to-issue-forms' into develop 2022-10-04 10:44:50 +02:00
Schalk Neethling
0c1d04919f 📎 Switch to issue forms (on github)
GitHub launched issue template forms some time ago. These have helped other open source projects I have been involved in. As you can make certain fields required, it also helps cut down on issue spam.

fix #2395
2022-10-04 10:44:18 +02:00
Andrey Antukh
746f492632 Merge branch 'luzpaz-typos' into develop 2022-10-04 10:41:32 +02:00
luz paz
e30bea0b6f 🔧 Fix typos in source code
Found via `codespell -q 3 -S *.po,./frontend/yarn.lock -L childs,clen,fpr,inflight,ody,ot,ro,te,trys,ue`
2022-10-04 10:40:34 +02:00
Andrey Antukh
ac4218a3c2 Merge branch 'Vesther-fix/feedback-twitter-link' into develop 2022-10-04 10:37:06 +02:00
Kevin Nowald
0680d25fd7 🐛 Fix twitter feedback link
Refers to unexisting PenpotSupport Twitter account

Signed-off-by: Kevin Nowald <kevin@nowald.pl>
2022-10-04 10:35:48 +02:00
Alejandro Alonso
4a3a181403 Merge branch 'lol768-patch-1' into develop 2022-10-04 10:33:04 +02:00
Adam Williams
9ae40b392f 🐛 Fix word-break on comments, changed to break-word 2022-10-04 10:32:05 +02:00
Andrey Antukh
6fc5813182 Merge pull request #2402 from penpot/hiru-fix-touched
🐛 Fix touched detection when moving instances
2022-10-04 10:21:56 +02:00
Eva Marco
6e5ba88240 Merge pull request #2387 from penpot/hiru-new-dashboard
🐛 Show new dashboard only in v2, and fix loading screen
2022-10-03 16:29:00 +02:00
Andrés Moya
a6d9a65843 🐛 Show new dashboard only in v2, and fix loading screen 2022-10-03 16:13:29 +02:00
Andrey Antukh
8fae7f7aa6 ♻️ Refactor internal websocket connection stage management 2022-10-03 13:40:33 +02:00
Andrés Moya
e9d3e8a643 🐛 Fix touched detection when moving instances 2022-10-03 12:27:00 +02:00
Denys M
8c20890c7b 🌐 Add translations for: Ukrainian (ukr_UA).
Currently translated at 7.5% (91 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ukr_UA/
2022-10-01 16:17:53 +02:00
Zvonimir Juranko
dc863e8b97 🌐 Add translations for: Croatian.
Currently translated at 79.9% (967 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/hr/
2022-10-01 16:17:52 +02:00
K.B.Dharun Krishna
44241ada56 🌐 Add translations for: Tamil.
Currently translated at 0.5% (7 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ta/
2022-10-01 16:17:48 +02:00
Jacopo Lodovico Trabia
f9b7235f8b 🌐 Add translations for: Italian.
Currently translated at 43.0% (520 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2022-10-01 16:17:48 +02:00
Ahmad HosseinBor
cc68eaa9f7 🌐 Add translations for: Persian.
Currently translated at 55.1% (667 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-10-01 16:17:47 +02:00
Shuaib Zahda
af640234b5 🌐 Add translations for: Arabic.
Currently translated at 58.3% (706 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2022-10-01 16:17:47 +02:00
Youkho
3c1ab1d58a 🌐 Add translations for: Arabic.
Currently translated at 58.3% (706 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2022-10-01 16:17:47 +02:00
Andrés Moya
243e29fdb4 🐛 Fix delete component from assets panel in v2 2022-09-30 15:26:29 +02:00
Eva
a4bbb43555 🐛 Fix shortcut texts alignment 2022-09-30 13:31:27 +02:00
Pablo Alba
16e8d1fcf2 Newsletter suscription 2022-09-30 12:22:53 +02:00
Andrés Moya
0e49625ebf Improve interactions with nested boards 2022-09-30 11:28:45 +02:00
Alejandro Alonso
98f490703f 🌐 Added translation for: Ukrainian (ukr_UA). 2022-09-30 07:16:21 +02:00
Andrey Antukh
fcbb95e8b6 💄 Replace some use-callback with shorter use-fn on sidebar/assets 2022-09-29 15:09:28 +02:00
Andrey Antukh
0fc2442175 🎉 Make the graphics assets thumbnail load lazy 2022-09-29 15:07:57 +02:00
Andrey Antukh
8c39c3af9f Make the exportation streaming directly to response 2022-09-29 14:28:45 +02:00
Alejandro Alonso
8f786407af Merge remote-tracking branch 'origin/staging' into develop 2022-09-29 14:22:05 +02:00
Eva Marco
7dcd362abd Merge pull request #2380 from penpot/juan-dashboard-CSS
🎉 Dashboard new design review
2022-09-29 14:14:38 +02:00
Elhombretecla
23d1087bc5 🎉 Change pin icon 2022-09-29 14:00:11 +02:00
Elhombretecla
8d5a97f6e5 Change team UI dropdown refactor 2022-09-29 12:45:41 +02:00
Elhombretecla
80f49e06cc 🎉 add new css changes 2022-09-29 12:45:41 +02:00
Andrey Antukh
4378d71b70 🐛 Fix error message on login when profile does not have password 2022-09-29 11:42:45 +02:00
Andrey Antukh
fd6d72128b Merge remote-tracking branch 'origin/staging' into develop 2022-09-29 10:37:13 +02:00
Andrey Antukh
b7206d734b 📎 Minor devenv update 2022-09-29 10:32:18 +02:00
Andrey Antukh
886ab0e152 Improve iteration and add concat-all and fully lazy mapcat helper 2022-09-29 10:32:18 +02:00
elhombretecla
f470efc9c7 🎉 Add new contributors to thankyou.md 2022-09-29 09:28:47 +02:00
Eva
055a870c1f 🐛 Fix view mode login size 2022-09-29 09:00:13 +02:00
Andrey Antukh
a59a4d9891 Merge remote-tracking branch 'origin/staging' into develop 2022-09-29 08:40:07 +02:00
Andrey Antukh
058727a44b 🐛 Fix wrong spec on config 2022-09-29 08:38:49 +02:00
Andrey Antukh
2a55d2ebdb Merge remote-tracking branch 'origin/staging' into develop 2022-09-28 15:36:12 +02:00
Andrey Antukh
a6e14846c7 🐛 Fix inconsistencies on config related to semaphores 2022-09-28 15:33:29 +02:00
Andrey Antukh
c2fec03fc7 Increase the auth token timeout 2022-09-28 15:33:07 +02:00
Alejandro Alonso
43ceb6bb44 Merge remote-tracking branch 'origin/main' into develop 2022-09-28 14:30:28 +02:00
Alejandro
a5b36fd3f8 Merge pull request #2365 from penpot/eva-fix-texts
🐛 Fix some texts and a typo
2022-09-28 14:25:53 +02:00
Alejandro Alonso
14788846a5 Merge remote-tracking branch 'origin/main' into staging 2022-09-28 14:25:27 +02:00
Alejandro
94a9bc844a Merge pull request #2372 from penpot/eva-empty-viewer
🐛 Fix alignment of 'no boards' message in viewer
2022-09-28 14:22:08 +02:00
Eva
745aa17d8a 🐛 Fix alignment of 'no boards' message in viewer 2022-09-28 14:20:43 +02:00
Alejandro
012315f207 Merge pull request #2367 from penpot/eva-fix-typos
🐛 Fix some typos
2022-09-28 14:12:00 +02:00
Eva
ba37168a84 🐛 Fix some typos 2022-09-28 14:10:34 +02:00
Alejandro
c68a6cbc10 Merge pull request #2366 from penpot/eva-hotfix-pdf-exportation
🐛 Fix PDF exportation order
2022-09-28 14:09:16 +02:00
Eva Marco
41d5a490d4 Merge pull request #2363 from penpot/palba-accesibility-elements-without-name
 Fix elements-without-names and html-lang-missing accesibility issues
2022-09-28 13:41:57 +02:00
Pablo Alba
6a329fac27 Fix html-lang-missing accesibility issues 2022-09-28 13:16:36 +02:00
Pablo Alba
4ef876bf58 Fix elements-without-names accesibility issues 2022-09-28 12:47:33 +02:00
Andrey Antukh
7303d311d5 Merge remote-tracking branch 'origin/staging' into develop 2022-09-28 12:16:06 +02:00
Alejandro
35a72be4f2 Merge pull request #2346 from penpot/niwinz-hot-improvements
Improvements & Fixes (part 2)
2022-09-28 12:04:55 +02:00
Andrey Antukh
53c358cfd7 🐛 Fix ssl support on email sending module 2022-09-28 11:30:48 +02:00
Eva
c2ccdd5680 🐛 Fix PDF exportation order 2022-09-28 10:35:26 +02:00
Lazalatin
3a4563d755 🐛 Fix doubled quotes in frontend config
Docker parses environment variables literally, delivering quoted flags in the $PENPOT_FLAGS variable. This in turn leads to doubled quotes in the resulting config.js in front and after the flags, omitting them completely.

This commit fixes this behaviour.
2022-09-28 09:50:20 +02:00
Andrey Antukh
ab22909b6c Merge pull request #2364 from penpot/superalex-fix-resend-invitation
🐛 Fix Internal error when resending invitation email
2022-09-28 09:47:55 +02:00
Andrey Antukh
89e64236b0 Don't log exception on health check fail 2022-09-28 09:47:13 +02:00
Andrey Antukh
748499a26f 🎉 Add lazy loading of thumbnails on dashboard 2022-09-28 09:47:13 +02:00
Alejandro Alonso
8fec5af55e 🐛 Fix cannot take out an element from a group at layers panel by drag 2022-09-28 09:47:11 +02:00
Andrey Antukh
84655c0fa3 🐛 Fix content-length handling on exporter 2022-09-28 09:45:43 +02:00
Andrey Antukh
1dc493c2d5 🔥 Remove assets handler code for :db backend 2022-09-28 09:45:43 +02:00
Andrey Antukh
2753a934aa 📎 Add service result wrapper
Allows attach metadata to values that does not implement the IObj
clojure interface.
2022-09-28 09:45:43 +02:00
Pablo Alba
47363d96f1 Improve invitation token validation 2022-09-28 09:45:43 +02:00
Andrey Antukh
b74631bf4a ⬆️ Update shadow-cljs on exporter 2022-09-28 09:45:43 +02:00
Andrey Antukh
99a718e407 🎉 Add openjdk19 on devenv 2022-09-28 09:45:43 +02:00
Andrey Antukh
8bdfd188d8 ⬆️ Upgrade shadow-cljs and rumext dependency 2022-09-28 09:45:43 +02:00
Andrey Antukh
278f6685b6 Improve object deletion process on profile deletion 2022-09-28 09:45:43 +02:00
Andrey Antukh
06bce92cdc 📎 Fix linter issues on backend 2022-09-28 09:45:43 +02:00
Andrey Antukh
757cee67fb 🎉 Add the ability to completly block access to a profile 2022-09-28 09:45:43 +02:00
Andrey Antukh
37e2fe5c65 Allow repeated registers after small delay
Helps users with expired tokens proceed with a new register
2022-09-28 09:45:43 +02:00
Andrey Antukh
395a7096bf Minor improvements on error report template 2022-09-28 09:45:43 +02:00
Andrey Antukh
65afa2a833 ⬆️ Update dependencies 2022-09-28 09:45:43 +02:00
Andrey Antukh
041ecf67fe 🔥 Remove sentry from codebase 2022-09-28 09:45:43 +02:00
Eva
1a7583e6ad 🐛 Fix some texts and a typo 2022-09-28 09:42:08 +02:00
Alejandro Alonso
6ac1d47de1 🐛 Fix Internal error when resending invitation email 2022-09-28 08:43:48 +02:00
andy
f2de69e1f3 🌐 Added translation for: Croatian. 2022-09-27 17:35:28 +02:00
andy
2030e845bb 🌐 Added translation for: Tamil. 2022-09-27 17:32:55 +02:00
Dário
b1edc53a1c 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2022-09-27 17:18:10 +02:00
Youkho
4d56b5f1b9 🌐 Add translations for: Arabic.
Currently translated at 53.1% (642 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2022-09-27 17:18:10 +02:00
Oğuz Ersen
e1960b4472 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2022-09-27 17:18:09 +02:00
Alejandro
dfae7d30a1 Merge pull request #2362 from penpot/superalex-fix-sort-anidated-objects
🐛 Fix cannot take out an element from a group at layers panel by …
2022-09-27 14:10:24 +02:00
Alejandro Alonso
d8f1df0142 🐛 Fix cannot take out an element from a group at layers panel by drag 2022-09-27 14:04:48 +02:00
Alejandro
86993c0e21 Merge pull request #2360 from penpot/eva-a11y-add-title
 Add title to color bullets
2022-09-27 13:54:31 +02:00
Alejandro
a471d96b53 Merge pull request #2361 from penpot/niwinz-hotfix-exporter-content-length
🐛 Fix content-lenght calculation on exporter response
2022-09-27 13:22:31 +02:00
Andrey Antukh
51307cdf8d 🐛 Fix content-lenght calculation on exporter response 2022-09-27 13:11:17 +02:00
Alejandro Alonso
c373b3741f 📎 Increase version 2022-09-27 13:02:43 +02:00
Alejandro Alonso
bc55268a17 📎 Update CHANGES.md file 2022-09-27 12:57:36 +02:00
Eva
494b08b975 Add title to color bullets 2022-09-27 12:57:20 +02:00
Alejandro Alonso
0bc24bb6eb Merge remote-tracking branch 'origin/staging' into develop 2022-09-27 12:42:08 +02:00
Alejandro
1be1e94869 Merge pull request #2344 from penpot/eva-fix-layers
🐛 Fix delete layers in bulk
2022-09-27 12:30:15 +02:00
Eva
3ea3ca3bd9 🐛 Fix delete layers in bulk 2022-09-27 12:24:32 +02:00
Eva Marco
6c09ecbef5 Merge pull request #2329 from penpot/superalex-fix-bounding-box-mask
🐛 Fix bounding box mask
2022-09-27 12:17:28 +02:00
Alejandro Alonso
e888b06ec4 Merge remote-tracking branch 'origin/staging' into develop 2022-09-27 09:50:37 +02:00
Alejandro Alonso
c1a4ae9d36 Merge remote-tracking branch 'origin/staging' 2022-09-27 09:50:23 +02:00
Alejandro
1a9fbee412 Merge pull request #2352 from penpot/niwinz-mtype-fix
 Ignore S3 object metadata and use our own content-type header
2022-09-27 09:49:10 +02:00
Andrey Antukh
4909d6574e 📎 Remove unnecesary logging on ws io exception 2022-09-27 07:28:29 +02:00
Andrey Antukh
577db35777 Merge pull request #2349 from penpot/palba-add-thankyou
📎 Add THANKYOU file
2022-09-27 07:17:12 +02:00
Pablo Alba
f9187cd202 📎 Add THANKYOU file 2022-09-27 07:12:39 +02:00
Andrey Antukh
a868840132 Ignore S3 object metadata and use our own content-type header 2022-09-27 00:47:09 +02:00
Alejandro Alonso
33a8c47f6e Merge remote-tracking branch 'origin/staging' into develop 2022-09-26 16:50:41 +02:00
Alejandro Alonso
e80ad112b8 Merge remote-tracking branch 'origin/staging' 2022-09-26 16:50:29 +02:00
Alejandro
07601975ac Merge pull request #2347 from penpot/superalex-fix-remove-woff2-from-template
🐛 Fix woff2 reference in font template
2022-09-26 16:50:06 +02:00
Alejandro Alonso
c709505733 🐛 Fix woff2 reference in font template 2022-09-26 16:45:52 +02:00
Alejandro Alonso
c3f0657652 Merge remote-tracking branch 'origin/staging' into develop 2022-09-26 15:56:21 +02:00
Alejandro Alonso
853b78613d Merge remote-tracking branch 'origin/staging' 2022-09-26 15:31:40 +02:00
Andrey Antukh
0b4a1553b9 Merge pull request #2342 from penpot/superalex-disable-woff2-compress
🐛 Fix woff2 generation
2022-09-26 15:30:32 +02:00
Alejandro Alonso
f67c4ddca0 🐛 Fix woff2 generation 2022-09-26 15:25:42 +02:00
Alejandro
bc693ad1bb Merge pull request #2345 from penpot/niwinz-hash-and-dblock
🎉 Add better hashing approach for database locking on Uuids
2022-09-26 15:24:13 +02:00
Andrey Antukh
fad2e51cbe 🎉 Add better hashing approach for database locking on Uuids 2022-09-26 14:22:52 +02:00
Eva Marco
61d1a3a77b Merge pull request #2343 from penpot/palba-fix-ungroup-typography
🐛 Fix ungroup does not work for typographies
2022-09-26 13:13:05 +02:00
Pablo Alba
d060ddaeae 🐛 Fix ungroup does not work for typographies 2022-09-26 09:45:33 +02:00
Hugo Figueira
161a139194 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2022-09-25 01:03:26 +02:00
Shuaib Zahda
407423b480 🌐 Add translations for: Arabic.
Currently translated at 52.6% (637 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2022-09-25 01:03:25 +02:00
Hugo Figueira
aadc3c25db 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-25 01:03:25 +02:00
Hugo Figueira
26b32634f7 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-24 10:30:23 +02:00
Jaziel Cavalcante
836511f5c7 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-24 10:30:23 +02:00
Hugo Figueira
043683775f 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2022-09-23 22:54:31 +02:00
Dário
f6792ce67f 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2022-09-23 22:54:31 +02:00
Dário
84760f940c 🌐 Add translations for: Indonesian.
Currently translated at 9.3% (113 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2022-09-23 22:54:30 +02:00
Stas Haas
4faa3db6f8 🌐 Add translations for: German.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-09-23 22:54:30 +02:00
Filipe Pessanha
71f2e4cabe 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 99.1% (1199 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-23 22:54:30 +02:00
Jaziel Cavalcante
96ef9a3c52 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 99.1% (1199 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-23 22:54:29 +02:00
Hugo Figueira
83f734977f 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 99.1% (1199 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-23 22:54:29 +02:00
Stas Haas
9d02bbcc1c 🌐 Add translations for: Russian.
Currently translated at 66.5% (805 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2022-09-23 22:54:27 +02:00
Dário
f4264e47f0 🌐 Add translations for: Spanish.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/es/
2022-09-23 22:54:27 +02:00
Dário
0fa8f54ce4 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 99.0% (1198 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2022-09-23 16:27:47 +02:00
Hugo Figueira
920cb86849 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 62.7% (759 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-23 16:27:45 +02:00
Alejandro Alonso
d2d7803186 🐛 Fix export bounding box mask 2022-09-23 14:07:04 +02:00
Dário
706bf86c95 🌐 Add translations for: Portuguese (Portugal).
Currently translated at 64.9% (785 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_PT/
2022-09-23 13:07:40 +02:00
Vik
fbaa19d405 🌐 Add translations for: Russian.
Currently translated at 66.5% (804 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2022-09-23 13:06:07 +02:00
Eva Marco
38468d7584 Merge pull request #2327 from penpot/superalex-hotfixes
🐛 Hotfixes
2022-09-23 12:09:41 +02:00
Alejandro Alonso
a9e8f4eb67 🐛 Fix Terms and Privacy links overlapping 2022-09-23 09:46:39 +02:00
Alejandro Alonso
944cfd0fc4 🐛 Fix font search works only with lowercase letters 2022-09-23 09:46:39 +02:00
Alejandro Alonso
1ef4d42b28 🐛 Fix error after user drags layers in search functionality 2022-09-23 09:46:39 +02:00
Alejandro Alonso
441e9627b5 🐛 Fix Wrong shortcut button tip of Delete function 2022-09-23 09:46:39 +02:00
Alejandro Alonso
5d01a0e24c 🐛 Fix import files with unexpected format or invalid content 2022-09-23 09:46:39 +02:00
Valentina Chapellu
69ab9e9696 🌐 Add translations for: Italian.
Currently translated at 37.7% (456 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2022-09-22 23:21:44 +02:00
Jacopo Lodovico Trabia
d5fea6100d 🌐 Add translations for: Italian.
Currently translated at 37.7% (456 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2022-09-22 23:21:44 +02:00
nautilusx
47ba8383e8 🌐 Add translations for: German.
Currently translated at 99.6% (1205 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-09-22 23:21:43 +02:00
Ruan Aragão
48e6cc5a6b 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 60.6% (733 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-22 23:21:42 +02:00
Mateus Muller
da5fabbc66 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 60.6% (733 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-22 23:21:42 +02:00
Vik
691a9fa877 🌐 Add translations for: Russian.
Currently translated at 65.8% (796 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2022-09-22 23:21:42 +02:00
Alejandro
b2d0f3cac2 Merge pull request #2324 from penpot/eva-fix-library-colors
🐛 Fix library color selector
2022-09-22 16:48:48 +02:00
andy
2667e515f7 🌐 Added translation for: Portuguese (Portugal). 2022-09-22 16:43:43 +02:00
andy
f1552e4091 🌐 Added translation for: Finnish. 2022-09-22 16:40:29 +02:00
Eva
79e35e2608 🐛 Fix precision 2022-09-22 15:32:15 +02:00
Eva
6e33d5b311 🐛 Fix library color selector 2022-09-22 15:32:15 +02:00
Andrey Antukh
e1b62805e5 Merge pull request #2323 from 5idereal/patch-1
🐛 Fix language name
2022-09-22 10:59:09 +02:00
5idereal
5cff6eb592 🐛 Fix language name 2022-09-22 16:54:21 +08:00
Eva
f3115f8f3a 🐛 Remove gitter information from feedback page 2022-09-21 15:21:17 +02:00
Alejandro Alonso
f7cfb5708f Merge remote-tracking branch 'origin/staging' 2022-09-21 14:06:38 +02:00
Alejandro
e75c9df17e Merge pull request #2316 from penpot/superalex-fix-colors
🐛 Fix several issues in colors #2303
2022-09-21 14:06:18 +02:00
Alejandro Alonso
dfc1b03a60 📎 Update CHANGES.md file 2022-09-21 13:59:12 +02:00
Alejandro Alonso
726baefa25 🐛 Fix add to recent colors when changing fill or opacity manually 2022-09-21 13:54:34 +02:00
Alejandro Alonso
3063725a62 🐛 Fix color type icon doesn't change 2022-09-21 13:54:25 +02:00
Alejandro Alonso
aed065eec1 🐛 Fix using gradient for shadow fill 2022-09-21 13:54:25 +02:00
Eva
4961991e18 🐛 Fix gradient colors in recents 2022-09-21 13:54:25 +02:00
Eva
199142045f 🐛 Remove bugged colors from recents 2022-09-21 13:54:25 +02:00
Eva
f444d3d01d 🐛 Fix opacity in color picker 2022-09-21 13:54:25 +02:00
Eva
bea96cb586 🐛 Fix recent colors 2022-09-21 13:54:25 +02:00
Alejandro
cc18f84d62 Merge pull request #2302 from penpot/niwinz-hot-improvements
Enhancements
2022-09-21 10:01:31 +02:00
Alejandro
ac75d0cc1b Merge pull request #2310 from penpot/niwinz-onboarding-form-load-improvements
 Improve error handling on onboarding questions form
2022-09-21 09:46:58 +02:00
Andrey Antukh
21683be07b Improve error handling on onboarding questions form 2022-09-21 09:44:08 +02:00
Andrey Antukh
5ac123dc4b Improve error handling on onboarding questions form 2022-09-21 09:35:29 +02:00
Andrey Antukh
ec53288b66 Improve test runner 2022-09-21 09:29:48 +02:00
Andrey Antukh
2348146f00 🎉 Add 'email-verification' flag enabled by default
The main idea is deprecating the `insecure-register` flag with the more
general `email-verification` flag.
2022-09-21 09:29:48 +02:00
Andrey Antukh
41134f22e9 📎 Update license header 2022-09-20 23:23:22 +02:00
Andrey Antukh
9bfdcc6277 Make the task retry algorithm use better backoff values 2022-09-20 23:04:37 +02:00
Andrey Antukh
d3347a1be0 Allow floats on db/interval constructor 2022-09-20 23:04:37 +02:00
Andrey Antukh
ef2918a115 Minor change on how service middleware are applied 2022-09-20 23:04:37 +02:00
Andrey Antukh
92d3015d24 Reset the recovery request form on submit 2022-09-20 23:04:37 +02:00
Andrey Antukh
c4aba025c4 Add some srepl helpers for resend email verification 2022-09-20 23:04:37 +02:00
Andrey Antukh
3aac620276 Merge pull request #2298 from penpot/Waishnav-button-gap-fix
 UI improvements in Project section
2022-09-20 17:12:47 +02:00
Valentina Chapellu
e2b39c0680 🌐 Add translations for: Italian.
Currently translated at 32.5% (394 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2022-09-20 15:46:24 +02:00
Jacopo Lodovico Trabia
58d604a20a 🌐 Add translations for: Italian.
Currently translated at 32.5% (394 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2022-09-20 15:46:24 +02:00
Shuaib Zahda
dc7e252972 🌐 Add translations for: Arabic.
Currently translated at 48.6% (588 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2022-09-20 15:46:23 +02:00
Filipe Pessanha
4433c1136c 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 59.3% (717 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-20 15:46:23 +02:00
Semon Xue
0dbefcc401 🌐 Add translations for: Chinese (Simplified).
Currently translated at 99.9% (1208 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2022-09-20 15:46:22 +02:00
Vik
051a65c346 🌐 Add translations for: Russian.
Currently translated at 62.2% (752 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2022-09-20 15:46:22 +02:00
Swapnil C
449a6c9127 🌐 Add translations for: French.
Currently translated at 88.8% (1074 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-09-20 15:46:20 +02:00
Andrey Antukh
3c2ba92f6c 🎉 Add srepl helper for sending test email 2022-09-20 13:41:40 +02:00
Andrey Antukh
58319d84ad ♻️ Refactor email namespaces 2022-09-20 13:41:18 +02:00
Andrey Antukh
87691499d7 🐛 Add missing enable-smtp flag on devenv scripts 2022-09-20 13:40:32 +02:00
Andrey Antukh
e0112ac3a3 🐛 Fix worker startup on dev REPL 2022-09-20 13:39:47 +02:00
andy
f72b94ac9b 🌐 Added translation for: Czech. 2022-09-20 12:34:09 +02:00
Eva Marco
ee8b5cc1c5 Merge pull request #2300 from penpot/superalex-fix-change-multiple-colors-with-svg
🐛 Fix change multiple colors with svg
2022-09-20 12:11:05 +02:00
Alejandro Alonso
c638ab459f Merge remote-tracking branch 'origin/staging' 2022-09-20 12:05:00 +02:00
Alejandro Alonso
345ae020d6 📎 Update version.txt file 2022-09-20 11:52:36 +02:00
Alejandro Alonso
b6b800a8e2 📎 Update CHANGES.md file 2022-09-20 11:44:56 +02:00
Waishnav
eeb8d284cc UI improvements in Project section div 2022-09-20 11:44:56 +02:00
Alejandro Alonso
00222499cc 🐛 Fix files translation 2022-09-20 11:43:41 +02:00
Andrés Moya
c6067ce336 🐛 Only dangling reset is unavailable, other cases do work 2022-09-20 11:36:32 +02:00
Andrey Antukh
6f42f4ec45 ♻️ Refactor semaphore and executors 2022-09-20 11:32:45 +02:00
Andrey Antukh
12b98c22bc Increase the default db pool size to 60 2022-09-20 11:32:45 +02:00
Andrey Antukh
435c627afd Make the audit log gc more agressive 2022-09-20 11:32:45 +02:00
Alejandro Alonso
4de579f861 🐛 Fix change multiple colors with svg 2022-09-20 11:20:38 +02:00
Andrey Antukh
978b309b04 🐛 Fix issues introduced in previous merge 2022-09-20 08:58:57 +02:00
Andrey Antukh
32b8c17dad Merge remote-tracking branch 'origin/staging' into develop 2022-09-20 08:48:55 +02:00
Andrey Antukh
c6e33fa9bc Merge pull request #2260 from penpot/eva-layout-effect
🐛 Fix layout effects in viewer
2022-09-20 07:43:56 +02:00
Alejandro
69c2d95768 Merge pull request #2258 from penpot/alotor-hotfixes
Alotor hotfixes
2022-09-20 07:37:36 +02:00
Wojciech Maj
80cfe6df9d 🎉 Add microsoft variant of woff mimetype on the fonts selection dialog 2022-09-20 07:37:12 +02:00
Martial Garchery
29550add6c 📚 Fix readme typo 2022-09-20 07:34:27 +02:00
Semon Xue
9a4ad38957 🌐 Add translations for: Chinese (Simplified).
Currently translated at 92.5% (1119 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2022-09-19 11:17:40 +02:00
Alejandro
780b833a67 Merge pull request #2290 from penpot/superalex-fix-instagram-link
🐛 Fix instagram link
2022-09-19 08:49:37 +02:00
Alejandro Alonso
879041b0bc 🐛 Fix instagram link 2022-09-19 08:44:02 +02:00
Ahmad HosseinBor
1019a037d8 🌐 Add translations for: Persian.
Currently translated at 54.9% (664 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-09-19 06:15:22 +02:00
liimee
9af04c8fbb 🌐 Add translations for: Indonesian.
Currently translated at 9.3% (113 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2022-09-19 06:15:22 +02:00
Mikel Larreategi
9d63bc99bf 🌐 Add translations for: Basque.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/eu/
2022-09-16 23:18:21 +02:00
Eranot
516735cd0b 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 58.7% (710 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-16 23:18:21 +02:00
Ally Tiago
4497d8842a 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 58.7% (710 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-09-16 23:18:21 +02:00
Pablo Ruiz Múzquiz
48118a0ff4 Readme 2.0 (#2262)
* Change nav and new intro text

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* minor updates

Co-authored-by: elhombretecla <delacruzgarciajuan@gmail.com>
2022-09-15 17:06:26 +02:00
Beeby Xia
be5a232994 🌐 Add translations for: Chinese (Simplified).
Currently translated at 92.4% (1118 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2022-09-14 16:15:35 +02:00
Eva
843e1e91c2 " Add new context menu options for components" 2022-09-14 15:05:46 +02:00
alonso.torres
ddf8aaf68f 🐛 Fix problem when moving shapes inside nested frames 2022-09-14 13:12:16 +02:00
Eva
ffaf5d835d 🐛 Fix layout effects in viewer 2022-09-14 13:09:43 +02:00
Andrey Antukh
f94571b3b4 Merge pull request #2256 from penpot/palba-newsletter-subscription
🎉 Newsletter Opt-in options for subscription categories
2022-09-14 12:47:19 +02:00
Andrey Antukh
7832a80f82 Merge pull request #2243 from penpot/add-shortcut-for-clear-undo
🐛 Change shortcut for "Clear undo"
2022-09-14 12:46:27 +02:00
Andrey Antukh
16a0af802a Merge branch 'staging' into add-shortcut-for-clear-undo 2022-09-14 12:45:42 +02:00
alonso.torres
9cb6e71258 🐛 Fix issue when scaling to value 0 2022-09-14 12:28:10 +02:00
alonso.torres
c9c2f9e40f Revert "🐛 Fix weird text align"
This reverts commit 726f55bd04.
2022-09-14 12:28:10 +02:00
alonso.torres
bdd487adc0 🐛 Fix problem with snap to grids 2022-09-14 12:28:10 +02:00
Andrey Antukh
8e2ccfb4b0 Revert some changes from previous merge 2022-09-14 11:15:29 +02:00
Andrey Antukh
6067498570 ⬆️ Update aws/s3 dependency 2022-09-14 09:26:36 +02:00
Andrey Antukh
3cd9a3254d 🎉 Add /readyz http endpoint for backend & exporter 2022-09-14 09:26:26 +02:00
Andrey Antukh
4af851d4c6 Merge branch 'staging' into develop 2022-09-14 09:16:00 +02:00
Andrey Antukh
8fa49eada8 Merge pull request #2225 from penpot/superalex-viwer-performance-degradation-because-of-fixed-position
🎉 Improve viewer performance degradation because of fixed position
2022-09-14 08:30:53 +02:00
Pablo Alba
f921085c72 🎉 Newsletter Opt-in options for subscription categories 2022-09-13 17:10:23 +02:00
Beeby Xia
81a4c6b3f1 🌐 Add translations for: Chinese (Simplified).
Currently translated at 90.4% (1094 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2022-09-13 15:19:14 +02:00
Andrey Antukh
e58c943f41 ⬆️ Update aws/s3 dependency 2022-09-13 13:25:22 +02:00
Alejandro
c43e8bda3c Merge pull request #2255 from penpot/niwinz-healtz-endpoint
🎉 Add /readyz http endpoint for backend & exporter
2022-09-13 11:22:25 +02:00
Andrey Antukh
028e0c5b70 🎉 Add /readyz http endpoint for backend & exporter 2022-09-13 11:03:41 +02:00
Alejandro Alonso
108cdcecbb 🎉 Improve viewer performance degradation because of fixed position 2022-09-13 10:10:50 +02:00
Alejandro
36f30c611e Merge pull request #2244 from penpot/niwinz-docker-devenv-aarch64
🎉 Make the devenv docker image multiplatform
2022-09-12 15:49:25 +02:00
Andrey Antukh
172a39c2e2 Improve storage sharding replacing uuid/next with uuid/random 2022-09-12 15:31:14 +02:00
Stas Haas
4027241bc0 🌐 Add translations for: German.
Currently translated at 99.0% (1197 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-09-12 15:20:09 +02:00
Andrés Moya
f736ec813e 🐛 Fix origin-frame calculation 2022-09-12 11:52:32 +02:00
Eva
7618fcade0 🐛 Fix several transitions on same frame 2022-09-12 11:52:32 +02:00
Eva
7599b7abc6 🐛 Fix overlay close when click 2022-09-12 11:52:32 +02:00
Eva
67cbfc631d 🐛 Fix toggle overlay position 2022-09-12 11:52:32 +02:00
Eva
dc6afb46bf 🐛 Fix overlay remain open on frame change 2022-09-12 11:52:32 +02:00
Alejandro
f98512242a Merge pull request #2247 from penpot/palba-select-children-on-ungrouping
🐛 Fix when ungrouping, the items previously grouped should ALWAYS…
2022-09-12 08:27:14 +02:00
Pablo Alba
8b29767932 🐛 Fix items selected while ungrouping 2022-09-12 08:26:32 +02:00
Alejandro
b5b042e6e4 Merge pull request #2242 from penpot/palba-fix-move-layers
🐛 Fix Move layers fails (sometimes)
2022-09-12 06:50:29 +02:00
Mikel Larreategi
8ac1dfce29 🌐 Add translations for: Basque.
Currently translated at 97.4% (1178 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/eu/
2022-09-10 19:20:27 +02:00
Ahmad HosseinBor
8e0e77fd3c 🌐 Add translations for: Persian.
Currently translated at 54.6% (661 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-09-10 19:20:26 +02:00
Yaron Shahrabani
5b92dca270 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (1209 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2022-09-10 19:20:26 +02:00
liimee
5454cabf98 🌐 Add translations for: Indonesian.
Currently translated at 7.8% (95 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2022-09-10 19:20:25 +02:00
Stas Haas
e4e0deeb1c 🌐 Add translations for: German.
Currently translated at 98.9% (1196 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-09-10 19:20:25 +02:00
Beeby Xia
d47d687b43 🌐 Add translations for: Chinese (Simplified).
Currently translated at 89.9% (1088 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/zh_Hans/
2022-09-10 19:20:24 +02:00
Philippe Accorsi
0595d6b88d 🌐 Add translations for: French.
Currently translated at 86.3% (1044 of 1209 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-09-10 19:20:23 +02:00
Alejandro Alonso
726f55bd04 🐛 Fix weird text align 2022-09-09 12:30:23 +02:00
Andrey Antukh
f86f93deea Make the rate limit configuration automatically reloadable 2022-09-09 12:19:49 +02:00
Andrey Antukh
e657c1bbfa Start use datoteka.io ns 2022-09-09 12:19:49 +02:00
Andrey Antukh
b5e26fe615 🎉 Make the devenv docker image multiplatform
Add support for aarch64
2022-09-08 16:27:40 +02:00
Pablo Alba
73d2aad4db 🐛 Change shortcut for "Clear undo" 2022-09-08 16:24:37 +02:00
Pablo Alba
27aa20f00b 🐛 Fix Move layers fails (sometimes) 2022-09-08 10:27:43 +02:00
Alejandro
643e58c61b Merge pull request #2233 from penpot/palba-fix-grouping-typographies
🐛 Fix Grouping typographies by drag & drop does not work (again)
2022-09-08 08:27:26 +02:00
Pablo Alba
f7aba14f76 bug: Fix Grouping typographies by drag & drop does not work (again) 2022-09-08 08:05:06 +02:00
Alejandro
19a9440f11 Merge pull request #2240 from penpot/palba-fix-undo-move-layers
🐛 Fix undo after moving layers will wrongly order the layers
2022-09-08 08:01:27 +02:00
Alejandro
1e2d100c81 Merge pull request #2236 from penpot/niwinz-minor-improvements
Minor improvements
2022-09-08 07:21:06 +02:00
Andrey Antukh
675a07bac6 🔥 Remove internal file data blob format v2 2022-09-08 07:16:44 +02:00
Pablo Alba
21ec8bfdac 🐛 Fix undo after moving layers will wrongly order the layers 2022-09-07 16:57:22 +02:00
Alejandro Alonso
de57300fe3 Merge remote-tracking branch 'origin/staging' into develop 2022-09-07 12:00:56 +02:00
Alejandro Alonso
2da6732aba Merge remote-tracking branch 'origin/staging' 2022-09-07 11:58:57 +02:00
Alejandro Alonso
be18defcb1 📎 Update version.txt file 2022-09-07 11:58:47 +02:00
Alejandro Alonso
52344fdb18 Merge remote-tracking branch 'origin/staging' into develop 2022-09-07 11:39:01 +02:00
Alejandro Alonso
d632ca3114 Merge remote-tracking branch 'origin/staging' 2022-09-07 11:38:43 +02:00
Alejandro
c19237b45a Merge pull request #2238 from penpot/alotor-bug-texts
🐛 Fix problem with texts for non existing fonts
2022-09-07 11:28:21 +02:00
alonso.torres
c47f5ca186 🐛 Fix problem with texts for non existing fonts 2022-09-07 11:12:30 +02:00
Alejandro Alonso
fb8543c4e4 Merge remote-tracking branch 'origin/staging' into develop 2022-09-07 06:32:29 +02:00
Andrey Antukh
e0ac583aba 📎 Improve analyze-files helper on srepl ns 2022-09-06 16:53:28 +02:00
Andrey Antukh
5cd0079e7f 📎 Add some utilities on user ns 2022-09-06 16:52:51 +02:00
Andrey Antukh
00a7760c0f Change default task schedule 2022-09-06 12:30:23 +02:00
Alejandro
89732d911b Merge pull request #2234 from penpot/niwinz-tasks-schedule-change
 Change default task schedule
2022-09-06 12:28:58 +02:00
Andrey Antukh
c184ab58a3 Change default task schedule 2022-09-06 12:17:28 +02:00
Andrey Antukh
182b572550 Merge pull request #2232 from penpot/alotor-ungroup-frames
 Ungroup frames
2022-09-06 11:59:37 +02:00
Andrey Antukh
f394e8dba3 📎 Minor fix on i18n ns 2022-09-06 11:13:01 +02:00
Andrey Antukh
5bcf5ff4bc 🎉 Add it and eu languages to the i18n subsystem 2022-09-06 11:11:30 +02:00
Alejandro
d41c2388c1 Merge pull request #2229 from penpot/niwinz-msgbus-improvements
 Improve msgbus internal API
2022-09-06 10:50:42 +02:00
Alejandro
0155ef80b2 Merge pull request #2222 from penpot/niwinz-uuidv8-improvements
 Improve UUIDv8 implementation
2022-09-06 10:44:36 +02:00
Alejandro
ad32512980 Merge pull request #2223 from penpot/niwinz-public-uri-improvements
 Improve public-uri handling
2022-09-06 10:43:30 +02:00
Andrey Antukh
d082ff0a2b Improve UUIDv8 implementation 2022-09-06 10:37:23 +02:00
alonso.torres
c0fc68b9f0 Ungroup frames 2022-09-06 09:31:01 +02:00
Andrey Antukh
82032bedf5 Sort & validate translation files 2022-09-06 08:40:18 +02:00
Andrey Antukh
915d4249a0 Merge branch 'translations' into develop 2022-09-06 08:15:50 +02:00
Andrey Antukh
004334a7c8 Merge remote-tracking branch 'weblate/develop' into translations 2022-09-06 08:15:24 +02:00
Valentina Chapellu
97d5f48ab5 🌐 Add translations for: Italian.
Currently translated at 33.2% (388 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2022-09-06 08:05:28 +02:00
Stas Haas
0155c6c5c4 🌐 Add translations for: German.
Currently translated at 93.9% (1095 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-09-06 08:05:27 +02:00
Andrey Antukh
45adc8a61d Merge pull request #2228 from penpot/hiru-check-v2-viewer
 Disallow to view a file with components-v2
2022-09-05 19:09:01 +02:00
Andrey Antukh
a555e13b6a Improve msgbus internal API 2022-09-05 19:08:26 +02:00
Andrés Moya
f1b536034a Show error instead of dialog 2022-09-05 16:16:24 +02:00
Andrey Antukh
6018df480e Merge pull request #2227 from penpot/palba-fix-colorpicker
🐛 Fix color-picker recent colors
2022-09-05 15:54:55 +02:00
Andrés Moya
3a6876eeec Disallow to view a file with components-v2 2022-09-05 15:53:19 +02:00
Pablo Alba
7e4b7424a5 🐛 Fix color-picker recent colors 2022-09-05 15:38:37 +02:00
Andrey Antukh
ce7eed5ea0 🐛 Fix issues on deleting library which is in use by deleted files 2022-09-05 14:58:05 +02:00
Andrey Antukh
11018581ed Merge pull request #2201 from penpot/hiru-undelete-components
🎉 Allow to restore deleted components
2022-09-05 14:26:14 +02:00
Andrey Antukh
3aa25e7a90 Merge pull request #2224 from penpot/eva-fix-grow-type
🐛 Fix default grow type in texts
2022-09-05 14:19:06 +02:00
Rubén
302c135d51 🌐 Add translations for: Catalan.
Currently translated at 99.4% (1160 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ca/
2022-09-05 14:17:52 +02:00
Alejandro Alonso
9c68432936 Merge remote-tracking branch 'origin/staging' into develop 2022-09-05 12:13:08 +02:00
Alejandro Alonso
851092fc9e Merge remote-tracking branch 'origin/staging' 2022-09-05 11:57:43 +02:00
Eva
c69cb20be1 🐛 Fix default grow type in texts 2022-09-05 11:17:51 +02:00
Andrey Antukh
a1fccd46ff Improve public-uri handling
This enables use penpot under subdirectory
2022-09-05 09:41:19 +02:00
Valentina Chapellu
d75648e6b0 🌐 Add translations for: Italian.
Currently translated at 22.8% (266 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/it/
2022-09-03 10:15:37 +02:00
liimee
179a77eb05 🌐 Add translations for: Indonesian.
Currently translated at 6.7% (79 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/id/
2022-09-03 10:15:36 +02:00
Stas Haas
352c044aad 🌐 Add translations for: German.
Currently translated at 92.7% (1081 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-09-03 10:15:35 +02:00
Aimee
5503e371aa 🌐 Add translations for: French.
Currently translated at 82.5% (962 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-09-03 10:15:34 +02:00
Andrés Moya
46053b6bbf 🎉 Import & export new components 2022-09-02 13:43:01 +02:00
Andrés Moya
251e7eada2 🎉 Allow to restore deleted components 2022-09-02 13:43:00 +02:00
Andrey Antukh
7e58e2f5eb Merge pull request #2217 from penpot/alotor-fix-nested-boards
Fixes on nested artboards and texts
2022-09-01 13:40:54 +02:00
alonso.torres
04d6e76c6c 🐛 Fix problem editing rotated texts 2022-09-01 12:56:01 +02:00
Alejandro
ee1058950e Merge pull request #2214 from penpot/palba-fix-undo-delete-page
🐛 Fix undo on delete page does not preserve its order
2022-09-01 08:16:11 +02:00
Pablo Alba
be656bb4ef 🐛 Fix undo on delete page does not preserve its order 2022-09-01 07:57:59 +02:00
alonso.torres
d6317297d7 🐛 Fix error when moving nested frames outside 2022-08-31 16:30:30 +02:00
alonso.torres
5820f73b6e 🐛 Fix problem when hovering over nested frames 2022-08-31 16:29:38 +02:00
Andrey Antukh
89e5607d7f Merge pull request #2211 from penpot/niwinz-rate-limit
Rate Limit for RPC methods
2022-08-31 13:19:34 +02:00
Andrey Antukh
2f21560fe3 🎉 Add improved approach for async flow time measurements 2022-08-31 12:55:48 +02:00
Andrey Antukh
fd973d87fd ♻️ Refactor metrics namespace 2022-08-31 12:55:48 +02:00
Andrey Antukh
ec3651d85b 🎉 Add optional rate limit support for RPC calls 2022-08-31 12:55:48 +02:00
Andrey Antukh
469704def6 Merge pull request #2212 from penpot/palba-fix-move-artboards-on-comments
🐛 Fix artboards moving with comment tool selected
2022-08-31 12:07:18 +02:00
Pablo Alba
3cbb2defb3 🐛 Fix artboards moving with comment tool selected 2022-08-31 11:59:17 +02:00
Andrey Antukh
47b745592b ⬆️ Update shadow-cljs on frontend 2022-08-31 11:01:07 +02:00
Andrey Antukh
819492f453 Remove release build warnings 2022-08-31 11:01:07 +02:00
Andrey Antukh
83905c2f56 📎 Minor change on common repl script 2022-08-31 11:01:07 +02:00
Andrey Antukh
d6d9d25fce ♻️ Refactor token generation API 2022-08-31 11:01:07 +02:00
Alejandro Alonso
44f4d9c50c Merge remote-tracking branch 'origin/staging' into develop 2022-08-31 08:58:27 +02:00
Alejandro Alonso
2cb8e7b986 Merge remote-tracking branch 'origin/staging' 2022-08-31 08:56:54 +02:00
Alejandro Alonso
199541aeee Merge remote-tracking branch 'origin/staging' into develop 2022-08-30 13:51:08 +02:00
Alejandro Alonso
0268e8594d Merge remote-tracking branch 'origin/staging' 2022-08-30 13:50:35 +02:00
Alejandro Alonso
28a721ce9c Merge remote-tracking branch 'origin/staging' into develop 2022-08-30 13:31:11 +02:00
Alejandro Alonso
1e62b72769 Merge remote-tracking branch 'origin/staging' 2022-08-30 13:29:51 +02:00
Alejandro Alonso
24a56f029a Merge remote-tracking branch 'origin/staging' into develop 2022-08-30 13:09:02 +02:00
Alejandro Alonso
a2d368636b Merge remote-tracking branch 'origin/staging' 2022-08-30 13:03:30 +02:00
Alejandro
02f3809b89 Merge pull request #2175 from penpot/hiru-dashboard-libraries
🎉 Add new dashboard libraries screen
2022-08-30 11:32:44 +02:00
Stas Haas
3c759a46ec 🌐 Add translations for: German.
Currently translated at 80.5% (939 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-08-29 10:20:04 +02:00
Andrés Moya
1675d945d9 Add some small enhancements 2022-08-29 09:50:04 +02:00
Andrey Antukh
12ba46642c Merge pull request #2198 from Windfarer/fix-devenv-nginx
🐛 Fix nginx user for devenv
2022-08-29 07:24:09 +02:00
Qizhao Yang
acb9432f61 🐛 Fix nginx user for devenv
Signed-off-by: Qizhao Yang <windfarer@gmail.com>
2022-08-29 09:32:06 +08:00
Mikel Larreategi
ff3b6fc0c8 🌐 Add translations for: Basque.
Currently translated at 100.0% (1166 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/eu/
2022-08-28 23:15:03 +02:00
Amine Gdoura
60d8486f24 🌐 Add translations for: Arabic.
Currently translated at 47.2% (551 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ar/
2022-08-28 23:15:01 +02:00
Stas Haas
99050af903 🌐 Add translations for: German.
Currently translated at 80.2% (936 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-08-28 23:15:00 +02:00
Rubén
c488efa515 🌐 Add translations for: Catalan.
Currently translated at 98.3% (1147 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ca/
2022-08-28 23:15:00 +02:00
Alejandro
396d35840e Merge pull request #2189 from penpot/palba-componentsv2-publish-from-popup
🎉 Publish file library from libraries popup
2022-08-26 13:30:25 +02:00
Pablo Alba
d1550ebb2a 🎉 Publish file library from libraries popup 2022-08-26 13:14:27 +02:00
Alejandro
edc88458d3 Merge pull request #2191 from penpot/palba-componentsv2-library-name-assets-panel
🎉 Library name in assets panel
2022-08-26 13:06:39 +02:00
Mikel Larreategi
517d47f016 🌐 Add translations for: Basque.
Currently translated at 60.8% (709 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/eu/
2022-08-25 17:42:32 +02:00
Mikel Larreategi
70f6a6cecc 🌐 Add translations for: Basque.
Currently translated at 4.3% (51 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/eu/
2022-08-25 15:21:25 +02:00
Ahmad HosseinBor
07ce252d60 🌐 Add translations for: Persian.
Currently translated at 55.8% (651 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-08-25 15:21:24 +02:00
Andrey Antukh
a055a31286 Merge remote-tracking branch 'origin/staging' into develop 2022-08-25 14:51:58 +02:00
Alejandro Alonso
1b33b0dcef Merge remote-tracking branch 'origin/staging' 2022-08-25 13:55:07 +02:00
Pablo Alba
00e9195af8 🎉 Library name in assets panel 2022-08-24 14:41:39 +02:00
Alejandro Alonso
f7186fa781 Merge remote-tracking branch 'origin/staging' 2022-08-24 14:27:02 +02:00
Ahmad HosseinBor
2974125e8f 🌐 Add translations for: Persian.
Currently translated at 51.5% (601 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-08-24 14:18:24 +02:00
Alejandro Alonso
581843f99b Merge remote-tracking branch 'origin/staging' 2022-08-24 12:18:41 +02:00
Pablo Alba
3c492f03d1 Merge pull request #2181 from penpot/hiru-select-instance
🎉 Select main instance when selecting a component
2022-08-24 11:18:21 +02:00
Andrés Moya
e8990caefb 🎉 Select main instance when selecting a component 2022-08-24 11:17:26 +02:00
Alejandro Alonso
d2cd29bf76 Merge remote-tracking branch 'origin/staging' 2022-08-24 11:10:08 +02:00
Andrés Moya
c1942ef408 💄 Change libraries label 2022-08-24 11:07:53 +02:00
Andrés Moya
b072c1d1d1 🐛 Fix delete library color 2022-08-24 11:00:26 +02:00
Andrés Moya
5a0ec9525b 🎉 Add new dashboard libraries screen 2022-08-24 11:00:26 +02:00
Andrés Moya
f0e521b8d5 🐛 Fix compilation of exporter 2022-08-24 10:59:53 +02:00
andy
a6210be63a 🌐 Added translation for: Basque. 2022-08-24 09:18:04 +02:00
Alejandro Alonso
1fdd3b85ab 🐛 Fix typo in releases 1.15 2022-08-24 09:00:28 +02:00
Alejandro
dbd2b8527a Merge pull request #2180 from penpot/palba-carousel-misaligment
🐛 Fix Libraries & Templates carousel misalingments
2022-08-23 10:50:46 +02:00
Andrey Antukh
b3d6b4b402 Merge remote-tracking branch 'origin/staging' into develop 2022-08-23 08:11:58 +02:00
Pablo Alba
b6e17a0f09 🐛 Fix Libraries & Templates carousel misalingments 2022-08-22 12:00:30 +02:00
Alejandro Alonso
4a655c863a 🐛 Fix typo in manage.sh 2022-08-19 07:21:51 +02:00
andy
9b642b6055 🌐 Add translations for: Romanian.
Currently translated at 54.4% (635 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ro/
2022-08-18 18:16:49 +02:00
andy
17c5eeb740 🌐 Add translations for: Portuguese (Brazil).
Currently translated at 43.8% (511 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/pt_BR/
2022-08-18 18:16:49 +02:00
Oğuz Ersen
54f19564d4 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1166 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2022-08-18 18:16:48 +02:00
andy
c3219d1de5 🌐 Add translations for: Russian.
Currently translated at 45.3% (529 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ru/
2022-08-18 18:16:48 +02:00
andy
f279e54f2f 🌐 Add translations for: Greek.
Currently translated at 48.5% (566 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/el/
2022-08-18 18:16:48 +02:00
andy
da18314e37 🌐 Add translations for: French.
Currently translated at 65.9% (769 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fr/
2022-08-18 18:16:47 +02:00
andy
f689d2f84f 🌐 Add translations for: Catalan.
Currently translated at 92.0% (1073 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/ca/
2022-08-18 18:16:47 +02:00
andy
a43f76bb3f 🌐 Add translations for: English.
Currently translated at 100.0% (1166 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/en/
2022-08-18 18:16:47 +02:00
Andrés Moya
0c717c579b 🐛 Some small fixes
* Remove an unneeded condition in sync.
* Correctly duplicate main instances.
* Slightly enhance sync logging.
2022-08-17 16:22:04 +02:00
Eva
bf63e9da95 🎉 Add new hero projects 2022-08-17 15:50:24 +02:00
Alejandro
61cb43f2f0 Merge pull request #2169 from penpot/hiru-create-nested-component
🎉 Allow to create a nested component in one step
2022-08-17 12:24:38 +02:00
andy
de8d693292 🌐 Add translations for: German.
Currently translated at 78.5% (916 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/de/
2022-08-17 12:18:31 +02:00
Andrés Moya
9725dd5fff 🎉 Allow to create a nested component in one step 2022-08-16 15:15:02 +02:00
Andrey Antukh
4ad27c3fca Merge remote-tracking branch 'origin/staging' into develop 2022-08-12 12:49:36 +02:00
Andrey Antukh
86389256a9 📎 Fix linter issues 2022-08-12 09:50:33 +02:00
Andrey Antukh
4f0cc3d0d8 Merge remote-tracking branch 'origin/staging' into develop 2022-08-12 09:45:58 +02:00
Andrey Antukh
fee264007f Merge pull request #2157 from penpot/superalex-add-audit-log-for-team-up-hero
🎉 Add audit log for team up hero
2022-08-12 08:21:03 +02:00
Alejandro
94c3dfbfe8 Merge pull request #2158 from penpot/eva-modal-animations
💄 Improve onboarding modal animations
2022-08-11 12:05:17 +02:00
Alejandro Alonso
f360958c66 🎉 Add audit log for team up hero 2022-08-11 11:59:07 +02:00
Eva
c9885d757a 💄 Improve onboarding modal animations 2022-08-11 11:17:28 +02:00
Andrey Antukh
4a054dec25 Merge remote-tracking branch 'origin/staging' into develop 2022-08-11 09:41:41 +02:00
Alejandro
0b9546c541 Merge pull request #2155 from penpot/eva-onboarding-team-up
🎉 Eva onboarding team up
2022-08-11 09:24:29 +02:00
Eva
0e513a4a25 🎉 Add new team hero 2022-08-11 08:55:52 +02:00
Alejandro
678a163b01 Merge pull request #2156 from penpot/niwinz-binfile-improvements
♻️ Refactor binfile implementation
2022-08-11 06:44:31 +02:00
Tatsuto Yamamoto
3b57e7a583 🌐 Add translations for: Japanese (jpn_JP).
Currently translated at 22.5% (263 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/jpn_JP/
2022-08-11 04:17:13 +02:00
Andrey Antukh
dd73152afd ♻️ Refactor binfile implementation 2022-08-10 20:07:24 +02:00
Andrey Antukh
99ed610dde Merge remote-tracking branch 'origin/staging' into develop 2022-08-10 14:10:57 +02:00
Eva Marco
5b5fe8ebbc Merge pull request #2145 from penpot/palba-templates-carousel
🎉 Add Libraries & Templates carousel
2022-08-10 11:52:21 +02:00
Pablo Alba
edb46b2080 🎉 Add Libraries & Templates carousel 2022-08-10 11:44:51 +02:00
Alejandro
2d24529165 Merge pull request #2148 from penpot/eva-onboarding-zoom-url
🎉 Add zoom style to share link url
2022-08-10 11:24:23 +02:00
Eva
0a939185d2 🎉 Add zoom style to share link url 2022-08-10 11:00:37 +02:00
Andrey Antukh
2211fea976 🚑 Fix tests in develop
Caused of bad merge conflict resolution from mergin
staging to develop.
2022-08-10 09:14:11 +02:00
Alejandro
b404246f8a Merge pull request #2153 from penpot/eva-fix-shared-placeholder
 Fix shared libraries placehoder
2022-08-10 09:09:23 +02:00
Eva
6f415cc046 Fix shared libraries placehoder 2022-08-10 08:54:34 +02:00
Andrey Antukh
84ee6555a3 Merge remote-tracking branch 'origin/staging' into develop 2022-08-10 08:27:25 +02:00
andy
29ff06dc6a 🌐 Added translation for: Japanese (jpn_JP). 2022-08-09 16:04:34 +02:00
Alejandro
42dd38b4ee Merge pull request #2151 from penpot/eva-show-next-btn-viewer
🎉 Make prev and next buttons fixed in viewer
2022-08-09 12:50:50 +02:00
Eva
5791ddda49 🎉 Make prev and next buttons fixed in viewer 2022-08-09 12:35:48 +02:00
Eva Marco
b560c07243 Merge pull request #2149 from penpot/superalex-review-onboarding-questions
🎉 Review onboarding questions
2022-08-09 11:55:45 +02:00
Alejandro Alonso
e6dcfec90c 🎉 Review onboarding questions 2022-08-09 11:39:55 +02:00
Andrey Antukh
7611aec4c6 🐛 Fix unexpected response truncation on viewer 2022-08-08 09:00:27 +02:00
Eva
e1972692ab 👷 fix CI 2022-08-04 16:00:20 +02:00
Eva
33706e0bda 🎉 Add ellipsis to text 2022-08-04 13:54:35 +02:00
Alejandro
57ec9f8218 Merge pull request #2139 from penpot/eva-review-onboarding
🎉 Improve dashboard and onboarding css
2022-08-04 12:33:09 +02:00
Eva
e863ef7dbf 🎉 Improve dashboard and onboarding css 2022-08-04 12:28:53 +02:00
Andrey Antukh
390ad34b13 Merge remote-tracking branch 'origin/staging' into develop 2022-08-04 10:43:12 +02:00
Andrey Antukh
29fa36ad2d Merge pull request #2140 from penpot/superalex-link-to-binary-versions-for-files-used-in-libraries-and-templates-carousel
🎉 Add binary file links to onboarding.edn
2022-08-04 09:24:14 +02:00
Alejandro Alonso
fe7c01323a 🎉 Add binary file links to onboarding.edn 2022-08-04 09:22:36 +02:00
Andrey Antukh
1df9f0b29e Merge pull request #2131 from penpot/andrewzhurov-3932-layers-get-out-of-the-group-when-moved
🐛 Fix layers get out of the group when moved
2022-08-04 07:09:29 +02:00
Andrey Antukh
74c6556ad6 ♻️ Refactor some page helpers usage 2022-08-04 07:08:18 +02:00
Andrew Zhurov
d270c9670e 🐛 Fix layers get out of their group when moved
Signed-off-by: Andrei Zhurau <zhurov.andrew@gmail.com>
2022-08-04 07:08:18 +02:00
Pablo Alba
87419d63a5 Merge pull request #2138 from penpot/niwinz-builtin-templates
Builtin Templates Load & RPC command for clone
2022-08-03 17:44:53 +02:00
Andrey Antukh
53d7c4332d 🎉 Add prefetch builtin templates script 2022-08-03 17:06:53 +02:00
Andrey Antukh
6981d92b11 🎉 Add RPC method for retrieve the list of builtin templates 2022-08-03 14:46:51 +02:00
Andrey Antukh
052404b1b4 🎉 Add complete list of onboarding builtin files 2022-08-03 14:41:32 +02:00
Andrey Antukh
b8b60d9208 🎉 Add RPC command for clone builtin template 2022-08-03 14:28:33 +02:00
Andrey Antukh
ed701fd9c5 ♻️ Move management mutations to commands 2022-08-03 14:28:33 +02:00
Andrey Antukh
d832482dae 🎉 Add builtin template loading mechanism 2022-08-03 14:28:33 +02:00
Pablo Alba
812131fdbc Add new image to onboarding welcome 2022-08-03 13:35:44 +02:00
Andrey Antukh
f455580cf7 Merge pull request #2124 from penpot/3799-dashboard-rework
3799 dashboard rework
2022-08-03 11:06:52 +02:00
Andrey Antukh
15d7b94940 🎉 Add convenience helper for http client 2022-08-03 09:49:24 +02:00
Andrey Antukh
d30b6ac5b9 Reorganize resources directory 2022-08-03 09:49:24 +02:00
Alejandro
39fb391128 Merge pull request #2130 from penpot/niwinz-uuid-improvements
🎉 Replace current uuidv1 with custom v8
2022-08-03 09:38:23 +02:00
Andrey Antukh
77b1ebfcc6 Merge pull request #2132 from penpot/eva-modify-design-onboarding-modal
💄 Modify label in input
2022-08-03 09:34:42 +02:00
Andrey Antukh
f5df0eacef Merge remote-tracking branch 'origin/staging' into develop 2022-08-03 09:33:48 +02:00
Andrey Antukh
4266d9be83 📎 Add missing entry on changelog 2022-08-03 09:25:38 +02:00
Andrey Antukh
8fe98b1f7a Merge pull request #2133 from penpot/superalex-add-audit-log-for-new-onboarding
🎉 Add audit log for new onboarding
2022-08-03 09:05:51 +02:00
Andrey Antukh
5c6212d7a2 📎 Comment not passing test of experimental code of new components
It should be revisited by @andres.moya
2022-08-03 09:05:28 +02:00
Andrey Antukh
ed5ce777b9 📎 Uncomment frontend tests on common module 2022-08-03 09:05:28 +02:00
Andrey Antukh
d477f74d13 📎 Change output feature set to :es2020 on test compiler options 2022-08-03 09:05:28 +02:00
Andrey Antukh
fbfcb827ed 🎉 Replace current uuidv1 with custom v8 2022-08-03 09:05:28 +02:00
Alejandro Alonso
b4d5ff3452 🎉 Add audit log for new onboarding 2022-08-03 08:55:34 +02:00
elhombretecla
4c03450b88 🎉 Add new CSS dashboard viewpoints 2022-08-03 08:32:24 +02:00
Eva
10e0a662e4 💄 Modify label in input 2022-08-02 11:00:43 +02:00
Andrey Antukh
5336db4456 Merge pull request #2123 from andrewzhurov/3885-assets-library-not-showing-graphics
🐛 Fix svg upload
2022-08-01 16:42:17 +02:00
Andrey Antukh
f301ec5d2f Merge pull request #2121 from andrewzhurov/3629-text-alignment-becomes-undefined-after-pasting-text-from-clipboard
🐛 Fix text alignment becoming undefined on pasting text from clipboard
2022-08-01 15:30:45 +02:00
Andrey Antukh
abfca5c89a 📎 Add additional reformating to specs naming 2022-08-01 15:01:03 +02:00
Andrey Antukh
d54ebaa0d7 Merge pull request #2125 from penpot/eva-component-delete-modal-plr
🎉 Add plurals to delete or unpublish lib modal
2022-08-01 14:42:49 +02:00
Andrey Antukh
5e57fb4023 📎 Fix linter issues introduced in the latest merges 2022-08-01 14:41:30 +02:00
Andrey Antukh
c1daa4a4c4 Merge remote-tracking branch 'origin/staging' into develop 2022-08-01 14:38:09 +02:00
Andrey Antukh
f25222e441 Merge remote-tracking branch 'origin/staging' into develop 2022-08-01 14:05:04 +02:00
Eva
ae20a06e97 🎉 Add plurals to delete or unpublish lib modal 2022-08-01 13:51:27 +02:00
Andrey Antukh
18970cb233 Merge pull request #2108 from penpot/hiru-main-instance
Components v2 (first PR)
2022-08-01 13:25:06 +02:00
Andrew Zhurov
a6ee1617ab 🐛 Fix svg upload
Signed-off-by: Andrei Zhurau <zhurov.andrew@gmail.com>
2022-08-01 11:23:08 +03:00
Andrew Zhurov
0aa60b22b0 🐛 Fix text alignment becoming undefined on pasting text from clipboard
Signed-off-by: Andrei Zhurau <zhurov.andrew@gmail.com>
2022-07-31 10:33:10 +03:00
Pablo Alba
bcc7be16ad Merge pull request #2119 from penpot/eva-onboaring-teams
🎉  Improve team up invitation flow
2022-07-29 14:34:02 +02:00
Andrés Moya
f4482eb5a7 Allow to set features by config file 2022-07-29 14:00:36 +02:00
Andrés Moya
0667089833 🔧 Some style enhancements and mini bug fix 2022-07-29 14:00:36 +02:00
Eva
c108974ad2 Add info in modal 2022-07-29 14:00:36 +02:00
Eva
dd5a6f7f50 🎉 Improve team up invitation flow 2022-07-29 13:02:07 +02:00
Andrés Moya
a5bf1c03e7 🎉 Make components-v2 an optional feature 2022-07-29 09:29:25 +02:00
Andrés Moya
1ef37281e6 🎉 Auto sync when changing main instance 2022-07-29 09:29:24 +02:00
Andrés Moya
eebd596fca ♻️ Use main-instance? attribute 2022-07-29 09:29:24 +02:00
Andrés Moya
dcf18b3aee 🔧 Refactor sync-file for performance 2022-07-29 09:29:24 +02:00
Andrés Moya
43e0b5cfa5 🎉 Absorb colors and typographies 2022-07-29 09:29:24 +02:00
Andrés Moya
7da159d52a 🎉 Absorb components when deleting or unpublishing a library 2022-07-29 09:29:24 +02:00
Andrés Moya
54e0071c9c 🎉 Scaffolding to write unit tests of common types 2022-07-29 09:29:24 +02:00
Andrés Moya
165cdd871f 🎉 Allow to duplicate components with main instance 2022-07-29 09:29:24 +02:00
Andrés Moya
ce09ea6eb5 🎉 Add library page for components on migration 2022-07-29 09:29:24 +02:00
Andrés Moya
bdcbe46d0d ♻️ Move component instantiation to new types module 2022-07-29 09:29:24 +02:00
Andrés Moya
5dc7bc213f 🎉 Add the concept of 'main instance' 2022-07-29 09:29:22 +02:00
Andrey Antukh
758d0d8943 📎 Update changelog 2022-07-29 08:22:33 +02:00
Andrey Antukh
f8fbb7abba Merge pull request #2113 from andrewzhurov/3887-paste-frame-removes-all-guides
🐛 Fix paste frame removes all guides
2022-07-29 08:21:04 +02:00
Andrey Antukh
c6f74692ba Merge pull request #2111 from andrewzhurov/1962-double-click-icon-in-navigation-pane-to-focus-on-object-or-artboard
🎉 Add zoom to shape on double click upon its icon in navigation pane
2022-07-29 08:17:30 +02:00
Andrew Zhurov
98402ae1db 🎉 Add zoom to shape on double click upon its icon in navigation pane
Signed-off-by: Andrei Zhurau <zhurov.andrew@gmail.com>
2022-07-28 20:40:49 +03:00
Andrew Zhurov
902c746dbb 🐛 Fix paste frame removes all guides
Signed-off-by: Andrei Zhurau <zhurov.andrew@gmail.com>
2022-07-28 19:59:12 +03:00
Andrey Antukh
26fd1a261c Merge pull request #2116 from penpot/palba-review-info-slides
🎉 New style and content for onboarding slides
2022-07-28 15:24:30 +02:00
Pablo Alba
b93b8a8966 🎉 Add new style and content for onboarding slides 2022-07-28 15:17:24 +02:00
Andrey Antukh
4e2dbdbebe Merge remote-tracking branch 'origin/staging' into develop 2022-07-28 11:58:30 +02:00
Alejandro
aa95114860 Merge pull request #2114 from penpot/andrewzhurov-2645-hovering-layers-bounding-box
Layer outlines hightlight on hovering
2022-07-28 11:43:43 +02:00
Andrey Antukh
7a3f1a36e9 📎 Fix linter issues 2022-07-28 10:53:23 +02:00
Andrey Antukh
b3415d0d52 📎 Update changelog 2022-07-28 10:53:21 +02:00
Andrey Antukh
10f8d1365c 📎 Add todo about equality checks on refs ns 2022-07-28 10:52:40 +02:00
Andrey Antukh
a48db277b9 Avoid recursive rerender and react warning 2022-07-28 10:52:40 +02:00
Andrey Antukh
9263f70d6a Use properly the react hook
We can't use hooks in a condition, the condition should be inside
the hook.
2022-07-28 10:52:40 +02:00
Andrey Antukh
d2aa985714 Properly use use-fn hook on layer-item component on sidebar 2022-07-28 10:52:40 +02:00
Andrey Antukh
b5796b4cdb Efficiency improvements on outlines component 2022-07-28 10:52:40 +02:00
Andrey Antukh
c3f67e6358 💄 Many cosmetic and indentation changes on outlines component 2022-07-28 10:52:40 +02:00
Andrey Antukh
1477837cbf 💄 Use concat-vec helper instead of set + into 2022-07-28 10:52:40 +02:00
Andrey Antukh
5834e29b39 🔥 Remove unnecesary ref, viewport already has access to all local data 2022-07-28 10:52:40 +02:00
Andrew Zhurov
1fa25060a0 🎉 Add shape outline on hover upon layers in workspace contextual menu
Signed-off-by: Andrew Zhurov <zhurov.andrew@gmail.com>
2022-07-28 10:52:40 +02:00
Andrew Zhurov
c354c560d4 🎉 Add shape outline on hover upon layers in the left sidebar of workspace
Signed-off-by: Andrew Zhurov <zhurov.andrew@gmail.com>
2022-07-28 10:52:40 +02:00
Alejandro
4b2729b041 Merge pull request #2112 from penpot/eva-viewer-full-screen
💄 Change some styles in viewer mode
2022-07-28 10:31:34 +02:00
Eva
5b658c2f8a 💄 Change some styles in viewer mode 2022-07-28 09:47:52 +02:00
Andrey Antukh
8285cb8f62 🐛 Fix unexpected text positioning 2022-07-27 15:28:50 +02:00
Andrey Antukh
7f611c89e1 Merge branch 'staging' into develop 2022-07-27 15:10:51 +02:00
Andrey Antukh
00b6d76164 Merge remote-tracking branch 'origin/eva-new-file-placeholder' into develop 2022-07-27 14:36:41 +02:00
Pablo Alba
6408689d4c Merge pull request #2110 from penpot/niwinz-scripts-and-fixes
Scripts & Fixes
2022-07-27 13:13:34 +02:00
Alejandro Alonso
bfe54fe5e1 Improve audit log for create files 2022-07-27 13:07:28 +02:00
Eva
1eede8442d Add new file creation button on placeholder 2022-07-27 10:54:05 +02:00
Ahmad HosseinBor
3778bb4b1d 🌐 Add translations for: Persian.
Currently translated at 50.6% (590 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/fa/
2022-07-27 10:17:11 +02:00
Andrey Antukh
1174502cb8 Merge remote-tracking branch 'origin/staging' into develop 2022-07-26 11:54:16 +02:00
Andrey Antukh
e5ebe0a295 Merge branch 'staging' into develop 2022-07-26 08:26:34 +02:00
Yaron Shahrabani
d3dd2644ae 🌐 Add translations for: Hebrew.
Currently translated at 100.0% (1166 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2022-07-19 08:21:57 +02:00
Yaron Shahrabani
b49348ff86 🌐 Add translations for: Hebrew.
Currently translated at 93.3% (1088 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/he/
2022-07-15 13:18:50 +02:00
Oğuz Ersen
d9cc76f8ba 🌐 Add translations for: Turkish.
Currently translated at 100.0% (1166 of 1166 strings)

Translation: Penpot/frontend
Translate-URL: https://hosted.weblate.org/projects/penpot/frontend/tr/
2022-07-15 13:18:50 +02:00
Andrey Antukh
b2da41720e ⬆️ Update npm dependencies on frontend submodule 2022-07-15 09:52:25 +02:00
Andrey Antukh
2b70331630 🐛 Fix custom fonts loading on dashboard thumbnails 2022-07-15 09:52:25 +02:00
Andrey Antukh
05c8ad8bf9 💄 Minor cosmetic changes on fonts loading code 2022-07-15 09:52:25 +02:00
Andrey Antukh
18ca2aca15 🐛 Fix font loading when text is only rendered as svg 2022-07-15 09:52:25 +02:00
Andrey Antukh
51023396bc 🎉 Add new version of gfonts reference file 2022-07-15 09:52:25 +02:00
Andrey Antukh
dd180d93f4 Merge pull request #2088 from penpot/alotor-autolayout
Autolayout basics
2022-07-14 09:54:49 +02:00
alonso.torres
3ac1760141 🎉 Add layout items options and feature toggle 2022-07-14 09:53:59 +02:00
alonso.torres
28abe785e8 Allow for rotated auto-layout 2022-07-14 09:53:59 +02:00
alonso.torres
5e5355230c 🎉 Add support for wrap layout 2022-07-14 09:53:59 +02:00
alonso.torres
6e5a23c190 Allows groups to reflow the layout on transform 2022-07-14 09:53:59 +02:00
alonso.torres
84c0825893 🐛 Fix problems with nested groups 2022-07-14 09:53:53 +02:00
Eva
51e8eea795 Changes in the layout UI 2022-07-14 09:53:53 +02:00
alonso.torres
7176bb6f1a 🎉 Add support for nested layouts 2022-07-14 09:53:53 +02:00
alonso.torres
1c8aef6fa8 🎉 Add packed basic layout positions 2022-07-14 09:53:33 +02:00
alonso.torres
aeb8fa1896 🎉 Add basic left-right layout 2022-07-14 09:48:51 +02:00
alonso.torres
3c3664535e Store layout info in shape 2022-07-14 09:29:21 +02:00
Andrey Antukh
e662a7090f Merge branch 'staging' into develop 2022-07-14 07:11:01 +02:00
Pablo Alba
9022520334 Merge pull request #2091 from penpot/eva-bugfix-share
🐛 Fix overlay and shadows of modal body
2022-07-13 11:10:32 +02:00
Eva
edad00ad95 🐛 Fix overlay and shadows of modal body 2022-07-13 08:15:03 +02:00
Andrey Antukh
641ebf8b8e 📎 Increase version 2022-07-12 11:57:51 +02:00
1270 changed files with 176259 additions and 65724 deletions

View File

@@ -3,19 +3,19 @@ jobs:
build:
docker:
- image: penpotapp/devenv:latest
- image: cimg/postgres:13.5
- image: cimg/postgres:14.5
environment:
POSTGRES_USER: penpot_test
POSTGRES_PASSWORD: penpot_test
POSTGRES_DB: penpot_test
- image: cimg/redis:6.2.6
- image: cimg/redis:7.0.5
working_directory: ~/repo
resource_class: large
environment:
# Customize the JVM maximum heap limit
JVM_OPTS: -Xmx1g
JVM_OPTS: -Xmx4g
steps:
- checkout
@@ -29,6 +29,13 @@ jobs:
- run: cd .clj-kondo && cat config.edn
- run:
name: frontend styles prettier
working_directory: "./frontend"
command: |
yarn install
yarn run lint-scss
- run:
name: common lint
working_directory: "./common"
@@ -43,13 +50,6 @@ jobs:
clj-kondo --version
clj-kondo --parallel --lint src/
- run:
name: frontend styles prettier
working_directory: "./frontend"
command: |
yarn install
yarn run lint-scss
- run:
name: backend lint
working_directory: "./backend"
@@ -57,47 +57,42 @@ jobs:
clj-kondo --version
clj-kondo --parallel --lint src/
# run backend test
- run:
working_directory: "./common"
name: common tests
command: |
yarn install
yarn test
clojure -X:dev:test :patterns '["common-tests.*-test"]'
environment:
PATH: /usr/local/nodejs/bin/:/usr/local/bin:/bin:/usr/bin
JVM_OPTS: -Xmx4g
NODE_OPTIONS: --max-old-space-size=4096
- run:
name: backend test
working_directory: "./backend"
command: "clojure -X:dev:test"
command: |
clojure -X:dev:test :patterns '["backend-tests.*-test"]'
environment:
PENPOT_TEST_DATABASE_URI: "postgresql://localhost/penpot_test"
PENPOT_TEST_DATABASE_USERNAME: penpot_test
PENPOT_TEST_DATABASE_PASSWORD: penpot_test
PENPOT_TEST_REDIS_URI: "redis://localhost/1"
JVM_OPTS: -Xmx4g
- run:
name: frontend tests
working_directory: "./frontend"
command: |
yarn install
clojure -M:dev:shadow-cljs compile test
node target/tests.js
environment:
PATH: /usr/local/nodejs/bin/:/usr/local/bin:/bin:/usr/bin
# - run:
# working_directory: "./common"
# name: common tests (cljs)
# command: |
# yarn install
# yarn run compile-test
# node target/test.js
#
# environment:
# PATH: /usr/local/nodejs/bin/:/usr/local/bin:/bin:/usr/bin
- run:
working_directory: "./common"
name: common tests (clj)
command: |
clojure -X:dev:test
yarn test
environment:
PATH: /usr/local/nodejs/bin/:/usr/local/bin:/bin:/usr/bin
NODE_OPTIONS: --max-old-space-size=4096
- save_cache:
paths:

View File

@@ -2,11 +2,12 @@
{promesa.core/let clojure.core/let
promesa.core/->> clojure.core/->>
promesa.core/-> clojure.core/->
rumext.alpha/defc clojure.core/defn
rumext.alpha/fnc clojure.core/fn
promesa.exec.csp/go-loop clojure.core/loop
rumext.v2/defc clojure.core/defn
rumext.v2/fnc clojure.core/fn
app.common.data/export clojure.core/def
app.db/with-atomic clojure.core/with-open
app.common.data.macros/get-in clojure.core/get-in
app.common.data.macros/with-open clojure.core/with-open
app.common.data.macros/select-keys clojure.core/select-keys
app.common.logging/with-context clojure.core/do}
@@ -15,6 +16,7 @@
{app.common.data.macros/export hooks.export/export
potok.core/reify hooks.export/potok-reify
app.util.services/defmethod hooks.export/service-defmethod
app.db/with-atomic hooks.export/penpot-with-atomic
}}
:output
@@ -44,6 +46,15 @@
:redundant-do
{:level :off}
:earmuffed-var-not-dynamic
{:level :off}
:dynamic-var-not-earmuffed
{:level :off}
:used-underscored-binding
{:level :warning}
:unused-binding
{:exclude-destructured-as true
:exclude-destructured-keys-in-fn-args false

View File

@@ -39,6 +39,43 @@
other))]
{:node result})))
(defn penpot-with-atomic
[{:keys [node]}]
(let [[_ params & other] (:children node)
result (if (api/vector-node? params)
(api/list-node
(into [(api/token-node (symbol "clojure.core" "with-open")) params] other))
(api/list-node
(into [(api/token-node (symbol "clojure.core" "with-open"))
(api/vector-node [params params])]
other)))
]
{:node result}))
(defn penpot-defrecord
[{:keys [:node]}]
(let [[rnode rtype rparams & other] (:children node)
nodes [(api/token-node (symbol "do"))
(api/list-node
(into [(api/token-node (symbol (name (:value rnode)))) rtype rparams] other))
(api/list-node
[(api/token-node (symbol "defn"))
(api/token-node (symbol (str "pos->" (:string-value rtype))))
(api/vector-node
(->> (:children rparams)
(mapv (fn [t]
(api/token-node (symbol (str "_" (:string-value t))))))))
(api/token-node nil)])]
result (api/list-node nodes)]
;; (prn "=====>" (into {} rparams))
;; (prn (api/sexpr result))
{:node result}))
(defn clojure-specify
[{:keys [:node]}]
(let [[rnode rtype & other] (:children node)
@@ -48,7 +85,6 @@
other))]
{:node result}))
(defn service-defmethod
[{:keys [:node]}]
(let [[rnode rtype ?meta & other] (:children node)

13
.editorconfig Normal file
View File

@@ -0,0 +1,13 @@
root = true
[*.{cljs,cljc,clj,js,css,scss,html,yml,yaml,json,mustache}]
charset = utf-8
indent_size = 2
indent_style = space
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

89
.github/ISSUE_TEMPLATE/bug-report.yml vendored Normal file
View File

@@ -0,0 +1,89 @@
description: Create a report to help us improve
labels: ["bug"]
name: Bug report
title: "bug: "
body:
- type: markdown
attributes:
value: |
## Before you start
Please search our [existing issues](https://github.com/penpot/penpot/issues) and open [pull requests](https://github.com/penpot/penpot/pulls) to lessen the change of filing duplicate issues or feature requests. Thank you.
---
- type: textarea
attributes:
label: Steps To Reproduce
description: Steps to reproduce the behavior.
placeholder: |
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
validations:
required: true
- type: textarea
id: expected
attributes:
description: A clear and concise description of what you expected to happen.
label: Expected behavior
validations:
required: true
- type: textarea
id: actual
attributes:
description: A clear and concise description of what happens instead; what the bug is.
label: Actual behavior
validations:
required: true
- type: textarea
id: screenshots
attributes:
description: If applicable, add screenshots to help explain your problem.
label: Screenshots or video
- type: textarea
id: desktop
attributes:
label: Desktop (please complete the following information)
placeholder: |
- OS (e.g. iOS):
- Browser & version (e.g. Chrome 89.0):
- type: textarea
id: mobile
attributes:
label: Smartphone (please complete the following information)
placeholder: |
- Device & model (e.g. iPhone 6):
- OS & version (e.g. iOS 8.1):
- Browser & version (e.g. stock browser 22):
- type: textarea
id: environment
attributes:
label: Environment (please complete the following information)
placeholder: |
- Host (e.g. https://design.penpot.app, local instance):
*If self-hosted:*
- OS Version (e.g. Ubuntu 16.04):
- Docker / Docker-compose version (e.g. Docker version 18.03.0-ce, build 0520e24):
- Image version (e.g. Alpine):
Docker commands or docker-compose file (if possible and if proceed.x):
```
```
- type: textarea
id: frontend-trace
attributes:
label: Frontend Stack Trace
render: console
- type: textarea
id: backend-trace
attributes:
label: Backend Stack Trace
render: console
- type: textarea
id: additional-context
attributes:
label: Additional context
description: Any other context about the problem.

View File

@@ -1,72 +0,0 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug
assignees: ''
---
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
**Expected behavior**
A clear and concise description of what you expected to happen.
**Actual behavior**
A clear and concise description of what happens instead; what the bug is.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS (e.g. iOS):
- Browser & version (e.g. Chrome 89.0):
**Smartphone (please complete the following information):**
- Device & model (e.g. iPhone 6):
- OS & version (e.g. iOS 8.1):
- Browser & version (e.g. stock browser 22):
**Environment (please complete the following information):**
- Host (e.g. https://design.penpot.app, local instance):
*If self-hosted:*
- OS Version (e.g. Ubuntu 16.04):
- Docker / Docker-compose version (e.g. Docker version 18.03.0-ce, build 0520e24):
- Image version (e.g. Alpine):
Docker commands or docker-compose file (if possible and if proceed.x):
```
```
Frontend Stack Trace:
<details>
```
```
</details>
Backend Stack Trace:
<details>
```
```
</details>
**Additional context:**
Any other context about the problem.

View File

@@ -0,0 +1,37 @@
description: Suggest an idea for this project.
labels: ["needs triage", "enhancement"]
name: "Feature request"
title: "feature: "
body:
- type: markdown
attributes:
value: |
## Before you start
Please search our [existing issues](https://github.com/penpot/penpot/issues) and open [pull requests](https://github.com/penpot/penpot/pulls) to lessen the change of filing duplicate issues or feature requests. Thank you.
---
- type: textarea
id: problem
attributes:
description: A clear and concise description of what the problem is. Ex. I'm always frustrated when (...)
label: Is your feature request related to a problem? Please describe.
validations:
required: true
- type: textarea
id: solution
attributes:
description: A clear and concise description of what you want to happen.
label: Describe the solution you'd like.
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Describe alternatives you've considered.
description: A clear and concise description of any alternative solutions or features you've considered.
- type: textarea
id: additional-context
attributes:
label: Additional context
description: Add any other context or screenshots about the feature request here.

View File

@@ -1,21 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when (...)
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

34
.gitignore vendored
View File

@@ -1,55 +1,59 @@
*-init.clj
*.jar
*.penpot
*.orig
*.penpot
.calva
.clj-kondo
.cpcache
.lein-deps-sum
.lein-failures
.lein-plugins/
.lein-repl-history
.lsp
.nrepl-port
.nyc_output
.rebel_readline_history
.repl
.shadow-cljs
/*.jpg
/*.md
/*.png
/*.sql
/*.txt
/*.yml
/*.zip
/.clj-kondo/.cache
/_dump
/backend/-
/backend/*.md
/backend/*.sql
/backend/*.txt
/backend/assets/
/backend/builtin-templates
/backend/dist/
/backend/logs/
/backend/resources/public/assets
/backend/resources/public/media
/backend/target/
/backend/builtin-templates
/bundle*
/cd.md
/clj-profiler/
/common/.shadow-cljs
/common/coverage
/common/target
/deploy
/docker/images/bundle*
/exporter/.shadow-cljs
/exporter/target
/frontend/.shadow-cljs
/frontend/package-lock.json
/frontend/cypress/videos/*/
/frontend/cypress/fixtures/validuser.json
/frontend/cypress/videos/*/
/frontend/cypress/videos/*/
/frontend/dist/
/frontend/npm-debug.log
/frontend/out/
/frontend/package-lock.json
/frontend/resources/fonts/experiments
/frontend/resources/public/*
/frontend/target/
/frontend/cypress/videos/*/
/media
/other/
/scripts/
/telemetry/
/tmp/
/vendor/**/target
/vendor/svgclean/bundle*.js
/web
clj-profiler/
figwheel_server.log
node_modules

9
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,9 @@
{
"files.exclude": {
"**/.clj-kondo": true,
"**/.cpcache": true,
"**/.lsp": true,
"**/.shadow-cljs": true,
"**/node_modules": true
}
}

View File

@@ -1,5 +1,543 @@
# CHANGELOG
## 1.19.2
### :sparkles: New features
- Navigate up in layer hierarchy with Shift+Enter shortcut [Taiga #5734](https://tree.taiga.io/project/penpot/us/5734)
- Click on the flow tags open viewer with the selected frame [Taiga #5044](https://tree.taiga.io/project/penpot/us/5044)
- Add Dutch language & update translation files with weblate
### :bug: Bugs fixed
- Fix unexpected output on get-page rpc method when invalid object-id is provided [Github #3546](https://github.com/penpot/penpot/issues/3546)
- Fix Invalid files amount after moving file from Project to Drafts [Taiga #5638](https://tree.taiga.io/project/penpot/us/5638)
- Fix deleted pages comments shown in right sidebar [Taiga #5648](https://tree.taiga.io/project/penpot/us/5648)
- Fix tooltip on toggle visibility and toggle lock buttons [Taiga #5141](https://tree.taiga.io/project/penpot/issue/5141)
## 1.19.1
### :bug: Bugs fixed
- Fix components not registered as updated [Taiga #5725](https://tree.taiga.io/project/penpot/issue/5725)
## 1.19.0
### :boom: Breaking changes & Deprecations
### :sparkles: New features
- Default naming of text layers [Taiga #2836](https://tree.taiga.io/project/penpot/us/2836)
- Create typography style from a selected text layer [Taiga #3041](https://tree.taiga.io/project/penpot/us/3041)
- Board as ruler origin [Taiga #4833](https://tree.taiga.io/project/penpot/us/4833)
- Access tokens support [Taiga #4460](https://tree.taiga.io/project/penpot/us/4460)
- Show interactions setting at the view mode [Taiga #1330](https://tree.taiga.io/project/penpot/issue/1330)
- Improve dashboard performance related to thumbnails; now the thumbnails are
rendered as bitmap images.
- Add the ability to disable google fonts provider with the `disable-google-fonts-provider` flag
- Add the ability to disable dashboard templates section with the `disable-dashboard-templates-section` flag
- Add the ability to use the registration whitelist with OICD [Github #3348](https://github.com/penpot/penpot/issues/3348)
- Add support for local caching of google fonts (this avoids exposing the final user IP to
goolge and reduces the amount of request sent to google)
- Set smooth/instant autoscroll depending on distance [GitHub #3377](https://github.com/penpot/penpot/issues/3377)
### :bug: Bugs fixed
- Fix files can be opened from multiple urls [Taiga #5310](https://tree.taiga.io/project/penpot/issue/5310)
- Fix asset color item was created from the selected layer [Taiga #5180](https://tree.taiga.io/project/penpot/issue/5180)
- Fix unpublish more than one library at the same time [Taiga #5532](https://tree.taiga.io/project/penpot/issue/5532)
- Fix drag projects on dahsboard [Taiga #5531](https://tree.taiga.io/project/penpot/issue/5531)
- Fix allow team name to be all blank [Taiga #5527](https://tree.taiga.io/project/penpot/issue/5527)
- Fix search font visualitation [Taiga #5523](https://tree.taiga.io/project/penpot/issue/5523)
- Fix create and account only with spaces [Taiga #5518](https://tree.taiga.io/project/penpot/issue/5518)
- Fix context menu outside screen [Taiga #5524](https://tree.taiga.io/project/penpot/issue/5524)
- Fix graphic item rename on assets pannel [Taiga #5556](https://tree.taiga.io/project/penpot/issue/5556)
- Fix component and media name validation on assets panel [Taiga #5555](https://tree.taiga.io/project/penpot/issue/5555)
- Fix problem with selection shortcuts [Taiga #5492](https://tree.taiga.io/project/penpot/issue/5492)
- Fix issue with paths line to curve and concurrent editing [Taiga #5191](https://tree.taiga.io/project/penpot/issue/5191)
- Fix problems with locked layers [Taiga #5139](https://tree.taiga.io/project/penpot/issue/5139)
- Fix export from shared prototype [Taiga #5565](https://tree.taiga.io/project/penpot/issue/5565)
- Fix email change: validation error displaying even after both fields are identical [Taiga #5514](https://tree.taiga.io/project/penpot/issue/5514)
- Fix scroll on viewer comment list [Taiga #5563](https://tree.taiga.io/project/penpot/issue/5563)
- Fix context menu z-index [Taiga #5561](https://tree.taiga.io/project/penpot/issue/5561)
- Fix select all checkbox on shared link config [Taiga #5566](https://tree.taiga.io/project/penpot/issue/5566)
- Fix validation on full name input on account creation [Taiga #5516](https://tree.taiga.io/project/penpot/issue/5516)
- Fix validation on team name input [Taiga #5510](https://tree.taiga.io/project/penpot/issue/5510)
- Fix incorrect uri generation issues on share-link modal [Taiga #5564](https://tree.taiga.io/project/penpot/issue/5564)
- Fix cache issues with share-links [Taiga #5559](https://tree.taiga.io/project/penpot/issue/5559)
- Makes height priority for the rows/columns grids [#2774](https://github.com/penpot/penpot/issues/2774)
- Fix problem with comments mode not staying [#3363](https://github.com/penpot/penpot/issues/3363)
- Fix problem with comments when user left the team [Taiga #5562](https://tree.taiga.io/project/penpot/issue/5562)
- Fix problem with images patterns repeating [#3372](https://github.com/penpot/penpot/issues/3372)
- Fix grid not being clipped in frames [#3365](https://github.com/penpot/penpot/issues/3365)
- Fix cut/delete text layer when while creating text [Taiga #5602](https://tree.taiga.io/project/penpot/issue/5602)
- Fix picking a gradient color in recent colors for a new color in the assets tab [Taiga #5601](https://tree.taiga.io/project/penpot/issue/5601)
- Fix problem with importation process [Taiga #5597](https://tree.taiga.io/project/penpot/issue/5597)
- Fix problem with HSV color picker [#3317](https://github.com/penpot/penpot/issues/3317)
- Fix problem with slashes in layers names for exporter [#3276](https://github.com/penpot/penpot/issues/3276)
- Fix incorrect modified data on moving files on dashboard [Taiga #5530](https://tree.taiga.io/project/penpot/issue/5530)
- Fix focus handling on comments edition [Taiga #5560](https://tree.taiga.io/project/penpot/issue/5560)
- Fix incorrect fullname use on registring user after OIDC authentication [Taiga #5517](https://tree.taiga.io/project/penpot/issue/5517)
- Fix incorrect modified-at on project after import file [Taiga #5268](https://tree.taiga.io/project/penpot/issue/5268)
- Fix incorrect message after sending invitation to already member [Taiga 5599](https://tree.taiga.io/project/penpot/issue/5599)
- Fix text decoration on button [Taiga #5301](https://tree.taiga.io/project/penpot/issue/5301)
- Fix menu order on design tab [Taiga #5195](https://tree.taiga.io/project/penpot/issue/5195)
- Fix search bar width on layer tab [Taiga #5445](https://tree.taiga.io/project/penpot/issue/5445)
- Fix border radius values with decimals [Taiga #5283](https://tree.taiga.io/project/penpot/issue/5283)
- Fix shortcuts translations not homogenized [Taiga #5141](https://tree.taiga.io/project/penpot/issue/5141)
- Fix overlay manual position in nested boards [Taiga #5135](https://tree.taiga.io/project/penpot/issue/5135)
- Fix close overlay from a nested board [Taiga #5587](https://tree.taiga.io/project/penpot/issue/5587)
- Fix overlay position when it has shadow or blur [Taiga #4752](https://tree.taiga.io/project/penpot/issue/4752)
- Fix overlay position when there are elements fixed when scrolling [Taiga #4383](https://tree.taiga.io/project/penpot/issue/4383)
- Fix problem when sliding color picker in selected-colors [#3150](https://github.com/penpot/penpot/issues/3150)
- Fix error screen on upload image error [Taiga #5608](https://tree.taiga.io/project/penpot/issue/5608)
- Fix bad frame-id for certain componentes [#3205](https://github.com/penpot/penpot/issues/3205)
- Fix paste elements at bottom of frame [Taig #5253](https://tree.taiga.io/project/penpot/issue/5253)
- Fix new-file button on project not redirecting to the new file [Taiga #5610](https://tree.taiga.io/project/penpot/issue/5610)
- Fix retrieve user comments in dashboard [Taiga #5607](https://tree.taiga.io/project/penpot/issue/5607)
- Locks shapes when moved inside a locked parent [Taiga #5252](https://tree.taiga.io/project/penpot/issue/5252)
- Fix rotate several elements in bulk [Taiga #5165](https://tree.taiga.io/project/penpot/issue/5165)
- Fix onboarding slides height [Taiga #5373](https://tree.taiga.io/project/penpot/issue/5373)
- Fix create typography with section closed [Taiga #5574](https://tree.taiga.io/project/penpot/issue/5574)
- Fix exports menu on viewer mode [Taiga #5568](https://tree.taiga.io/project/penpot/issue/5568)
- Fix create empty comments [Taiga #5536](https://tree.taiga.io/project/penpot/issue/5536)
- Fix position of text cursor is a bit too high in Invitations section [Taiga #5511](https://tree.taiga.io/project/penpot/issue/5511)
- Fix undo when updating several texts [Taiga #5197](https://tree.taiga.io/project/penpot/issue/5197)
- Fix assets right click button for multiple selection [Taiga #5545](https://tree.taiga.io/project/penpot/issue/5545)
- Fix problem with precision in resizes [Taiga #5623](https://tree.taiga.io/project/penpot/issue/5623)
- Fix absolute positioned layouts not showing flex properties [Taiga #5630](https://tree.taiga.io/project/penpot/issue/5630)
- Fix text gradient handlers [Taiga #4047](https://tree.taiga.io/project/penpot/issue/4047)
- Fix when user deletes one file during import it is impossible to finish importing of second file [Taiga #5656](https://tree.taiga.io/project/penpot/issue/5656)
- Fix export multiple images when only one of them has export settings [Taiga #5649](https://tree.taiga.io/project/penpot/issue/5649)
- Fix error when a user different than the thread creator edits a comment [Taiga #5647](https://tree.taiga.io/project/penpot/issue/5647)
- Fix unnecessary button [Taiga #3312](https://tree.taiga.io/project/penpot/issue/3312)
- Fix copy color information in several formats [Taiga #4723](https://tree.taiga.io/project/penpot/issue/4723)
- Fix dropdown width [Taiga #5541](https://tree.taiga.io/project/penpot/issue/5541)
- Fix enable comment mode and insert image keeps on comment mode [Taiga #5678](https://tree.taiga.io/project/penpot/issue/5678)
- Fix enable undo just after using pencil [Taiga #5674](https://tree.taiga.io/project/penpot/issue/5674)
- Fix 400 error when user changes password [Taiga #5643](https://tree.taiga.io/project/penpot/issue/5643)
- Fix cannot undo layer styles [Taiga #5676](https://tree.taiga.io/project/penpot/issue/5676)
- Fix unexpected exception on boolean shapes [Taiga #5685](https://tree.taiga.io/project/penpot/issue/5685)
- Fix ctrl+z on select not working [Taiga #5677](https://tree.taiga.io/project/penpot/issue/5677)
- Fix thubmnail rendering flashing [Taiga #5675](https://tree.taiga.io/project/penpot/issue/5675)
### :arrow_up: Deps updates
- Update google fonts catalog (at 2023/07/06) [Taiga #5592](https://tree.taiga.io/project/penpot/issue/5592)
### :heart: Community contributions by (Thank you!)
- Update Typography palette order (by @akshay-gupta7) [Github #3156](https://github.com/penpot/penpot/pull/3156)
- Palettes (color, typographies) empty state (by @akshay-gupta7) [Github #3160](https://github.com/penpot/penpot/pull/3160)
- Duplicate objects via drag + alt (by @akshay-gupta7) [Github #3147](https://github.com/penpot/penpot/pull/3147)
- Set line-height to auto as 1.2 (by @akshay-gupta7) [Github #3185](https://github.com/penpot/penpot/pull/3185)
- Click to select full values at the design sidebar (by @akshay-gupta7) [Github #3179](https://github.com/penpot/penpot/pull/3179)
- Fix rect filter bounds math (by @ryanbreen) [Github #3180](https://github.com/penpot/penpot/pull/3180)
- Removed sizing variables from radius (by @ondrejkonec) [Github #3184](https://github.com/penpot/penpot/pull/3184)
- Dashboard search, set focus after shortcut (by @akshay-gupta7) [Github #3196](https://github.com/penpot/penpot/pull/3196)
- Library name dropdown arrow is overlapped by library name (by @ondrejkonec) [Taiga #5200](https://tree.taiga.io/project/penpot/issue/5200)
- Reorder shadows (by @akshay-gupta7) [Github #3236](https://github.com/penpot/penpot/pull/3236)
- Open project in new tab from workspace (by @akshay-gupta7) [Github #3246](https://github.com/penpot/penpot/pull/3246)
- Distribute fix enabled when two elements were selected (by @dfelinto) [Github #3266](https://github.com/penpot/penpot/pull/3266)
- Distribute vertical spacing failing for overlapped text (by @dfelinto) [Github #3267](https://github.com/penpot/penpot/pull/3267)
- bug Change independent corner radius input tooltips #3332 (by @astudentinearth) [Github #3332](https://github.com/penpot/penpot/pull/3332)
## 1.18.6
### :bug: Bugs fixed
- Fix comments navigation from workspace [Taiga #5504](https://tree.taiga.io/project/penpot/issue/5504)
### :sparkles: Enhancements
- Add the ability to overwrite internal resolver with `PENPOT_INTERNAL_RESOLVER` environment
variable [GH #3310](https://github.com/penpot/penpot/issues/3310)
## 1.18.5
### :bug: Bugs fixed
- Fix add flow option in contextual menu for frames
- Fix issues related with invitations
- Fix problem with undefined gaps
- Add deleted fonts auto match mechanism
## 1.18.4
### :bug: Bugs fixed
- Fix zooming while color picker breaks UI [GH #3214](https://github.com/penpot/penpot/issues/3214)
- Fix problem with layout not reflowing on shape deletion [Taiga #5289](https://tree.taiga.io/project/penpot/issue/5289)
- Fix extra long typography names on assets and palette [Taiga #5199](https://tree.taiga.io/project/penpot/issue/5199)
- Fix background-color property on inspect code [Taiga #5300](https://tree.taiga.io/project/penpot/issue/5300)
- Preview layer blend modes (by @akshay-gupta7) [Github #3235](https://github.com/penpot/penpot/pull/3235)
## 1.18.3
### :bug: Bugs fixed
- Fix problem with rulers not placing correctly [Taiga #5093](https://tree.taiga.io/project/penpot/issue/5093)
- Fix page context menu [Taiga #5145](https://tree.taiga.io/project/penpot/issue/5145)
- Fix project file count [Taiga #5148](https://tree.taiga.io/project/penpot/issue/5148)
- Fix OIDC roles checking mechanism [GH #3152](https://github.com/penpot/penpot/issues/3152)
- Import updated translation strings from weblate
### :arrow_up: Deps updates
## 1.18.2
### :bug: Bugs fixed
- Fix problem with frame title rotation
- Fix first level board "Show in view mode" is automatically unchecked [Taiga #5136](https://tree.taiga.io/project/penpot/issue/5136)
## 1.18.1
### :bug: Bugs fixed
- Fix problems with imported SVG shadows [Taiga #4922](https://tree.taiga.io/project/penpot/issue/4922)
- Fix problems with imported SVG embedded images and transforms [Taiga #4639](https://tree.taiga.io/project/penpot/issue/4639)
## 1.18.0
### :sparkles: New features
- Adds more accessibility improvements in dashboard [Taiga #4577](https://tree.taiga.io/project/penpot/us/4577)
- Adds paddings and gaps prediction on layout creation [Taiga #4838](https://tree.taiga.io/project/penpot/task/4838)
- Add visual feedback when proportionally scaling text elements with **K** [Taiga #3415](https://tree.taiga.io/project/penpot/us/3415)
- Add visualization and mouse control to paddings, margins and gaps in frames with layout [Taiga #4839](https://tree.taiga.io/project/penpot/task/4839)
- Allow for absolute positioned elements inside layout [Taiga #4834](https://tree.taiga.io/project/penpot/us/4834)
- Add z-index option for flex layout items [Taiga #2980](https://tree.taiga.io/project/penpot/us/2980)
- Scale content proportionally affects strokes, shadows, blurs and corners [Taiga #1951](https://tree.taiga.io/project/penpot/us/1951)
- Use tabulators to navigate layers [Taiga #5010](https://tree.taiga.io/project/penpot/issue/5010)
### :bug: Bugs fixed
- Fix problem with rules position on changing pages [Taiga #4847](https://tree.taiga.io/project/penpot/issue/4847)
- Fix error streen when uploading wrong SVG [#2995](https://github.com/penpot/penpot/issues/2995)
- Fix selecting children from hidden parent layers [Taiga #4934](https://tree.taiga.io/project/penpot/issue/4934)
- Fix problem when undoing multiple selected colors [Taiga #4920](https://tree.taiga.io/project/penpot/issue/4920)
- Allow selection of empty board by partial rect [Taiga #4806](https://tree.taiga.io/project/penpot/issue/4806)
- Improve behavior for undo on text edition [Taiga #4693](https://tree.taiga.io/project/penpot/issue/4693)
- Improve deeps selection of nested arboards [Taiga #4913](https://tree.taiga.io/project/penpot/issue/4913)
- Fix problem on selection numeric inputs on Firefox [#2991](https://github.com/penpot/penpot/issues/2991)
- Changed the text dominant-baseline to use ideographic [Taiga #4791](https://tree.taiga.io/project/penpot/issue/4791)
- Viewer wrong translations [Github #3035](https://github.com/penpot/penpot/issues/3035)
- Fix problem with text editor in Safari
- Fix unlink library color when blur color picker input [#3026](https://github.com/penpot/penpot/issues/3026)
- Fix snap pixel when moving path points on high zoom [#2930](https://github.com/penpot/penpot/issues/2930)
- Fix shortcuts for zoom now take into account the mouse position [#2924](https://github.com/penpot/penpot/issues/2924)
- Fix close colorpicker on Firefox when mouse-up is outside the picker [#2911](https://github.com/penpot/penpot/issues/2911)
- Fix problems with touch devices and Wacom tablets [#2216](https://github.com/penpot/penpot/issues/2216)
- Fix problem with board titles misplaced [Taiga #4738](https://tree.taiga.io/project/penpot/issue/4738)
- Fix problem with alt getting stuck when alt+tab [Taiga #5013](https://tree.taiga.io/project/penpot/issue/5013)
- Fix problem with z positioning of elements [Taiga #5014](https://tree.taiga.io/project/penpot/issue/5014)
- Fix problem in Firefox with scroll jumping when changin pages [#3052](https://github.com/penpot/penpot/issues/3052)
- Fix nested frame interaction created flow in wrong frame [Taiga #5043](https://tree.taiga.io/project/penpot/issue/5043)
- Font-Kerning does not work on Artboard Export to PNG/JPG/PDF [#3029](https://github.com/penpot/penpot/issues/3029)
- Fix manipulate duplicated project (delete, duplicate, rename, pin/unpin...) [Taiga #5027](https://tree.taiga.io/project/penpot/issue/5027)
- Fix deleted files appear in search results [Taiga #5002](https://tree.taiga.io/project/penpot/issue/5002)
- Fix problem with selected colors and texts [Taiga #5051](https://tree.taiga.io/project/penpot/issue/5051)
- Fix problem when assigning color from palette or assets [Taiga #5050](https://tree.taiga.io/project/penpot/issue/5050)
- Fix shortcuts for alignment [Taiga #5030](https://tree.taiga.io/project/penpot/issue/5030)
- Fix path options not showing when editing rects or ellipses [Taiga #5053](https://tree.taiga.io/project/penpot/issue/5053)
- Fix tooltips for some alignment options are truncated on design tab [Taiga #5040](https://tree.taiga.io/project/penpot/issue/5040)
- Fix horizontal margins drag don't always start from place [Taiga #5020](https://tree.taiga.io/project/penpot/issue/5020)
- Fix multiplayer username sometimes is not displayed correctly [Taiga #4400](https://tree.taiga.io/project/penpot/issue/4400)
- Show warning when trying to invite a user that is already in members [Taiga #4147](https://tree.taiga.io/project/penpot/issue/4147)
- Fix problem with text out of borders when changing from auto-width to fixed [Taiga #4308](https://tree.taiga.io/project/penpot/issue/4308)
- Fix header not showing when exiting fullscreen mode in viewer [Taiga #4244](https://tree.taiga.io/project/penpot/issue/4244)
- Fix visual problem in select options [Taiga #5028](https://tree.taiga.io/project/penpot/issue/5028)
- Forbid empty names for assets [Taiga #5056](https://tree.taiga.io/project/penpot/issue/5056)
- Select children after ungroup action [Taiga #4917](https://tree.taiga.io/project/penpot/issue/4917)
- Fix problem with guides not showing when moving over nested frames [Taiga #4905](https://tree.taiga.io/project/penpot/issue/4905)
- Fix change email and password for users signed in via social login [Taiga #4273](https://tree.taiga.io/project/penpot/issue/4273)
- Fix drag and drop files from browser or file explorer under circumstances [Taiga #5054](https://tree.taiga.io/project/penpot/issue/5054)
- Fix problem when copy/pasting shapes [Taiga #4931](https://tree.taiga.io/project/penpot/issue/4931)
- Fix problem with color picker not able to change hue [Taiga #5065](https://tree.taiga.io/project/penpot/issue/5065)
- Fix problem with outer stroke in texts [Taiga #5078](https://tree.taiga.io/project/penpot/issue/5078)
- Fix problem with text carring over next line when changing to fixed [Taiga #5067](https://tree.taiga.io/project/penpot/issue/5067)
- Fix don't show invite user hero to users with editor role [Taiga #5086](https://tree.taiga.io/project/penpot/issue/5086)
- Fix enter emails on onboarding new user creating team [Taiga #5089](https://tree.taiga.io/project/penpot/issue/5089)
- Fix invalid files amount after moving on dashboard [Taiga #5080](https://tree.taiga.io/project/penpot/issue/5080)
- Fix dashboard left sidebar, the [x] overlaps the field [Taiga #5064](https://tree.taiga.io/project/penpot/issue/5064)
- Fix expanded typography on assets sidebar is moving [Taiga #5063](https://tree.taiga.io/project/penpot/issue/5063)
- Fix spelling mistake in confirmation after importing only 1 file [Taiga #5095](https://tree.taiga.io/project/penpot/issue/5095)
- Fix problem with selection colors and texts [Taiga #5079](https://tree.taiga.io/project/penpot/issue/5079)
- Remove "show in view mode" flag when moving frame to frame [Taiga #5091](https://tree.taiga.io/project/penpot/issue/5091)
- Fix problem creating files in project page [Taiga #5060](https://tree.taiga.io/project/penpot/issue/5060)
- Disable empty names on rename files [Taiga #5088](https://tree.taiga.io/project/penpot/issue/5088)
- Fix problem with SVG and flex layout [Taiga #](https://tree.taiga.io/project/penpot/issue/5099)
- Fix unpublish and delete shared library warning messages [Taiga #5090](https://tree.taiga.io/project/penpot/issue/5090)
- Fix last update project timer update after creating new file [Taiga #5096](https://tree.taiga.io/project/penpot/issue/5096)
- Fix dashboard scrolling using 'Page Up' and 'Page Down' [Taiga #5081](https://tree.taiga.io/project/penpot/issue/5081)
- Fix view mode header buttons overlapping in small resolutions [Taiga #5058](https://tree.taiga.io/project/penpot/issue/5058)
- Fix precision for wrap in flex [Taiga #5072](https://tree.taiga.io/project/penpot/issue/5072)
- Fix relative position overlay positioning [Taiga #5092](https://tree.taiga.io/project/penpot/issue/5092)
- Fix hide grid keyboard shortcut [Github #3071](https://github.com/penpot/penpot/pull/3071)
- Fix problem with opacity in imported SVG's [Taiga #4923](https://tree.taiga.io/project/penpot/issue/4923)
### :heart: Community contributions by (Thank you!)
- To @ondrejkonec: for contributing to the code with:
- Refactor CSS variables [Github #2948](https://github.com/penpot/penpot/pull/2948)
## 1.17.3
### :bug: Bugs fixed
- Fix copy and paste very nested inside itself [Taiga #4848](https://tree.taiga.io/project/penpot/issue/4848)
- Fix custom fonts not rendered correctly [Taiga #4874](https://tree.taiga.io/project/penpot/issue/4874)
- Fix problem with shadows and blur on multiple selection
- Fix problem with redo shortcut
- Fix Component texts not displayed in assets panel [Taiga #4907](https://tree.taiga.io/project/penpot/issue/4907)
- Fix search field has implemented shared styles for "close icon" and "search icon" [Taiga #4927](https://tree.taiga.io/project/penpot/issue/4927)
- Fix Handling correctly slashes "/" in emails [Taiga #4906](https://tree.taiga.io/project/penpot/issue/4906)
- Fix Change text color from selected colors [Taiga #4933](https://tree.taiga.io/project/penpot/issue/4933)
### :sparkles: Enhancements
- Adds environment variables for specifying the export and backend URI for the frontend docker image, thanks to @Supernova3339 for the initial PR and suggestion [Github #2984](https://github.com/penpot/penpot/issues/2984)
## 1.17.2
### :bug: Bugs fixed
- Fix invite members button text [Taiga #4794](https://tree.taiga.io/project/penpot/issue/4794)
- Fix problem with opacity in frames [Taiga #4795](https://tree.taiga.io/project/penpot/issue/4795)
- Fix correct behaviour for space-around and added space-evenly option
- Fix duplicate with alt and undo only undo one step [Taiga #4746](https://tree.taiga.io/project/penpot/issue/4746)
- Fix problem creating frames inside layout [Taiga #4844](https://tree.taiga.io/project/penpot/issue/4844)
- Fix paste board inside itself [Taiga #4775](https://tree.taiga.io/project/penpot/issue/4775)
- Fix middle button panning can drag guides [Taiga #4266](https://tree.taiga.io/project/penpot/issue/4266)
### :heart: Community contributions by (Thank you!)
- To @ondrejkonec: for some code contributions on this release.
## 1.17.1
### :bug: Bugs fixed
- Fix components groups items show the component name in list mode [Taiga #4770](https://tree.taiga.io/project/penpot/issue/4770)
- Fix typing CMD+Z on MacOS turns the cursor into a Zoom cursor [Taiga #4778](https://tree.taiga.io/project/penpot/issue/4778)
- Fix white space on small screens [Taiga #4774](https://tree.taiga.io/project/penpot/issue/4774)
- Fix button spacing on delete acount modal [Taiga #4762](https://tree.taiga.io/project/penpot/issue/4762)
- Fix invitations input on team management and onboarding modal [Taiga #4760](https://tree.taiga.io/project/penpot/issue/4760)
- Fix weird numeration creating new elements in dashboard [Taiga #4755](https://tree.taiga.io/project/penpot/issue/4755)
- Fix can move shape with lens zoom active [Taiga #4787](https://tree.taiga.io/project/penpot/issue/4787)
- Fix social links broken [Taiga #4759](https://tree.taiga.io/project/penpot/issue/4759)
- Fix tooltips on left toolbar [Taiga #4793](https://tree.taiga.io/project/penpot/issue/4793)
## 1.17.0
### :sparkles: New features
- Adds layout flex functionality for boards
- Better overlays interactions on boards inside boards [Taiga #4386](https://tree.taiga.io/project/penpot/us/4386)
- Show board miniature in manual overlay setting [Taiga #4475](https://tree.taiga.io/project/penpot/issue/4475)
- Handoff visual improvements [Taiga #3124](https://tree.taiga.io/project/penpot/us/3124)
- Dynamic alignment only in sight [Github 1971](https://github.com/penpot/penpot/issues/1971)
- Add some accessibility to shortcut panel [Taiga #4713](https://tree.taiga.io/project/penpot/issue/4713)
- Add shortcuts for text editing [Taiga #2052](https://tree.taiga.io/project/penpot/us/2052)
- Second level boards treated as groups in terms of selection [Taiga #4269](https://tree.taiga.io/project/penpot/us/4269)
- Performance improvements both for backend and frontend
- Accessibility improvements for login area [Taiga #4353](https://tree.taiga.io/project/penpot/us/4353)
- Outbound webhooks [Taiga #4577](https://tree.taiga.io/project/penpot/us/4577)
- Add copy invitation link to the invitation options [Taiga #4213](https://tree.taiga.io/project/penpot/us/4213)
- Dynamic alignment only in sight [Taiga #3537](https://tree.taiga.io/project/penpot/us/3537)
- Improve naming of layers [Taiga #4036](https://tree.taiga.io/project/penpot/us/4036)
- Add zoom lense [Taiga #4691](https://tree.taiga.io/project/penpot/us/4691)
- Detect potential problems with custom font vertical metrics [Taiga #4697](https://tree.taiga.io/project/penpot/us/4697)
### :bug: Bugs fixed
- Add title to color bullets [Taiga #4218](https://tree.taiga.io/project/penpot/task/4218)
- Fix color bullets in library color modal [Taiga #4186](https://tree.taiga.io/project/penpot/issue/4186)
- Fix shortcut texts alignment [Taiga #4275](https://tree.taiga.io/project/penpot/issue/4275)
- Fix some texts and a typo [Taiga #4215](https://tree.taiga.io/project/penpot/issue/4215)
- Fix twitter support account link [Taiga #4279](https://tree.taiga.io/project/penpot/issue/4279)
- Fix lang autodetect issue [Taiga #4277](https://tree.taiga.io/project/penpot/issue/4277)
- Fix adding an extra page on import [Taiga #4543](https://tree.taiga.io/project/penpot/task/4543)
- Fix unable to select text at assets inputs in firefox [Taiga #4572](https://tree.taiga.io/project/penpot/issue/4572)
- Fix component sync when converting to path [Taiga #3642](https://tree.taiga.io/project/penpot/issue/3642)
- Fix style for team invite in deutsch [Taiga #4614](https://tree.taiga.io/project/penpot/issue/4614)
- Fix problem with text edition in Safari [Taiga #4046](https://tree.taiga.io/project/penpot/issue/4046)
- Fix show outline with rounded corners on rects [Taiga #4053](https://tree.taiga.io/project/penpot/issue/4053)
- Fix wrong interaction between comments and panning modes [Taiga #4297](https://tree.taiga.io/project/penpot/issue/4297)
- Fix bad element positioning on interaction with fixed scroll [Github #2660](https://github.com/penpot/penpot/issues/2660)
- Fix display type of component library not persistent [Taiga #4512](https://tree.taiga.io/project/penpot/issue/4512)
- Fix problem when moving texts with keyboard [#2690](https://github.com/penpot/penpot/issues/2690)
- Fix problem when drawing boxes won't detect mouse-up [Taiga #4618](https://tree.taiga.io/project/penpot/issue/4618)
- Fix missing loading icon on shared libraries [Taiga #4148](https://tree.taiga.io/project/penpot/issue/4148)
- Fix selection stroke missing in properties of multiple texts [Taiga #4048](https://tree.taiga.io/project/penpot/issue/4048)
- Fix missing create component menu for frames [Github #2670](https://github.com/penpot/penpot/issues/2670)
- Fix "currentColor" is not converted when importing SVG [Github 2276](https://github.com/penpot/penpot/issues/2276)
- Fix incorrect color in properties of multiple bool shapes [Taiga #4355](https://tree.taiga.io/project/penpot/issue/4355)
- Fix pressing the enter key gives you an internal error [Github 2675](https://github.com/penpot/penpot/issues/2675) [Github 2577](https://github.com/penpot/penpot/issues/2577)
- Fix confirm group name with enter doesn't work in assets modal [Taiga #4506](https://tree.taiga.io/project/penpot/issue/4506)
- Fix group/ungroup shapes inside a component [Taiga #4052](https://tree.taiga.io/project/penpot/issue/4052)
- Fix wrong update of text in components [Taiga #4646](https://tree.taiga.io/project/penpot/issue/4646)
- Fix problem with SVG imports with style [#2605](https://github.com/penpot/penpot/issues/2605)
- Fix ghost shapes after sync groups in components [Taiga #4649](https://tree.taiga.io/project/penpot/issue/4649)
- Fix layer orders messed up on move, group, reparent and undo [Github #2672](https://github.com/penpot/penpot/issues/2672)
- Fix max height in library dialog [Github #2335](https://github.com/penpot/penpot/issues/2335)
- Fix undo ungroup (shift+g) scrambles positions [Taiga #4674](https://tree.taiga.io/project/penpot/issue/4674)
- Fix justified text is stretched [Github #2539](https://github.com/penpot/penpot/issues/2539)
- Fix mousewheel on viewer inspector [Taiga #4221](https://tree.taiga.io/project/penpot/issue/4221)
- Fix path edition activated on boards [Taiga #4105](https://tree.taiga.io/project/penpot/issue/4105)
- Fix hidden layers inside groups become visible after the group visibility is changed[Taiga #4710](https://tree.taiga.io/project/penpot/issue/4710)
- Fix format of HSLA color on viewer [Taiga #4393](https://tree.taiga.io/project/penpot/issue/4393)
- Fix some typos [Taiga #4724](https://tree.taiga.io/project/penpot/issue/4724)
- Fix ctrl+c for inspect code [Taiga #4739](https://tree.taiga.io/project/penpot/issue/4739)
- Fix text in custom font is not at the expected position at export [Taiga #4394](https://tree.taiga.io/project/penpot/issue/4394)
- Fix unneeded popup when updating local components [Taiga #4430](https://tree.taiga.io/project/penpot/issue/4430)
- Fix multiuser - "Shadow" element is not updating immediately [Taiga #4709](https://tree.taiga.io/project/penpot/issue/4709)
- Fix paths not flagged as modified when resized [Taiga #4742](https://tree.taiga.io/project/penpot/issue/4742)
- Fix resend invitation doesn't reset the expiration date [Taiga #4741](https://tree.taiga.io/project/penpot/issue/4741)
- Fix incorrect state after undo page creation [Taiga #4690](https://tree.taiga.io/project/penpot/issue/4690)
- Fix copy paste texts with typography assets linked [Taiga #4750](https://tree.taiga.io/project/penpot/issue/4750)
### :heart: Community contributions by (Thank you!)
- To @iprithvitharun: let's make UX Writing contributions in Open Source a trend!
## 1.16.2-beta
### :bug: Bugs fixed
- Fix strage cursor behaviour after clicking viewport with text pool [Github #2447](https://github.com/penpot/penpot/issues/2447)
## 1.16.1-beta
### :bug: Bugs fixed
- Fix unexpected exception related to default nudge value
- Fix firefox changing layer color type is not applied [Taiga #4292](https://tree.taiga.io/project/penpot/issue/4292)
- Fix justify alignes text left [Taiga #4322](https://tree.taiga.io/project/penpot/issue/4322)
- Fix text out of borders with "auto width" and center align [Taiga #4308](https://tree.taiga.io/project/penpot/issue/4308)
- Fix wrong validation text after interaction with 2 and more files [Taiga #4276](https://tree.taiga.io/project/penpot/issue/4276)
- Fix auto-width for texts can make text appear stretched [Github #2482](https://github.com/penpot/penpot/issues/2482)
- Fix boards name do not disappear in focus mode [#4272](https://tree.taiga.io/project/penpot/issue/4272)
- Fix wrong email in the info message at change email [Taiga #4274](https://tree.taiga.io/project/penpot/issue/4274)
- Fix transform to path RMB menu item is not relevant if shape is already path [Taiga #4302](https://tree.taiga.io/project/penpot/issue/4302)
- Fix join nodes icon is active when 2 already joined nodes are selected [Taiga #4370](https://tree.taiga.io/project/penpot/issue/4370)
- Fix path nodes panel. "To curve" and "To corner" icons are active if node is already curved/cornered [Taiga #4371](https://tree.taiga.io/project/penpot/issue/4371)
- Fix displaying comments settings are not applied via "Comments" menu drop-down on the top navbar on view mode [Taiga #4389](https://tree.taiga.io/project/penpot/issue/4389)
- Fix bad behaviour on hovering and click nested artboards [Taiga #4018](https://tree.taiga.io/project/penpot/issue/4018) and [Taiga #4269](https://tree.taiga.io/project/penpot/us/4269)
- Fix lang autodetect issue [Taiga #4277](https://tree.taiga.io/project/penpot/issue/4277)
- Fix colorpicker does not close upon switching to Dashboard [Taiga #4408](https://tree.taiga.io/project/penpot/issue/4408)
- Fix problem with auto-width/auto-height + lock-proportions
## 1.16.0-beta
### :boom: Breaking changes & Deprecations
- Removed the support for v2 internal file data blob format. This
version has never been documented nor set as default value so
technically this is not a breaking change because we are removing
a "private API".
### :sparkles: New features
- Improve interactions with nested boards [Taiga #4054](https://tree.taiga.io/project/penpot/us/4054)
- Add team hero in projects dashboard [Taiga #3863](https://tree.taiga.io/project/penpot/us/3863)
- Add zoom style to shared link [Taiga #3874](https://tree.taiga.io/project/penpot/us/3874)
- Add dashboard creation button as placeholder [Taiga #3861](https://tree.taiga.io/project/penpot/us/3861)
- Improve invitation flow on onboarding [Taiga #3241](https://tree.taiga.io/project/penpot/us/3241)
- Add new text to initial modals [Taiga #3458](https://tree.taiga.io/project/penpot/us/3458)
- Add new questions to onboarding [Taiga #3462](https://tree.taiga.io/project/penpot/us/3462)
- Add cosmetic changes in viewer mode [Taiga #3688](https://tree.taiga.io/project/penpot/us/3688)
- Outline highlights on layer hovering [Taiga #2645](https://tree.taiga.io/project/penpot/us/2645) by @andrewzhurov
- Add zoom to shape on double click up on its icon [Taiga #3929](https://tree.taiga.io/project/penpot/us/3929) by @andrewzhurov
- Add Libraries & Templates carousel [Taiga #3860](https://tree.taiga.io/project/penpot/us/3860)
- Ungroup frames [Taiga #4012](https://tree.taiga.io/project/penpot/us/4012)
- Newsletter Opt-in options for subscription categories [Taiga #3242](https://tree.taiga.io/project/penpot/us/3242)
- Print emails to console by default if smtp is disabled
- Add `email-verification` flag for enable/disable email verification
- Make graphics thumbnails load lazy [Taiga #4252](https://tree.taiga.io/project/penpot/issue/4252)
### :bug: Bugs fixed
- Fix unexpected removal of guides on copy&paste frames [Taiga #3887](https://tree.taiga.io/project/penpot/issue/3887) by @andrewzhurov
- Fix props preserving on copy&paste texts [Taiga #3629](https://tree.taiga.io/project/penpot/issue/3629) by @andrewzhurov
- Fix unexpected layers ungrouping on moving it [Taiga #3932](https://tree.taiga.io/project/penpot/issue/3932) by @andrewzhurov
- Fix artboards moving with comment tool selected [Taiga #3938](https://tree.taiga.io/project/penpot/issue/3938)
- Fix undo on delete page does not preserve its order [Taiga #3375](https://tree.taiga.io/project/penpot/issue/3375)
- Fix unexpected 404 on deleting library that is used by deleted files
- Fix inconsistent message on deleting library when a library is linked from deleted files
- Fix change multiple colors with SVG [Taiga #3889](https://tree.taiga.io/project/penpot/issue/3889)
- Fix ungroup does not work for typographies [Taiga #4195](https://tree.taiga.io/project/penpot/issue/4195)
- Fix inviting to non existing users can fail [Taiga #4108](https://tree.taiga.io/project/penpot/issue/4108)
- Fix components marked as touched when moved [Taiga #4061](https://tree.taiga.io/project/penpot/task/4061)
- Fix boards grouped shouldn't show the title [Taiga #4251](https://tree.taiga.io/project/penpot/issue/4251)
- Fix gradient handlers are under resize handlers[Taiga #4298](https://tree.taiga.io/project/penpot/issue/4298)
- Fix grid not syncing immediately in multiuser [Taiga #4339](https://tree.taiga.io/project/penpot/issue/4339)
- Fix custom font upload fails silently for unsupported formats [Taiga #4279](https://tree.taiga.io/project/penpot/issue/4280)
### :heart: Community contributions by (Thank you!)
- To @andrewzhurov for many code contributions on this release.
- UI improvements in Project section (by @Waishnav) [#2285](https://github.com/penpot/penpot/pull/2285)
- Fix fronted comments (by @lol768) [#2368](https://github.com/penpot/penpot/pull/2368)
## 1.15.5-beta
### :bug: Bugs fixed
- Fix artboard border radius [Taiga #4291](https://tree.taiga.io/project/penpot/issue/4291)
- Fix copied & pasted layer is not visible [Taiga #4283](https://tree.taiga.io/project/penpot/issue/4283)
- Fix notification to newsletter is shown in all cases [Taiga #4367](https://tree.taiga.io/project/penpot/issue/4367)
- Fix comments section is not scrolling by mouse wheel [Taiga #4305](https://tree.taiga.io/project/penpot/issue/4305)
- Fix justify alignes text left [Taiga #4322](https://tree.taiga.io/project/penpot/issue/4322)
- Fix text out of borders with "auto width" and center align [Taiga #4308](https://tree.taiga.io/project/penpot/issue/4308)
## 1.15.4-beta
### :bug: Bugs fixed
- Fix social buttons in register form [Taiga #4320](https://tree.taiga.io/project/penpot/issue/4320)
- Remove gitter information from feedback page [Taiga #4157](https://tree.taiga.io/project/penpot/issue/4157)
- Fix overlay remains open on frame change [Taiga #4066](https://tree.taiga.io/project/penpot/issue/4066)
- Fix toggle overlay position [Taiga #4091](https://tree.taiga.io/project/penpot/issue/4091)
- Fix overlay closed on clicked outside [Taiga #4027](https://tree.taiga.io/project/penpot/issue/4027)
- Fix animate multiple overlays [Taiga #3993](https://tree.taiga.io/project/penpot/issue/3993)
- Fix problem with snap to grids [#2221](https://github.com/penpot/penpot/issues/2221)
- Fix issue when scaling to value 0 [#2252](https://github.com/penpot/penpot/issues/2252)
- Fix problem when moving shapes inside nested frames [Taiga #4113](https://tree.taiga.io/project/penpot/issue/4113)
- Fix color type icon does not change [Taiga #4133](https://tree.taiga.io/project/penpot/issue/4133)
- Fix recent colors are not working [Taiga #4153](https://tree.taiga.io/project/penpot/issue/4153)
- Fix change opacity in colorpicker cause bugged color [Taiga #4154](https://tree.taiga.io/project/penpot/issue/4154)
- Fix gradient colors don't arrive in recent colors palette (https://tree.taiga.io/project/penpot/issue/4155)
- Fix selected colors allow gradients in shadows [Taiga #4156](https://tree.taiga.io/project/penpot/issue/4156)
- Fix import files with unexpected format or invalid content [Taiga #4136](https://tree.taiga.io/project/penpot/issue/4136)
- Fix wrong shortcut button tip of "Delete" function [Taiga #4162](https://tree.taiga.io/project/penpot/issue/4162)
- Fix error after user drags any layer in search functionality [Taiga #4161](https://tree.taiga.io/project/penpot/issue/4161)
- Fix font search works only with lowercase letters [Taiga #4140](https://tree.taiga.io/project/penpot/issue/4140)
- Fix Terms and Privacy links overlapping [Taiga #4137](https://tree.taiga.io/project/penpot/issue/4137)
- Fix Export bounding box mask [Taiga #950](https://tree.taiga.io/project/penpot/issue/950)
- Fix delete layers in bulk [Taiga #4160](https://tree.taiga.io/project/penpot/issue/4160)
- Fix Cannot take out an element from a group at layers panel by drag [Taiga #4209](https://tree.taiga.io/project/penpot/issue/4209)
- Fix Internal error when resending invitation email [Taiga #4212](https://tree.taiga.io/project/penpot/issue/4212)
- Fix PDF exportation order [Taiga #4216](https://tree.taiga.io/project/penpot/issue/4216)
- Fix some typos [Taiga #4215](https://tree.taiga.io/project/penpot/issue/4215)
- Fix "no boards" message in viewer [Taiga #4243](https://tree.taiga.io/project/penpot/issue/4243)
- Fix view mode login size [Taiga #4210](https://tree.taiga.io/project/penpot/issue/4210)
## 1.15.3-beta
### :bug: Bugs fixed
- Fix default value of grow type in texts [Taiga #4034](https://tree.taiga.io/project/penpot/issue/4034)
- Fix error when moving nested frames outside [Taiga #4017](https://tree.taiga.io/project/penpot/issue/4017)
- Fix problem when hovering over nested frames [Taiga #4018](https://tree.taiga.io/project/penpot/issue/4018)
- Fix problem editing rotated texts [Taiga #4026](https://tree.taiga.io/project/penpot/issue/4026)
- Fix problem with texts for non existing fonts [Taiga #4087](https://tree.taiga.io/project/penpot/issue/4087)
- Fix undo after moving layers will wrongly order the layers [Taiga #3344](https://tree.taiga.io/project/penpot/issue/3344)
- Fix grouping typographies by drag & drop does not work (again) [#2203](https://github.com/penpot/penpot/issues/2203)
- Fix when ungrouping, the items previously grouped should ALWAYS remain selected [Taiga #4064](https://tree.taiga.io/project/penpot/issue/4064)
- Change shortcut for "Clear undo" [#2219](https://github.com/penpot/penpot/issues/2219)
## 1.15.2-beta
### :bug: Bugs fixed
@@ -8,6 +546,7 @@
- Fix path tools blocking elements underneath [#2050](https://github.com/penpot/penpot/issues/2050)
- Fix frame titles deforming when resize [#2207](https://github.com/penpot/penpot/issues/2207)
- Fix export simple line path [#3890](https://tree.taiga.io/project/penpot/issue/3890)
- Fix color-picker recent colors [Taiga #4013](https://tree.taiga.io/project/penpot/issue/4013)
## 1.15.1-beta
@@ -31,7 +570,7 @@
- The `PENPOT_LDAP_ATTRS_PHOTO` finally removed, it was unused for many
versions.
- If you are using social login (google, github, gitlab or generic OIDC) you
will need to ensure to add the following flags respectivelly to let them
will need to ensure to add the following flags respectively to let them
enabled: `enable-login-with-google`, `enable-login-with-github`,
`enable-login-with-gitlab` and `enable-login-with-oidc`. If not, they will
remain disabled after application start independently if you set the client-id
@@ -81,8 +620,6 @@
- Fix drag and drop graphic assets in groups [Taiga #4002](https://tree.taiga.io/project/penpot/issue/4002)
- Fix bringing complete file data when launching the export dialog [Taiga #4006](https://tree.taiga.io/project/penpot/issue/4006)
### :arrow_up: Deps updates
### :heart: Community contributions by (Thank you!)
@@ -138,7 +675,7 @@
- Fix undo when drawing curves [Taiga #3523](https://tree.taiga.io/project/penpot/issue/3523)
- Fix issue with text edition and certain fonts (WorkSans, Raleway, ...) and foreign objects [Taiga #3521](https://tree.taiga.io/project/penpot/issue/3521)
- Fix thumbnail generation when concurrent edition [Taiga #3522](https://tree.taiga.io/project/penpot/issue/3522)
- Fix environment imporot for exporter in Docker
- Fix environment import for exporter in Docker
- Fix auto scroll layers in Firefox [Taiga #3531](https://tree.taiga.io/project/penpot/issue/3531)
- Fix base background not visible for imported SVG
@@ -222,7 +759,7 @@
- Fix mouse leave in handoff close overlay animation breaks [Taiga #3173](https://tree.taiga.io/project/penpot/issue/3173)
- Fix different behaviour during image drag [Taiga #2279](https://tree.taiga.io/project/penpot/issue/2279)
- Fix hidden file name on import [Taiga #3172](https://tree.taiga.io/project/penpot/issue/3172)
- Fix unneccessary scrollbars at the color list [Taiga #3211](https://tree.taiga.io/project/penpot/issue/3211)
- Fix unnecessary scrollbars at the color list [Taiga #3211](https://tree.taiga.io/project/penpot/issue/3211)
- "Show in exports" is showing in multiselections [Taiga #3194](https://tree.taiga.io/project/penpot/issue/3194)
- Edit file name navigates to the file workspace [Taiga #3183](https://tree.taiga.io/project/penpot/issue/3183)
- Fix scroll into view behind fixed element [Taiga #3170](https://tree.taiga.io/project/penpot/issue/3170)
@@ -231,7 +768,7 @@
- Fix duplicate multi selected elements [Taiga #3155](https://tree.taiga.io/project/penpot/issue/3155)
- Fix add fills to artboard modify children [Taiga #3151](https://tree.taiga.io/project/penpot/issue/3151)
- Avoid numeric inputs to allow big numbers [Taiga #2858](https://tree.taiga.io/project/penpot/issue/2858)
- Fix component contex menu size [Taiga #2480](https://tree.taiga.io/project/penpot/issue/2480)
- Fix component context menu size [Taiga #2480](https://tree.taiga.io/project/penpot/issue/2480)
- Add shadow to artboard make it lose the fill [Taiga #3139](https://tree.taiga.io/project/penpot/issue/3139)
- Avoid numeric inputs to change its value without focusing them [Taiga #3140](https://tree.taiga.io/project/penpot/issue/3140)
- Fix comments modal when changing pages [Taiga #2597](https://tree.taiga.io/project/penpot/issue/2508)
@@ -360,7 +897,7 @@
- Fix issue on handling empty content on boolean shapes
- Fix race condition issue on component renaming
- Handle EOF errors on writting streamed response
- Handle EOF errors on writing streamed response
- Handle EOF errors on websocket send/ping methods
- Disable parallel upload of file media on import (causes too much
contention on the rlimit subsistem that does not works as expected
@@ -472,7 +1009,7 @@
## 1.10.4-beta
### :sparkles: Enhacements
### :sparkles: Enhancements
- Allow parametrice file snapshoting interval
@@ -484,7 +1021,7 @@
## 1.10.3-beta
### :sparkles: Enhacements
### :sparkles: Enhancements
- Make all logging asynchronous, this avoid some overhead on jetty threads at cost of logging latency.
- Increase default session time to 15 days.
@@ -820,7 +1357,7 @@
- Add better auth module logging.
- Add missing `email` scope to OIDC backend.
- Add missing cause prop on error loging.
- Add missing cause prop on error logging.
- Fix empty font-family handling on custom fonts page.
- Fix incorrect unicode code points handling on draft-to-penpot conversion.
- Fix some problems with paths.

View File

@@ -99,16 +99,16 @@ Each commit should have:
- An entry on the CHANGES.md file if applicable, referencing the
github or taiga issue/user-story using the these same rules.
Examples of good commit messags:
Examples of good commit messages:
- :bug: Fix unexpected error on launching modal
- :bug: Set proper error message on generic error
- :sparkles: Enable new modal for profile
- :zap: Improve performance of dashboard navigation
- :wrench: Update default backend configuration
- :books: Add more documentation for authentication process
- :ambulance: Fix critical bug on user registration process
- :tada: Add new approach for user registration
- `:bug: Fix unexpected error on launching modal`
- `:bug: Set proper error message on generic error`
- `:sparkles: Enable new modal for profile`
- `:zap: Improve performance of dashboard navigation`
- `:wrench: Update default backend configuration`
- `:books: Add more documentation for authentication process`
- `:ambulance: Fix critical bug on user registration process`
- `:tada: Add new approach for user registration`
## Code of conduct ##

131
README.md
View File

@@ -4,7 +4,7 @@
<h1 align="center">
<br>
<img src="https://penpot.app/images/readme/readme-logo.jpg" alt="PENPOT">
<img src="https://penpot.app/images/readme/git-readme-header.png" alt="PENPOT">
</h1>
<p align="center"><a href="https://www.mozilla.org/en-US/MPL/2.0" rel="nofollow"><img src="https://camo.githubusercontent.com/3fcf3d6b678ea15fde3cf7d6af0e242160366282d62a7c182d83a50bfee3f45e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4d504c2d322e302d626c75652e737667" alt="License: MPL-2.0" data-canonical-src="https://img.shields.io/badge/MPL-2.0-blue.svg" style="max-width:100%;"></a>
@@ -12,76 +12,124 @@
<a href="https://tree.taiga.io/project/penpot/" title="Managed with Taiga.io" rel="nofollow"><img src="https://camo.githubusercontent.com/4a1d1112f0272e3393b1e8da312ff4435418e9e2eb4c0964881e3680f90a653c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d616e61676564253230776974682d54414947412e696f2d3730396631342e737667" alt="Managed with Taiga.io" data-canonical-src="https://img.shields.io/badge/managed%20with-TAIGA.io-709f14.svg" style="max-width:100%;"></a>
<a href="https://gitpod.io/#https://github.com/penpot/penpot" rel="nofollow"><img src="https://camo.githubusercontent.com/daadb4894128d1e19b72d80236f5959f1f2b47f9fe081373f3246131f0189f6c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f476974706f642d72656164792d2d746f2d2d636f64652d626c75653f6c6f676f3d676974706f64" alt="Gitpod ready-to-code" data-canonical-src="https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod" style="max-width:100%;"></a></p>
![PENPOT](https://penpot.app/images/readme/home-ui.jpg)
<p align="center">
<a href="https://penpot.app/"><b>Website</b></a> •
<a href="https://help.penpot.app/technical-guide/getting-started/"><b>Getting Started</b></a> •
<a href="https://help.penpot.app/user-guide/"><b>User Guide</b></a> •
<a href="https://help.penpot.app/user-guide/introduction/info/"><b>Tutorials & Info</b></a> •
<a href="https://community.penpot.app/"><b>Community</b></a> •
<a href="https://twitter.com/penpotapp"><b>Twitter</b></a> •
<a href="https://instagram.com/penpot.app"><b>Instagram</b></a> •
<a href="https://fosstodon.org/@penpot/"><b>Mastodon</b></a> •
<a href="https://www.youtube.com/channel/UCAqS8G72uv9P5HG1IfgnQ9g"><b>Youtube</b></a>
</p>
![feature-readme](https://user-images.githubusercontent.com/1045247/189871786-0b44f7cf-3a0a-4445-a87b-9919ec398bf7.gif)
## What is Penpot? ##
**:tada: [Important Notice!] :tada:** Our very first **Penpot Fest** is happening on June 28-30, Barcelona (Spain). **Secure yourself a ticket** to know everything about the present and future of Penpot and be part of the conversation! See details on the amazing venue and speakers lineup at [penpotfest.org](https://penpotfest.org)! :zap:
Penpot is the first **Open Source design** and prototyping platform meant for cross-domain teams. Non dependent on operating systems, Penpot is web based and works with open web standards (SVG). For all and empowered by the community.
Penpot is the first **Open Source** design and prototyping platform meant for cross-domain teams. Non dependent on operating systems, Penpot is web based and works with open standards (SVG). Penpot invites designers all over the world to fall in love with open source while getting developers excited about the design process in return.
- [How to use](#how-to-use)
- [Help center](#help-center)
- [Contributing](#contributing)
- [Give feedback](#give-feedback)
- [Tutorials](#tutorials)
## Table of contents ##
- [Why Penpot](#why-penpot)
- [Getting Started](#getting-started)
- [Community](#community)
- [Resources](#resources)
- [License](#license)
## How to use ##
## Why Penpot ##
Login or Register on our Penpot cloud app. Create a team to work together on projects and share design assets or jump right away into Penpot and **start designing** by your own.
Penpot makes design and prototyping accessible to every team in the world.
✏️ [Start using Penpot](https://design.penpot.app)
### For cross-domain teams ###
We have a clear focus on design and code teams and our capabilities reflect exactly that. The less hand-off mindset, the more fun for everyone.
You can also install Penpot in a local environment. This section details everything you need to know to get Penpot up and running in production environments. Although it can be installed in many ways, the recommended approach is using **docker** and **docker-compose**.
### Multiplatform ###
Being web based, Penpot is not dependent on operating systems or local installations, you will only need to run a modern browser.
🐳 [Install docker](https://help.penpot.app/technical-guide/getting-started/)
### Open Standards ###
Using SVG as no other design and prototyping tool does, Penpot files sport compatibility with most of the vectorial tools, are tech friendly and extremely easy to use on the web. We make sure you will always own your work.
## Help center ##
<p align="center">
<img src="https://penpot.app/images/readme/git-open.png" alt="Open Source" style="width: 65%;">
</p>
In this documentation you will find (almost) everything you need to know about how to work with Penpot. From the interface basics to advanced functionality.
📖 [User guide](https://help.penpot.app/user-guide/)
## Getting started ##
❓ [FAQs](https://help.penpot.app/faqs/)
### Install with Elestio ###
[Elestio](https://elest.io/) offers a fully managed service for on-premise instances of a selection of open-source software! This means you can deploy a dedicated instance of Penpot in just 3 minutes with no technical knowledge needed.
🖥️ [Technical guide](https://help.penpot.app/technical-guide/)
You dont need to worry about DNS configuration, SMTP, backups, SSL certificates, OS & Penpot upgrades, and much more.
❤️ [Contributing guide](https://help.penpot.app/contributing-guide/)
[Get started with Elestio.](https://help.penpot.app/technical-guide/getting-started/#install-with-elestio)
![User guide](https://penpot.app/images/readme/help-center.jpg)
### Install with Docker ###
You can also get started with Penpot locally or self-host it with **docker** and **docker-compose**.
Heres a step-by-step guide on [getting started with Docker.](https://help.penpot.app/technical-guide/getting-started/#install-with-docker)
### Penpot cloud app ###
If you prefer not to install Penpot in a local environment, [login or register on our Penpot cloud app](https://design.penpot.app). Create a team to work together on projects and share design assets or jump right away into Penpot and **start designing** on your own.
<p align="center">
<img src="https://penpot.app/images/readme/git-self-host.png" alt="Getting started" style="width: 65%;">
</p>
## Community ##
We love the open source software community. Contributing is our passion and if its yours too, [participate](https://community.penpot.app/) and [improve](https://community.penpot.app/c/help-us-improve-penpot/7) Penpot. All your ideas and code are welcome!
If you need help or have any questions; if youd like to share your experience using Penpot or get inspired; if youd rather meet our community of developers and designers, [join our Community](https://community.penpot.app/)!
You will find the following categories:
- [Ask the Community](https://community.penpot.app/c/ask-for-help-using-penpot/6)
- [Troubleshooting](https://community.penpot.app/c/technical/8)
- [Help us Improve Penpot](https://community.penpot.app/c/help-us-improve-penpot/7)
- [#MadeWithPenpot](https://community.penpot.app/c/madewithpenpot/9)
- [Events and Announcements](https://community.penpot.app/c/announcements/5)
- [Inside Penpot](https://community.penpot.app/c/inside-penpot/21)
- [Penpot in your language](https://community.penpot.app/c/penpot-in-your-language/12)
<p align="center">
<img src="https://penpot.app/images/readme/git-collaborate.png" alt="Communnity" style="width: 65%;">
</p>
## Contributing ##
Every sort of contribution will be very helpful to enhance Penpot. How youll participate? All your ideas, designs and code are welcome:
- Invite your [team to join](https://design.penpot.app/#/auth/register)
- Star this repo and follow us on Social Media: [Twitter](https://twitter.com/penpotapp), [Instagram](https://instagram.com/penpot.app), [Youtube](https://www.youtube.com/c/Penpot) or [Mastodon](https://fosstodon.org/@penpot/).
- Participate in the [Community](https://community.penpot.app/) asking and answering questions, reacting to others articles or opening your own conversations.
- Report bugs with our easy [guide for bugs hunting](https://help.penpot.app/contributing-guide/reporting-bugs/) or [GitHub issues](https://github.com/penpot/penpot/issues)
- Create and [share Libraries & templates](https://penpot.app/libraries-templates.html) that will be helpful for the community
- Become a [translator](https://help.penpot.app/contributing-guide/translations)
- Give feedback: [Mail us](mailto:support@penpot.app)
To find (almost) everything you need to know on how to contribute to Penpot, refer to the [contributing-guide](https://help.penpot.app/contributing-guide/).
<p align="center">
<img src="https://penpot.app/images/open-source.png" alt="Open Source">
<img src="https://penpot.app/images/readme/git-community.png" alt="Contributing" style="width: 65%;">
</p>
**Open to you!**
We love the open source software community. Contributing is our
passion and because of this, we'll be glad if you want to participate
and improve Penpot. All your awesome ideas and code are welcome!
Please refer to the [Contributing Guide](./CONTRIBUTING.md)
## Give feedback ##
## Resources ##
You can ask and answer questions, have open-ended conversations, and follow along on decisions affecting the project.
✉️ [Mail us](mailto:info@penpot.app)
💾 [Documentation](https://help.penpot.app/technical-guide/)
💬 [GitHub discussions](https://github.com/penpot/penpot/discussions)
🚀 [Getting Started](https://help.penpot.app/technical-guide/getting-started/)
🐞 [GitHub issues](https://github.com/penpot/penpot/issues)
✏️ [Tutorials](https://www.youtube.com/playlist?list=PLgcCPfOv5v54WpXhHmNO7T-YC7AE-SRsr)
✍️ [Gitter](https://gitter.im/penpot/community)
🏘 [Architecture](https://help.penpot.app/technical-guide/developer/architecture/)
## Tutorials ##
📚 [Dev Diaries](https://penpot.app/dev-diaries.html)
You can ask and answer questions, have open-ended conversations, and follow along on decisions affecting the project.
Would you like to know more about Penpot? We recommend you to visit our youtube channel and learn more about the functionalities and possibilities of Penpot with our video tutorials.
🎞️ [YouTube channel](https://www.youtube.com/channel/UCAqS8G72uv9P5HG1IfgnQ9g)
## License ##
@@ -90,5 +138,6 @@ This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
Copyright (c) UXBOX Labs SL
Copyright (c) KALEIDOS INC
```
Penpot is a Kaleidos [open source project](https://kaleidos.net/products)

98
THANKYOU.md Normal file
View File

@@ -0,0 +1,98 @@
# THANK YOU
We want to thank to the amazing people that help us! Thank you! You're the best!
## Security
* Husnain Iqbal (CEO OF ALPHA INFERNO PVT LTD)
* [Shiraz Ali Khan](https://www.linkedin.com/in/shiraz-ali-khan-1ba508180/)
* Vaibhav Shukla
## Internationalization
* [00ff88](https://hosted.weblate.org/user/00ff88)
* [AhmadHB](https://hosted.weblate.org/user/AhmadHB)
* [Aimee](https://hosted.weblate.org/user/Aimee)
* [alejandro.alonso](https://hosted.weblate.org/user/alejandro.alonso)
* [alexpawlak](https://hosted.weblate.org/user/alexpawlak)
* [allytiago](https://hosted.weblate.org/user/allytiago)
* [alonso.torres](https://hosted.weblate.org/user/alonso.torres)
* [andres.moya](https://hosted.weblate.org/user/andres.moya)
* [antoniofsm](https://hosted.weblate.org/user/antoniofsm)
* [ascarida](https://hosted.weblate.org/user/ascarida)
* [Bechii](https://hosted.weblate.org/user/Bechii)
* [Beeby](https://hosted.weblate.org/user/Beeby)
* [bingling-sama](https://hosted.weblate.org/user/bingling-sama)
* [devadarta](https://hosted.weblate.org/user/devadarta)
* [diacritica](https://hosted.weblate.org/user/diacritica)
* [dundzys.vincas](https://hosted.weblate.org/user/dundzys.vincas)
* [Eranot](https://hosted.weblate.org/user/Eranot)
* [erral](https://hosted.weblate.org/user/erral)
* [ersen](https://hosted.weblate.org/user/ersen)
* [filipepessanha](https://hosted.weblate.org/user/filipepessanha)
* [fortx](https://hosted.weblate.org/user/fortx)
* [foxbit](https://hosted.weblate.org/user/foxbit)
* [georgelemon](https://hosted.weblate.org/user/georgelemon)
* [girafic](https://hosted.weblate.org/user/girafic)
* [gizemb](https://hosted.weblate.org/user/gizemb)
* [greench](https://hosted.weblate.org/user/greench)
* [guidimas](https://hosted.weblate.org/user/guidimas)
* [hfigueira_1](https://hosted.weblate.org/user/hfigueira_1)
* [hifiaz](https://hosted.weblate.org/user/hifiaz)
* [httpsterio](https://hosted.weblate.org/user/httpsterio)
* [humteus](https://hosted.weblate.org/user/humteus)
* [iblueer](https://hosted.weblate.org/user/iblueer)
* [insan](https://hosted.weblate.org/user/insan)
* [Iphi](https://hosted.weblate.org/user/Iphi)
* [iWangJiaxiang](https://hosted.weblate.org/user/iWangJiaxiang)
* [jancborchardt](https://hosted.weblate.org/user/jancborchardt)
* [jazz](https://hosted.weblate.org/user/jazz)
* [johnterroa](https://hosted.weblate.org/user/johnterroa)
* [jponsa](https://hosted.weblate.org/user/jponsa)
* [kapler](https://hosted.weblate.org/user/kapler)
* [kingu](https://hosted.weblate.org/user/kingu)
* [KnahkAmath](https://hosted.weblate.org/user/KnahkAmath)
* [laminne](https://hosted.weblate.org/user/laminne)
* [lenildoleite](https://hosted.weblate.org/user/lenildoleite)
* [liimee](https://hosted.weblate.org/user/liimee)
* [lixeix](https://hosted.weblate.org/user/lixeix)
* [locness3](https://hosted.weblate.org/user/locness3)
* [maiwann](https://hosted.weblate.org/user/maiwann)
* [MidooDj](https://hosted.weblate.org/user/MidooDj)
* [Mohamed_amine_gdoura](https://hosted.weblate.org/user/Mohamed_amine_gdoura)
* [myfunnyandy](https://hosted.weblate.org/user/myfunnyandy)
* [NampoinaRal](https://hosted.weblate.org/user/NampoinaRal)
* [nautilusx](https://hosted.weblate.org/user/nautilusx)
* [niwinz](https://hosted.weblate.org/user/niwinz)
* [pablo.alba](pablo.https://hosted.weblate.org/user/alba)
* [PhilippeAccorsi](https://hosted.weblate.org/user/PhilippeAccorsi)
* [rnarius](https://hosted.weblate.org/user/rnarius)
* [rnd](https://hosted.weblate.org/user/rnd)
* [RuanAragao](https://hosted.weblate.org/user/RuanAragao)
* [ruben](https://hosted.weblate.org/user/ruben)
* [semonxue](https://hosted.weblate.org/user/semonxue)
* [shahab](https://hosted.weblate.org/user/shahab)
* [shuaib85](https://hosted.weblate.org/user/shuaib85)
* [SiderealArt](https://hosted.weblate.org/user/SiderealArt)
* [swapnil.cx](swapnil.https://hosted.weblate.org/user/cx)
* [syuza](https://hosted.weblate.org/user/syuza)
* [th3ph4nt0m](https://hosted.weblate.org/user/th3ph4nt0m)
* [tiwb](https://hosted.weblate.org/user/tiwb)
* [tommi](https://hosted.weblate.org/user/tommi)
* [val](https://hosted.weblate.org/user/val)
* [vikt](https://hosted.weblate.org/user/vikt)
* [VinLin](https://hosted.weblate.org/user/VinLin)
* [vintprox](https://hosted.weblate.org/user/vintprox)
* [Voxybuns](https://hosted.weblate.org/user/Voxybuns)
* [winie](https://hosted.weblate.org/user/winie)
* [Yaron](https://hosted.weblate.org/user/Yaron)
* [yrd](https://hosted.weblate.org/user/yrd)
* [YukiYuigishi](https://hosted.weblate.org/user/YukiYuigishi)
* [zcraber](https://hosted.weblate.org/user/zcraber)
## Libraries & templates
* systxema
* plumilla
* victor crespo
* xtech
* candidexmedia
* merih güz
* klarr agency

View File

@@ -16,16 +16,11 @@
{:src-dirs ["src" "resources"]
:target-dir class-dir})
(b/compile-clj
{:basis basis
:src-dirs ["src"]
:class-dir class-dir})
(b/uber
{:class-dir class-dir
:uber-file jar-file
:main 'clojure.main
:exclude [#"goog.*" #"^javasist.*"]
:exclude [#".*Log4j2Plugins\.dat$"]
:basis basis}))
(defn compile [_]
@@ -33,4 +28,4 @@
{:src-dirs ["dev/java"]
:class-dir class-dir
:basis basis
:javac-opts ["-source" "11" "-target" "11"]}))
:javac-opts ["-source" "17" "-target" "17"]}))

View File

@@ -1,56 +1,63 @@
{:deps
{:mvn/repos
{"sonatype" {:url "https://oss.sonatype.org/content/repositories/snapshots/"}}
:deps
{penpot/common {:local/root "../common"}
org.clojure/clojure {:mvn/version "1.11.1"}
org.clojure/core.async {:mvn/version "1.5.648"}
org.clojure/core.async {:mvn/version "1.6.673"}
;; Logging
org.zeromq/jeromq {:mvn/version "0.5.2"}
com.github.luben/zstd-jni {:mvn/version "1.5.5-4"}
com.taoensso/nippy {:mvn/version "3.1.1"}
com.github.luben/zstd-jni {:mvn/version "1.5.2-3"}
org.clojure/data.fressian {:mvn/version "1.0.0"}
io.prometheus/simpleclient {:mvn/version "0.16.0"}
io.prometheus/simpleclient_hotspot {:mvn/version "0.16.0"}
io.prometheus/simpleclient_jetty
{:mvn/version "0.16.0"
:exclusions [org.eclipse.jetty/jetty-server
org.eclipse.jetty/jetty-servlet]}
io.prometheus/simpleclient {:mvn/version "0.15.0"}
io.prometheus/simpleclient_hotspot {:mvn/version "0.15.0"}
io.prometheus/simpleclient_jetty {:mvn/version "0.15.0"
:exclusions [org.eclipse.jetty/jetty-server
org.eclipse.jetty/jetty-servlet]}
io.prometheus/simpleclient_httpserver {:mvn/version "0.15.0"}
io.prometheus/simpleclient_httpserver {:mvn/version "0.16.0"}
io.lettuce/lettuce-core {:mvn/version "6.1.8.RELEASE"}
io.lettuce/lettuce-core {:mvn/version "6.2.4.RELEASE"}
java-http-clj/java-http-clj {:mvn/version "0.4.3"}
funcool/yetti {:git/tag "v9.8" :git/sha "fbe1d7d"
:git/url "https://github.com/funcool/yetti.git"
:exclusions [org.slf4j/slf4j-api]}
funcool/yetti
{:git/tag "v9.16"
:git/sha "7df3e08"
:git/url "https://github.com/funcool/yetti.git"
:exclusions [org.slf4j/slf4j-api]}
com.github.seancorfield/next.jdbc {:mvn/version "1.3.883"}
metosin/reitit-core {:mvn/version "0.6.0"}
org.postgresql/postgresql {:mvn/version "42.6.0"}
com.github.seancorfield/next.jdbc {:mvn/version "1.2.780"}
metosin/reitit-core {:mvn/version "0.5.18"}
org.postgresql/postgresql {:mvn/version "42.4.0"}
com.zaxxer/HikariCP {:mvn/version "5.0.1"}
funcool/datoteka {:mvn/version "3.0.64"}
io.whitfin/siphash {:mvn/version "2.0.0"}
buddy/buddy-hashers {:mvn/version "1.8.158"}
buddy/buddy-sign {:mvn/version "3.4.333"}
buddy/buddy-hashers {:mvn/version "2.0.167"}
buddy/buddy-sign {:mvn/version "3.5.351"}
org.jsoup/jsoup {:mvn/version "1.15.1"}
org.im4java/im4java {:git/tag "1.4.0-penpot-2" :git/sha "e2b3e16"
:git/url "https://github.com/penpot/im4java"}
com.github.ben-manes.caffeine/caffeine {:mvn/version "3.1.6"}
org.jsoup/jsoup {:mvn/version "1.16.1"}
org.im4java/im4java
{:git/tag "1.4.0-penpot-2"
:git/sha "e2b3e16"
:git/url "https://github.com/penpot/im4java"}
org.lz4/lz4-java {:mvn/version "1.8.0"}
org.clojars.pntblnk/clj-ldap {:mvn/version "0.0.17"}
integrant/integrant {:mvn/version "0.8.0"}
io.sentry/sentry {:mvn/version "5.6.1"}
integrant/integrant {:mvn/version "0.8.1"}
dawran6/emoji {:mvn/version "0.1.5"}
markdown-clj/markdown-clj {:mvn/version "1.11.1"}
markdown-clj/markdown-clj {:mvn/version "1.11.4"}
;; Pretty Print specs
pretty-spec/pretty-spec {:mvn/version "0.1.4"}
software.amazon.awssdk/s3 {:mvn/version "2.17.209"}}
software.amazon.awssdk/s3 {:mvn/version "2.20.96"}
}
:paths ["src" "resources" "target/classes"]
:aliases
@@ -58,7 +65,6 @@
{:extra-deps
{com.bhauman/rebel-readline {:mvn/version "RELEASE"}
org.clojure/tools.namespace {:mvn/version "RELEASE"}
org.clojure/test.check {:mvn/version "RELEASE"}
clojure-humanize/clojure-humanize {:mvn/version "0.2.2"}
org.clojure/data.csv {:mvn/version "RELEASE"}
com.clojure-goes-fast/clj-async-profiler {:mvn/version "RELEASE"}
@@ -67,14 +73,15 @@
:build
{:extra-deps
{io.github.clojure/tools.build {:git/tag "v0.8.2" :git/sha "ba1a2bf"}}
{io.github.clojure/tools.build {:git/tag "v0.9.3" :git/sha "e537cd1"}}
:ns-default build}
:test
{:extra-paths ["test"]
:extra-deps
{io.github.cognitect-labs/test-runner
{:git/tag "v0.5.0" :git/sha "b3fd0d2"}}
{:git/tag "v0.5.1" :git/sha "dfb30dd"}}
:main-opts ["-m" "cognitect.test-runner"]
:exec-fn cognitect.test-runner.api/test}
:outdated

View File

@@ -2,7 +2,7 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
;; This is an example on how it can be executed:
;; clojure -Scp $(cat classpath) -M dev/script-fix-sobjects.clj

View File

@@ -2,19 +2,29 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns user
(:require
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.fressian :as fres]
[app.common.geom.matrix :as gmt]
[app.common.logging :as l]
[app.common.perf :as perf]
[app.common.pprint :as pp]
[app.common.schema :as sm]
[app.common.schema.desc-js-like :as smdj]
[app.common.schema.desc-native :as smdn]
[app.common.schema.generators :as sg]
[app.common.spec :as us]
[app.common.transit :as t]
[app.common.uuid :as uuid]
[app.config :as cfg]
[app.main :as main]
[app.srepl.helpers]
[app.srepl.main :as srepl]
[app.util.blob :as blob]
[app.util.fressian :as fres]
[app.util.json :as json]
[app.util.time :as dt]
[clj-async-profiler.core :as prof]
@@ -23,22 +33,50 @@
[clojure.pprint :refer [pprint print-table]]
[clojure.repl :refer :all]
[clojure.spec.alpha :as s]
[clojure.spec.gen.alpha :as sgen]
[clojure.stacktrace :as trace]
[clojure.test :as test]
[clojure.test.check.generators :as tgen]
[clojure.tools.namespace.repl :as repl]
[clojure.walk :refer [macroexpand-all]]
[criterium.core :as crit]
[cuerdas.core :as str]
[datoteka.core]
[integrant.core :as ig]))
[integrant.core :as ig]
[malli.core :as m]
[malli.dev.pretty :as mdp]
[malli.error :as me]
[malli.generator :as mg]
[malli.registry :as mr]
[malli.transform :as mt]
[malli.util :as mu]))
(repl/disable-reload! (find-ns 'integrant.core))
(set! *warn-on-reflection* true)
(defonce system nil)
;; --- Benchmarking Tools
(defmacro run-quick-bench
[& exprs]
`(crit/with-progress-reporting (crit/quick-bench (do ~@exprs) :verbose)))
(defmacro run-quick-bench'
[& exprs]
`(crit/quick-bench (do ~@exprs)))
(defmacro run-bench
[& exprs]
`(crit/with-progress-reporting (crit/bench (do ~@exprs) :verbose)))
(defmacro run-bench'
[& exprs]
`(crit/bench (do ~@exprs)))
;; --- Development Stuff
(defn- run-tests
([] (run-tests #"^app.*-test$"))
([] (run-tests #"^backend-tests.*-test$"))
([o]
(repl/refresh)
(cond
@@ -53,19 +91,22 @@
(defn- start
[]
(alter-var-root #'system (fn [sys]
(when sys (ig/halt! sys))
(-> main/system-config
(ig/prep)
(ig/init))))
:started)
(try
(alter-var-root #'system (fn [sys]
(when sys (ig/halt! sys))
(-> (merge main/system-config main/worker-config)
(ig/prep)
(ig/init))))
:started
(catch Throwable cause
(ex/print-throwable cause))))
(defn- stop
[]
(alter-var-root #'system (fn [sys]
(when sys (ig/halt! sys))
nil))
:stoped)
:stopped)
(defn restart
[]
@@ -79,12 +120,20 @@
(defn compression-bench
[data]
(let [humanize (fn [v] (hum/filesize v :binary true :format " %.4f "))]
(let [humanize (fn [v] (hum/filesize v :binary true :format " %.4f "))
v1 (time (humanize (alength (blob/encode data {:version 1}))))
v3 (time (humanize (alength (blob/encode data {:version 3}))))
v4 (time (humanize (alength (blob/encode data {:version 4}))))
v5 (time (humanize (alength (blob/encode data {:version 5}))))
v6 (time (humanize (alength (blob/encode data {:version 6}))))
]
(print-table
[{:v1 (humanize (alength (blob/encode data {:version 1})))
:v2 (humanize (alength (blob/encode data {:version 2})))
:v3 (humanize (alength (blob/encode data {:version 3})))
:v4 (humanize (alength (blob/encode data {:version 4})))
[{
:v1 v1
:v3 v3
:v4 v4
:v5 v5
:v6 v6
}])))
(defonce debug-tap
@@ -92,3 +141,39 @@
(add-tap #(locking debug-tap
(prn "tap debug:" %)))
1))
(sm/def! ::test
[:map {:title "Foo"}
[:x :int]
[:y {:min 0} :double]
[:bar
[:map {:title "Bar"}
[:z :string]
[:v ::sm/uuid]]]
[:items
[:vector ::dt/instant]]])
(sm/def! ::test2
[:multi {:title "Foo" :dispatch :type}
[:x
[:map {:title "FooX"}
[:type [:= :x]]
[:x :int]]]
[:y
[:map
[:type [:= :x]]
[:y [::sm/one-of #{:a :b :c}]]]]
[:z
[:map {:title "FooZ"}
[:z
[:multi {:title "Bar" :dispatch :type}
[:a
[:map
[:type [:= :a]]
[:a :int]]]
[:b
[:map
[:type [:= :b]]
[:b :int]]]]]]]])

View File

@@ -1,54 +0,0 @@
<li class="rpc-item">
<div class="rpc-row-info">
{# <div class="type">{{item.type}}</div> #}
<div class="module">{{item.module}}:</div>
<div class="name">{{item.name}}</div>
<div class="tags">
{% if item.deprecated %}
<span class="tag">
<span>Deprecated:</span>
<span>since v{{item.deprecated}}</span>,
</span>
{% endif %}
<span class="tag">
<span>Auth:</span>
<span>{% if item.auth %}YES{% else %}NO{% endif %}</span>
</span>
</div>
</div>
<div class="rpc-row-detail hidden">
<h3>DOCSTRING:</h3>
<section class="padded-section">
{% if item.added %}
<p class="small"><strong>Added:</strong> on v{{item.added}}</p>
{% endif %}
{% if item.deprecated %}
<p class="small"><strong>Deprecated:</strong> since v{{item.deprecated}}</p>
{% endif %}
{% if item.docs %}
<p class="docstring"> {{item.docs}}</p>
{% endif %}
</section>
{% if item.changes %}
<h3>CHANGES:</h3>
<section class="padded-section">
<ul class="changes">
{% for change in item.changes %}
<li><strong>{{change.0}}</strong> - {{change.1}}</li>
{% endfor %}
</ul>
</section>
{% endif %}
<h3>SPEC EXPLAIN:</h3>
<section class="padded-section">
<pre class="spec-explain">{{item.spec}}</pre>
</section>
</div>
</li>

View File

@@ -1,50 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="robots" content="noindex,nofollow">
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<title>Builtin API Documentation - Penpot</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@200;300;400;500;700&display=swap" rel="stylesheet">
<style>
{% include "api-doc.css" %}
</style>
<script>
{% include "api-doc.js" %}
</script>
</head>
<body>
<main>
<header>
<h1>Penpot API Documentation (v{{version}})</h1>
</header>
<section class="rpc-doc-content">
<h2>RPC COMMAND METHODS:</h2>
<ul class="rpc-items">
{% for item in command-methods %}
{% include "api-doc-entry.tmpl" with item=item %}
{% endfor %}
</ul>
<h2>RPC QUERY METHODS:</h2>
<ul class="rpc-items">
{% for item in query-methods %}
{% include "api-doc-entry.tmpl" with item=item %}
{% endfor %}
</ul>
<h2>RPC MUTATION METHODS:</h2>
<ul class="rpc-items">
{% for item in mutation-methods %}
{% include "api-doc-entry.tmpl" with item=item %}
{% endfor %}
</ul>
</section>
</main>
</body>
</html>

View File

File diff suppressed because one or more lines are too long

View File

File diff suppressed because one or more lines are too long

View File

@@ -103,9 +103,9 @@
<td style="direction:ltr;font-size:0px;padding:0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -129,9 +129,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -143,7 +143,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -157,9 +157,9 @@
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -211,9 +211,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -225,7 +225,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -239,9 +239,9 @@
<td style="direction:ltr;font-size:0px;padding:24px 0 0 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:425px;"
>
@@ -257,9 +257,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -271,7 +271,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -285,9 +285,9 @@
<td style="direction:ltr;font-size:0px;padding:0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -301,7 +301,7 @@
align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
>
<tr>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -321,7 +321,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -341,7 +341,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -361,7 +361,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -370,7 +370,7 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://instagram.com/penpotapp/" target="_blank">
<a href="https://www.instagram.com/penpot.app/" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-instagram.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
@@ -381,7 +381,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -390,7 +390,7 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://tree.taiga.io/project/uxbox" target="_blank">
<a href="https://tree.taiga.io/project/penpot" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-taiga.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
@@ -401,7 +401,7 @@
</table>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
@@ -411,9 +411,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -425,7 +425,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -439,9 +439,9 @@
<td style="direction:ltr;font-size:0px;padding:0 0 24px 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -457,9 +457,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>

View File

@@ -103,9 +103,9 @@
<td style="direction:ltr;font-size:0px;padding:0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -129,9 +129,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -143,7 +143,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -157,9 +157,9 @@
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -201,9 +201,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -215,7 +215,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -229,9 +229,9 @@
<td style="direction:ltr;font-size:0px;padding:24px 0 0 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:425px;"
>
@@ -247,9 +247,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -261,7 +261,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -275,9 +275,9 @@
<td style="direction:ltr;font-size:0px;padding:0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -291,7 +291,7 @@
align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
>
<tr>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -311,7 +311,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -331,7 +331,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -351,7 +351,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -360,7 +360,7 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://instagram.com/penpotapp/" target="_blank">
<a href="https://www.instagram.com/penpot.app/" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-instagram.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
@@ -371,7 +371,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -380,7 +380,7 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://tree.taiga.io/project/uxbox" target="_blank">
<a href="https://tree.taiga.io/project/penpot" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-taiga.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
@@ -391,7 +391,7 @@
</table>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
@@ -401,9 +401,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -415,7 +415,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -429,9 +429,9 @@
<td style="direction:ltr;font-size:0px;padding:0 0 24px 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -447,9 +447,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>

View File

@@ -103,9 +103,9 @@
<td style="direction:ltr;font-size:0px;padding:0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -129,9 +129,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -143,7 +143,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -157,9 +157,9 @@
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -206,9 +206,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -220,7 +220,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -234,9 +234,9 @@
<td style="direction:ltr;font-size:0px;padding:24px 0 0 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:425px;"
>
@@ -252,9 +252,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -266,7 +266,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -280,9 +280,9 @@
<td style="direction:ltr;font-size:0px;padding:0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -296,7 +296,7 @@
align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
>
<tr>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -316,7 +316,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -336,7 +336,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -356,7 +356,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -365,7 +365,7 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://instagram.com/penpotapp/" target="_blank">
<a href="https://www.instagram.com/penpot.app/" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-instagram.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
@@ -376,7 +376,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -385,7 +385,7 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://tree.taiga.io/project/uxbox" target="_blank">
<a href="https://tree.taiga.io/project/penpot" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-taiga.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
@@ -396,7 +396,7 @@
</table>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
@@ -406,9 +406,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -420,7 +420,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -434,9 +434,9 @@
<td style="direction:ltr;font-size:0px;padding:0 0 24px 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -452,9 +452,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>

View File

@@ -103,9 +103,9 @@
<td style="direction:ltr;font-size:0px;padding:0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -129,9 +129,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -143,7 +143,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -157,9 +157,9 @@
<td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -201,9 +201,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -215,7 +215,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -229,9 +229,9 @@
<td style="direction:ltr;font-size:0px;padding:24px 0 0 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:425px;"
>
@@ -247,9 +247,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -261,7 +261,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -275,9 +275,9 @@
<td style="direction:ltr;font-size:0px;padding:0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -291,7 +291,7 @@
align="center" border="0" cellpadding="0" cellspacing="0" role="presentation"
>
<tr>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -311,7 +311,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -331,7 +331,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -351,7 +351,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -360,7 +360,7 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://instagram.com/penpotapp/" target="_blank">
<a href="https://www.instagram.com/penpot.app/" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-instagram.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
@@ -371,7 +371,7 @@
</table>
<!--[if mso | IE]>
</td>
<td>
<![endif]-->
<table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
@@ -380,7 +380,7 @@
<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:24px;">
<tr>
<td style="font-size:0;height:24px;vertical-align:middle;width:24px;">
<a href="https://tree.taiga.io/project/uxbox" target="_blank">
<a href="https://tree.taiga.io/project/penpot" target="_blank">
<img height="24" src="{{ public-uri }}/images/email/logo-taiga.png" style="border-radius:3px;display:block;" width="24" />
</a>
</td>
@@ -391,7 +391,7 @@
</table>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
@@ -401,9 +401,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>
@@ -415,7 +415,7 @@
</td>
</tr>
</table>
<table
align="center" border="0" cellpadding="0" cellspacing="0" class="" style="width:600px;" width="600"
>
@@ -429,9 +429,9 @@
<td style="direction:ltr;font-size:0px;padding:0 0 24px 0;text-align:center;">
<!--[if mso | IE]>
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
<tr>
<td
class="" style="vertical-align:top;width:600px;"
>
@@ -447,9 +447,9 @@
</div>
<!--[if mso | IE]>
</td>
</tr>
</table>
<![endif]-->
</td>

View File

@@ -0,0 +1,30 @@
[{:id "material-design-3"
:name "Material Design 3"
:file-uri "https://github.com/penpot/penpot-files/raw/main/Material%20Design%203.penpot"}
{:id "tutorial-for-beginners"
:name "Tutorial for beginners"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/tutorial-for-beginners.penpot"}
{:id "penpot-design-system"
:name "Penpot Design System"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Penpot-Design-system.penpot"}
{:id "flex-layout-playground"
:name "Flex Layout Playground"
:file-uri "https://github.com/penpot/penpot-files/raw/main/Flex%20Layout%20Playground.penpot"}
{:id "wireframing-kit"
:name "Wireframing Kit"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/wireframing-kit.penpot"}
{:id "ant-design"
:name "Ant Design UI Kit (lite)"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Ant-Design-UI-Kit-Lite.penpot"}
{:id "cocomaterial"
:name "Cocomaterial"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Cocomaterial.penpot"}
{:id "circum-icons"
:name "Circum Icons pack"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/CircumIcons.penpot"}
{:id "coreui"
:name "CoreUI"
:file-uri "https://github.com/penpot/penpot-files/raw/main/CoreUI%20DesignSystem%20(DEMO).penpot"}
{:id "whiteboarding-kit"
:name "Whiteboarding Kit"
:file-uri "https://github.com/penpot/penpot-files/raw/binary-files/Whiteboarding-mapping-kit.penpot"}]

View File

@@ -0,0 +1,115 @@
<li class="rpc-item">
<div class="rpc-row-info">
<div class="module">{{item.module}}:</div>
<div class="name">{{item.name}}</div>
<div class="tags">
{% if item.deprecated %}
<span class="tag">
<span>DEPRECATED</span>
</span>
{% endif %}
{% if item.auth %}
<span class="tag">
<span>AUTH</span>
</span>
{% endif %}
{% if item.webhook %}
<span class="tag">
<span>WEBHOOK</span>
</span>
{% endif %}
{% if item.params-schema-js %}
<span class="tag">
<span>SCHEMA</span>
</span>
{% endif %}
</div>
</div>
<div class="rpc-row-detail hidden">
<h4>DOCSTRING:</h4>
<section class="padded-section">
{% if item.added %}
<p class="small"><strong>Added:</strong> on v{{item.added}}</p>
{% endif %}
{% if item.deprecated %}
<p class="small"><strong>Deprecated:</strong> since v{{item.deprecated}}</p>
{% endif %}
{% if item.entrypoint %}
<p class="small"><strong>URI:</strong> <a href="{{item.entrypoint}}">{{item.entrypoint}}</a></p>
{% endif %}
{% if item.docs %}
<p class="docstring"> {{item.docs}}</p>
{% endif %}
</section>
{% if item.changes %}
<h4>CHANGES:</h4>
<section class="padded-section">
<ul class="changes">
{% for change in item.changes %}
<li><strong>{{change.0}}</strong> - {{change.1}}</li>
{% endfor %}
</ul>
</section>
{% endif %}
{% if item.spec %}
<h4>PARAMS (SPEC):</h4>
<section class="padded-section">
<pre class="spec-explain">{{item.spec}}</pre>
</section>
{% endif %}
{% if param-style = "js" %}
{% if item.params-schema-js %}
<h4>PARAMS:</h4>
<section class="padded-section">
<pre class="params-schema">{{item.params-schema-js}}</pre>
</section>
{% endif %}
{% if item.result-schema-js %}
<h4>RESPONSE:</h4>
<section class="padded-section">
<pre class="result">{{item.result-schema-js}}</pre>
</section>
{% endif %}
{% if item.webhook-schema-js %}
<h4>WEBHOOK PAYLOAD:</h4>
<section class="padded-section">
<pre class="webhook">{{item.webhook-schema-js}}</pre>
</section>
{% endif %}
{% else %}
{% if item.params-schema-clj %}
<h4>PARAMS:</h4>
<section class="padded-section">
<pre class="params-schema">{{item.params-schema-clj}}</pre>
</section>
{% endif %}
{% if item.result-schema-clj %}
<h4>RESPONSE:</h4>
<section class="padded-section">
<pre class="result">{{item.result-schema-clj}}</pre>
</section>
{% endif %}
{% if item.webhook-schema-clj %}
<h4>WEBHOOK PAYLOAD:</h4>
<section class="padded-section">
<pre class="webhook">{{item.webhook-schema-clj}}</pre>
</section>
{% endif %}
{% endif %}
</div>
</li>

View File

@@ -27,12 +27,78 @@ main {
header {
border-bottom: 1px solid #c0c0c0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 100%;
}
.rpc-doc-content {
header .menu {
display: flex;
align-items: center;
margin-top: 5px;
margin-bottom: 10px;
}
header .menu nav {
list-style: none;
padding: 0px;
margin: 0px;
display: flex;
width: 45px;
justify-content: space-between;
}
header .menu nav > a {
list-style: none;
padding: 0px;
margin: 0px;
cursor: pointer;
}
header .menu nav > a.selected {
font-weight: 600;
}
b {
font-weight: 500;
}
h2 {
margin-top: 30px;
}
h3 {
font-weight: 400;
font-size: 11px;
margin-top: 20px;
text-decoration: underline;
}
h4 {
font-weight: 300;
font-size: 11px;
}
.doc-content {
margin-top: 20px;
width: 100%;
display: flex;
flex-direction: column;
/* border: 1px solid red; */
padding: 5px;
}
.doc-content p {
line-height: 22px;
margin-bottom: 0px;
}
.doc-content h3 {
margin-bottom: 0px;
}
.rpc-doc-content {
width: 100%;
display: flex;
flex-direction: column;
@@ -65,7 +131,7 @@ header {
.rpc-row-info {
cursor: pointer;
display: flex;
background-color: #eeeeee;
background-color: #e5e5e5;
padding: 5px 10px;
}
@@ -108,6 +174,8 @@ header {
.rpc-row-detail {
padding: 5px 10px;
padding-bottom: 20px;
border-left: 2px solid #e5e5e5;
border-right: 2px solid #e5e5e5;
}
.rpc-row-detail p {
@@ -143,3 +211,7 @@ header {
p.small strong {
font-size: 10px;
}
p.small a {
font-size: 10px;
}

View File

@@ -0,0 +1,94 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="robots" content="noindex,nofollow">
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<title>Builtin API Documentation - Penpot</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@200;300;400;500;700&display=swap" rel="stylesheet">
<style>
{% include "app/templates/api-doc.css" %}
</style>
<script>
{% include "app/templates/api-doc.js" %}
</script>
</head>
<body>
<main>
<header>
<h1>Penpot API Documentation (v{{version}})</h1>
<small class="menu">
[
<nav>
<a href="?type=js" {% if param-style = "js" %}class="selected"{% endif %}>JS</a>
<a href="?type=clj" {% if param-style = "cljs" %}class="selected"{% endif %}>CLJ</a>
</nav>
]
</small>
</header>
<section class="doc-content">
<h2>INTRODUCTION</h2>
<p>This documentation is intended to be a general overview of the penpot RPC API.
If you prefer, you can use <a href="/api/openapi.json">OpenAPI</a>
and/or <a href="/api/openapi">SwaggerUI</a> as alternative.</p>
<h2>GENERAL NOTES</h2>
<h3>Authentication</h3>
<p>The penpot backend right now offers two way for authenticate the request:
<b>cookies</b> (the same mechanism that we use ourselves on accessing the API from the
web application) and <b>access tokens</b>.</p>
<p>The cookie can be obtained using the <b>`login-with-password`</b> rpc method,
on successful login it sets the <b>`auth-token`</b> cookie with the session
token.</p>
<p>The access token can be obtained on the appropriate section on profile settings
and it should be provided using <b>`Authorization`</b> header with <b>`Token
&lt;token-string&gt;`</b> value.</p>
<h3>Content Negotiation</h3>
<p>The penpot API by default operates indistinctly with: <b>`application/json`</b>
and <b>`application/transit+json`</b> content types. You should specify the
desired content-type on the <b>`Accept`</b> header, the transit encoding is used
by default.</p>
<h3>Limits</h3>
<p>The rate limit work per user basis (this means that different api keys share
the same rate limit). For now the limits are not documented because we are
studying and analyzing the data. As a general rule, it should not be abused, if an
abusive use is detected, we will proceed to block the user's access to the
API.</p>
<h3>Webhooks</h3>
<p>All methods that emit webhook events are marked with flag <b>WEBHOOK</b>, the
data structure defined on each method represents the <i>payload</i> of the
event.</p>
<p>The webhook event structure has this aspect:</p>
<br/>
<pre>
{
"id": "db601c95-045f-808b-8002-362f08fcb621",
"name": "rename-file",
"props": &lt;payload&gt;,
"profileId": "db601c95-045f-808b-8002-361312e63531"
}
</pre>
</section>
<section class="rpc-doc-content">
<h2>RPC METHODS REFERENCE:</h2>
<ul class="rpc-items">
{% for item in methods %}
{% include "app/templates/api-doc-entry.tmpl" with item=item %}
{% endfor %}
</ul>
</section>
</main>
</body>
</html>

View File

@@ -7,7 +7,7 @@
<title>{% block title %}{% endblock %}</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=JetBrains+Mono">
<style>
{% include "templates/styles.css" %}
{% include "app/templates/styles.css" %}
</style>
</head>
<body>

View File

@@ -1,4 +1,4 @@
{% extends "templates/base.tmpl" %}
{% extends "app/templates/base.tmpl" %}
{% block title %}
Debug Main Page
@@ -77,7 +77,7 @@ Debug Main Page
<legend>Import binfile:</legend>
<desc>Import penpot file in binary
format. If <strong>overwrite</strong> is checked, all files will
be overwriten using the same ids found in the file instead of
be overwritten using the same ids found in the file instead of
generating a new ones.</desc>
<form method="post" enctype="multipart/form-data" action="/dbg/file/import">
@@ -90,7 +90,7 @@ Debug Main Page
<input type="checkbox" name="overwrite" />
<br />
<small>
Instead of creating a new file with all relations remaped,
Instead of creating a new file with all relations remapped,
reuses all ids and updates/overwrites the objects that are
already exists on the database.
<strong>Warning, this operation should be used with caution.</strong>
@@ -111,7 +111,7 @@ Debug Main Page
<input type="checkbox" name="ignore-index-errors" checked/>
<br />
<small>
Do not break on index lookup erros (remap operation).
Do not break on index lookup errors (remap operation).
Useful when importing a broken file that has broken
relations or missing pieces.
</small>

View File

@@ -0,0 +1,25 @@
{% extends "app/templates/base.tmpl" %}
{% block title %}
penpot - error list
{% endblock %}
{% block content %}
<nav>
<div class="title">
<h1>Error reports (last 200)</h1>
</div>
</nav>
<main class="horizontal-list">
<ul>
{% for item in items %}
<li>
<a class="date" href="/dbg/error/{{item.id}}">{{item.created-at}}</a>
<a class="hint" href="/dbg/error/{{item.id}}">
<span class="title">{{item.hint|abbreviate:150}}</span>
</a>
</li>
{% endfor %}
</ul>
</main>
{% endblock %}

View File

@@ -1,4 +1,4 @@
{% extends "templates/base.tmpl" %}
{% extends "app/templates/base.tmpl" %}
{% block title %}
penpot - error report {{id}}

View File

@@ -0,0 +1,112 @@
{% extends "app/templates/base.tmpl" %}
{% block title %}
penpot - error report v2 {{id}}
{% endblock %}
{% block content %}
<nav>
<div>[<a href="/dbg/error">⮜</a>]</div>
<div>[<a href="#message">message</a>]</div>
<div>[<a href="#props">props</a>]</div>
<div>[<a href="#context">context</a>]</div>
{% if params %}
<div>[<a href="#params">request params</a>]</div>
{% endif %}
{% if data %}
<div>[<a href="#edata">error data</a>]</div>
{% endif %}
{% if spec-explain %}
<div>[<a href="#spec-explain">spec explain</a>]</div>
{% endif %}
{% if spec-problems %}
<div>[<a href="#spec-problems">spec problems</a>]</div>
{% endif %}
{% if spec-value %}
<div>[<a href="#spec-value">spec value</a>]</div>
{% endif %}
{% if trace %}
<div>[<a href="#trace">error trace</a>]</div>
{% endif %}
</nav>
<main>
<div class="table">
<div class="table-row multiline">
<div id="message" class="table-key">MESSAGE: </div>
<div class="table-val">
<h1>{{hint}}</h1>
</div>
</div>
<div class="table-row multiline">
<div id="props" class="table-key">LOG PROPS: </div>
<div class="table-val">
<pre>{{props}}</pre>
</div>
</div>
<div class="table-row multiline">
<div id="context" class="table-key">CONTEXT: </div>
<div class="table-val">
<pre>{{context}}</pre>
</div>
</div>
{% if params %}
<div class="table-row multiline">
<div id="params" class="table-key">REQUEST PARAMS: </div>
<div class="table-val">
<pre>{{params}}</pre>
</div>
</div>
{% endif %}
{% if data %}
<div class="table-row multiline">
<div id="edata" class="table-key">ERROR DATA: </div>
<div class="table-val">
<pre>{{data}}</pre>
</div>
</div>
{% endif %}
{% if spec-explain %}
<div class="table-row multiline">
<div id="spec-explain" class="table-key">SPEC EXPLAIN: </div>
<div class="table-val">
<pre>{{spec-explain}}</pre>
</div>
</div>
{% endif %}
{% if spec-problems %}
<div class="table-row multiline">
<div id="spec-problems" class="table-key">SPEC PROBLEMS: </div>
<div class="table-val">
<pre>{{spec-problems}}</pre>
</div>
</div>
{% endif %}
{% if spec-value %}
<div class="table-row multiline">
<div id="spec-value" class="table-key">SPEC VALUE: </div>
<div class="table-val">
<pre>{{spec-value}}</pre>
</div>
</div>
{% endif %}
{% if trace %}
<div class="table-row multiline">
<div id="trace" class="table-key">TRACE:</div>
<div class="table-val">
<pre>{{trace}}</pre>
</div>
</div>
{% endif %}
</div>
</main>
{% endblock %}

View File

@@ -0,0 +1,101 @@
{% extends "app/templates/base.tmpl" %}
{% block title %}
Report: {{hint|abbreviate:150}} - {{id}} - Penpot Error Report (v3)
{% endblock %}
{% block content %}
<nav>
<div>[<a href="/dbg/error">⮜</a>]</div>
<div>[<a href="#head">head</a>]</div>
<div>[<a href="#props">props</a>]</div>
<div>[<a href="#context">context</a>]</div>
{% if params %}
<div>[<a href="#params">params</a>]</div>
{% endif %}
{% if data %}
<div>[<a href="#edata">data</a>]</div>
{% endif %}
{% if explain %}
<div>[<a href="#explain">explain</a>]</div>
{% endif %}
{% if value %}
<div>[<a href="#value">value</a>]</div>
{% endif %}
{% if trace %}
<div>[<a href="#trace">trace</a>]</div>
{% endif %}
</nav>
<main>
<div class="table">
<div class="table-row multiline">
<div id="head" class="table-key">HEAD</div>
<div class="table-val">
<h1><span class="not-important">Hint:</span> <br/> {{hint}}</h1>
<h2><span class="not-important">Reported at:</span> <br/> {{created-at}}</h2>
<h2><span class="not-important">Report ID:</span> <br/> {{id}}</h2>
</div>
</div>
<div class="table-row multiline">
<div id="props" class="table-key">LOG PROPS: </div>
<div class="table-val">
<pre>{{props}}</pre>
</div>
</div>
<div class="table-row multiline">
<div id="context" class="table-key">CONTEXT: </div>
<div class="table-val">
<pre>{{context}}</pre>
</div>
</div>
{% if params %}
<div class="table-row multiline">
<div id="params" class="table-key">PARAMS: </div>
<div class="table-val">
<pre>{{params}}</pre>
</div>
</div>
{% endif %}
{% if data %}
<div class="table-row multiline">
<div id="edata" class="table-key">DATA: </div>
<div class="table-val">
<pre>{{data}}</pre>
</div>
</div>
{% endif %}
{% if value %}
<div class="table-row multiline">
<div id="value" class="table-key">VALUE: </div>
<div class="table-val">
<pre>{{value}}</pre>
</div>
</div>
{% endif %}
{% if explain %}
<div class="table-row multiline">
<div id="explain" class="table-key">EXPLAIN: </div>
<div class="table-val">
<pre>{{explain}}</pre>
</div>
</div>
{% endif %}
{% if trace %}
<div class="table-row multiline">
<div id="trace" class="table-key">TRACE:</div>
<div class="table-val">
<pre>{{trace}}</pre>
</div>
</div>
{% endif %}
</div>
</main>
{% endblock %}

View File

@@ -0,0 +1,28 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta
name="description"
content="SwaggerUI"
/>
<title>PENPOT Swagger UI</title>
<style>{{swagger-css|safe}}</style>
</head>
<body>
<div id="swagger-ui"></div>
<script>{{swagger-js|safe}}</script>
<script>
window.onload = () => {
window.ui = SwaggerUIBundle({
url: '{{public-uri}}/api/openapi.json',
dom_id: '#swagger-ui',
presets: [
SwaggerUIBundle.presets.apis,
],
});
};
</script>
</body>
</html>

View File

@@ -23,6 +23,10 @@ input[type=text], input[type=submit] {
padding: 3px;
}
pre {
white-space: pre-wrap;
}
main {
margin: 20px;
}
@@ -32,6 +36,11 @@ small {
color: #888;
}
.not-important {
color: #888;
font-weight: 200;
}
small > strong {
font-size: 9px;
}
@@ -46,7 +55,13 @@ nav {
background: #e3e3e3;
}
nav > h1 {
nav > .title {
display: flex;
justify-content: center;
width: 100%;
}
nav > .title > h1 {
padding: 0px;
margin: 0px;
font-size: 11px;
@@ -137,8 +152,6 @@ nav > div:not(:last-child) {
margin: 0px;
padding: 0px;
flex-direction: column;
flex-wrap: wrap;
height: calc(100vh - 75px);
justify-content: flex-start;
}
@@ -149,21 +162,32 @@ nav > div:not(:last-child) {
line-height: 18px;
min-width: 210px;
margin: 0px 20px;
cursor: pointer;
display: flex;
justify-content: center;
border-radius: 3px;
}
.horizontal-list li:hover {
background-color: #e9e9e9;
}
.horizontal-list li > *:not(:last-child) {
margin-right: 10px;
}
.horizontal-list li > a {
text-decoration: none;
color: inherit;
}
.horizontal-list li > .date {
font-weight: 200;
color: #686868;
min-width: 210px;
}
form .row {
padding: 5px 0;
}

View File

@@ -0,0 +1,14 @@
;; Example climit.edn file
;; Required: permits
;; Optional: queue, ommited means Integer/MAX_VALUE
;; Optional: timeout, ommited means no timeout
;; Note: queue and timeout are excluding
{:update-file-by-id {:permits 1 :queue 3}
:update-file {:permits 20}
:derive-password {:permits 8}
:process-font {:permits 4 :queue 32}
:process-image {:permits 8 :queue 32}
:submit-audit-events-by-profile
{:permits 1 :queue 3}}

View File

@@ -1,66 +0,0 @@
<mjml>
<mj-head>
<mj-font name="Source Sans Pro" href="https://fonts.googleapis.com/css?family=Source%20Sans%20Pro" />
<mj-attributes>
<mj-text font-family="Source Sans Pro, sans-serif" font-size="16px" color="#000000" line-height="150%" />
<mj-button background-color="#31EFB8" color="#1F1F1F" font-family="Source Sans Pro, sans-serif" font-size="16px" />
</mj-attributes>
</mj-head>
<mj-body background-color="#E5E5E5">
<mj-section padding="0">
<mj-column>
<mj-image src="{{ public-uri }}/images/email/uxbox-title.png"
width="97px" height="32px" align="left" padding="16px" />
</mj-column>
</mj-section>
<mj-section background-color="#FFFFFF">
<mj-column>
<mj-text font-size="24px" font-weight="600">Hello {{name}}!</mj-text>
<mj-text>We received a request to change your current email to {{ pending-email }}.</mj-text>
<mj-text>Click to the link below to confirm the change:</mj-text>
<mj-button href="{{ public-uri }}/#/auth/verify-token?token={{token}}">
Confirm email change
</mj-button>
<mj-text>
If you received this email by mistake, please consider changing your password
for security reasons.
</mj-text>
<mj-text>Enjoy!</mj-text>
<mj-text>The Penpot team.</mj-text>
</mj-column>
</mj-section>
<mj-section padding="24px 0 0 0">
<mj-column width="425px">
<mj-text align="center" font-size="14px" color="#64666A">
Penpot is the first Open Source design and prototyping platform meant for cross-domain teams.
</mj-text>
</mj-column>
</mj-section>
<mj-section padding="0">
<mj-column>
<mj-social icon-size="24px" mode="horizontal">
<mj-social-element src="{{ public-uri }}/images/email/logo-uxbox.png" href="https://penpot.app/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-twitter.png" href="https://twitter.com/penpotapp" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-github.png" href="https://github.com/penpot/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-instagram.png" href="https://instagram.com/penpotapp/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-taiga.png" href="https://tree.taiga.io/project/uxbox" padding="0 8px" />
</mj-social>
</mj-column>
</mj-section>
<mj-section padding="0 0 24px 0">
<mj-column>
<mj-text align="center" font-size="14px" color="#64666A" line-height="150%">
Penpot © 2020 | Made with &lt;3 and Open Source
</mj-text>
</mj-column>
</mj-section>
</mg-body>
</mjml>

View File

@@ -1,59 +0,0 @@
<mjml>
<mj-head>
<mj-font name="Source Sans Pro" href="https://fonts.googleapis.com/css?family=Source%20Sans%20Pro" />
<mj-attributes>
<mj-text font-family="Source Sans Pro, sans-serif" font-size="16px" color="#000000" line-height="150%" />
<mj-button background-color="#31EFB8" color="#1F1F1F" font-family="Source Sans Pro, sans-serif" font-size="16px" />
</mj-attributes>
</mj-head>
<mj-body background-color="#E5E5E5">
<mj-section padding="0">
<mj-column>
<mj-image src="{{ public-uri }}/images/email/uxbox-title.png"
width="97px" height="32px" align="left" padding="16px" />
</mj-column>
</mj-section>
<mj-section background-color="#FFFFFF">
<mj-column>
<mj-text font-size="24px" font-weight="600">Hello!</mj-text>
<mj-text>
{{invited-by}} has invited you to join the team “{{ team }}”.
</mj-text>
<mj-button href="{{ public-uri }}/#/auth/verify-token?token={{token}}">
Accept invite
</mj-button>
<mj-text>Enjoy!</mj-text>
<mj-text>The Penpot team.</mj-text>
</mj-column>
</mj-section>
<mj-section padding="24px 0 0 0">
<mj-column width="425px">
<mj-text align="center" font-size="14px" color="#64666A">
Penpot is the first Open Source design and prototyping platform meant for cross-domain teams.
</mj-text>
</mj-column>
</mj-section>
<mj-section padding="0">
<mj-column>
<mj-social icon-size="24px" mode="horizontal">
<mj-social-element src="{{ public-uri }}/images/email/logo-uxbox.png" href="https://penpot.app/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-twitter.png" href="https://twitter.com/penpotapp" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-github.png" href="https://github.com/penpot/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-instagram.png" href="https://instagram.com/penpotapp/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-taiga.png" href="https://tree.taiga.io/project/uxbox" padding="0 8px" />
</mj-social>
</mj-column>
</mj-section>
<mj-section padding="0 0 24px 0">
<mj-column>
<mj-text align="center" font-size="14px" color="#64666A" line-height="150%">
Penpot © 2020 | Made with &lt;3 and Open Source
</mj-text>
</mj-column>
</mj-section>
</mg-body>
</mjml>

View File

@@ -1,68 +0,0 @@
<mjml>
<mj-head>
<mj-font name="Source Sans Pro" href="https://fonts.googleapis.com/css?family=Source%20Sans%20Pro" />
<mj-attributes>
<mj-text font-family="Source Sans Pro, sans-serif" font-size="16px" color="#000000" line-height="150%" />
<mj-button background-color="#31EFB8" color="#1F1F1F" font-family="Source Sans Pro, sans-serif" font-size="16px" />
</mj-attributes>
</mj-head>
<mj-body background-color="#E5E5E5">
<mj-section padding="0">
<mj-column>
<mj-image src="{{ public-uri }}/images/email/uxbox-title.png"
width="97px" height="32px" align="left" padding="16px" />
</mj-column>
</mj-section>
<mj-section background-color="#FFFFFF">
<mj-column>
<mj-text font-size="24px" font-weight="600">Hello {{name}}!</mj-text>
<mj-text>
We have received a request to reset your password. Click the link
below to choose a new one:
</mj-text>
<mj-button href="{{ public-uri }}/#/auth/recovery?token={{token}}">
Reset password
</mj-button>
<mj-text>
If you received this email by mistake, you can safely ignore
it. Your password won't be changed.
</mj-text>
<mj-text>Enjoy!</mj-text>
<mj-text>The Penpot team.</mj-text>
</mj-column>
</mj-section>
<mj-section padding="24px 0 0 0">
<mj-column width="425px">
<mj-text align="center" font-size="14px" color="#64666A">
Penpot is the first Open Source design and prototyping platform meant for cross-domain teams.
</mj-text>
</mj-column>
</mj-section>
<mj-section padding="0">
<mj-column>
<mj-social icon-size="24px" mode="horizontal">
<mj-social-element src="{{ public-uri }}/images/email/logo-uxbox.png" href="https://penpot.app/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-twitter.png" href="https://twitter.com/penpotapp" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-github.png" href="https://github.com/penpot/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-instagram.png" href="https://instagram.com/penpotapp/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-taiga.png" href="https://tree.taiga.io/project/uxbox" padding="0 8px" />
</mj-social>
</mj-column>
</mj-section>
<mj-section padding="0 0 24px 0">
<mj-column>
<mj-text align="center" font-size="14px" color="#64666A" line-height="150%">
Penpot © 2020 | Made with &lt;3 and Open Source
</mj-text>
</mj-column>
</mj-section>
</mg-body>
</mjml>

View File

@@ -1,65 +0,0 @@
<mjml>
<mj-head>
<mj-font name="Source Sans Pro" href="https://fonts.googleapis.com/css?family=Source%20Sans%20Pro" />
<mj-attributes>
<mj-text font-family="Source Sans Pro, sans-serif" font-size="16px" color="#000000" line-height="150%" />
<mj-button background-color="#31EFB8" color="#1F1F1F" font-family="Source Sans Pro, sans-serif" font-size="16px" />
</mj-attributes>
</mj-head>
<mj-body background-color="#E5E5E5">
<mj-section padding="0">
<mj-column>
<mj-image src="{{ public-uri }}/images/email/uxbox-title.png"
width="97px" height="32px" align="left" padding="16px" />
</mj-column>
</mj-section>
<mj-section background-color="#FFFFFF">
<mj-column>
<mj-text font-size="24px" font-weight="600">Hello {{name}}!</mj-text>
<mj-text>
Thanks for signing up for your Penpot account! Please verify your
email using the link below and get started building mockups and
prototypes today!
</mj-text>
<mj-button href="{{ public-uri }}/#/auth/verify-token?token={{token}}">
Verify email
</mj-button>
<mj-text>Enjoy!</mj-text>
<mj-text>The Penpot team.</mj-text>
</mj-column>
</mj-section>
<mj-section padding="24px 0 0 0">
<mj-column width="425px">
<mj-text align="center" font-size="14px" color="#64666A">
Penpot is the first Open Source design and prototyping platform meant for cross-domain teams.
</mj-text>
</mj-column>
</mj-section>
<mj-section padding="0">
<mj-column>
<mj-social icon-size="24px" mode="horizontal">
<mj-social-element src="{{ public-uri }}/images/email/logo-uxbox.png" href="https://penpot.app/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-twitter.png" href="https://twitter.com/penpotapp" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-github.png" href="https://github.com/penpot/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-instagram.png" href="https://instagram.com/penpotapp/" padding="0 8px" />
<mj-social-element src="{{ public-uri }}/images/email/logo-taiga.png" href="https://tree.taiga.io/project/uxbox" padding="0 8px" />
</mj-social>
</mj-column>
</mj-section>
<mj-section padding="0 0 24px 0">
<mj-column>
<mj-text align="center" font-size="14px" color="#64666A" line-height="150%">
Penpot © 2020 | Made with &lt;3 and Open Source
</mj-text>
</mj-column>
</mj-section>
</mg-body>
</mjml>

View File

@@ -2,21 +2,18 @@
<Configuration status="info" monitorInterval="30">
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss.SSS}] %level{length=1} %logger{36} - %msg%n"/>
<PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss.SSS}] %level{length=1} %logger{36} - %msg%n"
alwaysWriteExceptions="true" />
</Console>
<RollingFile name="main" fileName="logs/main.log" filePattern="logs/main-%i.log">
<PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss.SSS}] %level{length=1} %logger{36} - %msg%n"/>
<PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss.SSS}] %level{length=1} %logger{36} - %msg%n"
alwaysWriteExceptions="true" />
<Policies>
<SizeBasedTriggeringPolicy size="50M"/>
</Policies>
<DefaultRolloverStrategy max="9"/>
</RollingFile>
<JeroMQ name="zmq">
<Property name="endpoint">tcp://localhost:45556</Property>
<JsonLayout complete="false" compact="true" includeTimeMillis="true" stacktraceAsString="true" properties="true" />
</JeroMQ>
</Appenders>
<Loggers>
@@ -25,15 +22,15 @@
<Logger name="org.postgresql" level="error" />
<Logger name="app.rpc.commands.binfile" level="debug" />
<Logger name="app.storage.tmp" level="info" />
<Logger name="app.storage.tmp" level="debug" />
<Logger name="app.worker" level="info" />
<Logger name="app.msgbus" level="info" />
<Logger name="app.http.websocket" level="info" />
<Logger name="app.util.websocket" level="info" />
<Logger name="app.cli" level="debug" additivity="false">
<AppenderRef ref="console"/>
</Logger>
<Logger name="app.redis" level="info" />
<Logger name="app.rpc.rlimit" level="info" />
<Logger name="app.rpc.climit" level="info" />
<Logger name="app.rpc.mutations.files" level="info" />
<Logger name="app.loggers" level="debug" additivity="false">
<AppenderRef ref="main" level="debug" />
@@ -41,7 +38,6 @@
<Logger name="app" level="all" additivity="false">
<AppenderRef ref="main" level="trace" />
<AppenderRef ref="zmq" level="debug" />
</Logger>
<Logger name="user" level="trace" additivity="false">

View File

@@ -2,7 +2,8 @@
<Configuration status="info" monitorInterval="60">
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss.SSS}] %level{length=1} %logger{36} - %msg%n"/>
<PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss.SSS}] %level{length=1} %logger{36} - %msg%n"
alwaysWriteExceptions="false" />
</Console>
</Appenders>
@@ -11,6 +12,7 @@
<Logger name="com.zaxxer.hikari" level="error" />
<Logger name="org.postgresql" level="error" />
<Logger name="app.util" level="info" />
<Logger name="app" level="info" additivity="false">
<AppenderRef ref="console" />
</Logger>

View File

@@ -0,0 +1,11 @@
;; Example rlimit.edn file
^{:refresh "30s"}
{:default
[[:default :window "200000/h"]]
;; #{:command/get-teams}
;; [[:burst :bucket "5/5/5s"]]
;; #{:command/get-profile}
;; [[:burst :bucket "60/60/1m"]]
}

View File

@@ -1,18 +0,0 @@
{% extends "templates/base.tmpl" %}
{% block title %}
penpot - error list
{% endblock %}
{% block content %}
<nav>
<h1>Latest error reports:</h1>
</nav>
<main class="horizontal-list">
<ul>
{% for item in items %}
<li><a href="/dbg/error/{{item.id}}">{{item.created-at}}</a></li>
{% endfor %}
</ul>
</main>
{% endblock %}

View File

@@ -12,10 +12,14 @@ cp ../CHANGES.md target/classes/changelog.md;
clojure -T:build jar;
mv target/penpot.jar target/dist/penpot.jar
cp resources/log4j2.xml target/dist/log4j2.xml
cp scripts/run.template.sh target/dist/run.sh;
cp scripts/manage.template.sh target/dist/manage.sh;
cp scripts/manage.py target/dist/manage.py
chmod +x target/dist/run.sh;
chmod +x target/dist/manage.sh;
chmod +x target/dist/manage.py
# Prefetch templates
rm -rf builtin-templates;
mkdir builtin-templates;
bb ./scripts/prefetch-templates.clj resources/app/onboarding.edn builtin-templates/
cp -r builtin-templates target/dist/

4
backend/scripts/kill-repl.sh Executable file
View File

@@ -0,0 +1,4 @@
#!/usr/bin/env bash
set -x
jcmd |grep "rebel" |sed -nE 's/^([0-9]+).*$/\1/p' | xargs kill -9

219
backend/scripts/manage.py Executable file
View File

@@ -0,0 +1,219 @@
#!/usr/bin/env python3
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# Copyright (c) KALEIDOS INC
import argparse
import json
import socket
import sys
from tabulate import tabulate
from getpass import getpass
from urllib.parse import urlparse
PREPL_URI = "tcp://localhost:6063"
def get_prepl_conninfo():
uri_data = urlparse(PREPL_URI)
if uri_data.scheme != "tcp":
raise RuntimeError(f"invalid PREPL_URI: {PREPL_URI}")
if not isinstance(uri_data.netloc, str):
raise RuntimeError(f"invalid PREPL_URI: {PREPL_URI}")
host, port = uri_data.netloc.split(":", 2)
if port is None:
port = 6063
if isinstance(port, str):
port = int(port)
return host, port
def send_eval(expr):
host, port = get_prepl_conninfo()
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, port))
s.send(expr.encode("utf-8"))
s.send(b":repl/quit\n\n")
with s.makefile() as f:
result = json.load(f)
tag = result.get("tag", None)
if tag != "ret":
raise RuntimeError("unexpected response from PREPL")
return result.get("val", None), result.get("exception", None)
def encode(val):
return json.dumps(json.dumps(val))
def print_error(res):
for error in res["via"]:
print("ERR:", error["message"])
break
def run_cmd(params):
try:
expr = "(app.srepl.ext/run-json-cmd {})".format(encode(params))
res, failed = send_eval(expr)
if failed:
print_error(res)
sys.exit(-1)
return res
except Exception as cause:
print("EXC:", str(cause))
sys.exit(-2)
def create_profile(fullname, email, password):
params = {
"cmd": "create-profile",
"params": {
"fullname": fullname,
"email": email,
"password": password
}
}
res = run_cmd(params)
print(f"Created: {res['email']} / {res['id']}")
def update_profile(email, fullname, password, is_active):
params = {
"cmd": "update-profile",
"params": {
"email": email,
"fullname": fullname,
"password": password,
"is_active": is_active
}
}
res = run_cmd(params)
if res is True:
print(f"Updated")
else:
print(f"No profile found with email {email}")
def delete_profile(email, soft):
params = {
"cmd": "delete-profile",
"params": {
"email": email,
"soft": soft
}
}
res = run_cmd(params)
if res is True:
print(f"Deleted")
else:
print(f"No profile found with email {email}")
def search_profile(email):
params = {
"cmd": "search-profile",
"params": {
"email": email,
}
}
res = run_cmd(params)
if isinstance(res, list):
print(tabulate(res, headers="keys"))
def derive_password(password):
params = {
"cmd": "derive-password",
"params": {
"password": password,
}
}
res = run_cmd(params)
print(f"Derived password: \"{res}\"")
available_commands = (
"create-profile",
"update-profile",
"delete-profile",
"search-profile",
"derive-password",
)
parser = argparse.ArgumentParser(
description=(
"Penpot Command Line Interface (CLI)"
)
)
parser.add_argument("-V", "--version", action="version", version="Penpot CLI %%develop%%")
parser.add_argument("action", action="store", choices=available_commands)
parser.add_argument("-f", "--force", help="force operation", action="store_true")
parser.add_argument("-n", "--fullname", help="fullname", action="store")
parser.add_argument("-e", "--email", help="email", action="store")
parser.add_argument("-p", "--password", help="password", action="store")
parser.add_argument("-c", "--connect", help="connect to PREPL", action="store", default="tcp://localhost:6063")
args = parser.parse_args()
PREPL_URI = args.connect
if args.action == "create-profile":
email = args.email
password = args.password
fullname = args.fullname
if email is None:
email = input("Email: ")
if fullname is None:
fullname = input("Fullname: ")
if password is None:
password = getpass("Password: ")
create_profile(fullname, email, password)
elif args.action == "update-profile":
email = args.email
password = args.password
if email is None:
email = input("Email: ")
if password is None:
password = getpass("Password: ")
update_profile(email, None, password, None)
elif args.action == "derive-password":
password = args.password
if password is None:
password = getpass("Password: ")
derive_password(password)
elif args.action == "delete-profile":
email = args.email
soft = not args.force
if email is None:
email = input("Email: ")
delete_profile(email, soft)
elif args.action == "search-profile":
email = args.email
if email is None:
email = input("Email: ")
search_profile(email)

View File

@@ -1,19 +0,0 @@
#!/usr/bin/env bash
set +e
JAVA_CMD=$(type -p java)
set -e
if [[ ! -n "$JAVA_CMD" ]]; then
if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]]; then
JAVA_CMD="$JAVA_HOME/bin/java"
else
>&2 echo "Couldn't find 'java'. Please set JAVA_HOME."
exit 1
fi
fi
if [ -f ./environ ]; then
source ./environ
fi
exec $JAVA_CMD $JVM_OPTS -jar penpot.jar -m app.cli.manage "$@"

View File

@@ -0,0 +1,40 @@
#!/usr/bin/env bb
(require '[babashka.curl :as curl]
'[babashka.fs :as fs])
(defn download-if-needed!
[dest data]
(doseq [{:keys [id file-uri] :as item} data]
(let [file (fs/file dest id)
rsp (curl/get file-uri {:as :stream})]
(when (not= 200 (:status rsp))
(println (format "unable to download %s (uri: %s)" id file-uri))
(System/exit -1))
(when-not (fs/exists? (str file))
(println (format "=> downloading %s" id))
(with-open [output (io/output-stream file)]
(io/copy (:body rsp) output))))))
(defn read-defs-file
[path]
(with-open [content (io/reader path)]
(edn/read-string (slurp content))))
(let [[path dest] *command-line-args*]
(when (or (nil? path)
(nil? dest))
(println "invalid arguments")
(System/exit -1))
(when-not (fs/exists? path)
(println (format "file %s does not exists" path))
(System/exit -1))
(when-not (fs/exists? dest)
(fs/create-dirs dest))
(let [data (read-defs-file path)]
(download-if-needed! dest data)))

View File

@@ -2,7 +2,29 @@
export PENPOT_HOST=devenv
export PENPOT_TENANT=dev
export PENPOT_FLAGS="$PENPOT_FLAGS enable-backend-asserts enable-audit-log enable-transit-readable-response enable-demo-users disable-secure-session-cookies"
export PENPOT_FLAGS="\
$PENPOT_FLAGS \
enable-registration
enable-login-with-password
enable-login-with-oidc \
enable-login-with-google \
enable-login-with-github \
enable-login-with-gitlab \
enable-backend-asserts \
enable-fdata-storage-pointer-map \
enable-fdata-storage-objets-map \
enable-audit-log \
enable-transit-readable-response \
enable-demo-users \
disable-secure-session-cookies \
enable-smtp \
enable-prepl-server \
enable-urepl-server \
enable-rpc-climit \
enable-rpc-rlimit \
enable-soft-rpc-rlimit \
enable-webhooks \
enable-access-tokens";
# export PENPOT_DATABASE_URI="postgresql://172.17.0.1:5432/penpot"
# export PENPOT_DATABASE_USERNAME="penpot"
@@ -28,18 +50,39 @@ export PENPOT_ASSETS_STORAGE_BACKEND=assets-s3
export PENPOT_STORAGE_ASSETS_S3_ENDPOINT=http://minio:9000
export PENPOT_STORAGE_ASSETS_S3_BUCKET=penpot
export OPTIONS="
-A:dev:jmx-remote \
-J-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager \
-J-Dlog4j2.configurationFile=log4j2-devenv.xml \
-J-XX:+UseG1GC \
-J-XX:-OmitStackTraceInFastThrow \
-J-Xms50m -J-Xmx1024m \
-J-Djdk.attach.allowAttachSelf \
-J-XX:+UnlockDiagnosticVMOptions \
-J-XX:+DebugNonSafepoints";
#-J-Djdk.virtualThreadScheduler.parallelism=16
# Uncomment for use the ImageMagick v7.x
export OPTIONS="
-A:jmx-remote -A:dev \
-J-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager \
-J-Djdk.attach.allowAttachSelf \
-J-Dlog4j2.configurationFile=log4j2-devenv.xml \
-J-XX:-OmitStackTraceInFastThrow \
-J-XX:+UnlockDiagnosticVMOptions \
-J-XX:+DebugNonSafepoints \
-J-Djdk.tracePinnedThreads=full \
-J--enable-preview";
# Setup HEAP
export OPTIONS="$OPTIONS -J-Xms50m -J-Xmx1024m"
# export OPTIONS="$OPTIONS -J-Xms1100m -J-Xmx1100m -J-XX:+AlwaysPreTouch"
# Increase virtual thread pool size
# export OPTIONS="$OPTIONS -J-Djdk.virtualThreadScheduler.parallelism=16"
# Disable C2 Compiler
# export OPTIONS="$OPTIONS -J-XX:TieredStopAtLevel=1"
# Disable all compilers
# export OPTIONS="$OPTIONS -J-Xint"
# Setup GC
export OPTIONS="$OPTIONS -J-XX:+UseG1GC"
# Setup GC
# export OPTIONS="$OPTIONS -J-XX:+UseZGC"
# Enable ImageMagick v7.x support
# export OPTIONS="-J-Dim4java.useV7=true $OPTIONS";
export OPTIONS_EVAL="nil"

View File

@@ -1,20 +1,24 @@
#!/usr/bin/env bash
set +e
JAVA_CMD=$(type -p java)
set -e
if [[ ! -n "$JAVA_CMD" ]]; then
if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]]; then
JAVA_CMD="$JAVA_HOME/bin/java"
else
>&2 echo "Couldn't find 'java'. Please set JAVA_HOME."
exit 1
fi
if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]]; then
JAVA_CMD="$JAVA_HOME/bin/java"
else
set +e
JAVA_CMD=$(type -p java)
set -e
if [[ ! -n "$JAVA_CMD" ]]; then
>&2 echo "Couldn't find 'java'. Please set JAVA_HOME."
exit 1
fi
fi
fi
if [ -f ./environ ]; then
source ./environ
source ./environ
fi
export JVM_OPTS="-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager -Dlog4j2.configurationFile=log4j2.xml -XX:-OmitStackTraceInFastThrow --enable-preview $JVM_OPTS"
set -x
exec $JAVA_CMD $JVM_OPTS "$@" -jar penpot.jar -m app.main

View File

@@ -2,7 +2,20 @@
export PENPOT_HOST=devenv
export PENPOT_TENANT=dev
export PENPOT_FLAGS="$PENPOT_FLAGS enable-backend-asserts enable-audit-log enable-transit-readable-response enable-demo-users disable-secure-session-cookies"
export PENPOT_FLAGS="\
$PENPOT_FLAGS \
enable-prepl-server \
enable-urepl-server \
enable-webhooks \
enable-backend-asserts \
enable-audit-log \
enable-transit-readable-response \
enable-demo-users \
enable-fdata-storage-pointer-map \
enable-fdata-storage-objets-map \
disable-secure-session-cookies \
enable-smtp \
enable-access-tokens";
set -ex

44
backend/src/app/auth.clj Normal file
View File

@@ -0,0 +1,44 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.auth
(:require
[app.config :as cf]
[buddy.hashers :as hashers]
[cuerdas.core :as str]
[promesa.exec :as px]))
(def default-params
{:alg :argon2id
:memory (* 32768 2) ;; 64 MiB
:iterations 7
:parallelism (px/get-available-processors)})
(defn derive-password
[password]
(hashers/derive password default-params))
(defn verify-password
[attempt password]
(try
(hashers/verify attempt password)
(catch Throwable _
{:update false
:valid false})))
(defn email-domain-in-whitelist?
"Returns true if email's domain is in the given whitelist or if
given whitelist is an empty string."
([email]
(let [domains (cf/get :registration-domain-whitelist)]
(email-domain-in-whitelist? domains email)))
([domains email]
(if (or (nil? domains) (empty? domains))
true
(let [[_ candidate] (-> (str/lower email)
(str/split #"@" 2))]
(contains? domains candidate)))))

View File

@@ -2,7 +2,7 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.auth.ldap
(:require
@@ -41,15 +41,18 @@
(reduce-kv clojure.string/replace s replacements))
(defn- search-user
[{:keys [conn attrs base-dn] :as cfg} email]
(let [query (replace-several (:query cfg) ":username" email)
[{:keys [::conn base-dn] :as cfg} email]
(let [query (replace-several (:query cfg) ":username" email)
attrs [(:attrs-username cfg)
(:attrs-email cfg)
(:attrs-fullname cfg)]
params {:filter query
:sizelimit 1
:attributes attrs}]
(first (ldap/search conn base-dn params))))
(defn- retrieve-user
[{:keys [conn] :as cfg} {:keys [email password]}]
[{:keys [::conn] :as cfg} {:keys [email password]}]
(when-let [{:keys [dn] :as user} (search-user cfg email)]
(when (ldap/bind? conn dn password)
{:fullname (get user (-> cfg :attrs-fullname keyword))
@@ -66,7 +69,7 @@
(defn authenticate
[cfg params]
(with-open [conn (connect cfg)]
(when-let [user (-> (assoc cfg :conn conn)
(when-let [user (-> (assoc cfg ::conn conn)
(retrieve-user params))]
(when-not (s/valid? ::info-data user)
(let [explain (s/explain-str ::info-data user)]
@@ -100,17 +103,6 @@
:host (:host cfg) :port (:port cfg) :cause cause)
nil))))
(defn- prepare-attributes
[cfg]
(assoc cfg :attrs [(:attrs-username cfg)
(:attrs-email cfg)
(:attrs-fullname cfg)]))
(defmethod ig/init-key ::provider
[_ cfg]
(when (:enabled? cfg)
(some-> cfg try-connectivity prepare-attributes)))
(s/def ::enabled? ::us/boolean)
(s/def ::host ::cf/ldap-host)
(s/def ::port ::cf/ldap-port)
@@ -124,8 +116,7 @@
(s/def ::attrs-fullname ::cf/ldap-attrs-fullname)
(s/def ::attrs-username ::cf/ldap-attrs-username)
(defmethod ig/pre-init-spec ::provider
[_]
(s/def ::provider-params
(s/keys :opt-un [::host ::port
::ssl ::tls
::enabled?
@@ -135,3 +126,14 @@
::attrs-email
::attrs-username
::attrs-fullname]))
(s/def ::provider
(s/nilable ::provider-params))
(defmethod ig/pre-init-spec ::provider
[_]
(s/spec ::provider))
(defmethod ig/init-key ::provider
[_ cfg]
(when (:enabled? cfg)
(try-connectivity cfg)))

View File

@@ -2,11 +2,13 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.auth.oidc
"OIDC client implementation."
(:require
[app.auth :as auth]
[app.auth.oidc.providers :as-alias providers]
[app.common.data :as d]
[app.common.data.macros :as dm]
[app.common.exceptions :as ex]
@@ -15,19 +17,21 @@
[app.common.uri :as u]
[app.config :as cf]
[app.db :as db]
[app.http.middleware :as hmw]
[app.http.client :as http]
[app.http.session :as session]
[app.loggers.audit :as audit]
[app.rpc.queries.profile :as profile]
[app.main :as-alias main]
[app.rpc.commands.profile :as profile]
[app.tokens :as tokens]
[app.util.json :as json]
[app.util.time :as dt]
[app.worker :as wrk]
[buddy.sign.jwk :as jwk]
[buddy.sign.jwt :as jwt]
[clojure.set :as set]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig]
[promesa.core :as p]
[promesa.exec :as px]
[yetti.response :as yrs]))
[yetti.response :as-alias yrs]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HELPERS
@@ -45,41 +49,44 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- discover-oidc-config
[{:keys [http-client]} {:keys [base-uri] :as opts}]
(let [discovery-uri (u/join base-uri ".well-known/openid-configuration")
response (ex/try (http-client {:method :get :uri (str discovery-uri)} {:sync? true}))]
(cond
(ex/exception? response)
(do
(l/warn :hint "unable to discover oidc configuration"
:discover-uri (str discovery-uri)
:cause response)
nil)
[cfg {:keys [base-uri] :as opts}]
(let [uri (dm/str (u/join base-uri ".well-known/openid-configuration"))
rsp (http/req! cfg {:method :get :uri uri} {:sync? true})]
(if (= 200 (:status rsp))
(let [data (-> rsp :body json/decode)
token-uri (get data :token_endpoint)
auth-uri (get data :authorization_endpoint)
user-uri (get data :userinfo_endpoint)
jwks-uri (get data :jwks_uri)]
(= 200 (:status response))
(let [data (json/read (:body response))]
{:token-uri (get data :token_endpoint)
:auth-uri (get data :authorization_endpoint)
:user-uri (get data :userinfo_endpoint)})
(l/debug :hint "oidc uris discovered"
:token-uri token-uri
:auth-uri auth-uri
:user-uri user-uri
:jwks-uri jwks-uri)
:else
{:token-uri token-uri
:auth-uri auth-uri
:user-uri user-uri
:jwks-uri jwks-uri})
(do
(l/warn :hint "unable to discover OIDC configuration"
:uri (str discovery-uri)
:response-status-code (:status response))
:discover-uri uri
:http-status (:status rsp))
nil))))
(defn- prepare-oidc-opts
[cfg]
(let [opts {:base-uri (:base-uri cfg)
:client-id (:client-id cfg)
:client-secret (:client-secret cfg)
:token-uri (:token-uri cfg)
:auth-uri (:auth-uri cfg)
:user-uri (:user-uri cfg)
:scopes (:scopes cfg #{"openid" "profile" "email"})
:roles-attr (:roles-attr cfg)
:roles (:roles cfg)
(let [opts {:base-uri (cf/get :oidc-base-uri)
:client-id (cf/get :oidc-client-id)
:client-secret (cf/get :oidc-client-secret)
:token-uri (cf/get :oidc-token-uri)
:auth-uri (cf/get :oidc-auth-uri)
:user-uri (cf/get :oidc-user-uri)
:jwks-uri (cf/get :oidc-jwks-uri)
:scopes (cf/get :oidc-scopes #{"openid" "profile" "email"})
:roles-attr (cf/get :oidc-roles-attr)
:roles (cf/get :oidc-roles)
:name "oidc"}
opts (d/without-nils opts)]
@@ -91,64 +98,94 @@
(string? (:user-uri opts))
(string? (:auth-uri opts)))
opts
(some-> (discover-oidc-config cfg opts)
(merge opts {:discover? true}))))))
(try
(-> (discover-oidc-config cfg opts)
(merge opts {:discover? true}))
(catch Throwable cause
(l/warn :hint "unable to discover OIDC configuration"
:cause cause)))))))
(defmethod ig/prep-key ::generic-provider
[_ cfg]
(d/without-nils cfg))
(defn- process-oidc-jwks
[keys]
(reduce (fn [result {:keys [kid] :as kdata}]
(let [pkey (ex/try! (jwk/public-key kdata))]
(if (ex/exception? pkey)
(do
(l/warn :hint "unable to create public key"
:kid (:kid kdata)
:cause pkey)
result)
(assoc result kid pkey))))
{}
keys))
(defmethod ig/init-key ::generic-provider
(defn- fetch-oidc-jwks
[cfg {:keys [jwks-uri]}]
(when jwks-uri
(try
(let [{:keys [status body]} (http/req! cfg {:method :get :uri jwks-uri} {:sync? true})]
(if (= 200 status)
(-> body json/decode :keys process-oidc-jwks)
(do
(l/warn :hint "unable to retrieve JWKs (unexpected response status code)"
:http-status status
:http-body body)
nil)))
(catch Throwable cause
(l/warn :hint "unable to retrieve JWKs (unexpected exception)"
:cause cause)))))
(defmethod ig/pre-init-spec ::providers/generic [_]
(s/keys :req [::http/client]))
(defmethod ig/init-key ::providers/generic
[_ cfg]
(when (:enabled? cfg)
(when (contains? cf/flags :login-with-oidc)
(if-let [opts (prepare-oidc-opts cfg)]
(do
(let [jwks (fetch-oidc-jwks cfg opts)]
(l/info :hint "provider initialized"
:provider :oidc
:provider "oidc"
:method (if (:discover? opts) "discover" "manual")
:client-id (:client-id opts)
:client-secret (obfuscate-string (:client-secret opts))
:scopes (str/join "," (:scopes opts))
:auth-uri (:auth-uri opts)
:user-uri (:user-uri opts)
:token-uri (:token-uri opts)
:scopes (str/join "," (:scopes opts))
:auth-uri (:auth-uri opts)
:user-uri (:user-uri opts)
:token-uri (:token-uri opts)
:roles-attr (:roles-attr opts)
:roles (:roles opts))
opts)
:roles (:roles opts)
:keys (str/join "," (map str (keys jwks))))
(assoc opts :jwks jwks))
(do
(l/warn :hint "unable to initialize auth provider, missing configuration" :provider :oidc)
(l/warn :hint "unable to initialize auth provider, missing configuration" :provider "oidc")
nil))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; GOOGLE AUTH PROVIDER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defmethod ig/prep-key ::google-provider
[_ cfg]
(d/without-nils cfg))
(defmethod ig/init-key ::google-provider
[_ cfg]
(let [opts {:client-id (:client-id cfg)
:client-secret (:client-secret cfg)
(defmethod ig/init-key ::providers/google
[_ _]
(let [opts {:client-id (cf/get :google-client-id)
:client-secret (cf/get :google-client-secret)
:scopes #{"openid" "email" "profile"}
:auth-uri "https://accounts.google.com/o/oauth2/v2/auth"
:token-uri "https://oauth2.googleapis.com/token"
:user-uri "https://openidconnect.googleapis.com/v1/userinfo"
:name "google"}]
(when (:enabled? cfg)
(when (contains? cf/flags :login-with-google)
(if (and (string? (:client-id opts))
(string? (:client-secret opts)))
(do
(l/info :hint "provider initialized"
:provider :google
:provider "google"
:client-id (:client-id opts)
:client-secret (obfuscate-string (:client-secret opts)))
opts)
(do
(l/warn :hint "unable to initialize auth provider, missing configuration" :provider :google)
(l/warn :hint "unable to initialize auth provider, missing configuration" :provider "google")
nil)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -156,29 +193,31 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- retrieve-github-email
[{:keys [http-client]} tdata info]
(or (some-> info :email p/resolved)
(-> (http-client {:uri "https://api.github.com/user/emails"
:headers {"Authorization" (dm/str (:type tdata) " " (:token tdata))}
:timeout 6000
:method :get})
(p/then (fn [{:keys [status body] :as response}]
(when-not (s/int-in-range? 200 300 status)
(ex/raise :type :internal
:code :unable-to-retrieve-github-emails
:hint "unable to retrieve github emails"
:http-status status
:http-body body))
(->> response :body json/read (filter :primary) first :email))))))
[cfg tdata props]
(or (some-> props :github/email)
(let [params {:uri "https://api.github.com/user/emails"
:headers {"Authorization" (dm/str (:token/type tdata) " " (:token/access tdata))}
:timeout 6000
:method :get}
(defmethod ig/prep-key ::github-provider
[_ cfg]
(d/without-nils cfg))
{:keys [status body]} (http/req! cfg params {:sync? true})]
(defmethod ig/init-key ::github-provider
(when-not (s/int-in-range? 200 300 status)
(ex/raise :type :internal
:code :unable-to-retrieve-github-emails
:hint "unable to retrieve github emails"
:http-status status
:http-body body))
(->> body json/decode (filter :primary) first :email))))
(defmethod ig/pre-init-spec ::providers/github [_]
(s/keys :req [::http/client]))
(defmethod ig/init-key ::providers/github
[_ cfg]
(let [opts {:client-id (:client-id cfg)
:client-secret (:client-secret cfg)
(let [opts {:client-id (cf/get :github-client-id)
:client-secret (cf/get :github-client-secret)
:scopes #{"read:user" "user:email"}
:auth-uri "https://github.com/login/oauth/authorize"
:token-uri "https://github.com/login/oauth/access_token"
@@ -187,63 +226,64 @@
;; Additional hooks for provider specific way of
;; retrieve emails.
:get-email-fn (partial retrieve-github-email cfg)}]
:get-email-fn (partial retrieve-github-email cfg)}]
(when (:enabled? cfg)
(when (contains? cf/flags :login-with-github)
(if (and (string? (:client-id opts))
(string? (:client-secret opts)))
(do
(l/info :hint "provider initialized"
:provider :github
:provider "github"
:client-id (:client-id opts)
:client-secret (obfuscate-string (:client-secret opts)))
opts)
(do
(l/warn :hint "unable to initialize auth provider, missing configuration" :provider :github)
(l/warn :hint "unable to initialize auth provider, missing configuration" :provider "github")
nil)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; GITLAB AUTH PROVIDER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defmethod ig/prep-key ::gitlab-provider
[_ cfg]
(d/without-nils cfg))
(defmethod ig/init-key ::gitlab-provider
[_ cfg]
(let [base (:base-uri cfg "https://gitlab.com")
(defmethod ig/init-key ::providers/gitlab
[_ _]
(let [base (cf/get :gitlab-base-uri "https://gitlab.com")
opts {:base-uri base
:client-id (:client-id cfg)
:client-secret (:client-secret cfg)
:client-id (cf/get :gitlab-client-id)
:client-secret (cf/get :gitlab-client-secret)
:scopes #{"openid" "profile" "email"}
:auth-uri (str base "/oauth/authorize")
:token-uri (str base "/oauth/token")
:user-uri (str base "/oauth/userinfo")
:name "gitlab"}]
(when (:enabled? cfg)
(when (contains? cf/flags :login-with-gitlab)
(if (and (string? (:client-id opts))
(string? (:client-secret opts)))
(do
(l/info :hint "provider initialized"
:provider :gitlab
:provider "gitlab"
:base-uri base
:client-id (:client-id opts)
:client-secret (obfuscate-string (:client-secret opts)))
opts)
(do
(l/warn :hint "unable to initialize auth provider, missing configuration" :provider :gitlab)
(l/warn :hint "unable to initialize auth provider, missing configuration" :provider "gitlab")
nil)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HANDLERS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- parse-attr-path
[provider path]
(let [[fitem & items] (str/split path "__")]
(into [(keyword (:name provider) fitem)] (map keyword) items)))
(defn- build-redirect-uri
[{:keys [provider] :as cfg}]
(let [public (u/uri (:public-uri cfg))]
(let [public (u/uri (cf/get :public-uri))]
(str (assoc public :path (str "/api/auth/oauth/" (:name provider) "/callback")))))
(defn- build-auth-uri
@@ -265,8 +305,8 @@
{}
props))
(defn retrieve-access-token
[{:keys [provider http-client] :as cfg} code]
(defn fetch-access-token
[{:keys [provider] :as cfg} code]
(let [params {:client_id (:client-id provider)
:client_secret (:client-secret provider)
:code code
@@ -277,70 +317,91 @@
"accept" "application/json"}
:uri (:token-uri provider)
:body (u/map->query-string params)}]
(p/then
(http-client req)
(fn [{:keys [status body] :as res}]
(if (= status 200)
(let [data (json/read body)]
{:token (get data :access_token)
:type (get data :token_type)})
(ex/raise :type :internal
:code :unable-to-retrieve-token
:http-status status
:http-body body))))))
(defn- retrieve-user-info
[{:keys [provider http-client] :as cfg} tdata]
(letfn [(retrieve []
(http-client {:uri (:user-uri provider)
:headers {"Authorization" (str (:type tdata) " " (:token tdata))}
:timeout 6000
:method :get}))
(l/trace :hint "request access token"
:provider (:name provider)
:client-id (:client-id provider)
:client-secret (obfuscate-string (:client-secret provider))
:grant-type (:grant_type params)
:redirect-uri (:redirect_uri params))
(validate-response [response]
(when-not (s/int-in-range? 200 300 (:status response))
(ex/raise :type :internal
:code :unable-to-retrieve-user-info
:hint "unable to retrieve user info"
:http-status (:status response)
:http-body (:body response)))
response)
(let [{:keys [status body]} (http/req! cfg req {:sync? true})]
(l/trace :hint "access token response" :status status :body body)
(if (= status 200)
(let [data (json/decode body)]
{:token/access (get data :access_token)
:token/id (get data :id_token)
:token/type (get data :token_type)})
(get-email [info]
(ex/raise :type :internal
:code :unable-to-retrieve-token
:hint "unable to retrieve token"
:http-status status
:http-body body)))))
(defn- process-user-info
[provider tdata info]
(letfn [(get-email [props]
;; Allow providers hook into this for custom email
;; retrieval method.
(if-let [get-email-fn (:get-email-fn provider)]
(get-email-fn tdata info)
(let [attr-kw (cf/get :oidc-email-attr :email)]
(get info attr-kw))))
(get-email-fn tdata props)
(let [attr-kw (cf/get :oidc-email-attr "email")
attr-ph (parse-attr-path provider attr-kw)]
(get-in props attr-ph))))
(get-name [info]
(let [attr-kw (cf/get :oidc-name-attr :name)]
(get info attr-kw)))
(get-name [props]
(let [attr-kw (cf/get :oidc-name-attr "name")
attr-ph (parse-attr-path provider attr-kw)]
(get-in props attr-ph)))
]
(process-response [response]
(p/let [info (-> response :body json/read)
email (get-email info)]
{:backend (:name provider)
:email email
:fullname (or (get-name info) email)
:props (->> (dissoc info :name :email)
(qualify-props provider))}))
(let [props (qualify-props provider info)
email (get-email props)]
{:backend (:name provider)
:fullname (or (get-name props) email)
:email email
:props props})))
(validate-info [info]
(when-not (s/valid? ::info info)
(l/warn :hint "received incomplete profile info object (please set correct scopes)"
:info (pr-str info))
(ex/raise :type :internal
:code :incomplete-user-info
:hint "inconmplete user info"
:info info))
info)]
(defn- fetch-user-info
[{:keys [provider] :as cfg} tdata]
(l/trace :hint "fetch user info"
:uri (:user-uri provider)
:token (obfuscate-string (:token/access tdata)))
(-> (retrieve)
(p/then validate-response)
(p/then process-response)
(p/then validate-info))))
(let [params {:uri (:user-uri provider)
:headers {"Authorization" (str (:token/type tdata) " " (:token/access tdata))}
:timeout 6000
:method :get}
response (http/req! cfg params {:sync? true})]
(l/trace :hint "user info response"
:status (:status response)
:body (:body response))
(when-not (s/int-in-range? 200 300 (:status response))
(ex/raise :type :internal
:code :unable-to-retrieve-user-info
:hint "unable to retrieve user info"
:http-status (:status response)
:http-body (:body response)))
(-> response :body json/decode)))
(defn- get-user-info
[{:keys [provider]} tdata]
(try
(when (:token/id tdata)
(let [{:keys [kid alg] :as theader} (jwt/decode-header (:token/id tdata))]
(when-let [key (if (str/starts-with? (name alg) "hs")
(:client-secret provider)
(get-in provider [:jwks kid]))]
(let [claims (jwt/unsign (:token/id tdata) key {:alg alg})]
(dissoc claims :exp :iss :iat :sid :aud :sub)))))
(catch Throwable cause
(l/warn :hint "unable to get user info from JWT token (unexpected exception)"
:cause cause))))
(s/def ::backend ::us/not-empty-string)
(s/def ::email ::us/not-empty-string)
@@ -352,141 +413,168 @@
::fullname
::props]))
(defn retrieve-info
[{:keys [tokens provider] :as cfg} {:keys [params] :as request}]
(letfn [(validate-oidc [info]
;; If the provider is OIDC, we can proceed to check
;; roles if they are defined.
(when (and (= "oidc" (:name provider))
(seq (:roles provider)))
(let [provider-roles (into #{} (:roles provider))
profile-roles (let [attr (cf/get :oidc-roles-attr :roles)
roles (get info attr)]
(cond
(string? roles) (into #{} (str/words roles))
(vector? roles) (into #{} roles)
:else #{}))]
(defn get-info
[{:keys [provider ::main/props] :as cfg} {:keys [params] :as request}]
(when-let [error (get params :error)]
(ex/raise :type :internal
:code :error-on-retrieving-code
:error-id error
:error-desc (get params :error_description)))
;; check if profile has a configured set of roles
(when-not (set/subset? provider-roles profile-roles)
(ex/raise :type :internal
:code :unable-to-auth
:hint "not enough permissions"))))
info)
(let [state (get params :state)
code (get params :code)
state (tokens/verify props {:token state :iss :oauth})
tdata (fetch-access-token cfg code)
info (case (cf/get :oidc-user-info-source)
:token (get-user-info cfg tdata)
:userinfo (fetch-user-info cfg tdata)
(or (get-user-info cfg tdata)
(fetch-user-info cfg tdata)))
(post-process [state info]
(cond-> info
(some? (:invitation-token state))
(assoc :invitation-token (:invitation-token state))
info (process-user-info provider tdata info)]
;; If state token comes with props, merge them. The state token
;; props can contain pm_ and utm_ prefixed query params.
(map? (:props state))
(update :props merge (:props state))))]
(l/trace :hint "user info" :info info)
(when-let [error (get params :error)]
(when-not (s/valid? ::info info)
(l/warn :hint "received incomplete profile info object (please set correct scopes)" :info info)
(ex/raise :type :internal
:code :error-on-retrieving-code
:error-id error
:error-desc (get params :error_description)))
:code :incomplete-user-info
:hint "inconmplete user info"
:info info))
(let [state (get params :state)
code (get params :code)
state (tokens :verify {:token state :iss :oauth})]
(-> (p/resolved code)
(p/then #(retrieve-access-token cfg %))
(p/then #(retrieve-user-info cfg %))
(p/then' validate-oidc)
(p/then' (partial post-process state))))))
;; If the provider is OIDC, we can proceed to check
;; roles if they are defined.
(when (and (= "oidc" (:name provider))
(seq (:roles provider)))
(defn- retrieve-profile
[{:keys [pool executor] :as cfg} info]
(px/with-dispatch executor
(with-open [conn (db/open pool)]
(some->> (:email info)
(profile/retrieve-profile-data-by-email conn)
(profile/populate-additional-data conn)
(profile/decode-profile-row)))))
(let [expected-roles (into #{} (:roles provider))
current-roles (let [roles-kw (cf/get :oidc-roles-attr "roles")
roles-ph (parse-attr-path provider roles-kw)
roles (get-in (:props info) roles-ph)]
(cond
(string? roles) (into #{} (str/words roles))
(vector? roles) (into #{} roles)
:else #{}))]
;; check if profile has a configured set of roles
(when-not (set/subset? expected-roles current-roles)
(ex/raise :type :internal
:code :unable-to-auth
:hint "not enough permissions"))))
(cond-> info
(some? (:invitation-token state))
(assoc :invitation-token (:invitation-token state))
;; If state token comes with props, merge them. The state token
;; props can contain pm_ and utm_ prefixed query params.
(map? (:props state))
(update :props merge (:props state)))))
(defn- get-profile
[{:keys [::db/pool] :as cfg} info]
(dm/with-open [conn (db/open pool)]
(some->> (:email info)
(profile/get-profile-by-email conn))))
(defn- redirect-response
[uri]
(yrs/response :status 302 :headers {"location" (str uri)}))
{::yrs/status 302
::yrs/headers {"location" (str uri)}})
(defn- generate-error-redirect
[cfg error]
(let [uri (-> (u/uri (:public-uri cfg))
(assoc :path "/#/auth/login")
(assoc :query (u/map->query-string {:error "unable-to-auth" :hint (ex-message error)})))]
[_ cause]
(let [data (if (ex/error? cause) (ex-data cause) nil)
code (or (:code data) :unexpected)
type (or (:type data) :internal)
hint (or (:hint data)
(if (ex/exception? cause)
(ex-message cause)
(str cause)))
params {:error "unable-to-auth"
:hint hint
:type type
:code code}
uri (-> (u/uri (cf/get :public-uri))
(assoc :path "/#/auth/login")
(assoc :query (u/map->query-string params)))]
(redirect-response uri)))
(defn- generate-redirect
[{:keys [tokens session audit] :as cfg} request info profile]
[cfg request info profile]
(if profile
(let [sxf ((:create session) (:id profile))
(let [sxf (session/create-fn cfg (:id profile))
token (or (:invitation-token info)
(tokens :generate {:iss :auth
:exp (dt/in-future "15m")
:profile-id (:id profile)}))
(tokens/generate (::main/props cfg)
{:iss :auth
:exp (dt/in-future "15m")
:profile-id (:id profile)}))
params {:token token}
uri (-> (u/uri (:public-uri cfg))
uri (-> (u/uri (cf/get :public-uri))
(assoc :path "/#/auth/verify-token")
(assoc :query (u/map->query-string params)))]
(when (fn? audit)
(audit :cmd :submit
:type "mutation"
:name "login"
:profile-id (:id profile)
:ip-addr (audit/parse-client-ip request)
:props (audit/profile->props profile)))
(when (:is-blocked profile)
(ex/raise :type :restriction
:code :profile-blocked))
(audit/submit! cfg {::audit/type "command"
::audit/name "login-with-oidc"
::audit/profile-id (:id profile)
::audit/ip-addr (audit/parse-client-ip request)
::audit/props (audit/profile->props profile)})
(->> (redirect-response uri)
(sxf request)))
(let [info (assoc info
:iss :prepared-register
:is-active true
:exp (dt/in-future {:hours 48}))
token (tokens :generate info)
params (d/without-nils
{:token token
:fullname (:fullname info)})
uri (-> (u/uri (:public-uri cfg))
(assoc :path "/#/auth/register/validate")
(assoc :query (u/map->query-string params)))]
(redirect-response uri))))
(if (auth/email-domain-in-whitelist? (:email info))
(let [info (assoc info
:iss :prepared-register
:is-active true
:exp (dt/in-future {:hours 48}))
token (tokens/generate (::main/props cfg) info)
params (d/without-nils
{:token token
:fullname (:fullname info)})
uri (-> (u/uri (cf/get :public-uri))
(assoc :path "/#/auth/register/validate")
(assoc :query (u/map->query-string params)))]
(redirect-response uri))
(generate-error-redirect cfg "email-domain-not-allowed"))))
(defn- auth-handler
[{:keys [tokens] :as cfg} {:keys [params] :as request}]
[cfg {:keys [params] :as request}]
(let [props (audit/extract-utm-params params)
state (tokens :generate
{:iss :oauth
:invitation-token (:invitation-token params)
:props props
:exp (dt/in-future "15m")})
state (tokens/generate (::main/props cfg)
{:iss :oauth
:invitation-token (:invitation-token params)
:props props
:exp (dt/in-future "4h")})
uri (build-auth-uri cfg state)]
(yrs/response 200 {:redirect-uri uri})))
{::yrs/status 200
::yrs/body {:redirect-uri uri}}))
(defn- callback-handler
[cfg request]
(letfn [(process-request []
(p/let [info (retrieve-info cfg request)
profile (retrieve-profile cfg info)]
(generate-redirect cfg request info profile)))
(handle-error [cause]
(l/error :hint "error on oauth process" :cause cause)
(generate-error-redirect cfg cause))]
(-> (process-request)
(p/catch handle-error))))
(try
(let [info (get-info cfg request)
profile (get-profile cfg info)]
(generate-redirect cfg request info profile))
(catch Throwable cause
(l/warn :hint "error on oauth process" :cause cause)
(generate-error-redirect cfg cause))))
(def provider-lookup
{:compile
(fn [& _]
(fn [handler]
(fn [{:keys [providers] :as cfg} request]
(fn [handler {:keys [::providers] :as cfg}]
(fn [request]
(let [provider (some-> request :path-params :provider keyword)]
(if-let [provider (get providers provider)]
(handler (assoc cfg :provider provider) request)
@@ -495,41 +583,51 @@
:provider provider
:hint "provider not configured"))))))})
(s/def ::public-uri ::us/not-empty-string)
(s/def ::http-client fn?)
(s/def ::session map?)
(s/def ::tokens fn?)
(s/def ::providers map?)
(s/def ::client-id ::cf/oidc-client-id)
(s/def ::client-secret ::cf/oidc-client-secret)
(s/def ::base-uri ::cf/oidc-base-uri)
(s/def ::token-uri ::cf/oidc-token-uri)
(s/def ::auth-uri ::cf/oidc-auth-uri)
(s/def ::user-uri ::cf/oidc-user-uri)
(s/def ::scopes ::cf/oidc-scopes)
(s/def ::roles ::cf/oidc-roles)
(s/def ::roles-attr ::cf/oidc-roles-attr)
(s/def ::email-attr ::cf/oidc-email-attr)
(s/def ::name-attr ::cf/oidc-name-attr)
;; FIXME: migrate to qualified-keywords
(s/def ::provider
(s/keys :req-un [::client-id
::client-secret]
:opt-un [::base-uri
::token-uri
::auth-uri
::user-uri
::scopes
::roles
::roles-attr
::email-attr
::name-attr]))
(s/def ::providers (s/map-of ::us/keyword (s/nilable ::provider)))
(s/def ::routes vector?)
(defmethod ig/pre-init-spec ::routes
[_]
(s/keys :req-un [::public-uri
::session
::tokens
::http-client
::providers
::db/pool
::wrk/executor]))
(s/keys :req [::session/manager
::http/client
::main/props
::db/pool
::providers]))
(defmethod ig/init-key ::routes
[_ {:keys [executor session] :as cfg}]
[_ cfg]
(let [cfg (update cfg :provider d/without-nils)]
["" {:middleware [[(:middleware session)]
[hmw/with-promise-async executor]
[hmw/with-config cfg]
[provider-lookup]
]}
;; We maintain the both URI prefixes for backward compatibility.
["" {:middleware [[session/authz cfg]
[provider-lookup cfg]]}
["/auth/oauth"
["/:provider"
{:handler auth-handler
:allowed-methods #{:post}}]
["/:provider/callback"
{:handler callback-handler
:allowed-methods #{:get}}]]
["/auth/oidc"
["/:provider"
{:handler auth-handler
:allowed-methods #{:post}}]

View File

@@ -1,169 +0,0 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
(ns app.cli.manage
"A manage cli api."
(:require
[app.common.logging :as l]
[app.db :as db]
[app.main :as main]
[app.rpc.commands.auth :as cmd.auth]
[app.rpc.mutations.profile :as profile]
[app.rpc.queries.profile :refer [retrieve-profile-data-by-email]]
[clojure.string :as str]
[clojure.tools.cli :refer [parse-opts]]
[integrant.core :as ig])
(:import
java.io.Console))
;; --- IMPL
(defn init-system
[]
(let [data (-> main/system-config
(select-keys [:app.db/pool :app.metrics/metrics])
(assoc :app.migrations/all {}))]
(-> data ig/prep ig/init)))
(defn- read-from-console
[{:keys [label type] :or {type :text}}]
(let [^Console console (System/console)]
(when-not console
(l/error :hint "no console found, can proceed")
(System/exit 1))
(binding [*out* (.writer console)]
(print label " ")
(.flush *out*))
(case type
:text (.readLine console)
:password (String. (.readPassword console)))))
(defn create-profile
[options]
(let [system (init-system)
email (or (:email options)
(read-from-console {:label "Email:"}))
fullname (or (:fullname options)
(read-from-console {:label "Full Name:"}))
password (or (:password options)
(read-from-console {:label "Password:"
:type :password}))]
(try
(db/with-atomic [conn (:app.db/pool system)]
(->> (cmd.auth/create-profile conn
{:fullname fullname
:email email
:password password
:is-active true
:is-demo false})
(cmd.auth/create-profile-relations conn)))
(when (pos? (:verbosity options))
(println "User created successfully."))
(System/exit 0)
(catch Exception _e
(when (pos? (:verbosity options))
(println "Unable to create user, already exists."))
(System/exit 1)))))
(defn reset-password
[options]
(let [system (init-system)]
(try
(db/with-atomic [conn (:app.db/pool system)]
(let [email (or (:email options)
(read-from-console {:label "Email:"}))
profile (retrieve-profile-data-by-email conn email)]
(when-not profile
(when (pos? (:verbosity options))
(println "Profile does not exists."))
(System/exit 1))
(let [password (or (:password options)
(read-from-console {:label "Password:"
:type :password}))]
(profile/update-profile-password! conn (assoc profile :password password))
(when (pos? (:verbosity options))
(println "Password changed successfully.")))))
(System/exit 0)
(catch Exception e
(when (pos? (:verbosity options))
(println "Unable to change password."))
(when (= 2 (:verbosity options))
(.printStackTrace e))
(System/exit 1)))))
;; --- CLI PARSE
(def cli-options
;; An option with a required argument
[["-u" "--email EMAIL" "Email Address"]
["-p" "--password PASSWORD" "Password"]
["-n" "--name FULLNAME" "Full Name"
:id :fullname]
["-v" nil "Verbosity level"
:id :verbosity
:default 1
:update-fn inc]
["-q" nil "Dont' print to console"
:id :verbosity
:update-fn (constantly 0)]
["-h" "--help"]])
(defn usage
[options-summary]
(->> ["Penpot CLI management."
""
"Usage: manage [options] action"
""
"Options:"
options-summary
""
"Actions:"
" create-profile Create new profile."
" reset-password Reset profile password."
""]
(str/join \newline)))
(defn error-msg [errors]
(str "The following errors occurred while parsing your command:\n\n"
(str/join \newline errors)))
(defn validate-args
"Validate command line arguments. Either return a map indicating the program
should exit (with a error message, and optional ok status), or a map
indicating the action the program should take and the options provided."
[args]
(let [{:keys [options arguments errors summary] :as opts} (parse-opts args cli-options)]
(cond
(:help options) ; help => exit OK with usage summary
{:exit-message (usage summary) :ok? true}
errors ; errors => exit with description of errors
{:exit-message (error-msg errors)}
;; custom validation on arguments
:else
(let [action (first arguments)]
(if (#{"create-profile" "reset-password"} action)
{:action (first arguments) :options options}
{:exit-message (usage summary)})))))
(defn exit [status msg]
(println msg)
(System/exit status))
(defn -main
[& args]
(let [{:keys [action options exit-message ok?]} (validate-args args)]
(if exit-message
(exit (if ok? 0 1) exit-message)
(case action
"create-profile" (create-profile options)
"reset-password" (reset-password options)))))

View File

@@ -2,7 +2,7 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.config
"A configuration management."
@@ -11,7 +11,6 @@
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.flags :as flags]
[app.common.logging :as l]
[app.common.spec :as us]
[app.common.version :as v]
[app.util.time :as dt]
@@ -20,6 +19,7 @@
[clojure.pprint :as pprint]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[datoteka.fs :as fs]
[environ.core :refer [env]]
[integrant.core :as ig]))
@@ -27,6 +27,10 @@
clojure.lang.IRecord
clojure.lang.IDeref)
(prefer-method print-method
clojure.lang.IPersistentMap
clojure.lang.IDeref)
(prefer-method pprint/simple-dispatch
clojure.lang.IPersistentMap
clojure.lang.IDeref)
@@ -46,19 +50,19 @@
:database-username "penpot"
:database-password "penpot"
:default-blob-version 4
:loggers-zmq-uri "tcp://localhost:45556"
:default-blob-version 5
:rpc-rlimit-config (fs/path "resources/rlimit.edn")
:rpc-climit-config (fs/path "resources/climit.edn")
:file-change-snapshot-every 5
:file-change-snapshot-timeout "3h"
:public-uri "http://localhost:3449"
:host "localhost"
:tenant "main"
:tenant "default"
:redis-uri "redis://redis/0"
:srepl-host "127.0.0.1"
:srepl-port 6062
:assets-storage-backend :assets-fs
:storage-assets-fs-directory "assets"
@@ -83,22 +87,27 @@
;; a server prop key where initial project is stored.
:initial-project-skey "initial-project"})
(s/def ::default-rpc-rlimit ::us/vector-of-strings)
(s/def ::rpc-rlimit-config ::fs/path)
(s/def ::rpc-climit-config ::fs/path)
(s/def ::media-max-file-size ::us/integer)
(s/def ::flags ::us/vec-of-valid-keywords)
(s/def ::flags ::us/vector-of-keywords)
(s/def ::telemetry-enabled ::us/boolean)
(s/def ::audit-log-archive-uri ::us/string)
(s/def ::audit-log-gc-max-age ::dt/duration)
(s/def ::audit-log-http-handler-concurrency ::us/integer)
(s/def ::admins ::us/set-of-non-empty-strings)
(s/def ::admins ::us/set-of-valid-emails)
(s/def ::file-change-snapshot-every ::us/integer)
(s/def ::file-change-snapshot-timeout ::dt/duration)
(s/def ::default-executor-parallelism ::us/integer)
(s/def ::blocking-executor-parallelism ::us/integer)
(s/def ::worker-executor-parallelism ::us/integer)
(s/def ::scheduled-executor-parallelism ::us/integer)
(s/def ::worker-default-parallelism ::us/integer)
(s/def ::worker-webhook-parallelism ::us/integer)
(s/def ::authenticated-cookie-domain ::us/string)
(s/def ::authenticated-cookie-name ::us/string)
@@ -115,6 +124,17 @@
(s/def ::database-min-pool-size ::us/integer)
(s/def ::database-max-pool-size ::us/integer)
(s/def ::quotes-teams-per-profile ::us/integer)
(s/def ::quotes-access-tokens-per-profile ::us/integer)
(s/def ::quotes-projects-per-team ::us/integer)
(s/def ::quotes-invitations-per-team ::us/integer)
(s/def ::quotes-profiles-per-team ::us/integer)
(s/def ::quotes-files-per-project ::us/integer)
(s/def ::quotes-files-per-team ::us/integer)
(s/def ::quotes-font-variants-per-team ::us/integer)
(s/def ::quotes-comment-threads-per-file ::us/integer)
(s/def ::quotes-comments-per-file ::us/integer)
(s/def ::default-blob-version ::us/integer)
(s/def ::error-report-webhook ::us/string)
(s/def ::user-feedback-destination ::us/string)
@@ -126,16 +146,18 @@
(s/def ::google-client-id ::us/string)
(s/def ::google-client-secret ::us/string)
(s/def ::oidc-client-id ::us/string)
(s/def ::oidc-user-info-source ::us/keyword)
(s/def ::oidc-client-secret ::us/string)
(s/def ::oidc-base-uri ::us/string)
(s/def ::oidc-token-uri ::us/string)
(s/def ::oidc-auth-uri ::us/string)
(s/def ::oidc-user-uri ::us/string)
(s/def ::oidc-scopes ::us/set-of-non-empty-strings)
(s/def ::oidc-roles ::us/set-of-non-empty-strings)
(s/def ::oidc-roles-attr ::us/keyword)
(s/def ::oidc-email-attr ::us/keyword)
(s/def ::oidc-name-attr ::us/keyword)
(s/def ::oidc-jwks-uri ::us/string)
(s/def ::oidc-scopes ::us/set-of-strings)
(s/def ::oidc-roles ::us/set-of-strings)
(s/def ::oidc-roles-attr ::us/string)
(s/def ::oidc-email-attr ::us/string)
(s/def ::oidc-name-attr ::us/string)
(s/def ::host ::us/string)
(s/def ::http-server-port ::us/integer)
(s/def ::http-server-host ::us/string)
@@ -143,7 +165,6 @@
(s/def ::http-server-max-multipart-body-size ::us/integer)
(s/def ::http-server-io-threads ::us/integer)
(s/def ::http-server-worker-threads ::us/integer)
(s/def ::initial-project-skey ::us/string)
(s/def ::ldap-attrs-email ::us/string)
(s/def ::ldap-attrs-fullname ::us/string)
(s/def ::ldap-attrs-username ::us/string)
@@ -155,8 +176,6 @@
(s/def ::ldap-ssl ::us/boolean)
(s/def ::ldap-starttls ::us/boolean)
(s/def ::ldap-user-query ::us/string)
(s/def ::loggers-loki-uri ::us/string)
(s/def ::loggers-zmq-uri ::us/string)
(s/def ::media-directory ::us/string)
(s/def ::media-uri ::us/string)
(s/def ::profile-bounce-max-age ::dt/duration)
@@ -165,11 +184,8 @@
(s/def ::profile-complaint-threshold ::us/integer)
(s/def ::public-uri ::us/string)
(s/def ::redis-uri ::us/string)
(s/def ::registration-domain-whitelist ::us/set-of-non-empty-strings)
(s/def ::rlimit-font ::us/integer)
(s/def ::rlimit-file-update ::us/integer)
(s/def ::rlimit-image ::us/integer)
(s/def ::rlimit-password ::us/integer)
(s/def ::registration-domain-whitelist ::us/set-of-strings)
(s/def ::smtp-default-from ::us/string)
(s/def ::smtp-default-reply-to ::us/string)
(s/def ::smtp-host ::us/string)
@@ -178,34 +194,26 @@
(s/def ::smtp-ssl ::us/boolean)
(s/def ::smtp-tls ::us/boolean)
(s/def ::smtp-username (s/nilable ::us/string))
(s/def ::srepl-host ::us/string)
(s/def ::srepl-port ::us/integer)
(s/def ::urepl-host ::us/string)
(s/def ::urepl-port ::us/integer)
(s/def ::prepl-host ::us/string)
(s/def ::prepl-port ::us/integer)
(s/def ::assets-storage-backend ::us/keyword)
(s/def ::fdata-storage-backend ::us/keyword)
(s/def ::storage-assets-fs-directory ::us/string)
(s/def ::storage-assets-s3-bucket ::us/string)
(s/def ::storage-assets-s3-region ::us/keyword)
(s/def ::storage-assets-s3-endpoint ::us/string)
(s/def ::storage-fdata-s3-bucket ::us/string)
(s/def ::storage-fdata-s3-region ::us/keyword)
(s/def ::storage-fdata-s3-prefix ::us/string)
(s/def ::storage-fdata-s3-endpoint ::us/string)
(s/def ::telemetry-uri ::us/string)
(s/def ::telemetry-with-taiga ::us/boolean)
(s/def ::tenant ::us/string)
(s/def ::sentry-trace-sample-rate ::us/number)
(s/def ::sentry-attach-stack-trace ::us/boolean)
(s/def ::sentry-debug ::us/boolean)
(s/def ::sentry-dsn ::us/string)
(s/def ::config
(s/keys :opt-un [::secret-key
::flags
::admins
::allow-demo-users
::audit-log-archive-uri
::audit-log-gc-max-age
::audit-log-http-handler-concurrency
::auth-token-cookie-name
::auth-token-cookie-max-age
::authenticated-cookie-name
@@ -217,10 +225,12 @@
::database-min-pool-size
::database-max-pool-size
::default-blob-version
::default-rpc-rlimit
::error-report-webhook
::default-executor-parallelism
::blocking-executor-parallelism
::worker-executor-parallelism
::scheduled-executor-parallelism
::worker-default-parallelism
::worker-webhook-parallelism
::file-change-snapshot-every
::file-change-snapshot-timeout
::user-feedback-destination
@@ -233,10 +243,12 @@
::google-client-secret
::oidc-client-id
::oidc-client-secret
::oidc-user-info-source
::oidc-base-uri
::oidc-token-uri
::oidc-auth-uri
::oidc-user-uri
::oidc-jwks-uri
::oidc-scopes
::oidc-roles-attr
::oidc-email-attr
@@ -249,7 +261,6 @@
::http-server-max-multipart-body-size
::http-server-io-threads
::http-server-worker-threads
::initial-project-skey
::ldap-attrs-email
::ldap-attrs-fullname
::ldap-attrs-username
@@ -262,24 +273,33 @@
::ldap-starttls
::ldap-user-query
::local-assets-uri
::loggers-loki-uri
::loggers-zmq-uri
::media-max-file-size
::profile-bounce-max-age
::profile-bounce-threshold
::profile-complaint-max-age
::profile-complaint-threshold
::public-uri
::quotes-teams-per-profile
::quotes-access-tokens-per-profile
::quotes-projects-per-team
::quotes-invitations-per-team
::quotes-profiles-per-team
::quotes-files-per-project
::quotes-files-per-team
::quotes-font-variants-per-team
::quotes-comment-threads-per-file
::quotes-comments-per-file
::redis-uri
::registration-domain-whitelist
::rlimit-font
::rlimit-file-update
::rlimit-image
::rlimit-password
::sentry-dsn
::sentry-debug
::sentry-attach-stack-trace
::sentry-trace-sample-rate
::rpc-rlimit-config
::semaphore-process-font
::semaphore-process-image
::semaphore-update-file
::semaphore-auth
::smtp-default-from
::smtp-default-reply-to
::smtp-host
@@ -288,18 +308,17 @@
::smtp-ssl
::smtp-tls
::smtp-username
::srepl-host
::srepl-port
::urepl-host
::urepl-port
::prepl-host
::prepl-port
::assets-storage-backend
::storage-assets-fs-directory
::storage-assets-s3-bucket
::storage-assets-s3-region
::storage-assets-s3-endpoint
::fdata-storage-backend
::storage-fdata-s3-bucket
::storage-fdata-s3-region
::storage-fdata-s3-prefix
::storage-fdata-s3-endpoint
::telemetry-enabled
::telemetry-uri
::telemetry-referer
@@ -308,8 +327,10 @@
(def default-flags
[:enable-backend-api-doc
:enable-backend-openapi-doc
:enable-backend-worker
:enable-secure-session-cookies])
:enable-secure-session-cookies
:enable-email-verification])
(defn- parse-flags
[config]
@@ -336,10 +357,11 @@
(merge defaults)
(us/conform ::config))
(catch Throwable e
(when (ex/ex-info? e)
(when (ex/error? e)
(println ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;")
(println "Error on validating configuration:")
(println (us/pretty-explain (ex-data e)))
(println (some-> e ex-data ex/explain))
(println (ex/explain (ex-data e)))
(println ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"))
(throw e))))
@@ -350,11 +372,7 @@
"%version%")))
(defonce ^:dynamic config (read-config))
(defonce ^:dynamic flags
(let [flags (parse-flags config)]
(l/info :hint "flags initialized" :flags (str/join "," (map name flags)))
flags))
(defonce ^:dynamic flags (parse-flags config))
(def deletion-delay
(dt/duration {:days 7}))

View File

@@ -2,9 +2,10 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.db
(:refer-clojure :exclude [get run!])
(:require
[app.common.data :as d]
[app.common.exceptions :as ex]
@@ -16,7 +17,6 @@
[app.db.sql :as sql]
[app.metrics :as mtx]
[app.util.json :as json]
[app.util.migrations :as mg]
[app.util.time :as dt]
[clojure.java.io :as io]
[clojure.spec.alpha :as s]
@@ -27,9 +27,10 @@
com.zaxxer.hikari.HikariConfig
com.zaxxer.hikari.HikariDataSource
com.zaxxer.hikari.metrics.prometheus.PrometheusMetricsTrackerFactory
io.whitfin.siphash.SipHasher
io.whitfin.siphash.SipHasherContainer
java.io.InputStream
java.io.OutputStream
java.lang.AutoCloseable
java.sql.Connection
java.sql.Savepoint
org.postgresql.PGConnection
@@ -47,12 +48,9 @@
;; Initialization
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(declare apply-migrations!)
(s/def ::connection-timeout ::us/integer)
(s/def ::max-size ::us/integer)
(s/def ::min-size ::us/integer)
(s/def ::migrations map?)
(s/def ::name keyword?)
(s/def ::password ::us/string)
(s/def ::uri ::us/not-empty-string)
@@ -61,26 +59,26 @@
(s/def ::read-only? ::us/boolean)
(s/def ::pool-options
(s/keys :opt-un [::uri ::name
::min-size
::max-size
::connection-timeout
::validation-timeout
::migrations
::username
::password
::mtx/metrics
::read-only?]))
(s/keys :opt [::uri
::name
::min-size
::max-size
::connection-timeout
::validation-timeout
::username
::password
::mtx/metrics
::read-only?]))
(def defaults
{:name :main
:min-size 0
:max-size 30
:connection-timeout 10000
:validation-timeout 10000
:idle-timeout 120000 ; 2min
:max-lifetime 1800000 ; 30m
:read-only? false})
{::name :main
::min-size 0
::max-size 60
::connection-timeout 10000
::validation-timeout 10000
::idle-timeout 120000 ; 2min
::max-lifetime 1800000 ; 30m
::read-only? false})
(defmethod ig/prep-key ::pool
[_ cfg]
@@ -90,39 +88,23 @@
(defmethod ig/pre-init-spec ::pool [_] ::pool-options)
(defmethod ig/init-key ::pool
[_ {:keys [migrations read-only? uri] :as cfg}]
(if uri
(let [pool (create-pool cfg)]
(l/info :hint "initialize connection pool"
:name (d/name (:name cfg))
:uri uri
:read-only read-only?
:with-credentials (and (contains? cfg :username)
(contains? cfg :password))
:min-size (:min-size cfg)
:max-size (:max-size cfg))
(when-not read-only?
(some->> (seq migrations) (apply-migrations! pool)))
pool)
(do
(l/warn :hint "unable to initialize pool, missing url"
:name (d/name (:name cfg))
:read-only read-only?)
nil)))
[_ {:keys [::uri ::read-only?] :as cfg}]
(when uri
(l/info :hint "initialize connection pool"
:name (d/name (::name cfg))
:uri uri
:read-only read-only?
:with-credentials (and (contains? cfg ::username)
(contains? cfg ::password))
:min-size (::min-size cfg)
:max-size (::max-size cfg))
(create-pool cfg)))
(defmethod ig/halt-key! ::pool
[_ pool]
(when pool
(.close ^HikariDataSource pool)))
(defn- apply-migrations!
[pool migrations]
(with-open [conn ^AutoCloseable (open pool)]
(mg/setup! conn)
(doseq [[name steps] migrations]
(mg/migrate! conn {:name (d/name name) :steps steps}))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; API & Impl
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -132,30 +114,30 @@
"SET idle_in_transaction_session_timeout = 300000;"))
(defn- create-datasource-config
[{:keys [metrics uri] :as cfg}]
[{:keys [::mtx/metrics ::uri] :as cfg}]
(let [config (HikariConfig.)]
(doto config
(.setJdbcUrl (str "jdbc:" uri))
(.setPoolName (d/name (:name cfg)))
(.setPoolName (d/name (::name cfg)))
(.setAutoCommit true)
(.setReadOnly (:read-only? cfg))
(.setConnectionTimeout (:connection-timeout cfg))
(.setValidationTimeout (:validation-timeout cfg))
(.setIdleTimeout (:idle-timeout cfg))
(.setMaxLifetime (:max-lifetime cfg))
(.setMinimumIdle (:min-size cfg))
(.setMaximumPoolSize (:max-size cfg))
(.setReadOnly (::read-only? cfg))
(.setConnectionTimeout (::connection-timeout cfg))
(.setValidationTimeout (::validation-timeout cfg))
(.setIdleTimeout (::idle-timeout cfg))
(.setMaxLifetime (::max-lifetime cfg))
(.setMinimumIdle (::min-size cfg))
(.setMaximumPoolSize (::max-size cfg))
(.setConnectionInitSql initsql)
(.setInitializationFailTimeout -1))
;; When metrics namespace is provided
(when metrics
(->> (:registry metrics)
(->> (::mtx/registry metrics)
(PrometheusMetricsTrackerFactory.)
(.setMetricsTrackerFactory config)))
(some->> ^String (:username cfg) (.setUsername config))
(some->> ^String (:password cfg) (.setPassword config))
(some->> ^String (::username cfg) (.setUsername config))
(some->> ^String (::password cfg) (.setPassword config))
config))
@@ -163,15 +145,28 @@
[v]
(instance? javax.sql.DataSource v))
(s/def ::conn some?)
(s/def ::nilable-pool (s/nilable ::pool))
(s/def ::pool pool?)
(s/def ::pool-or-conn some?)
(defn closed?
[pool]
(.isClosed ^HikariDataSource pool))
(defn read-only?
[pool]
(.isReadOnly ^HikariDataSource pool))
[pool-or-conn]
(cond
(instance? HikariDataSource pool-or-conn)
(.isReadOnly ^HikariDataSource pool-or-conn)
(instance? Connection pool-or-conn)
(.isReadOnly ^Connection pool-or-conn)
:else
(ex/raise :type :internal
:code :invalid-connection
:hint "invalid connection provided")))
(defn create-pool
[cfg]
@@ -223,79 +218,98 @@
(defmacro with-atomic
[& args]
`(jdbc/with-transaction ~@args))
(if (symbol? (first args))
(let [cfgs (first args)
body (rest args)]
`(jdbc/with-transaction [conn# (::pool ~cfgs)]
(let [~cfgs (assoc ~cfgs ::conn conn#)]
~@body)))
`(jdbc/with-transaction ~@args)))
(defn open
[pool]
(jdbc/get-connection pool))
(def ^:private default-opts
{:builder-fn sql/as-kebab-maps})
(defn exec!
([ds sv]
(exec! ds sv {}))
(jdbc/execute! ds sv default-opts))
([ds sv opts]
(jdbc/execute! ds sv (assoc opts :builder-fn sql/as-kebab-maps))))
(jdbc/execute! ds sv (merge default-opts opts))))
(defn exec-one!
([ds sv] (exec-one! ds sv {}))
([ds sv]
(jdbc/execute-one! ds sv default-opts))
([ds sv opts]
(jdbc/execute-one! ds sv (assoc opts :builder-fn sql/as-kebab-maps))))
(jdbc/execute-one! ds sv
(-> (merge default-opts opts)
(assoc :return-keys (::return-keys? opts false))))))
(defn insert!
([ds table params] (insert! ds table params nil))
([ds table params opts]
(exec-one! ds
(sql/insert table params opts)
(merge {:return-keys true} opts))))
[ds table params & {:as opts}]
(exec-one! ds
(sql/insert table params opts)
(merge {::return-keys? true} opts)))
(defn insert-multi!
([ds table cols rows] (insert-multi! ds table cols rows nil))
([ds table cols rows opts]
(exec! ds
(sql/insert-multi table cols rows opts)
(merge {:return-keys true} opts))))
[ds table cols rows & {:as opts}]
(exec! ds
(sql/insert-multi table cols rows opts)
(merge {::return-keys? true} opts)))
(defn update!
([ds table params where] (update! ds table params where nil))
([ds table params where opts]
(exec-one! ds
(sql/update table params where opts)
(merge {:return-keys true} opts))))
[ds table params where & {:as opts}]
(exec-one! ds
(sql/update table params where opts)
(merge {::return-keys? true} opts)))
(defn delete!
([ds table params] (delete! ds table params nil))
([ds table params opts]
(exec-one! ds
(sql/delete table params opts)
(assoc opts :return-keys true))))
[ds table params & {:as opts}]
(exec-one! ds
(sql/delete table params opts)
(merge {::return-keys? true} opts)))
(defn- is-deleted?
(defn is-row-deleted?
[{:keys [deleted-at]}]
(and (dt/instant? deleted-at)
(< (inst-ms deleted-at)
(inst-ms (dt/now)))))
(defn get-by-params
([ds table params]
(get-by-params ds table params nil))
([ds table params {:keys [check-not-found] :or {check-not-found true} :as opts}]
(let [res (exec-one! ds (sql/select table params opts))]
(when (and check-not-found (or (not res) (is-deleted? res)))
(ex/raise :type :not-found
:table table
:hint "database object not found"))
res)))
(defn get*
"Retrieve a single row from database that matches a simple filters. Do
not raises exceptions."
[ds table params & {:as opts}]
(let [rows (exec! ds (sql/select table params opts))
rows (cond->> rows
(::remove-deleted? opts true)
(remove is-row-deleted?))]
(first rows)))
(defn get
"Retrieve a single row from database that matches a simple
filters. Raises :not-found exception if no object is found."
[ds table params & {:as opts}]
(let [row (get* ds table params opts)]
(when (and (not row) (::check-deleted? opts true))
(ex/raise :type :not-found
:code :object-not-found
:table table
:hint "database object not found"))
row))
(defn plan
[ds sql]
(jdbc/plan ds sql sql/default-opts))
(defn get-by-id
([ds table id]
(get-by-params ds table {:id id} nil))
([ds table id opts]
(get-by-params ds table {:id id} opts)))
[ds table id & {:as opts}]
(get ds table {:id id} opts))
(defn query
([ds table params]
(query ds table params nil))
([ds table params opts]
(exec! ds (sql/select table params opts))))
[ds table params & {:as opts}]
(exec! ds (sql/select table params opts)))
(defn pgobject?
([v]
@@ -322,10 +336,13 @@
[v]
(and (pgarray? v) (= "uuid" (.getBaseTypeName ^PgArray v))))
;; TODO rename to decode-pgarray-into
(defn decode-pgarray
([v] (some->> ^PgArray v .getArray vec))
([v in] (some->> ^PgArray v .getArray (into in)))
([v in xf] (some->> ^PgArray v .getArray (into in xf))))
([v] (decode-pgarray v []))
([v in]
(into in (some-> ^PgArray v .getArray)))
([v in xf]
(into in xf (some-> ^PgArray v .getArray))))
(defn pgarray->set
[v]
@@ -354,87 +371,161 @@
[data]
(org.postgresql.util.PGInterval. ^String data))
(defn connection?
[conn]
(instance? Connection conn))
(defn savepoint
([^Connection conn]
(.setSavepoint conn))
([^Connection conn label]
(.setSavepoint conn (name label))))
(defn release!
[^Connection conn ^Savepoint sp ]
(.releaseSavepoint conn sp))
(defn rollback!
([^Connection conn]
(.rollback conn))
([^Connection conn ^Savepoint sp]
(.rollback conn sp)))
(defn interval
[data]
(defn tx-run!
[cfg f]
(cond
(integer? data)
(->> (/ data 1000.0)
(format "%s seconds")
(pginterval))
(connection? cfg)
(tx-run! {::conn cfg} f)
(string? data)
(pginterval data)
(pool? cfg)
(tx-run! {::pool cfg} f)
(dt/duration? data)
(->> (/ (.toMillis ^java.time.Duration data) 1000.0)
(format "%s seconds")
(pginterval))
(::conn cfg)
(let [conn (::conn cfg)
sp (savepoint conn)]
(try
(let [result (f cfg)]
(release! conn sp)
result)
(catch Throwable cause
(rollback! sp)
(throw cause))))
(::pool cfg)
(with-atomic [conn (::pool cfg)]
(f (assoc cfg ::conn conn)))
:else
(ex/raise :type :not-implemented)))
(throw (IllegalArgumentException. "invalid arguments"))))
(defn run!
[cfg f]
(cond
(connection? cfg)
(run! {::conn cfg} f)
(pool? cfg)
(run! {::pool cfg} f)
(::conn cfg)
(f cfg)
(::pool cfg)
(with-open [^Connection conn (open (::pool cfg))]
(f (assoc cfg ::conn conn)))
:else
(throw (IllegalArgumentException. "invalid arguments"))))
(defn interval
[o]
(cond
(or (integer? o)
(float? o))
(->> (/ o 1000.0)
(format "%s seconds")
(pginterval))
(string? o)
(pginterval o)
(dt/duration? o)
(interval (inst-ms o))
:else
(ex/raise :type :not-implemented
:hint (format "no implementation found for value %s" (pr-str o)))))
(defn decode-json-pgobject
[^PGobject o]
(let [typ (.getType o)
val (.getValue o)]
(if (or (= typ "json")
(= typ "jsonb"))
(json/read val)
val)))
(when o
(let [typ (.getType o)
val (.getValue o)]
(if (or (= typ "json")
(= typ "jsonb"))
(json/decode val)
val))))
(defn decode-transit-pgobject
[^PGobject o]
(let [typ (.getType o)
val (.getValue o)]
(if (or (= typ "json")
(= typ "jsonb"))
(t/decode-str val)
val)))
(when o
(let [typ (.getType o)
val (.getValue o)]
(if (or (= typ "json")
(= typ "jsonb"))
(t/decode-str val)
val))))
(defn inet
[ip-addr]
(doto (org.postgresql.util.PGobject.)
(.setType "inet")
(.setValue (str ip-addr))))
(when ip-addr
(doto (org.postgresql.util.PGobject.)
(.setType "inet")
(.setValue (str ip-addr)))))
(defn decode-inet
[^PGobject o]
(if (= "inet" (.getType o))
(.getValue o)
nil))
(when o
(if (= "inet" (.getType o))
(.getValue o)
nil)))
(defn tjson
"Encode as transit json."
[data]
(doto (org.postgresql.util.PGobject.)
(.setType "jsonb")
(.setValue (t/encode-str data {:type :json-verbose}))))
(when data
(doto (org.postgresql.util.PGobject.)
(.setType "jsonb")
(.setValue (t/encode-str data {:type :json-verbose})))))
(defn json
"Encode as plain json."
[data]
(doto (org.postgresql.util.PGobject.)
(.setType "jsonb")
(.setValue (json/write-str data))))
(when data
(doto (org.postgresql.util.PGobject.)
(.setType "jsonb")
(.setValue (json/encode-str data)))))
(defn get-update-count
[result]
(:next.jdbc/update-count result))
;; --- Locks
(def ^:private siphash-state
(SipHasher/container
(uuid/get-bytes uuid/zero)))
(defn uuid->hash-code
[o]
(.hash ^SipHasherContainer siphash-state
^bytes (uuid/get-bytes o)))
(defn- xact-check-param
[n]
(cond
(uuid? n) (uuid/get-word-high n)
(uuid? n) (uuid->hash-code n)
(int? n) n
:else (throw (IllegalArgumentException. "uuid or number allowed"))))
@@ -449,3 +540,18 @@
(let [n (xact-check-param n)
row (exec-one! conn ["select pg_try_advisory_xact_lock(?::bigint) as lock" n])]
(:lock row)))
(defn sql-exception?
[cause]
(instance? java.sql.SQLException cause))
(defn connection-error?
[cause]
(and (sql-exception? cause)
(contains? #{"08003" "08006" "08001" "08004"}
(.getSQLState ^java.sql.SQLException cause))))
(defn serialization-error?
[cause]
(and (sql-exception? cause)
(= "40001" (.getSQLState ^java.sql.SQLException cause))))

View File

@@ -2,11 +2,12 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.db.sql
(:refer-clojure :exclude [update])
(:require
[app.db :as-alias db]
[clojure.string :as str]
[next.jdbc.optional :as jdbc-opt]
[next.jdbc.sql.builder :as sql]))
@@ -43,8 +44,10 @@
([table where-params opts]
(let [opts (merge default-opts opts)
opts (cond-> opts
(:for-update opts) (assoc :suffix "FOR UPDATE")
(:for-key-share opts) (assoc :suffix "FOR KEY SHARE"))]
(::db/for-update? opts) (assoc :suffix "FOR UPDATE")
(::db/for-share? opts) (assoc :suffix "FOR KEY SHARE")
(:for-update opts) (assoc :suffix "FOR UPDATE")
(:for-key-share opts) (assoc :suffix "FOR KEY SHARE"))]
(sql/for-query table where-params opts))))
(defn update

445
backend/src/app/email.clj Normal file
View File

@@ -0,0 +1,445 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.email
"Main api for send emails."
(:require
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.pprint :as pp]
[app.common.spec :as us]
[app.config :as cf]
[app.db :as db]
[app.db.sql :as sql]
[app.email.invite-to-team :as-alias email.invite-to-team]
[app.metrics :as mtx]
[app.util.template :as tmpl]
[app.worker :as wrk]
[clojure.java.io :as io]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig])
(:import
jakarta.mail.Message$RecipientType
jakarta.mail.Session
jakarta.mail.Transport
jakarta.mail.internet.InternetAddress
jakarta.mail.internet.MimeBodyPart
jakarta.mail.internet.MimeMessage
jakarta.mail.internet.MimeMultipart
java.util.Properties))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; EMAIL IMPL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- parse-address
^"[Ljakarta.mail.internet.InternetAddress;"
[v]
(InternetAddress/parse ^String v))
(defn- resolve-recipient-type
^Message$RecipientType
[type]
(case type
:to Message$RecipientType/TO
:cc Message$RecipientType/CC
:bcc Message$RecipientType/BCC))
(defn- assign-recipient
[^MimeMessage mmsg type address]
(if (sequential? address)
(reduce #(assign-recipient %1 type %2) mmsg address)
(let [address (parse-address address)
type (resolve-recipient-type type)]
(.addRecipients mmsg type address)
mmsg)))
(defn- assign-recipients
[mmsg {:keys [to cc bcc] :as params}]
(cond-> mmsg
(some? to) (assign-recipient :to to)
(some? cc) (assign-recipient :cc cc)
(some? bcc) (assign-recipient :bcc bcc)))
(defn- assign-from
[mmsg {:keys [::default-from] :as cfg} {:keys [from] :as params}]
(let [from (or from default-from)]
(when from
(let [from (parse-address from)]
(.addFrom ^MimeMessage mmsg from)))))
(defn- assign-reply-to
[mmsg {:keys [::default-reply-to] :as cfg} {:keys [reply-to] :as params}]
(let [reply-to (or reply-to default-reply-to)]
(when reply-to
(let [reply-to (parse-address reply-to)]
(.setReplyTo ^MimeMessage mmsg reply-to)))))
(defn- assign-subject
[mmsg {:keys [subject charset] :or {charset "utf-8"} :as params}]
(assert (string? subject) "subject is mandatory")
(.setSubject ^MimeMessage mmsg
^String subject
^String charset))
(defn- assign-extra-headers
[^MimeMessage mmsg {:keys [headers extra-data] :as params}]
(let [headers (assoc headers "X-Penpot-Data" extra-data)]
(reduce-kv (fn [^MimeMessage mmsg k v]
(doto mmsg
(.addHeader (name k) (str v))))
mmsg
headers)))
(defn- assign-body
[^MimeMessage mmsg {:keys [body charset] :or {charset "utf-8"}}]
(let [mpart (MimeMultipart. "mixed")]
(cond
(string? body)
(let [bpart (MimeBodyPart.)]
(.setContent bpart ^String body (str "text/plain; charset=" charset))
(.addBodyPart mpart bpart))
(vector? body)
(let [mmp (MimeMultipart. "alternative")
mbp (MimeBodyPart.)]
(.addBodyPart mpart mbp)
(.setContent mbp mmp)
(doseq [item body]
(let [mbp (MimeBodyPart.)]
(.setContent mbp
^String (:content item)
^String (str (:type item "text/plain") "; charset=" charset))
(.addBodyPart mmp mbp))))
(map? body)
(let [bpart (MimeBodyPart.)]
(.setContent bpart
^String (:content body)
^String (str (:type body "text/plain") "; charset=" charset))
(.addBodyPart mpart bpart))
:else
(throw (ex-info "Unsupported type" {:body body})))
(.setContent mmsg mpart)
mmsg))
(defn- opts->props
[{:keys [::username ::tls ::host ::port ::timeout ::default-from]
:or {timeout 30000}}]
(reduce-kv
(fn [^Properties props k v]
(if (nil? v)
props
(doto props (.put ^String k ^String (str v)))))
(Properties.)
{"mail.user" username
"mail.host" host
"mail.debug" (contains? cf/flags :smtp-debug)
"mail.from" default-from
"mail.smtp.auth" (boolean username)
"mail.smtp.starttls.enable" tls
"mail.smtp.starttls.required" tls
"mail.smtp.host" host
"mail.smtp.port" port
"mail.smtp.user" username
"mail.smtp.timeout" timeout
"mail.smtp.connectiontimeout" timeout}))
(defn- create-smtp-session
^Session
[cfg]
(let [props (opts->props cfg)]
(Session/getInstance props)))
(defn- create-smtp-message
^MimeMessage
[cfg session params]
(let [mmsg (MimeMessage. ^Session session)]
(assign-recipients mmsg params)
(assign-from mmsg cfg params)
(assign-reply-to mmsg cfg params)
(assign-subject mmsg params)
(assign-extra-headers mmsg params)
(assign-body mmsg params)
(.saveChanges ^MimeMessage mmsg)
mmsg))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; TEMPLATE EMAIL IMPL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def ^:private email-path "app/email/%(id)s/%(lang)s.%(type)s")
(defn- render-email-template-part
[type id context]
(let [lang (:lang context :en)
path (str/format email-path {:id (name id)
:lang (name lang)
:type (name type)})]
(some-> (io/resource path)
(tmpl/render context))))
(defn- build-email-template
[id context]
(let [subj (render-email-template-part :subj id context)
text (render-email-template-part :txt id context)
html (render-email-template-part :html id context)]
(when (or (not subj)
(and (not text)
(not html)))
(ex/raise :type :internal
:code :missing-email-templates))
{:subject subj
:body (into
[{:type "text/plain"
:content text}]
(when html
[{:type "text/html"
:content html}]))}))
(s/def ::priority #{:high :low})
(s/def ::to (s/or :single ::us/email
:multi (s/coll-of ::us/email)))
(s/def ::from ::us/email)
(s/def ::reply-to ::us/email)
(s/def ::lang string?)
(s/def ::extra-data ::us/string)
(s/def ::context
(s/keys :req-un [::to]
:opt-un [::reply-to ::from ::lang ::priority ::extra-data]))
(defn template-factory
([id] (template-factory id {}))
([id extra-context]
(s/assert keyword? id)
(fn [context]
(us/verify ::context context)
(when-let [spec (s/get-spec id)]
(s/assert spec context))
(let [context (merge (if (fn? extra-context)
(extra-context)
extra-context)
context)
email (build-email-template id context)]
(when-not email
(ex/raise :type :internal
:code :email-template-does-not-exists
:hint "seems like the template is wrong or does not exists."
:context {:id id}))
(cond-> (assoc email :id (name id))
(:extra-data context)
(assoc :extra-data (:extra-data context))
(:from context)
(assoc :from (:from context))
(:reply-to context)
(assoc :reply-to (:reply-to context))
(:to context)
(assoc :to (:to context)))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PUBLIC HIGH-LEVEL API
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn render
[email-factory context]
(email-factory context))
(defn send!
"Schedule an already defined email to be sent using asynchronously
using worker task."
[{:keys [::conn ::factory] :as context}]
(us/verify some? conn)
(let [email (if factory
(factory context)
(dissoc context ::conn))]
(wrk/submit! (merge
{::wrk/task :sendmail
::wrk/delay 0
::wrk/max-retries 4
::wrk/priority 200
::wrk/conn conn}
email))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; SENDMAIL FN / TASK HANDLER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(s/def ::username ::cf/smtp-username)
(s/def ::password ::cf/smtp-password)
(s/def ::tls ::cf/smtp-tls)
(s/def ::ssl ::cf/smtp-ssl)
(s/def ::host ::cf/smtp-host)
(s/def ::port ::cf/smtp-port)
(s/def ::default-reply-to ::cf/smtp-default-reply-to)
(s/def ::default-from ::cf/smtp-default-from)
(s/def ::smtp-config
(s/keys :opt [::username
::password
::tls
::ssl
::host
::port
::default-from
::default-reply-to]))
(declare send-to-logger!)
(s/def ::sendmail fn?)
(defmethod ig/pre-init-spec ::sendmail [_]
(s/spec ::smtp-config))
(defmethod ig/init-key ::sendmail
[_ cfg]
(fn [params]
(when (contains? cf/flags :smtp)
(let [session (create-smtp-session cfg)]
(with-open [transport (.getTransport session (if (::ssl cfg) "smtps" "smtp"))]
(.connect ^Transport transport
^String (::username cfg)
^String (::password cfg))
(let [^MimeMessage message (create-smtp-message cfg session params)]
(.sendMessage ^Transport transport
^MimeMessage message
(.getAllRecipients message))))))
(when (or (contains? cf/flags :log-emails)
(not (contains? cf/flags :smtp)))
(send-to-logger! cfg params))))
(defmethod ig/pre-init-spec ::handler [_]
(s/keys :req [::sendmail ::mtx/metrics]))
(defmethod ig/init-key ::handler
[_ {:keys [::sendmail]}]
(fn [{:keys [props] :as task}]
(sendmail props)))
(defn- send-to-logger!
[_ email]
(let [body (:body email)
out (with-out-str
(println "email console dump:")
(println "******** start email" (:id email) "**********")
(pp/pprint (dissoc email :body))
(if (string? body)
(println body)
(println (->> body
(filter #(= "text/plain" (:type %)))
(map :content)
first)))
(println "******** end email" (:id email) "**********"))]
(l/raw! :info out)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; EMAIL FACTORIES
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(s/def ::subject ::us/string)
(s/def ::content ::us/string)
(s/def ::feedback
(s/keys :req-un [::subject ::content]))
(def feedback
"A profile feedback email."
(template-factory ::feedback))
(s/def ::name ::us/string)
(s/def ::register
(s/keys :req-un [::name]))
(def register
"A new profile registration welcome email."
(template-factory ::register))
(s/def ::token ::us/string)
(s/def ::password-recovery
(s/keys :req-un [::name ::token]))
(def password-recovery
"A password recovery notification email."
(template-factory ::password-recovery))
(s/def ::pending-email ::us/email)
(s/def ::change-email
(s/keys :req-un [::name ::pending-email ::token]))
(def change-email
"Password change confirmation email"
(template-factory ::change-email))
(s/def ::email.invite-to-team/invited-by ::us/string)
(s/def ::email.invite-to-team/team ::us/string)
(s/def ::email.invite-to-team/token ::us/string)
(s/def ::invite-to-team
(s/keys :req-un [::email.invite-to-team/invited-by
::email.invite-to-team/token
::email.invite-to-team/team]))
(def invite-to-team
"Teams member invitation email."
(template-factory ::invite-to-team))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; BOUNCE/COMPLAINS HELPERS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def sql:profile-complaint-report
"select (select count(*)
from profile_complaint_report
where type = 'complaint'
and profile_id = ?
and created_at > now() - ?::interval) as complaints,
(select count(*)
from profile_complaint_report
where type = 'bounce'
and profile_id = ?
and created_at > now() - ?::interval) as bounces;")
(defn allow-send-emails?
[conn profile]
(when-not (:is-muted profile false)
(let [complaint-threshold (cf/get :profile-complaint-threshold)
complaint-max-age (cf/get :profile-complaint-max-age)
bounce-threshold (cf/get :profile-bounce-threshold)
bounce-max-age (cf/get :profile-bounce-max-age)
{:keys [complaints bounces] :as result}
(db/exec-one! conn [sql:profile-complaint-report
(:id profile)
(db/interval complaint-max-age)
(:id profile)
(db/interval bounce-max-age)])]
(and (< (or complaints 0) complaint-threshold)
(< (or bounces 0) bounce-threshold)))))
(defn has-complaint-reports?
([conn email] (has-complaint-reports? conn email nil))
([conn email {:keys [threshold] :or {threshold 1}}]
(let [reports (db/exec! conn (sql/select :global-complaint-report
{:email email :type "complaint"}
{:limit 10}))]
(>= (count reports) threshold))))
(defn has-bounce-reports?
([conn email] (has-bounce-reports? conn email nil))
([conn email {:keys [threshold] :or {threshold 1}}]
(let [reports (db/exec! conn (sql/select :global-complaint-report
{:email email :type "bounce"}
{:limit 10}))]
(>= (count reports) threshold))))

View File

@@ -1,190 +0,0 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
(ns app.emails
"Main api for send emails."
(:require
[app.common.logging :as l]
[app.common.pprint :as pp]
[app.common.spec :as us]
[app.config :as cf]
[app.db :as db]
[app.db.sql :as sql]
[app.util.emails :as emails]
[app.worker :as wrk]
[clojure.spec.alpha :as s]
[integrant.core :as ig]))
;; --- PUBLIC API
(defn render
[email-factory context]
(email-factory context))
(defn send!
"Schedule the email for sending."
[{:keys [::conn ::factory] :as context}]
(us/verify fn? factory)
(us/verify some? conn)
(let [email (factory context)]
(wrk/submit! (assoc email
::wrk/task :sendmail
::wrk/delay 0
::wrk/max-retries 1
::wrk/priority 200
::wrk/conn conn))))
;; --- BOUNCE/COMPLAINS HANDLING
(def sql:profile-complaint-report
"select (select count(*)
from profile_complaint_report
where type = 'complaint'
and profile_id = ?
and created_at > now() - ?::interval) as complaints,
(select count(*)
from profile_complaint_report
where type = 'bounce'
and profile_id = ?
and created_at > now() - ?::interval) as bounces;")
(defn allow-send-emails?
[conn profile]
(when-not (:is-muted profile false)
(let [complaint-threshold (cf/get :profile-complaint-threshold)
complaint-max-age (cf/get :profile-complaint-max-age)
bounce-threshold (cf/get :profile-bounce-threshold)
bounce-max-age (cf/get :profile-bounce-max-age)
{:keys [complaints bounces] :as result}
(db/exec-one! conn [sql:profile-complaint-report
(:id profile)
(db/interval complaint-max-age)
(:id profile)
(db/interval bounce-max-age)])]
(and (< (or complaints 0) complaint-threshold)
(< (or bounces 0) bounce-threshold)))))
(defn has-complaint-reports?
([conn email] (has-complaint-reports? conn email nil))
([conn email {:keys [threshold] :or {threshold 1}}]
(let [reports (db/exec! conn (sql/select :global-complaint-report
{:email email :type "complaint"}
{:limit 10}))]
(>= (count reports) threshold))))
(defn has-bounce-reports?
([conn email] (has-bounce-reports? conn email nil))
([conn email {:keys [threshold] :or {threshold 1}}]
(let [reports (db/exec! conn (sql/select :global-complaint-report
{:email email :type "bounce"}
{:limit 10}))]
(>= (count reports) threshold))))
;; --- EMAIL FACTORIES
(s/def ::subject ::us/string)
(s/def ::content ::us/string)
(s/def ::feedback
(s/keys :req-un [::subject ::content]))
(def feedback
"A profile feedback email."
(emails/template-factory ::feedback))
(s/def ::name ::us/string)
(s/def ::register
(s/keys :req-un [::name]))
(def register
"A new profile registration welcome email."
(emails/template-factory ::register))
(s/def ::token ::us/string)
(s/def ::password-recovery
(s/keys :req-un [::name ::token]))
(def password-recovery
"A password recovery notification email."
(emails/template-factory ::password-recovery))
(s/def ::pending-email ::us/email)
(s/def ::change-email
(s/keys :req-un [::name ::pending-email ::token]))
(def change-email
"Password change confirmation email"
(emails/template-factory ::change-email))
(s/def :internal.emails.invite-to-team/invited-by ::us/string)
(s/def :internal.emails.invite-to-team/team ::us/string)
(s/def :internal.emails.invite-to-team/token ::us/string)
(s/def ::invite-to-team
(s/keys :req-un [:internal.emails.invite-to-team/invited-by
:internal.emails.invite-to-team/token
:internal.emails.invite-to-team/team]))
(def invite-to-team
"Teams member invitation email."
(emails/template-factory ::invite-to-team))
;; --- SENDMAIL TASK
(declare send-console!)
(s/def ::username ::cf/smtp-username)
(s/def ::password ::cf/smtp-password)
(s/def ::tls ::cf/smtp-tls)
(s/def ::ssl ::cf/smtp-ssl)
(s/def ::host ::cf/smtp-host)
(s/def ::port ::cf/smtp-port)
(s/def ::default-reply-to ::cf/smtp-default-reply-to)
(s/def ::default-from ::cf/smtp-default-from)
(defmethod ig/pre-init-spec ::sendmail-handler [_]
(s/keys :opt-un [::username
::password
::tls
::ssl
::host
::port
::default-from
::default-reply-to]))
(defmethod ig/init-key ::sendmail-handler
[_ cfg]
(fn [{:keys [props] :as task}]
(let [enabled? (or (contains? cf/flags :smtp)
(cf/get :smtp-enabled)
(:enabled task))]
(when enabled?
(emails/send! cfg props))
(when (contains? cf/flags :log-emails)
(send-console! cfg props)))))
(defn- send-console!
[_ email]
(let [body (:body email)
out (with-out-str
(println "email console dump:")
(println "******** start email" (:id email) "**********")
(pp/pprint (dissoc email :body))
(if (string? body)
(println body)
(println (->> body
(filter #(= "text/plain" (:type %)))
(map :content)
first)))
(println "******** end email" (:id email) "**********"))]
(l/info ::l/raw out)))

View File

@@ -2,26 +2,38 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.http
(:require
[app.auth.oidc :as-alias oidc]
[app.common.data :as d]
[app.common.logging :as l]
[app.common.transit :as t]
[app.db :as-alias db]
[app.http.access-token :as actoken]
[app.http.assets :as-alias assets]
[app.http.awsns :as-alias awsns]
[app.http.debug :as-alias debug]
[app.http.errors :as errors]
[app.http.middleware :as middleware]
[app.http.middleware :as mw]
[app.http.session :as session]
[app.http.websocket :as-alias ws]
[app.main :as-alias main]
[app.metrics :as mtx]
[app.rpc :as-alias rpc]
[app.rpc.doc :as-alias rpc.doc]
[app.worker :as wrk]
[clojure.spec.alpha :as s]
[integrant.core :as ig]
[promesa.exec :as px]
[reitit.core :as r]
[reitit.middleware :as rr]
[yetti.adapter :as yt]
[yetti.request :as yrq]
[yetti.response :as yrs]))
[yetti.response :as-alias yrs]))
(declare wrap-router)
(declare router-handler)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HTTP SERVER
@@ -36,144 +48,131 @@
(s/def ::max-body-size integer?)
(s/def ::max-multipart-body-size integer?)
(s/def ::io-threads integer?)
(s/def ::worker-threads integer?)
(defmethod ig/prep-key ::server
[_ cfg]
(merge {:name "http"
:port 6060
:host "0.0.0.0"
:max-body-size (* 1024 1024 30) ; 30 MiB
:max-multipart-body-size (* 1024 1024 120)} ; 120 MiB
(merge {::port 6060
::host "0.0.0.0"
::max-body-size (* 1024 1024 30) ; 30 MiB
::max-multipart-body-size (* 1024 1024 120)} ; 120 MiB
(d/without-nils cfg)))
(defmethod ig/pre-init-spec ::server [_]
(s/and
(s/keys :req-un [::port ::host ::name ::max-body-size ::max-multipart-body-size]
:opt-un [::router ::handler ::io-threads ::worker-threads ::wrk/executor])
(fn [cfg]
(or (contains? cfg :router)
(contains? cfg :handler)))))
(s/keys :req [::port ::host]
:opt [::max-body-size
::max-multipart-body-size
::router
::handler
::io-threads
::wrk/executor]))
(defmethod ig/init-key ::server
[_ {:keys [handler router port name host] :as cfg}]
(l/info :hint "starting http server" :port port :host host :name name)
[_ {:keys [::handler ::router ::host ::port] :as cfg}]
(l/info :hint "starting http server" :port port :host host)
(let [options {:http/port port
:http/host host
:http/max-body-size (:max-body-size cfg)
:http/max-multipart-body-size (:max-multipart-body-size cfg)
:xnio/io-threads (:io-threads cfg)
:xnio/worker-threads (:worker-threads cfg)
:xnio/dispatch (:executor cfg)
:http/max-body-size (::max-body-size cfg)
:http/max-multipart-body-size (::max-multipart-body-size cfg)
:xnio/io-threads (or (::io-threads cfg)
(max 3 (px/get-available-processors)))
:xnio/worker-threads (or (::worker-threads cfg)
(max 6 (px/get-available-processors)))
:xnio/dispatch true
:socket/backlog 4069
:ring/async true}
handler (if (some? router)
(wrap-router router)
handler (cond
(some? router)
(router-handler router)
handler)
server (yt/server handler (d/without-nils options))]
(assoc cfg :server (yt/start! server))))
(some? handler)
handler
:else
(throw (UnsupportedOperationException. "handler or router are required")))
options (d/without-nils options)
server (yt/server handler options)]
(assoc cfg ::server (yt/start! server))))
(defmethod ig/halt-key! ::server
[_ {:keys [server name port] :as cfg}]
(l/info :msg "stoping http server" :name name :port port)
[_ {:keys [::server ::port] :as cfg}]
(l/info :msg "stopping http server" :port port)
(yt/stop! server))
(defn- not-found-handler
[_ respond _]
(respond (yrs/response 404)))
(respond {::yrs/status 404}))
(defn- wrap-router
(defn- router-handler
[router]
(letfn [(handler [request respond raise]
(letfn [(resolve-handler [request]
(if-let [match (r/match-by-path router (yrq/path request))]
(let [params (:path-params match)
result (:result match)
handler (or (:handler result) not-found-handler)
request (-> request
(assoc :path-params params)
(update :params merge params))]
(handler request respond raise))
(not-found-handler request respond raise)))
request (assoc request :path-params params)]
(partial handler request))
(partial not-found-handler request)))
(on-error [cause request respond]
(on-error [cause request]
(let [{:keys [body] :as response} (errors/handle cause request)]
(respond
(cond-> response
(map? body)
(-> (update :headers assoc "content-type" "application/transit+json")
(assoc :body (t/encode-str body {:type :json-verbose})))))))]
(cond-> response
(map? body)
(-> (update ::yrs/headers assoc "content-type" "application/transit+json")
(assoc ::yrs/body (t/encode-str body {:type :json-verbose}))))))]
(fn [request respond _]
(try
(handler request respond #(on-error % request respond))
(catch Throwable cause
(on-error cause request respond))))))
(let [handler (resolve-handler request)
exchange (yrq/exchange request)]
(handler
(fn [response]
(yt/dispatch! exchange (partial respond response)))
(fn [cause]
(let [response (on-error cause request)]
(yt/dispatch! exchange (partial respond response)))))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HTTP ROUTER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(s/def ::oauth map?)
(s/def ::storage map?)
(s/def ::assets map?)
(s/def ::feedback fn?)
(s/def ::ws fn?)
(s/def ::audit-handler fn?)
(s/def ::awsns-handler fn?)
(s/def ::session map?)
(s/def ::rpc-routes (s/nilable vector?))
(s/def ::debug-routes (s/nilable vector?))
(s/def ::oidc-routes (s/nilable vector?))
(s/def ::doc-routes (s/nilable vector?))
(defmethod ig/pre-init-spec ::router [_]
(s/keys :req-un [::mtx/metrics
::ws
::storage
::assets
::session
::feedback
::awsns-handler
::debug-routes
::oidc-routes
::audit-handler
::rpc-routes
::doc-routes]))
(s/keys :req [::session/manager
::ws/routes
::rpc/routes
::rpc.doc/routes
::oidc/routes
::main/props
::assets/routes
::debug/routes
::db/pool
::mtx/routes
::awsns/routes]))
(defmethod ig/init-key ::router
[_ {:keys [ws session metrics assets feedback] :as cfg}]
[_ cfg]
(rr/router
[["" {:middleware [[middleware/server-timing]
[middleware/format-response]
[middleware/params]
[middleware/parse-request]
[middleware/errors errors/handle]
[middleware/restrict-methods]]}
[["" {:middleware [[mw/server-timing]
[mw/params]
[mw/format-response]
[mw/parse-request]
[session/soft-auth cfg]
[actoken/soft-auth cfg]
[mw/errors errors/handle]
[mw/restrict-methods]
[mw/with-dispatch :vthread]]}
["/metrics" {:handler (:handler metrics)}]
["/assets" {:middleware [(:middleware session)]}
["/by-id/:id" {:handler (:objects-handler assets)}]
["/by-file-media-id/:id" {:handler (:file-objects-handler assets)}]
["/by-file-media-id/:id/thumbnail" {:handler (:file-thumbnails-handler assets)}]]
(:debug-routes cfg)
(::mtx/routes cfg)
(::assets/routes cfg)
(::debug/routes cfg)
["/webhooks"
["/sns" {:handler (:awsns-handler cfg)
:allowed-methods #{:post}}]]
(::awsns/routes cfg)]
["/ws/notifications" {:middleware [(:middleware session)]
:handler ws
:allowed-methods #{:get}}]
["/api" {:middleware [[middleware/cors]
[(:middleware session)]]}
["/audit/events" {:handler (:audit-handler cfg)
:allowed-methods #{:post}}]
["/feedback" {:handler feedback
:allowed-methods #{:post}}]
(:doc-routes cfg)
(:oidc-routes cfg)
(:rpc-routes cfg)]]]))
(::ws/routes cfg)
["/api" {:middleware [[mw/cors]]}
(::oidc/routes cfg)
(::rpc.doc/routes cfg)
(::rpc/routes cfg)]]]))

View File

@@ -0,0 +1,84 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.http.access-token
(:require
[app.common.logging :as l]
[app.config :as cf]
[app.db :as db]
[app.main :as-alias main]
[app.tokens :as tokens]
[yetti.request :as yrq]))
(def header-re #"^Token\s+(.*)")
(defn- get-token
[request]
(some->> (yrq/get-header request "authorization")
(re-matches header-re)
(second)))
(defn- decode-token
[props token]
(when token
(tokens/verify props {:token token :iss "access-token"})))
(def sql:get-token-data
"SELECT perms, profile_id, expires_at
FROM access_token
WHERE id = ?
AND (expires_at IS NULL
OR (expires_at > now()));")
(defn- get-token-data
[pool token-id]
(when-not (db/read-only? pool)
(some-> (db/exec-one! pool [sql:get-token-data token-id])
(update :perms db/decode-pgarray #{}))))
(defn- wrap-soft-auth
"Soft Authentication, will be executed synchronously on the undertow
worker thread."
[handler {:keys [::main/props]}]
(letfn [(handle-request [request]
(try
(let [token (get-token request)
claims (decode-token props token)]
(cond-> request
(map? claims)
(assoc ::id (:tid claims))))
(catch Throwable cause
(l/trace :hint "exception on decoding malformed token" :cause cause)
request)))]
(fn [request respond raise]
(let [request (handle-request request)]
(handler request respond raise)))))
(defn- wrap-authz
"Authorization middleware, will be executed synchronously on vthread."
[handler {:keys [::db/pool]}]
(fn [request]
(let [{:keys [perms profile-id expires-at]} (some->> (::id request) (get-token-data pool))]
(handler (cond-> request
(some? perms)
(assoc ::perms perms)
(some? profile-id)
(assoc ::profile-id profile-id)
(some? expires-at)
(assoc ::expires-at expires-at))))))
(def soft-auth
{:name ::soft-auth
:compile (fn [& _]
(when (contains? cf/flags :access-tokens)
wrap-soft-auth))})
(def authz
{:name ::authz
:compile (fn [& _]
(when (contains? cf/flags :access-tokens)
wrap-authz))})

View File

@@ -2,24 +2,21 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.http.assets
"Assets related handlers."
(:require
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.spec :as us]
[app.common.uri :as u]
[app.db :as db]
[app.metrics :as mtx]
[app.storage :as sto]
[app.util.time :as dt]
[app.worker :as wrk]
[clojure.spec.alpha :as s]
[integrant.core :as ig]
[promesa.core :as p]
[promesa.exec :as px]
[yetti.response :as yrs]))
[yetti.response :as-alias yrs]))
(def ^:private cache-max-age
(dt/duration {:hours 24}))
@@ -27,111 +24,87 @@
(def ^:private signature-max-age
(dt/duration {:hours 24 :minutes 15}))
(defn coerce-id
[id]
(let [res (parse-uuid id)]
(when-not (uuid? res)
(defn get-id
[{:keys [path-params]}]
(or (some-> path-params :id d/parse-uuid)
(ex/raise :type :not-found
:hint "object not found"))
res))
:hunt "object not found")))
(defn- get-file-media-object
[{:keys [pool executor] :as storage} id]
(px/with-dispatch executor
(let [id (coerce-id id)
mobj (db/exec-one! pool ["select * from file_media_object where id=?" id])]
(when-not mobj
(ex/raise :type :not-found
:hint "object does not found"))
mobj)))
[pool id]
(db/get pool :file-media-object {:id id}))
(defn- serve-object-from-s3
[{:keys [::sto/storage] :as cfg} obj]
(let [{:keys [host port] :as url} (sto/get-object-url storage obj {:max-age signature-max-age})]
{::yrs/status 307
::yrs/headers {"location" (str url)
"x-host" (cond-> host port (str ":" port))
"x-mtype" (-> obj meta :content-type)
"cache-control" (str "max-age=" (inst-ms cache-max-age))}}))
(defn- serve-object-from-fs
[{:keys [::path]} obj]
(let [purl (u/join (u/uri path)
(sto/object->relative-path obj))
mdata (meta obj)
headers {"x-accel-redirect" (:path purl)
"content-type" (:content-type mdata)
"cache-control" (str "max-age=" (inst-ms cache-max-age))}]
{::yrs/status 204
::yrs/headers headers}))
(defn- serve-object
"Helper function that returns the appropriate response depending on
the storage object backend type."
[{:keys [storage] :as cfg} obj]
(let [mdata (meta obj)
backend (sto/resolve-backend storage (:backend obj))]
(case (:type backend)
:db
(p/let [body (sto/get-object-bytes storage obj)]
(yrs/response :status 200
:body body
:headers {"content-type" (:content-type mdata)
"cache-control" (str "max-age=" (inst-ms cache-max-age))}))
:s3
(p/let [{:keys [host port] :as url} (sto/get-object-url storage obj {:max-age signature-max-age})]
(yrs/response :status 307
:headers {"location" (str url)
"x-host" (cond-> host port (str ":" port))
"cache-control" (str "max-age=" (inst-ms cache-max-age))}))
:fs
(p/let [purl (u/uri (:assets-path cfg))
purl (u/join purl (sto/object->relative-path obj))]
(yrs/response :status 204
:headers {"x-accel-redirect" (:path purl)
"content-type" (:content-type mdata)
"cache-control" (str "max-age=" (inst-ms cache-max-age))})))))
[{:keys [::sto/storage] :as cfg} {:keys [backend] :as obj}]
(let [backend (sto/resolve-backend storage backend)]
(case (::sto/type backend)
:s3 (serve-object-from-s3 cfg obj)
:fs (serve-object-from-fs cfg obj))))
(defn objects-handler
"Handler that servers storage objects by id."
[{:keys [storage executor] :as cfg} request respond raise]
(-> (px/with-dispatch executor
(p/let [id (get-in request [:path-params :id])
id (coerce-id id)
obj (sto/get-object storage id)]
(if obj
(serve-object cfg obj)
(yrs/response 404))))
(p/bind p/wrap)
(p/then' respond)
(p/catch raise)))
[{:keys [::sto/storage] :as cfg} request]
(let [id (get-id request)
obj (sto/get-object storage id)]
(if obj
(serve-object cfg obj)
{::yrs/status 404})))
(defn- generic-handler
"A generic handler helper/common code for file-media based handlers."
[{:keys [storage] :as cfg} request kf]
(p/let [id (get-in request [:path-params :id])
mobj (get-file-media-object storage id)
obj (sto/get-object storage (kf mobj))]
(if obj
(serve-object cfg obj)
(yrs/response 404))))
[{:keys [::sto/storage] :as cfg} request kf]
(let [pool (::db/pool storage)
id (get-id request)
mobj (get-file-media-object pool id)
sobj (sto/get-object storage (kf mobj))]
(if sobj
(serve-object cfg sobj)
{::yrs/status 404})))
(defn file-objects-handler
"Handler that serves storage objects by file media id."
[cfg request respond raise]
(-> (generic-handler cfg request :media-id)
(p/then respond)
(p/catch raise)))
[cfg request]
(generic-handler cfg request :media-id))
(defn file-thumbnails-handler
"Handler that serves storage objects by thumbnail-id and quick
fallback to file-media-id if no thumbnail is available."
[cfg request respond raise]
(-> (generic-handler cfg request #(or (:thumbnail-id %) (:media-id %)))
(p/then respond)
(p/catch raise)))
[cfg request]
(generic-handler cfg request #(or (:thumbnail-id %) (:media-id %))))
;; --- Initialization
(s/def ::storage some?)
(s/def ::assets-path ::us/string)
(s/def ::cache-max-age ::dt/duration)
(s/def ::signature-max-age ::dt/duration)
(s/def ::path ::us/string)
(s/def ::routes vector?)
(defmethod ig/pre-init-spec ::handlers [_]
(s/keys :req-un [::storage
::wrk/executor
::mtx/metrics
::assets-path
::cache-max-age
::signature-max-age]))
(defmethod ig/pre-init-spec ::routes [_]
(s/keys :req [::sto/storage ::path]))
(defmethod ig/init-key ::handlers
(defmethod ig/init-key ::routes
[_ cfg]
{:objects-handler (partial objects-handler cfg)
:file-objects-handler (partial file-objects-handler cfg)
:file-thumbnails-handler (partial file-thumbnails-handler cfg)})
["/assets"
["/by-id/:id" {:handler (partial objects-handler cfg)}]
["/by-file-media-id/:id" {:handler (partial file-objects-handler cfg)}]
["/by-file-media-id/:id/thumbnail" {:handler (partial file-thumbnails-handler cfg)}]])

View File

@@ -2,7 +2,7 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.http.awsns
"AWS SNS webhook handler for bounces."
@@ -11,33 +11,40 @@
[app.common.logging :as l]
[app.db :as db]
[app.db.sql :as sql]
[app.http.client :as http]
[app.main :as-alias main]
[app.tokens :as tokens]
[app.worker :as-alias wrk]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig]
[jsonista.core :as j]
[promesa.exec :as px]
[yetti.request :as yrq]
[yetti.response :as yrs]))
[yetti.response :as-alias yrs]))
(declare parse-json)
(declare handle-request)
(declare parse-notification)
(declare process-report)
(s/def ::http-client fn?)
(defmethod ig/pre-init-spec ::routes [_]
(s/keys :req [::http/client
::main/props
::db/pool
::wrk/executor]))
(defmethod ig/pre-init-spec ::handler [_]
(s/keys :req-un [::db/pool ::http-client]))
(defmethod ig/init-key ::handler
[_ {:keys [executor] :as cfg}]
(fn [request respond _]
(let [data (-> request yrq/body slurp)]
(px/run! executor #(handle-request cfg data)))
(respond (yrs/response 200))))
(defmethod ig/init-key ::routes
[_ {:keys [::wrk/executor] :as cfg}]
(letfn [(handler [request]
(let [data (-> request yrq/body slurp)]
(px/run! executor #(handle-request cfg data)))
{::yrs/status 200})]
["/sns" {:handler handler
:allowed-methods #{:post}}]))
(defn handle-request
[{:keys [http-client] :as cfg} data]
[cfg data]
(try
(let [body (parse-json data)
mtype (get body "Type")]
@@ -46,7 +53,7 @@
(let [surl (get body "SubscribeURL")
stopic (get body "TopicArn")]
(l/info :action "subscription received" :topic stopic :url surl)
(http-client {:uri surl :method :post :timeout 10000} {:sync? true}))
(http/req! cfg {:uri surl :method :post :timeout 10000} {:sync? true}))
(= mtype "Notification")
(when-let [message (parse-json (get body "Message"))]
@@ -97,10 +104,10 @@
(get mail "headers")))
(defn- extract-identity
[{:keys [tokens] :as cfg} headers]
[cfg headers]
(let [tdata (get headers "x-penpot-data")]
(when-not (str/empty? tdata)
(let [result (tokens :verify {:token tdata :iss :profile-identity})]
(let [result (tokens/verify (::main/props cfg) {:token tdata :iss :profile-identity})]
(:profile-id result)))))
(defn- parse-notification
@@ -133,7 +140,7 @@
(j/read-value v)))
(defn- register-bounce-for-profile
[{:keys [pool]} {:keys [type kind profile-id] :as report}]
[{:keys [::db/pool]} {:keys [type kind profile-id] :as report}]
(when (= kind "permanent")
(db/with-atomic [conn pool]
(db/insert! conn :profile-complaint-report
@@ -162,7 +169,7 @@
{:id profile-id}))))))
(defn- register-complaint-for-profile
[{:keys [pool]} {:keys [type profile-id] :as report}]
[{:keys [::db/pool]} {:keys [type profile-id] :as report}]
(db/with-atomic [conn pool]
(db/insert! conn :profile-complaint-report
{:profile-id profile-id

View File

@@ -2,29 +2,63 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.http.client
"Http client abstraction layer."
(:require
[app.common.spec :as us]
[app.worker :as wrk]
[clojure.spec.alpha :as s]
[integrant.core :as ig]
[java-http-clj.core :as http]))
[java-http-clj.core :as http]
[promesa.core :as p])
(:import
java.net.http.HttpClient))
(defmethod ig/pre-init-spec :app.http/client [_]
(s/keys :req-un [::wrk/executor]))
(s/def ::client #(instance? HttpClient %))
(s/def ::client-holder
(s/keys :req [::client]))
(defmethod ig/pre-init-spec ::client [_]
(s/keys :req [::wrk/executor]))
(defmethod ig/init-key ::client
[_ {:keys [::wrk/executor] :as cfg}]
(http/build-client {:executor executor
:connect-timeout 30000 ;; 10s
:follow-redirects :always}))
(defn send!
([client req] (send! client req {}))
([client req {:keys [response-type sync?] :or {response-type :string sync? false}}]
(us/assert! ::client client)
(if sync?
(http/send req {:client client :as response-type})
(try
(http/send-async req {:client client :as response-type})
(catch Throwable cause
(p/rejected cause))))))
(defn- resolve-client
[params]
(cond
(instance? HttpClient params)
params
(map? params)
(resolve-client (::client params))
:else
(throw (UnsupportedOperationException. "invalid arguments"))))
(defn req!
"A convencience toplevel function for gradual migration to a new API
convention."
([cfg-or-client request]
(let [client (resolve-client cfg-or-client)]
(send! client request {})))
([cfg-or-client request options]
(let [client (resolve-client cfg-or-client)]
(send! client request options))))
(defmethod ig/init-key :app.http/client
[_ {:keys [executor] :as cfg}]
(let [client (http/build-client {:executor executor
:connect-timeout 30000 ;; 10s
:follow-redirects :always})]
(with-meta
(fn send
([req] (send req {}))
([req {:keys [response-type sync?] :or {response-type :string sync? false}}]
(if sync?
(http/send req {:client client :as response-type})
(http/send-async req {:client client :as response-type}))))
{::client client})))

View File

@@ -2,28 +2,28 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.http.debug
(:refer-clojure :exclude [error-handler])
(:require
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.pprint :as pp]
[app.common.uuid :as uuid]
[app.config :as cf]
[app.db :as db]
[app.http.middleware :as mw]
[app.http.session :as session]
[app.rpc.commands.binfile :as binf]
[app.rpc.mutations.files :refer [create-file]]
[app.rpc.queries.profile :as profile]
[app.rpc.commands.files-create :refer [create-file]]
[app.rpc.commands.profile :as profile]
[app.storage :as-alias sto]
[app.util.blob :as blob]
[app.util.bytes :as bs]
[app.util.template :as tmpl]
[app.util.time :as dt]
[app.worker :as wrk]
[clojure.java.io :as io]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[datoteka.io :as io]
[emoji.core :as emj]
[integrant.core :as ig]
[markdown.core :as md]
@@ -38,36 +38,40 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn authorized?
[pool {:keys [profile-id]}]
[pool {:keys [::session/profile-id]}]
(or (= "devenv" (cf/get :host))
(let [profile (ex/ignoring (profile/retrieve-profile-data pool profile-id))
(let [profile (ex/ignoring (profile/get-profile pool profile-id))
admins (or (cf/get :admins) #{})]
(contains? admins (:email profile)))))
(defn prepare-response
[body]
(let [headers {"content-type" "application/transit+json"}]
(yrs/response :status 200 :body body :headers headers)))
{::yrs/status 200
::yrs/body body
::yrs/headers headers}))
(defn prepare-download-response
[body filename]
(let [headers {"content-disposition" (str "attachment; filename=" filename)
"content-type" "application/octet-stream"}]
(yrs/response :status 200 :body body :headers headers)))
{::yrs/status 200
::yrs/body body
::yrs/headers headers}))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; INDEX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn index-handler
[{:keys [pool]} request]
[{:keys [::db/pool]} request]
(when-not (authorized? pool request)
(ex/raise :type :authentication
:code :only-admins-allowed))
(yrs/response :status 200
:headers {"content-type" "text/html"}
:body (-> (io/resource "templates/debug.tmpl")
(tmpl/render {}))))
{::yrs/status 200
::yrs/headers {"content-type" "text/html"}
::yrs/body (-> (io/resource "app/templates/debug.tmpl")
(tmpl/render {}))})
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; FILE CHANGES
@@ -80,7 +84,7 @@
"select revn, changes, data from file_change where file_id=? and revn = ?")
(defn- retrieve-file-data
[{:keys [pool]} {:keys [params profile-id] :as request}]
[{:keys [::db/pool]} {:keys [params ::session/profile-id] :as request}]
(when-not (authorized? pool request)
(ex/raise :type :authentication
:code :only-admins-allowed))
@@ -106,17 +110,19 @@
(prepare-download-response data filename)
(contains? params :clone)
(let [project-id (some-> (profile/retrieve-additional-data pool profile-id) :default-project-id)
data (some-> data blob/decode)]
(let [profile (profile/get-profile pool profile-id)
project-id (:default-project-id profile)
data (blob/decode data)]
(create-file pool {:id (uuid/next)
:name (str "Cloned file: " filename)
:project-id project-id
:profile-id profile-id
:data data})
(yrs/response 201 "OK CREATED"))
{::yrs/status 201
::yrs/body "OK CREATED"})
:else
(prepare-response (some-> data blob/decode))))))
(prepare-response (blob/decode data))))))
(defn- is-file-exists?
[pool id]
@@ -124,9 +130,10 @@
(-> (db/exec-one! pool [sql id]) :exists)))
(defn- upload-file-data
[{:keys [pool]} {:keys [profile-id params] :as request}]
(let [project-id (some-> (profile/retrieve-additional-data pool profile-id) :default-project-id)
data (some-> params :file :path bs/read-as-bytes blob/decode)]
[{:keys [::db/pool]} {:keys [::session/profile-id params] :as request}]
(let [profile (profile/get-profile pool profile-id)
project-id (:default-project-id profile)
data (some-> params :file :path io/read-as-bytes blob/decode)]
(if (and data project-id)
(let [fname (str "Imported file *: " (dt/now))
@@ -140,7 +147,8 @@
(db/update! pool :file
{:data (blob/encode data)}
{:id file-id})
(yrs/response 200 "OK UPDATED"))
{::yrs/status 200
::yrs/body "OK UPDATED"})
(do
(create-file pool {:id file-id
@@ -148,9 +156,11 @@
:project-id project-id
:profile-id profile-id
:data data})
(yrs/response 201 "OK CREATED"))))
{::yrs/status 201
::yrs/body "OK CREATED"})))
(yrs/response 500 "ERROR"))))
{::yrs/status 500
::yrs/body "ERROR"})))
(defn file-data-handler
[cfg request]
@@ -161,7 +171,7 @@
:code :method-not-found)))
(defn file-changes-handler
[{:keys [pool]} {:keys [params] :as request}]
[{:keys [::db/pool]} {:keys [params] :as request}]
(when-not (authorized? pool request)
(ex/raise :type :authentication
:code :only-admins-allowed))
@@ -201,69 +211,82 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn error-handler
[{:keys [pool]} request]
(letfn [(parse-id [request]
(let [id (get-in request [:path-params :id])
id (parse-uuid id)]
(when (uuid? id)
id)))
(retrieve-report [id]
[{:keys [::db/pool]} request]
(letfn [(get-report [{:keys [path-params]}]
(ex/ignoring
(some-> (db/get-by-id pool :server-error-report id) :content db/decode-transit-pgobject)))
(let [report-id (some-> path-params :id parse-uuid)]
(some-> (db/get-by-id pool :server-error-report report-id)
(update :content db/decode-transit-pgobject)))))
(render-template [report]
(let [context (dissoc report
:trace :cause :params :data :spec-problems
(render-template-v1 [{:keys [content]}]
(let [context (dissoc content
:trace :cause :params :data :spec-problems :message
:spec-explain :spec-value :error :explain :hint)
params {:context (pp/pprint-str context :width 200)
:hint (:hint report)
:spec-explain (:spec-explain report)
:spec-problems (:spec-problems report)
:spec-value (:spec-value report)
:data (:data report)
:trace (or (:trace report)
(some-> report :error :trace))
:params (:params report)}]
(-> (io/resource "templates/error-report.tmpl")
(tmpl/render params))))]
:hint (:hint content)
:spec-explain (:spec-explain content)
:spec-problems (:spec-problems content)
:spec-value (:spec-value content)
:data (:data content)
:trace (or (:trace content)
(some-> content :error :trace))
:params (:params content)}]
(-> (io/resource "app/templates/error-report.tmpl")
(tmpl/render params))))
(render-template-v2 [{report :content}]
(-> (io/resource "app/templates/error-report.v2.tmpl")
(tmpl/render report)))
(render-template-v3 [{:keys [content id created-at]}]
(-> (io/resource "app/templates/error-report.v3.tmpl")
(tmpl/render (-> content
(assoc :id id)
(assoc :created-at (dt/format-instant created-at :rfc1123))))))
]
(when-not (authorized? pool request)
(ex/raise :type :authentication
:code :only-admins-allowed))
(let [result (some-> (parse-id request)
(retrieve-report)
(render-template))]
(if result
(yrs/response :status 200
:body result
:headers {"content-type" "text/html; charset=utf-8"
"x-robots-tag" "noindex"})
(yrs/response 404 "not found")))))
(if-let [report (get-report request)]
(let [result (case (:version report)
1 (render-template-v1 report)
2 (render-template-v2 report)
3 (render-template-v3 report))]
{::yrs/status 200
::yrs/body result
::yrs/headers {"content-type" "text/html; charset=utf-8"
"x-robots-tag" "noindex"}})
{::yrs/status 404
::yrs/body "not found"})))
(def sql:error-reports
"select id, created_at from server_error_report order by created_at desc limit 100")
"SELECT id, created_at,
content->>'~:hint' AS hint
FROM server_error_report
ORDER BY created_at DESC
LIMIT 200")
(defn error-list-handler
[{:keys [pool]} request]
[{:keys [::db/pool]} request]
(when-not (authorized? pool request)
(ex/raise :type :authentication
:code :only-admins-allowed))
(let [items (db/exec! pool [sql:error-reports])
items (map #(update % :created-at dt/format-instant :rfc1123) items)]
(yrs/response :status 200
:body (-> (io/resource "templates/error-list.tmpl")
(tmpl/render {:items items}))
:headers {"content-type" "text/html; charset=utf-8"
"x-robots-tag" "noindex"})))
(let [items (->> (db/exec! pool [sql:error-reports])
(map #(update % :created-at dt/format-instant :rfc1123)))]
{::yrs/status 200
::yrs/body (-> (io/resource "app/templates/error-list.tmpl")
(tmpl/render {:items items}))
::yrs/headers {"content-type" "text/html; charset=utf-8"
"x-robots-tag" "noindex"}}))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; EXPORT/IMPORT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn export-handler
[{:keys [pool] :as cfg} {:keys [params profile-id] :as request}]
[{:keys [::db/pool] :as cfg} {:keys [params ::session/profile-id] :as request}]
(let [file-ids (->> (:file-ids params)
(remove empty?)
@@ -280,9 +303,10 @@
(assoc ::binf/file-ids file-ids)
(assoc ::binf/embed-assets? embed?)
(assoc ::binf/include-libraries? libs?)
(binf/export!))]
(binf/export-to-tmpfile!))]
(if clone?
(let [project-id (some-> (profile/retrieve-additional-data pool profile-id) :default-project-id)]
(let [profile (profile/get-profile pool profile-id)
project-id (:default-project-id profile)]
(binf/import!
(assoc cfg
::binf/input path
@@ -291,28 +315,28 @@
::binf/profile-id profile-id
::binf/project-id project-id))
(yrs/response
:status 200
:headers {"content-type" "text/plain"}
:body "OK CLONED"))
{::yrs/status 200
::yrs/headers {"content-type" "text/plain"}
::yrs/body "OK CLONED"})
{::yrs/status 200
::yrs/body (io/input-stream path)
::yrs/headers {"content-type" "application/octet-stream"
"content-disposition" (str "attachmen; filename=" (first file-ids) ".penpot")}}))))
(yrs/response
:status 200
:headers {"content-type" "application/octet-stream"
"content-disposition" (str "attachmen; filename=" (first file-ids) ".penpot")}
:body (io/input-stream path))))))
(defn import-handler
[{:keys [pool] :as cfg} {:keys [params profile-id] :as request}]
[{:keys [::db/pool] :as cfg} {:keys [params ::session/profile-id] :as request}]
(when-not (contains? params :file)
(ex/raise :type :validation
:code :missing-upload-file
:hint "missing upload file"))
(let [project-id (some-> (profile/retrieve-additional-data pool profile-id) :default-project-id)
(let [profile (profile/get-profile pool profile-id)
project-id (:default-project-id profile)
overwrite? (contains? params :overwrite)
migrate? (contains? params :migrate)
migrate? (contains? params :migrate)
ignore-index-errors? (contains? params :ignore-index-errors)]
(when-not project-id
@@ -329,10 +353,9 @@
::binf/profile-id profile-id
::binf/project-id project-id))
(yrs/response
:status 200
:headers {"content-type" "text/plain"}
:body "OK")))
{::yrs/status 200
::yrs/headers {"content-type" "text/plain"}
::yrs/body "OK"}))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; OTHER SMALL VIEWS/HANDLERS
@@ -340,10 +363,16 @@
(defn health-handler
"Mainly a task that performs a health check."
[{:keys [pool]} _]
(db/with-atomic [conn pool]
(db/exec-one! conn ["select count(*) as count from server_prop;"])
(yrs/response 200 "OK")))
[{:keys [::db/pool]} _]
(try
(db/exec-one! pool ["select count(*) as count from server_prop;"])
{::yrs/status 200
::yrs/body "OK"}
(catch Throwable cause
(l/warn :hint "unable to execute query on health handler"
:cause cause)
{::yrs/status 503
::yrs/body "KO"})))
(defn changelog-handler
[_ _]
@@ -352,10 +381,11 @@
(md->html [text]
(md/md-to-html-string text :replacement-transformers (into [transform-emoji] mdt/transformer-vector)))]
(if-let [clog (io/resource "changelog.md")]
(yrs/response :status 200
:headers {"content-type" "text/html; charset=utf-8"}
:body (-> clog slurp md->html))
(yrs/response :status 404 :body "NOT FOUND"))))
{::yrs/status 200
::yrs/headers {"content-type" "text/html; charset=utf-8"}
::yrs/body (-> clog slurp md->html)}
{::yrs/status 404
::yrs/body "NOT FOUND"})))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; INIT
@@ -365,31 +395,26 @@
{:compile
(fn [& _]
(fn [handler pool]
(fn [request respond raise]
(fn [request]
(if (authorized? pool request)
(handler request respond raise)
(raise (ex/error :type :authentication
:code :only-admins-allowed))))))})
(s/def ::session map?)
(handler request)
(ex/raise :type :authentication
:code :only-admins-allowed)))))})
(defmethod ig/pre-init-spec ::routes [_]
(s/keys :req-un [::db/pool ::wrk/executor ::session]))
(s/keys :req [::db/pool ::session/manager]))
(defmethod ig/init-key ::routes
[_ {:keys [session pool executor] :as cfg}]
["/dbg" {:middleware [[(:middleware session)]
[with-authorization pool]
[mw/with-promise-async executor]
[mw/with-config cfg]]}
["" {:handler index-handler}]
["/health" {:handler health-handler}]
["/changelog" {:handler changelog-handler}]
;; ["/error-by-id/:id" {:handler error-handler}]
["/error/:id" {:handler error-handler}]
["/error" {:handler error-list-handler}]
["/file/export" {:handler export-handler}]
["/file/import" {:handler import-handler}]
["/file/data" {:handler file-data-handler}]
["/file/changes" {:handler file-changes-handler}]])
[_ {:keys [::db/pool] :as cfg}]
[["/readyz" {:handler (partial health-handler cfg)}]
["/dbg" {:middleware [[session/authz cfg]
[with-authorization pool]]}
["" {:handler (partial index-handler cfg)}]
["/health" {:handler (partial health-handler cfg)}]
["/changelog" {:handler (partial changelog-handler cfg)}]
["/error/:id" {:handler (partial error-handler cfg)}]
["/error" {:handler (partial error-list-handler cfg)}]
["/file/export" {:handler (partial export-handler cfg)}]
["/file/import" {:handler (partial import-handler cfg)}]
["/file/data" {:handler (partial file-data-handler cfg)}]
["/file/changes" {:handler (partial file-changes-handler cfg)}]]])

View File

@@ -2,39 +2,43 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.http.errors
"A errors handling for the http server."
(:require
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.spec :as us]
[app.common.schema :as sm]
[app.config :as cf]
[app.http :as-alias http]
[app.http.access-token :as-alias actoken]
[app.http.session :as-alias session]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[yetti.request :as yrq]
[yetti.response :as yrs]))
(def ^:dynamic *context* {})
(defn- parse-client-ip
[request]
(or (some-> (yrq/get-header request "x-forwarded-for") (str/split ",") first)
(yrq/get-header request "x-real-ip")
(yrq/remote-addr request)))
(defn get-context
(defn request->context
"Extracts error report relevant context data from request."
[request]
(merge
*context*
{:path (:path request)
:method (:method request)
:params (:params request)
:ip-addr (parse-client-ip request)
:profile-id (:profile-id request)}
(let [headers (:headers request)]
{:user-agent (get headers "user-agent")
:frontend-version (get headers "x-frontend-version" "unknown")})))
(let [claims (-> {}
(into (::session/token-claims request))
(into (::actoken/token-claims request)))]
{:request/path (:path request)
:request/method (:method request)
:request/params (:params request)
:request/user-agent (yrq/get-header request "user-agent")
:request/ip-addr (parse-client-ip request)
:request/profile-id (:uid claims)
:version/frontend (or (yrq/get-header request "x-frontend-version") "unknown")
:version/backend (:full cf/version)}))
(defmulti handle-exception
(fn [err & _rest]
@@ -44,69 +48,135 @@
(defmethod handle-exception :authentication
[err _]
(yrs/response 401 (ex-data err)))
{::yrs/status 401
::yrs/body (ex-data err)})
(defmethod handle-exception :authorization
[err _]
{::yrs/status 403
::yrs/body (ex-data err)})
(defmethod handle-exception :restriction
[err _]
(yrs/response 400 (ex-data err)))
{::yrs/status 400
::yrs/body (ex-data err)})
(defmethod handle-exception :rate-limit
[err _]
(let [headers (-> err ex-data ::http/headers)]
{::yrs/status 429
::yrs/headers headers}))
(defmethod handle-exception :concurrency-limit
[err _]
(let [headers (-> err ex-data ::http/headers)]
{::yrs/status 429
::yrs/headers headers}))
(defmethod handle-exception :validation
[err _]
[err request]
(let [{:keys [code] :as data} (ex-data err)]
(cond
(= code :spec-validation)
(let [explain (us/pretty-explain data)]
(yrs/response :status 400
:body (-> data
(dissoc ::s/problems ::s/value)
(cond-> explain (assoc :explain explain)))))
(let [explain (ex/explain data)]
{::yrs/status 400
::yrs/body (-> data
(dissoc ::s/problems ::s/value ::s/spec)
(cond-> explain (assoc :explain explain)))})
(= code :params-validation)
(let [explain (::sm/explain data)
payload (sm/humanize-data explain)]
{::yrs/status 400
::yrs/body (-> data
(dissoc ::sm/explain)
(assoc :data payload))})
(= code :request-body-too-large)
(yrs/response :status 413 :body data)
{::yrs/status 413 ::yrs/body data}
(= code :invalid-image)
(binding [l/*context* (request->context request)]
(l/error :hint "unexpected error on processing image" :cause err)
{::yrs/status 400 ::yrs/body data})
:else
(yrs/response :status 400 :body data))))
{::yrs/status 400 ::yrs/body data})))
(defmethod handle-exception :assertion
[error request]
(let [edata (ex-data error)
explain (us/pretty-explain edata)]
(l/error ::l/raw (str (ex-message error) "\n" explain)
::l/context (get-context request)
:cause error)
(yrs/response :status 500
:body {:type :server-error
:code :assertion
:data (-> edata
(dissoc ::s/problems ::s/value ::s/spec)
(cond-> explain (assoc :explain explain)))})))
(binding [l/*context* (request->context request)]
(let [{:keys [code] :as data} (ex-data error)]
(cond
(= code :data-validation)
(let [explain (::sm/explain data)
payload (sm/humanize-data explain)]
(l/error :hint "Data assertion error" :message (ex-message error) :cause error)
{::yrs/status 500
::yrs/body {:type :server-error
:code :assertion
:data (-> data
(dissoc ::sm/explain)
(assoc :data payload))}})
(= code :spec-validation)
(let [explain (ex/explain data)]
(l/error :hint "Spec assertion error" :message (ex-message error) :cause error)
{::yrs/status 500
::yrs/body {:type :server-error
:code :assertion
:data (-> data
(dissoc ::s/problems ::s/value ::s/spec)
(cond-> explain (assoc :explain explain)))}})
:else
(do
(l/error :hint "Assertion error" :message (ex-message error) :cause error)
{::yrs/status 500
::yrs/body {:type :server-error
:code :assertion
:data data}})))))
(defmethod handle-exception :not-found
[err _]
(yrs/response 404 (ex-data err)))
{::yrs/status 404
::yrs/body (ex-data err)})
(defmethod handle-exception :internal
[error request]
(binding [l/*context* (request->context request)]
(l/error :hint "Internal error" :message (ex-message error) :cause error)
{::yrs/status 500
::yrs/body {:type :server-error
:code :unhandled
:hint (ex-message error)
:data (ex-data error)}}))
(defmethod handle-exception org.postgresql.util.PSQLException
[error request]
(let [state (.getSQLState ^java.sql.SQLException error)]
(l/error ::l/raw (ex-message error)
::l/context (get-context request)
:cause error)
(cond
(= state "57014")
(yrs/response 504 {:type :server-error
:code :statement-timeout
:hint (ex-message error)})
(binding [l/*context* (request->context request)]
(l/error :hint "PSQL error" :message (ex-message error) :cause error)
(cond
(= state "57014")
{::yrs/status 504
::yrs/body {:type :server-error
:code :statement-timeout
:hint (ex-message error)}}
(= state "25P03")
(yrs/response 504 {:type :server-error
:code :idle-in-transaction-timeout
:hint (ex-message error)})
(= state "25P03")
{::yrs/status 504
::yrs/body {:type :server-error
:code :idle-in-transaction-timeout
:hint (ex-message error)}}
:else
(yrs/response 500 {:type :server-error
:code :unexpected
:hint (ex-message error)
:state state}))))
:else
{::yrs/status 500
::yrs/body {:type :server-error
:code :unexpected
:hint (ex-message error)
:state state}}))))
(defmethod handle-exception :default
[error request]
@@ -114,13 +184,12 @@
(cond
;; This means that exception is not a controlled exception.
(nil? edata)
(do
(l/error ::l/raw (ex-message error)
::l/context (get-context request)
:cause error)
(yrs/response 500 {:type :server-error
:code :unexpected
:hint (ex-message error)}))
(binding [l/*context* (request->context request)]
(l/error :hint "Unexpected error" :message (ex-message error) :cause error)
{::yrs/status 500
::yrs/body {:type :server-error
:code :unexpected
:hint (ex-message error)}})
;; This is a special case for the idle-in-transaction error;
;; when it happens, the connection is automatically closed and
@@ -132,27 +201,17 @@
(handle-exception (:handling edata) request)
:else
(do
(l/error ::l/raw (ex-message error)
::l/context (get-context request)
:cause error)
(yrs/response 500 {:type :server-error
:code :unhandled
:hint (ex-message error)
:data edata})))))
(binding [l/*context* (request->context request)]
(l/error :hint "Unhandled error" :message (ex-message error) :cause error)
{::yrs/status 500
::yrs/body {:type :server-error
:code :unhandled
:hint (ex-message error)
:data edata}}))))
(defn handle
[cause request]
(cond
(or (instance? java.util.concurrent.CompletionException cause)
(instance? java.util.concurrent.ExecutionException cause))
(handle-exception (.getCause ^Throwable cause) request)
(ex/wrapped? cause)
(let [context (meta cause)
cause (deref cause)]
(binding [*context* context]
(handle-exception cause request)))
:else
(if (or (instance? java.util.concurrent.CompletionException cause)
(instance? java.util.concurrent.ExecutionException cause))
(handle-exception (ex-cause cause) request)
(handle-exception cause request)))

View File

@@ -1,80 +0,0 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
(ns app.http.feedback
"A general purpose feedback module."
(:require
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.spec :as us]
[app.config :as cf]
[app.db :as db]
[app.emails :as eml]
[app.rpc.queries.profile :as profile]
[app.worker :as wrk]
[clojure.spec.alpha :as s]
[integrant.core :as ig]
[promesa.core :as p]
[promesa.exec :as px]
[yetti.request :as yrq]
[yetti.response :as yrs]))
(declare ^:private send-feedback)
(declare ^:private handler)
(defmethod ig/pre-init-spec ::handler [_]
(s/keys :req-un [::db/pool ::wrk/executor]))
(defmethod ig/init-key ::handler
[_ {:keys [executor] :as cfg}]
(let [enabled? (contains? cf/flags :user-feedback)]
(if enabled?
(fn [request respond raise]
(-> (px/submit! executor #(handler cfg request))
(p/then' respond)
(p/catch raise)))
(fn [_ _ raise]
(raise (ex/error :type :validation
:code :feedback-disabled
:hint "feedback module is disabled"))))))
(defn- handler
[{:keys [pool] :as cfg} {:keys [profile-id] :as request}]
(let [ftoken (cf/get :feedback-token ::no-token)
token (yrq/get-header request "x-feedback-token")
params (d/merge (:params request)
(:body-params request))]
(cond
(uuid? profile-id)
(let [profile (profile/retrieve-profile-data pool profile-id)
params (assoc params :from (:email profile))]
(send-feedback pool profile params))
(= token ftoken)
(send-feedback cfg nil params))
(yrs/response 204)))
(s/def ::content ::us/string)
(s/def ::from ::us/email)
(s/def ::subject ::us/string)
(s/def ::feedback
(s/keys :req-un [::from ::subject ::content]))
(defn- send-feedback
[pool profile params]
(let [params (us/conform ::feedback params)
destination (cf/get :feedback-destination)]
(eml/send! {::eml/conn pool
::eml/factory eml/feedback
:from destination
:to destination
:profile profile
:reply-to (:from params)
:email (:from params)
:subject (:subject params)
:content (:content params)})
nil))

View File

@@ -2,7 +2,7 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.http.middleware
(:require
@@ -14,15 +14,21 @@
[cuerdas.core :as str]
[promesa.core :as p]
[promesa.exec :as px]
[promesa.util :as pu]
[yetti.adapter :as yt]
[yetti.middleware :as ymw]
[yetti.request :as yrq]
[yetti.response :as yrs])
(:import
com.fasterxml.jackson.core.JsonParseException
com.fasterxml.jackson.core.io.JsonEOFException
com.fasterxml.jackson.databind.exc.MismatchedInputException
io.undertow.server.RequestTooBigException
java.io.InputStream
java.io.OutputStream))
(set! *warn-on-reflection* true)
(def server-timing
{:name ::server-timing
:compile (constantly ymw/wrap-server-timing)})
@@ -31,21 +37,27 @@
{:name ::params
:compile (constantly ymw/wrap-params)})
(def ^:private json-mapper
(json/mapper
{:encode-key-fn str/camel
:decode-key-fn (comp keyword str/kebab)
:pretty true}))
(defn wrap-parse-request
[handler]
(letfn [(process-request [request]
(let [header (yrq/get-header request "content-type")]
(cond
(str/starts-with? header "application/transit+json")
(with-open [is (yrq/body request)]
(with-open [^InputStream is (yrq/body request)]
(let [params (t/read! (t/reader is))]
(-> request
(assoc :body-params params)
(update :params merge params))))
(str/starts-with? header "application/json")
(with-open [is (yrq/body request)]
(let [params (json/read is)]
(with-open [^InputStream is (yrq/body request)]
(let [params (json/decode is json-mapper)]
(-> request
(assoc :body-params params)
(update :params merge params))))
@@ -55,25 +67,34 @@
(handle-error [raise cause]
(cond
(instance? RuntimeException cause)
(if-let [cause (ex-cause cause)]
(handle-error raise cause)
(raise cause))
(instance? RequestTooBigException cause)
(raise (ex/error :type :validation
:code :request-body-too-large
:hint (ex-message cause)))
(instance? JsonEOFException cause)
(or (instance? JsonEOFException cause)
(instance? JsonParseException cause)
(instance? MismatchedInputException cause))
(raise (ex/error :type :validation
:code :malformed-json
:hint (ex-message cause)))
:hint (ex-message cause)
:cause cause))
:else
(raise cause)))]
(fn [request respond raise]
(when-let [request (try
(process-request request)
(catch RuntimeException cause
(handle-error raise (or (.getCause cause) cause)))
(catch Throwable cause
(handle-error raise cause)))]
(if (= (yrq/method request) :post)
(let [request (ex/try! (process-request request))]
(if (ex/exception? request)
(handle-error raise request)
(handler request respond raise)))
(handler request respond raise)))))
(def parse-request
@@ -85,12 +106,7 @@
needed because transit-java calls flush very aggresivelly on each
object write."
[^java.io.OutputStream os ^long chunk-size]
(proxy [java.io.BufferedOutputStream] [os (int chunk-size)]
;; Explicitly do not forward flush
(flush [])
(close []
(proxy-super flush)
(proxy-super close))))
(yetti.util.BufferedOutputStream. os (int chunk-size)))
(def ^:const buffer-size (:xnio/buffer-size yt/defaults))
@@ -100,21 +116,42 @@
(reify yrs/StreamableResponseBody
(-write-body-to-stream [_ _ output-stream]
(try
(with-open [bos (buffered-output-stream output-stream buffer-size)]
(with-open [^OutputStream bos (buffered-output-stream output-stream buffer-size)]
(let [tw (t/writer bos opts)]
(t/write! tw data)))
(catch java.io.IOException _cause
;; Do nothing, EOF means client closes connection abruptly
nil)
(catch java.io.IOException _)
(catch Throwable cause
(l/warn :hint "unexpected error on encoding response"
:cause cause))
(binding [l/*context* {:value data}]
(l/error :hint "unexpected error on encoding response"
:cause cause)))
(finally
(.close ^OutputStream output-stream))))))
(format-response [response request]
(let [body (yrs/body response)]
(json-streamable-body [data]
(reify yrs/StreamableResponseBody
(-write-body-to-stream [_ _ output-stream]
(try
(with-open [^OutputStream bos (buffered-output-stream output-stream buffer-size)]
(json/write! bos data json-mapper))
(catch java.io.IOException _)
(catch Throwable cause
(binding [l/*context* {:value data}]
(l/error :hint "unexpected error on encoding response"
:cause cause)))
(finally
(.close ^OutputStream output-stream))))))
(format-response-with-json [response _]
(let [body (::yrs/body response)]
(if (or (boolean? body) (coll? body))
(-> response
(update ::yrs/headers assoc "content-type" "application/json")
(assoc ::yrs/body (json-streamable-body body)))
response)))
(format-response-with-transit [response request]
(let [body (::yrs/body response)]
(if (or (boolean? body) (coll? body))
(let [qs (yrq/query request)
opts (if (or (contains? cf/flags :transit-readable-response)
@@ -122,10 +159,29 @@
{:type :json-verbose}
{:type :json})]
(-> response
(update :headers assoc "content-type" "application/transit+json")
(assoc :body (transit-streamable-body body opts))))
(update ::yrs/headers assoc "content-type" "application/transit+json")
(assoc ::yrs/body (transit-streamable-body body opts))))
response)))
(format-from-params [{:keys [query-params] :as request}]
(and (= "json" (get query-params :_fmt))
"application/json"))
(format-response [response request]
(let [accept (or (format-from-params request)
(yrq/get-header request "accept"))]
(cond
(or (= accept "application/transit+json")
(str/includes? accept "application/transit+json"))
(format-response-with-transit response request)
(or (= accept "application/json")
(str/includes? accept "application/json"))
(format-response-with-json response request)
:else
(format-response-with-transit response request))))
(process-response [response request]
(cond-> response
(map? response) (format-response request)))]
@@ -133,8 +189,7 @@
(fn [request respond raise]
(handler request
(fn [response]
(let [response (process-response response request)]
(respond response)))
(respond (process-response response request)))
raise))))
(def format-response
@@ -143,72 +198,59 @@
(defn wrap-errors
[handler on-error]
(fn [request respond _]
(fn [request respond raise]
(handler request respond (fn [cause]
(-> cause (on-error request) respond)))))
(try
(respond (on-error cause request))
(catch Throwable cause
(raise cause)))))))
(def errors
{:name ::errors
:compile (constantly wrap-errors)})
(defn- with-cors-headers
[headers origin]
(-> headers
(assoc "access-control-allow-origin" origin)
(assoc "access-control-allow-methods" "GET,POST,DELETE,OPTIONS,PUT,HEAD,PATCH")
(assoc "access-control-allow-credentials" "true")
(assoc "access-control-expose-headers" "x-requested-with, content-type, cookie")
(assoc "access-control-allow-headers" "x-frontend-version, content-type, accept, x-requested-width")))
(defn wrap-cors
[handler]
(if-not (contains? cf/flags :cors)
handler
(letfn [(add-headers [headers request]
(let [origin (yrq/get-header request "origin")]
(-> headers
(assoc "access-control-allow-origin" origin)
(assoc "access-control-allow-methods" "GET,POST,DELETE,OPTIONS,PUT,HEAD,PATCH")
(assoc "access-control-allow-credentials" "true")
(assoc "access-control-expose-headers" "x-requested-with, content-type, cookie")
(assoc "access-control-allow-headers" "x-frontend-version, content-type, accept, x-requested-width"))))
(update-response [response request]
(update response :headers add-headers request))]
(fn [request respond raise]
(if (= (yrq/method request) :options)
(-> (yrs/response 200)
(update-response request)
(respond))
(handler request
(fn [response]
(respond (update-response response request)))
raise))))))
(fn [request]
(let [response (if (= (yrq/method request) :options)
{::yrs/status 200}
(handler request))
origin (yrq/get-header request "origin")]
(update response ::yrs/headers with-cors-headers origin))))
(def cors
{:name ::cors
:compile (constantly wrap-cors)})
(defn compile-restrict-methods
[data _]
(when-let [allowed (:allowed-methods data)]
(fn [handler]
(fn [request respond raise]
(let [method (yrq/method request)]
(if (contains? allowed method)
(handler request respond raise)
(respond (yrs/response 405))))))))
:compile (fn [& _]
(when (contains? cf/flags :cors)
wrap-cors))})
(def restrict-methods
{:name ::restrict-methods
:compile compile-restrict-methods})
:compile
(fn [data _]
(when-let [allowed (:allowed-methods data)]
(fn [handler]
(fn [request respond raise]
(let [method (yrq/method request)]
(if (contains? allowed method)
(handler request respond raise)
(respond {::yrs/status 405})))))))})
(def with-promise-async
{:compile
(def with-dispatch
{:name ::with-dispatch
:compile
(fn [& _]
(fn [handler executor]
(fn [request respond raise]
(-> (px/submit! executor #(handler request))
(p/bind p/wrap)
(p/then respond)
(p/catch raise)))))})
(def with-config
{:compile
(fn [& _]
(fn [handler config]
(fn
([request] (handler config request))
([request respond raise] (handler config request respond raise)))))})
(let [executor (px/resolve-executor executor)]
(fn [request respond raise]
(->> (px/submit! executor (partial handler request))
(p/fnly (pu/handler respond raise)))))))})

View File

@@ -2,23 +2,30 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.http.session
(:refer-clojure :exclude [read])
(:require
[app.common.data :as d]
[app.common.logging :as l]
[app.common.spec :as us]
[app.config :as cf]
[app.db :as db]
[app.db.sql :as sql]
[app.http.session.tasks :as-alias tasks]
[app.main :as-alias main]
[app.tokens :as tokens]
[app.util.time :as dt]
[app.worker :as wrk]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig]
[promesa.core :as p]
[promesa.exec :as px]
[yetti.request :as yrq]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; DEFAULTS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; A default cookie name for storing the session.
(def default-auth-token-cookie-name "auth-token")
@@ -32,120 +39,206 @@
;; Default age for automatic session renewal
(def default-renewal-max-age (dt/duration {:hours 6}))
(defprotocol ISessionStore
(read-session [store key])
(write-session [store key data])
(update-session [store data])
(delete-session [store key]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; PROTOCOLS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn- make-database-store
[{:keys [pool tokens executor]}]
(reify ISessionStore
(read-session [_ token]
(px/with-dispatch executor
(db/exec-one! pool (sql/select :http-session {:id token}))))
(defprotocol ISessionManager
(read [_ key])
(write! [_ key data])
(update! [_ data])
(delete! [_ key]))
(write-session [_ _ data]
(px/with-dispatch executor
(let [profile-id (:profile-id data)
user-agent (:user-agent data)
created-at (or (:created-at data) (dt/now))
token (tokens :generate {:iss "authentication"
:iat created-at
:uid profile-id})
params {:user-agent user-agent
:profile-id profile-id
:created-at created-at
:updated-at created-at
:id token}]
(db/insert! pool :http-session params))))
(s/def ::manager #(satisfies? ISessionManager %))
(update-session [_ data]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; STORAGE IMPL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(s/def ::session-params
(s/keys :req-un [::user-agent
::profile-id
::created-at]))
(defn- prepare-session-params
[key params]
(us/assert! ::us/not-empty-string key)
(us/assert! ::session-params params)
{:user-agent (:user-agent params)
:profile-id (:profile-id params)
:created-at (:created-at params)
:updated-at (:created-at params)
:id key})
(defn- database-manager
[pool]
(reify ISessionManager
(read [_ token]
(db/exec-one! pool (sql/select :http-session {:id token})))
(write! [_ key params]
(let [params (prepare-session-params key params)]
(db/insert! pool :http-session params)
params))
(update! [_ params]
(let [updated-at (dt/now)]
(px/with-dispatch executor
(db/update! pool :http-session
{:updated-at updated-at}
{:id (:id data)})
(assoc data :updated-at updated-at))))
(db/update! pool :http-session
{:updated-at updated-at}
{:id (:id params)})
(assoc params :updated-at updated-at)))
(delete! [_ token]
(db/delete! pool :http-session {:id token})
nil)))
(delete-session [_ token]
(px/with-dispatch executor
(db/delete! pool :http-session {:id token})
(defn inmemory-manager
[]
(let [cache (atom {})]
(reify ISessionManager
(read [_ token]
(get @cache token))
(write! [_ key params]
(let [params (prepare-session-params key params)]
(swap! cache assoc key params)
params))
(update! [_ params]
(let [updated-at (dt/now)]
(swap! cache update (:id params) assoc :updated-at updated-at)
(assoc params :updated-at updated-at)))
(delete! [_ token]
(swap! cache dissoc token)
nil))))
(defn make-inmemory-store
[{:keys [tokens]}]
(let [cache (atom {})]
(reify ISessionStore
(read-session [_ token]
(p/do (get @cache token)))
(defmethod ig/pre-init-spec ::manager [_]
(s/keys :req [::db/pool]))
(write-session [_ _ data]
(p/do
(let [profile-id (:profile-id data)
user-agent (:user-agent data)
created-at (or (:created-at data) (dt/now))
token (tokens :generate {:iss "authentication"
:iat created-at
:uid profile-id})
params {:user-agent user-agent
:created-at created-at
:updated-at created-at
:profile-id profile-id
:id token}]
(swap! cache assoc token params)
params)))
(update-session [_ data]
(let [updated-at (dt/now)]
(swap! cache update (:id data) assoc :updated-at updated-at)
(assoc data :updated-at updated-at)))
(delete-session [_ token]
(p/do
(swap! cache dissoc token)
nil)))))
(s/def ::tokens fn?)
(defmethod ig/pre-init-spec ::store [_]
(s/keys :req-un [::db/pool ::wrk/executor ::tokens]))
(defmethod ig/init-key ::store
[_ {:keys [pool] :as cfg}]
(defmethod ig/init-key ::manager
[_ {:keys [::db/pool]}]
(if (db/read-only? pool)
(make-inmemory-store cfg)
(make-database-store cfg)))
(inmemory-manager)
(database-manager pool)))
(defmethod ig/halt-key! ::store
(defmethod ig/halt-key! ::manager
[_ _])
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; MANAGER IMPL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(declare ^:private assign-auth-token-cookie)
(declare ^:private assign-authenticated-cookie)
(declare ^:private clear-auth-token-cookie)
(declare ^:private clear-authenticated-cookie)
(declare ^:private gen-token)
(defn create-fn
[{:keys [::manager ::main/props]} profile-id]
(us/assert! ::manager manager)
(us/assert! ::us/uuid profile-id)
(fn [request response]
(let [uagent (yrq/get-header request "user-agent")
params {:profile-id profile-id
:user-agent uagent
:created-at (dt/now)}
token (gen-token props params)
session (write! manager token params)]
(l/trace :hint "create" :profile-id (str profile-id))
(-> response
(assign-auth-token-cookie session)
(assign-authenticated-cookie session)))))
(defn delete-fn
[{:keys [::manager]}]
(us/assert! ::manager manager)
(fn [request response]
(let [cname (cf/get :auth-token-cookie-name default-auth-token-cookie-name)
cookie (yrq/get-cookie request cname)]
(l/trace :hint "delete" :profile-id (:profile-id request))
(some->> (:value cookie) (delete! manager))
(-> response
(assoc :status 204)
(assoc :body nil)
(clear-auth-token-cookie)
(clear-authenticated-cookie)))))
(defn- gen-token
[props {:keys [profile-id created-at]}]
(tokens/generate props {:iss "authentication"
:iat created-at
:uid profile-id}))
(defn- decode-token
[props token]
(when token
(tokens/verify props {:token token :iss "authentication"})))
(defn- get-token
[request]
(let [cname (cf/get :auth-token-cookie-name default-auth-token-cookie-name)
cookie (some-> (yrq/get-cookie request cname) :value)]
(when-not (str/empty? cookie)
cookie)))
(defn- get-session
[manager token]
(some->> token (read manager)))
(defn- renew-session?
[{:keys [updated-at] :as session}]
(and (dt/instant? updated-at)
(let [elapsed (dt/diff updated-at (dt/now))]
(neg? (compare default-renewal-max-age elapsed)))))
(defn- wrap-soft-auth
[handler {:keys [::manager ::main/props]}]
(us/assert! ::manager manager)
(letfn [(handle-request [request]
(try
(let [token (get-token request)
claims (decode-token props token)]
(cond-> request
(map? claims)
(-> (assoc ::token-claims claims)
(assoc ::token token))))
(catch Throwable cause
(l/trace :hint "exception on decoding malformed token" :cause cause)
request)))]
(fn [request respond raise]
(let [request (handle-request request)]
(handler request respond raise)))))
(defn- wrap-authz
[handler {:keys [::manager]}]
(us/assert! ::manager manager)
(fn [request]
(let [session (get-session manager (::token request))
request (cond-> request
(some? session)
(assoc ::profile-id (:profile-id session)
::id (:id session)))]
(cond-> (handler request)
(renew-session? session)
(-> (assign-auth-token-cookie session)
(assign-authenticated-cookie session))))))
(def soft-auth
{:name ::soft-auth
:compile (constantly wrap-soft-auth)})
(def authz
{:name ::authz
:compile (constantly wrap-authz)})
;; --- IMPL
(defn- create-session!
[store profile-id user-agent]
(let [params {:user-agent user-agent
:profile-id profile-id}]
(write-session store nil params)))
(defn- update-session!
[store session]
(update-session store session))
(defn- delete-session!
[store {:keys [cookies] :as request}]
(let [name (cf/get :auth-token-cookie-name default-auth-token-cookie-name)]
(when-let [token (get-in cookies [name :value])]
(delete-session store token))))
(defn- retrieve-session
[store request]
(let [cookie-name (cf/get :auth-token-cookie-name default-auth-token-cookie-name)]
(when-let [cookie (yrq/get-cookie request cookie-name)]
(read-session store (:value cookie)))))
(defn assign-auth-token-cookie
(defn- assign-auth-token-cookie
[response {token :id updated-at :updated-at}]
(let [max-age (cf/get :auth-token-cookie-max-age default-cookie-max-age)
created-at (or updated-at (dt/now))
@@ -164,16 +257,19 @@
:secure secure?}]
(update response :cookies assoc name cookie)))
(defn assign-authenticated-cookie
(defn- assign-authenticated-cookie
[response {updated-at :updated-at}]
(let [max-age (cf/get :auth-token-cookie-max-age default-cookie-max-age)
domain (cf/get :authenticated-cookie-domain)
cname (cf/get :authenticated-cookie-name "authenticated")
created-at (or updated-at (dt/now))
renewal (dt/plus created-at default-renewal-max-age)
expires (dt/plus created-at max-age)
comment (str "Renewal at: " (dt/format-instant renewal :rfc1123))
secure? (contains? cf/flags :secure-session-cookies)
domain (cf/get :authenticated-cookie-domain)
name (cf/get :authenticated-cookie-name "authenticated")
cookie {:domain domain
:expires expires
:path "/"
@@ -183,115 +279,46 @@
:secure secure?}]
(cond-> response
(string? domain)
(update :cookies assoc name cookie))))
(update :cookies assoc cname cookie))))
(defn clear-auth-token-cookie
(defn- clear-auth-token-cookie
[response]
(let [name (cf/get :auth-token-cookie-name default-auth-token-cookie-name)]
(update response :cookies assoc name {:path "/" :value "" :max-age -1})))
(let [cname (cf/get :auth-token-cookie-name default-auth-token-cookie-name)]
(update response :cookies assoc cname {:path "/" :value "" :max-age 0})))
(defn- clear-authenticated-cookie
[response]
(let [name (cf/get :authenticated-cookie-name default-authenticated-cookie-name)
(let [cname (cf/get :authenticated-cookie-name default-authenticated-cookie-name)
domain (cf/get :authenticated-cookie-domain)]
(cond-> response
(string? domain)
(update :cookies assoc name {:domain domain :path "/" :value "" :max-age -1}))))
(defn- make-middleware
[{:keys [store] :as cfg}]
(letfn [;; Check if time reached for automatic session renewal
(renew-session? [{:keys [updated-at] :as session}]
(and (dt/instant? updated-at)
(let [elapsed (dt/diff updated-at (dt/now))]
(neg? (compare default-renewal-max-age elapsed)))))
;; Wrap respond with session renewal code
(wrap-respond [respond session]
(fn [response]
(p/let [session (update-session! store session)]
(-> response
(assign-auth-token-cookie session)
(assign-authenticated-cookie session)
(respond)))))]
{:name :session
:compile (fn [& _]
(fn [handler]
(fn [request respond raise]
(try
(-> (retrieve-session store request)
(p/finally (fn [session cause]
(cond
(some? cause)
(raise cause)
(nil? session)
(handler request respond raise)
:else
(let [request (-> request
(assoc :profile-id (:profile-id session))
(assoc :session-id (:id session)))
respond (cond-> respond
(renew-session? session)
(wrap-respond session))]
(handler request respond raise))))))
(catch Throwable cause
(raise cause))))))}))
(update :cookies assoc cname {:domain domain :path "/" :value "" :max-age 0}))))
;; --- STATE INIT: SESSION
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; TASK: SESSION GC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(s/def ::store #(satisfies? ISessionStore %))
(s/def ::tasks/max-age ::dt/duration)
(defmethod ig/pre-init-spec :app.http/session [_]
(s/keys :req-un [::store]))
(defmethod ig/pre-init-spec ::tasks/gc [_]
(s/keys :req [::db/pool]
:opt [::tasks/max-age]))
(defmethod ig/prep-key :app.http/session
(defmethod ig/prep-key ::tasks/gc
[_ cfg]
(d/merge {:buffer-size 128}
(d/without-nils cfg)))
(let [max-age (cf/get :auth-token-cookie-max-age default-cookie-max-age)]
(merge {::tasks/max-age max-age} (d/without-nils cfg))))
(defmethod ig/init-key :app.http/session
[_ {:keys [store] :as cfg}]
(-> cfg
(assoc :middleware (make-middleware cfg))
(assoc :create (fn [profile-id]
(fn [request response]
(p/let [uagent (yrq/get-header request "user-agent")
session (create-session! store profile-id uagent)]
(-> response
(assign-auth-token-cookie session)
(assign-authenticated-cookie session))))))
(assoc :delete (fn [request response]
(p/do
(delete-session! store request)
(-> response
(assoc :status 204)
(assoc :body nil)
(clear-auth-token-cookie)
(clear-authenticated-cookie)))))))
(def ^:private
sql:delete-expired
"delete from http_session
where updated_at < now() - ?::interval
or (updated_at is null and
created_at < now() - ?::interval)")
;; --- STATE INIT: SESSION GC
(declare sql:delete-expired)
(s/def ::max-age ::dt/duration)
(defmethod ig/pre-init-spec ::gc-task [_]
(s/keys :req-un [::db/pool]
:opt-un [::max-age]))
(defmethod ig/prep-key ::gc-task
[_ cfg]
(merge {:max-age default-cookie-max-age}
(d/without-nils cfg)))
(defmethod ig/init-key ::gc-task
[_ {:keys [pool max-age] :as cfg}]
(defmethod ig/init-key ::tasks/gc
[_ {:keys [::db/pool ::tasks/max-age] :as cfg}]
(l/debug :hint "initializing session gc task" :max-age max-age)
(fn [_]
(db/with-atomic [conn pool]
@@ -303,9 +330,3 @@
:deleted result)
result))))
(def ^:private
sql:delete-expired
"delete from http_session
where updated_at < now() - ?::interval
or (updated_at is null and
created_at < now() - ?::interval)")

View File

@@ -2,7 +2,7 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.http.websocket
"A penpot notification service for file cooperative edition."
@@ -11,77 +11,62 @@
[app.common.logging :as l]
[app.common.pprint :as pp]
[app.common.spec :as us]
[app.common.uuid :as uuid]
[app.db :as db]
[app.http.session :as session]
[app.metrics :as mtx]
[app.msgbus :as mbus]
[app.util.time :as dt]
[app.util.websocket :as ws]
[clojure.core.async :as a]
[clojure.spec.alpha :as s]
[integrant.core :as ig]
[promesa.exec.csp :as sp]
[yetti.websocket :as yws]))
(def recv-labels
(into-array String ["recv"]))
(def send-labels
(into-array String ["send"]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; WEBSOCKET HOOKS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def state (atom {}))
(defn- on-connect
[{:keys [metrics]} wsp]
(let [created-at (dt/now)]
(swap! state assoc (::ws/id @wsp) wsp)
(mtx/run! metrics {:id :websocket-active-connections :inc 1})
(fn []
(swap! state dissoc (::ws/id @wsp))
(mtx/run! metrics {:id :websocket-active-connections :dec 1})
(mtx/run! metrics {:id :websocket-session-timing
:val (/ (inst-ms (dt/diff created-at (dt/now))) 1000.0)}))))
(defn- on-rcv-message
[{:keys [metrics]} _ message]
(mtx/run! metrics {:id :websocket-messages-total :labels ["recv"] :inc 1})
message)
(defn- on-snd-message
[{:keys [metrics]} _ message]
(mtx/run! metrics {:id :websocket-messages-total :labels ["send"] :inc 1})
message)
;; REPL HELPERS
(defn repl-get-connections-for-file
[file-id]
(->> (vals @state)
(filter #(= file-id (-> % deref ::file-subscription :file-id)))
(map deref)
(map ::ws/id)))
(defn repl-get-connections-for-team
[team-id]
(->> (vals @state)
(filter #(= team-id (-> % deref ::team-subscription :team-id)))
(map deref)
(map ::ws/id)))
(defn repl-close-connection
[id]
(when-let [wsp (get @state id)]
(a/>!! (::ws/close-ch @wsp) [8899 "closed from server"])
(a/close! (::ws/close-ch @wsp))))
(when-let [{:keys [::ws/close-ch] :as wsp} (get @state id)]
(sp/put! close-ch [8899 "closed from server"])
(sp/close! close-ch)))
(defn repl-get-connection-info
[id]
(when-let [wsp (get @state id)]
{:id id
:created-at (dt/instant id)
:profile-id (::profile-id @wsp)
:session-id (::session-id @wsp)
:user-agent (::ws/user-agent @wsp)
:ip-addr (::ws/remote-addr @wsp)
:last-activity-at (::ws/last-activity-at @wsp)
:http-session-id (::ws/http-session-id @wsp)
:subscribed-file (-> wsp deref ::file-subscription :file-id)
:subscribed-team (-> wsp deref ::team-subscription :team-id)}))
{:id id
:created-at (::created-at wsp)
:profile-id (::profile-id wsp)
:session-id (::session-id wsp)
:user-agent (::ws/user-agent wsp)
:ip-addr (::ws/remote-addr wsp)
:last-activity-at (::ws/last-activity-at wsp)
:subscribed-file (-> wsp ::file-subscription :file-id)
:subscribed-team (-> wsp ::team-subscription :team-id)}))
(defn repl-print-connection-info
[id]
@@ -101,241 +86,237 @@
(fn [_ _ message]
(:type message)))
(defmethod handle-message :connect
[cfg wsp _]
(defmethod handle-message :open
[{:keys [::mbus/msgbus]} {:keys [::ws/id ::ws/output-ch ::ws/state ::profile-id ::session-id] :as wsp} _]
(l/trace :fn "handle-message" :event "open" :conn-id id)
(let [ch (sp/chan :buf (sp/dropping-buffer 16)
:xf (remove #(= (:session-id %) session-id)))]
(let [msgbus-fn (:msgbus cfg)
conn-id (::ws/id @wsp)
profile-id (::profile-id @wsp)
session-id (::session-id @wsp)
output-ch (::ws/output-ch @wsp)
;; Subscribe to the profile channel and forward all messages to websocket output
;; channel (send them to the client).
(swap! state assoc ::profile-subscription {:channel ch})
xform (remove #(= (:session-id %) session-id))
channel (a/chan (a/dropping-buffer 16) xform)]
;; Forward the subscription messages directly to the websocket output channel
(sp/pipe ch output-ch false)
(l/trace :fn "handle-message" :event :connect :conn-id conn-id)
;; Subscribe to the profile topic on msgbus/redis
(mbus/sub! msgbus :topic profile-id :chan ch)
;; Subscribe to the profile channel and forward all messages to
;; websocket output channel (send them to the client).
(swap! wsp assoc ::profile-subscription channel)
(a/pipe channel output-ch false)
(msgbus-fn :cmd :sub :topic profile-id :chan channel)))
;; Subscribe to the system topic on msgbus/redis
(mbus/sub! msgbus :topic (str uuid/zero) :chan ch)))
(defmethod handle-message :disconnect
[cfg wsp _]
(let [msgbus-fn (:msgbus cfg)
conn-id (::ws/id @wsp)
profile-id (::profile-id @wsp)
session-id (::session-id @wsp)
profile-ch (::profile-subscription @wsp)
fsub (::file-subscription @wsp)
tsub (::team-subscription @wsp)
(defmethod handle-message :close
[{:keys [::mbus/msgbus]} {:keys [::ws/id ::ws/state ::profile-id ::session-id]} _]
(l/trace :fn "handle-message" :event "close" :conn-id id)
(let [psub (::profile-subscription @state)
fsub (::file-subscription @state)
tsub (::team-subscription @state)
msg {:type :disconnect
:subs-id profile-id
:profile-id profile-id
:session-id session-id}]
message {:type :disconnect
:subs-id profile-id
:profile-id profile-id
:session-id session-id}]
;; Close profile subscription if exists
(when-let [ch (:channel psub)]
(sp/close! ch)
(mbus/purge! msgbus [ch]))
(l/trace :fn "handle-message"
:event :disconnect
:conn-id conn-id)
(a/go
;; Close the main profile subscription
(a/close! profile-ch)
(a/<! (msgbus-fn :cmd :purge :chans [profile-ch]))
;; Close tram subscription if exists
(when-let [channel (:channel tsub)]
(a/close! channel)
(a/<! (msgbus-fn :cmd :purge :chans [channel])))
;; Close team subscription if exists
(when-let [ch (:channel tsub)]
(sp/close! ch)
(mbus/purge! msgbus [ch]))
;; Close file subscription if exists
(when-let [{:keys [topic channel]} fsub]
(a/close! channel)
(a/<! (msgbus-fn :cmd :purge :chans [channel]))
(a/<! (msgbus-fn :cmd :pub :topic topic :message message))))))
(sp/close! channel)
(mbus/purge! msgbus [channel])
(mbus/pub! msgbus :topic topic :message msg))))
(defmethod handle-message :subscribe-team
[cfg wsp {:keys [team-id] :as params}]
(let [msgbus-fn (:msgbus cfg)
conn-id (::ws/id @wsp)
session-id (::session-id @wsp)
output-ch (::ws/output-ch @wsp)
prev-subs (get @wsp ::team-subscription)
xform (comp
(remove #(= (:session-id %) session-id))
(map #(assoc % :subs-id team-id)))
[{:keys [::mbus/msgbus]} {:keys [::ws/id ::ws/state ::ws/output-ch ::session-id]} {:keys [team-id] :as params}]
(l/trace :fn "handle-message" :event "subscribe-team" :team-id team-id :conn-id id)
(let [prev-subs (get @state ::team-subscription)
channel (sp/chan :buf (sp/dropping-buffer 64)
:xf (comp
(remove #(= (:session-id %) session-id))
(map #(assoc % :subs-id team-id))))]
channel (a/chan (a/dropping-buffer 64) xform)]
(sp/pipe channel output-ch false)
(mbus/sub! msgbus :topic team-id :chan channel)
(l/trace :fn "handle-message"
:event :subscribe-team
:team-id team-id
:conn-id conn-id)
(let [subs {:team-id team-id :channel channel :topic team-id}]
(swap! state assoc ::team-subscription subs))
(a/pipe channel output-ch false)
;; Close previous subscription if exists
(when-let [ch (:channel prev-subs)]
(sp/close! ch)
(mbus/purge! msgbus [ch]))))
(let [state {:team-id team-id :channel channel :topic team-id}]
(swap! wsp assoc ::team-subscription state))
(a/go
;; Close previous subscription if exists
(when-let [channel (:channel prev-subs)]
(a/close! channel)
(a/<! (msgbus-fn :cmd :purge :chans [channel]))))
(a/go
(a/<! (msgbus-fn :cmd :sub :topic team-id :chan channel)))))
(defmethod handle-message :subscribe-file
[cfg wsp {:keys [file-id] :as params}]
(let [msgbus-fn (:msgbus cfg)
conn-id (::ws/id @wsp)
profile-id (::profile-id @wsp)
session-id (::session-id @wsp)
output-ch (::ws/output-ch @wsp)
prev-subs (::file-subscription @wsp)
xform (comp (remove #(= (:session-id %) session-id))
(map #(assoc % :subs-id file-id)))
channel (a/chan (a/dropping-buffer 64) xform)]
[{:keys [::mbus/msgbus]} {:keys [::ws/id ::ws/state ::ws/output-ch ::session-id ::profile-id]} {:keys [file-id] :as params}]
(l/trace :fn "handle-message" :event "subscribe-file" :file-id file-id :conn-id id)
(let [psub (::file-subscription @state)
fch (sp/chan :buf (sp/dropping-buffer 64)
:xf (comp (remove #(= (:session-id %) session-id))
(map #(assoc % :subs-id file-id))))]
(l/trace :fn "handle-message"
:event :subscribe-file
:file-id file-id
:conn-id conn-id)
(let [subs {:file-id file-id :channel fch :topic file-id}]
(swap! state assoc ::file-subscription subs))
(let [state {:file-id file-id :channel channel :topic file-id}]
(swap! wsp assoc ::file-subscription state))
;; Close previous subscription if exists
(when-let [ch (:channel psub)]
(sp/close! ch)
(mbus/purge! msgbus [ch]))
(a/go
;; Close previous subscription if exists
(when-let [channel (:channel prev-subs)]
(a/close! channel)
(a/<! (msgbus-fn :cmd :purge :chans [channel]))))
;; Message forwarding
(a/go
(loop []
(when-let [{:keys [type] :as message} (a/<! channel)]
(when (or (= :join-file type)
(= :leave-file type)
(= :disconnect type))
(let [message {:type :presence
:file-id file-id
:session-id session-id
(sp/go-loop []
(when-let [{:keys [type] :as message} (sp/take! fch)]
(sp/put! output-ch message)
(when (or (= :join-file type)
(= :leave-file type)
(= :disconnect type))
(let [message {:type :presence
:file-id file-id
:session-id session-id
:profile-id profile-id}]
(a/<! (msgbus-fn :cmd :pub
:topic file-id
:message message))))
(a/>! output-ch message)
(recur))))
(mbus/pub! msgbus
:topic file-id
:message message)))
(recur)))
(a/go
;; Subscribe to file topic
(a/<! (msgbus-fn :cmd :sub :topic file-id :chan channel))
;; Subscribe to file topic
(mbus/sub! msgbus :topic file-id :chan fch)
;; Notifify the rest of participants of the new connection.
(let [message {:type :join-file
:file-id file-id
:subs-id file-id
:session-id session-id
:profile-id profile-id}]
(a/<! (msgbus-fn :cmd :pub
:topic file-id
:message message))))))
;; Notifify the rest of participants of the new connection.
(let [message {:type :join-file
:file-id file-id
:subs-id file-id
:session-id session-id
:profile-id profile-id}]
(mbus/pub! msgbus :topic file-id :message message))))
(defmethod handle-message :unsubscribe-file
[cfg wsp {:keys [file-id] :as params}]
(let [msgbus-fn (:msgbus cfg)
conn-id (::ws/id @wsp)
session-id (::session-id @wsp)
profile-id (::profile-id @wsp)
subs (::file-subscription @wsp)
[{:keys [::mbus/msgbus]} {:keys [::ws/id ::ws/state ::session-id ::profile-id]} {:keys [file-id] :as params}]
(l/trace :fn "handle-message" :event "unsubscribe-file" :file-id file-id :conn-id id)
message {:type :leave-file
:file-id file-id
:session-id session-id
:profile-id profile-id}]
(let [subs (::file-subscription @state)
message {:type :leave-file
:file-id file-id
:session-id session-id
:profile-id profile-id}]
(l/trace :fn "handle-message"
:event :unsubscribe-file
:file-id file-id
:conn-id conn-id)
(a/go
(when (= (:file-id subs) file-id)
(let [channel (:channel subs)]
(a/close! channel)
(a/<! (msgbus-fn :cmd :purge :chans [channel]))
(a/<! (msgbus-fn :cmd :pub :topic file-id :message message)))))))
(when (= (:file-id subs) file-id)
(mbus/pub! msgbus :topic file-id :message message)
(let [ch (:channel subs)]
(sp/close! ch)
(mbus/purge! msgbus [ch])))))
(defmethod handle-message :keepalive
[_ _ _]
(l/trace :fn "handle-message" :event :keepalive)
(a/go :nothing))
(l/trace :fn "handle-message" :event :keepalive))
(defmethod handle-message :broadcast
[{:keys [::mbus/msgbus]} {:keys [::ws/id ::session-id ::profile-id]} message]
(l/trace :fn "handle-message" :event "broadcast" :conn-id id)
(let [message (-> message
(assoc :subs-id profile-id)
(assoc :profile-id profile-id)
(assoc :session-id session-id))]
(mbus/pub! msgbus :topic profile-id :message message)))
(defmethod handle-message :pointer-update
[cfg wsp {:keys [file-id] :as message}]
(let [msgbus-fn (:msgbus cfg)
profile-id (::profile-id @wsp)
session-id (::session-id @wsp)
subs (::file-subscription @wsp)
message (-> message
(assoc :subs-id file-id)
(assoc :profile-id profile-id)
(assoc :session-id session-id))]
(a/go
;; Only allow receive pointer updates when active subscription
(when subs
(a/<! (msgbus-fn :cmd :pub
:topic file-id
:message message))))))
[{:keys [::mbus/msgbus]} {:keys [::ws/state ::session-id ::profile-id]} {:keys [file-id] :as message}]
(when (::file-subscription @state)
(let [message (-> message
(assoc :subs-id file-id)
(assoc :profile-id profile-id)
(assoc :session-id session-id))]
(mbus/pub! msgbus :topic file-id :message message))))
(defmethod handle-message :default
[_ wsp message]
(let [conn-id (::ws/id @wsp)]
(l/warn :hint "received unexpected message"
:message message
:conn-id conn-id)
(a/go :none)))
[_ {:keys [::ws/id]} message]
(l/warn :hint "received unexpected message"
:message message
:conn-id id))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HTTP HANDLER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(s/def ::msgbus fn?)
(s/def ::session-id ::us/uuid)
(defn- on-connect
[{:keys [::mtx/metrics]} {:keys [::ws/id] :as wsp}]
(let [created-at (dt/now)]
(l/trace :fn "on-connect" :conn-id id)
(swap! state assoc id wsp)
(mtx/run! metrics
:id :websocket-active-connections
:inc 1)
(assoc wsp ::ws/on-disconnect
(fn []
(l/trace :fn "on-disconnect" :conn-id id)
(swap! state dissoc id)
(mtx/run! metrics :id :websocket-active-connections :dec 1)
(mtx/run! metrics
:id :websocket-session-timing
:val (/ (inst-ms (dt/diff created-at (dt/now))) 1000.0))))))
(defn- on-rcv-message
[{:keys [::mtx/metrics ::profile-id ::session-id]} message]
(mtx/run! metrics
:id :websocket-messages-total
:labels recv-labels
:inc 1)
(assoc message :profile-id profile-id :session-id session-id))
(defn- on-snd-message
[{:keys [::mtx/metrics]} message]
(mtx/run! metrics
:id :websocket-messages-total
:labels send-labels
:inc 1)
message)
(s/def ::session-id ::us/uuid)
(s/def ::handler-params
(s/keys :req-un [::session-id]))
(defmethod ig/pre-init-spec ::handler [_]
(s/keys :req-un [::msgbus ::db/pool ::mtx/metrics]))
(defn- http-handler
[cfg {:keys [params ::session/profile-id] :as request}]
(let [{:keys [session-id]} (us/conform ::handler-params params)]
(cond
(not profile-id)
(ex/raise :type :authentication
:hint "Authentication required.")
(defmethod ig/init-key ::handler
(not (yws/upgrade-request? request))
(ex/raise :type :validation
:code :websocket-request-expected
:hint "this endpoint only accepts websocket connections")
:else
(do
(l/trace :hint "websocket request" :profile-id profile-id :session-id session-id)
(->> (ws/handler
::ws/on-rcv-message (partial on-rcv-message cfg)
::ws/on-snd-message (partial on-snd-message cfg)
::ws/on-connect (partial on-connect cfg)
::ws/handler (partial handle-message cfg)
::profile-id profile-id
::session-id session-id)
(yws/upgrade request))))))
(defmethod ig/pre-init-spec ::routes [_]
(s/keys :req [::mbus/msgbus
::mtx/metrics
::db/pool
::session/manager]))
(s/def ::routes vector?)
(defmethod ig/init-key ::routes
[_ cfg]
(fn [{:keys [profile-id params] :as req} respond raise]
(let [{:keys [session-id]} (us/conform ::handler-params params)]
(cond
(not profile-id)
(raise (ex/error :type :authentication
:hint "Authentication required."))
(not (yws/upgrade-request? req))
(raise (ex/error :type :validation
:code :websocket-request-expected
:hint "this endpoint only accepts websocket connections"))
:else
(do
(l/trace :hint "websocket request" :profile-id profile-id :session-id session-id)
(->> (ws/handler
::ws/on-rcv-message (partial on-rcv-message cfg)
::ws/on-snd-message (partial on-snd-message cfg)
::ws/on-connect (partial on-connect cfg)
::ws/handler (partial handle-message cfg)
::profile-id profile-id
::session-id session-id)
(yws/upgrade req)
(respond)))))))
["/ws/notifications" {:middleware [[session/authz cfg]]
:handler (partial http-handler cfg)
:allowed-methods #{:get}}])

View File

@@ -2,12 +2,13 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.loggers.audit
"Services related to the user activity (audit log)."
(:require
[app.common.data :as d]
[app.common.data.macros :as dm]
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.spec :as us]
@@ -15,18 +16,28 @@
[app.common.uuid :as uuid]
[app.config :as cf]
[app.db :as db]
[app.util.async :as aa]
[app.http :as-alias http]
[app.http.access-token :as-alias actoken]
[app.http.client :as http.client]
[app.loggers.audit.tasks :as-alias tasks]
[app.loggers.webhooks :as-alias webhooks]
[app.main :as-alias main]
[app.rpc :as-alias rpc]
[app.rpc.retry :as rtry]
[app.tokens :as tokens]
[app.util.services :as-alias sv]
[app.util.time :as dt]
[app.worker :as wrk]
[clojure.core.async :as a]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig]
[lambdaisland.uri :as u]
[promesa.core :as p]
[promesa.exec :as px]
[yetti.request :as yrq]
[yetti.response :as yrs]))
[yetti.request :as yrq]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HELPERS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn parse-client-ip
[request]
@@ -48,210 +59,221 @@
(assoc (->> sk str/kebab (keyword "penpot")) v))))]
(reduce-kv process-param {} params)))
(def ^:private
profile-props
[:id
:is-active
:is-muted
:auth-backend
:email
:default-team-id
:default-project-id
:fullname
:lang])
(defn profile->props
[profile]
(-> profile
(select-keys [:id :is-active :is-muted :auth-backend :email :default-team-id :default-project-id :fullname :lang])
(select-keys profile-props)
(merge (:props profile))
(d/without-nils)))
(def reserved-props
#{:session-id
:password
:old-password
:token})
(defn clean-props
[{:keys [profile-id] :as event}]
(let [invalid-keys #{:session-id
:password
:old-password
:token}
xform (comp
(remove (fn [kv]
(qualified-keyword? (first kv))))
(remove (fn [kv]
(contains? invalid-keys (first kv))))
(remove (fn [[k v]]
(and (= k :profile-id)
(= v profile-id))))
(filter (fn [[_ v]]
(or (string? v)
(keyword? v)
(uuid? v)
(boolean? v)
(number? v)))))]
[props]
(into {}
(comp
(d/without-nils)
(d/without-qualified)
(remove #(contains? reserved-props (key %))))
props))
;; --- SPECS
(update event :props #(into {} xform %))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; HTTP Handler
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(declare persist-http-events)
(s/def ::profile-id ::us/uuid)
(s/def ::name ::us/string)
(s/def ::type ::us/string)
(s/def ::props (s/map-of ::us/keyword any?))
(s/def ::timestamp dt/instant?)
(s/def ::context (s/map-of ::us/keyword any?))
(s/def ::frontend-event
(s/keys :req-un [::type ::name ::props ::timestamp ::profile-id]
:opt-un [::context]))
(s/def ::frontend-events (s/every ::frontend-event))
(defmethod ig/init-key ::http-handler
[_ {:keys [executor pool] :as cfg}]
(if (or (db/read-only? pool) (not (contains? cf/flags :audit-log)))
(do
(l/warn :hint "audit log http handler disabled or db is read-only")
(fn [_ respond _]
(respond (yrs/response 204))))
(letfn [(handler [{:keys [profile-id] :as request}]
(let [events (->> (:events (:params request))
(remove #(not= profile-id (:profile-id %)))
(us/conform ::frontend-events))
ip-addr (parse-client-ip request)
cfg (-> cfg
(assoc :source "frontend")
(assoc :events events)
(assoc :ip-addr ip-addr))]
(persist-http-events cfg)))
(handle-error [cause]
(let [xdata (ex-data cause)]
(if (= :spec-validation (:code xdata))
(l/error ::l/raw (str "spec validation on persist-events:\n" (us/pretty-explain xdata)))
(l/error :hint "error on persist-events" :cause cause))))]
(fn [request respond _]
;; Fire and forget, log error in case of errro
(-> (px/submit! executor #(handler request))
(p/catch handle-error))
(respond (yrs/response 204))))))
(defn- persist-http-events
[{:keys [pool events ip-addr source] :as cfg}]
(let [columns [:id :name :source :type :tracked-at :profile-id :ip-addr :props :context]
prepare-xf (map (fn [event]
[(uuid/next)
(:name event)
source
(:type event)
(:timestamp event)
(:profile-id event)
(db/inet ip-addr)
(db/tjson (:props event))
(db/tjson (d/without-nils (:context event)))]))]
(when (seq events)
(->> (into [] prepare-xf events)
(db/insert-multi! pool :audit-log columns)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Collector
;; COLLECTOR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Defines a service that collects the audit/activity log using
;; internal database. Later this audit log can be transferred to
;; an external storage and data cleared.
(declare persist-events)
(s/def ::profile-id ::us/uuid)
(s/def ::name ::us/string)
(s/def ::type ::us/string)
(s/def ::props (s/map-of ::us/keyword any?))
(s/def ::ip-addr ::us/string)
(s/def ::webhooks/event? ::us/boolean)
(s/def ::webhooks/batch-timeout ::dt/duration)
(s/def ::webhooks/batch-key
(s/or :fn fn? :str string? :kw keyword?))
(s/def ::event
(s/keys :req [::type ::name ::profile-id]
:opt [::ip-addr
::props
::webhooks/event?
::webhooks/batch-timeout
::webhooks/batch-key]))
(s/def ::collector
(s/keys :req [::wrk/executor ::db/pool]))
(defmethod ig/pre-init-spec ::collector [_]
(s/keys :req-un [::db/pool ::wrk/executor]))
(s/def ::ip-addr string?)
(s/def ::backend-event
(s/keys :req-un [::type ::name ::profile-id]
:opt-un [::ip-addr ::props]))
(def ^:private backend-event-xform
(comp
(filter #(us/valid? ::backend-event %))
(map clean-props)))
(s/keys :req [::db/pool ::wrk/executor]))
(defmethod ig/init-key ::collector
[_ {:keys [pool] :as cfg}]
[_ {:keys [::db/pool] :as cfg}]
(cond
(not (contains? cf/flags :audit-log))
(do
(l/info :hint "audit log collection disabled")
(constantly nil))
(db/read-only? pool)
(do
(l/warn :hint "audit log collection disabled, db is read-only")
(constantly nil))
(l/warn :hint "audit: disabled (db is read-only)")
:else
(let [input (a/chan 512 backend-event-xform)
buffer (aa/batch input {:max-batch-size 100
:max-batch-age (* 10 1000) ; 10s
:init []})]
(l/info :hint "audit log collector initialized")
(a/go-loop []
(when-let [[_type events] (a/<! buffer)]
(let [res (a/<! (persist-events cfg events))]
(when (ex/exception? res)
(l/error :hint "error on persisting events" :cause res))
(recur))))
cfg))
(fn [& {:keys [cmd] :as params}]
(case cmd
:stop
(a/close! input)
(defn prepare-event
[cfg mdata params result]
(let [resultm (meta result)
request (-> params meta ::http/request)
profile-id (or (::profile-id resultm)
(:profile-id result)
(::rpc/profile-id params)
uuid/zero)
:submit
(let [params (-> params
(dissoc :cmd)
(assoc :tracked-at (dt/now)))]
(when-not (a/offer! input params)
(l/warn :hint "activity channel is full"))))))))
props (-> (or (::replace-props resultm)
(-> params
(merge (::props resultm))
(dissoc :profile-id)
(dissoc :type)))
(defn- persist-events
[{:keys [pool executor] :as cfg} events]
(letfn [(event->row [event]
[(uuid/next)
(:name event)
(:type event)
(:profile-id event)
(:tracked-at event)
(some-> (:ip-addr event) db/inet)
(db/tjson (:props event))
"backend"])]
(aa/with-thread executor
(when (seq events)
(db/with-atomic [conn pool]
(db/insert-multi! conn :audit-log
[:id :name :type :profile-id :tracked-at :ip-addr :props :source]
(sequence (keep event->row) events)))))))
(clean-props))
token-id (::actoken/id request)
context (d/without-nils
{:access-token-id (some-> token-id str)})]
{::type (or (::type resultm)
(::rpc/type cfg))
::name (or (::name resultm)
(::sv/name mdata))
::profile-id profile-id
::ip-addr (some-> request parse-client-ip)
::props props
::context context
;; NOTE: for batch-key lookup we need the params as-is
;; because the rpc api does not need to know the
;; audit/webhook specific object layout.
::rpc/params params
::webhooks/batch-key
(or (::webhooks/batch-key mdata)
(::webhooks/batch-key resultm))
::webhooks/batch-timeout
(or (::webhooks/batch-timeout mdata)
(::webhooks/batch-timeout resultm))
::webhooks/event?
(or (::webhooks/event? mdata)
(::webhooks/event? resultm)
false)}))
(defn- handle-event!
[conn-or-pool event]
(us/verify! ::event event)
(let [params {:id (uuid/next)
:name (::name event)
:type (::type event)
:profile-id (::profile-id event)
:ip-addr (::ip-addr event)
:context (::context event)
:props (::props event)}]
(when (contains? cf/flags :audit-log)
;; NOTE: this operation may cause primary key conflicts on inserts
;; because of the timestamp precission (two concurrent requests), in
;; this case we just retry the operation.
(rtry/with-retry {::rtry/when rtry/conflict-exception?
::rtry/max-retries 6
::rtry/label "persist-audit-log"
::db/conn (dm/check db/connection? conn-or-pool)}
(let [now (dt/now)]
(db/insert! conn-or-pool :audit-log
(-> params
(update :props db/tjson)
(update :context db/tjson)
(update :ip-addr db/inet)
(assoc :created-at now)
(assoc :tracked-at now)
(assoc :source "backend"))))))
(when (and (contains? cf/flags :webhooks)
(::webhooks/event? event))
(let [batch-key (::webhooks/batch-key event)
batch-timeout (::webhooks/batch-timeout event)
label (dm/str "rpc:" (:name params))
label (cond
(ifn? batch-key) (dm/str label ":" (batch-key (::rpc/params event)))
(string? batch-key) (dm/str label ":" batch-key)
:else label)
dedupe? (boolean (and batch-key batch-timeout))]
(wrk/submit! ::wrk/conn conn-or-pool
::wrk/task :process-webhook-event
::wrk/queue :webhooks
::wrk/max-retries 0
::wrk/delay (or batch-timeout 0)
::wrk/dedupe dedupe?
::wrk/label label
::webhooks/event
(-> params
(dissoc :ip-addr)
(dissoc :type)))))
params))
(defn submit!
"Submit audit event to the collector."
[cfg params]
(let [conn (or (::db/conn cfg) (::db/pool cfg))]
(us/assert! ::db/pool-or-conn conn)
(try
(handle-event! conn (d/without-nils params))
(catch Throwable cause
(l/error :hint "audit: unexpected error processing event" :cause cause)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Archive Task
;; TASK: ARCHIVE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; This is a task responsible to send the accumulated events to an
;; This is a task responsible to send the accumulated events to
;; external service for archival.
(declare archive-events)
(s/def ::http-client fn?)
(s/def ::uri ::us/string)
(s/def ::tokens fn?)
(s/def ::tasks/uri ::us/string)
(defmethod ig/pre-init-spec ::archive-task [_]
(s/keys :req-un [::db/pool ::tokens ::http-client]
:opt-un [::uri]))
(defmethod ig/pre-init-spec ::tasks/archive-task [_]
(s/keys :req [::db/pool ::main/props ::http.client/client]))
(defmethod ig/init-key ::archive-task
[_ {:keys [uri] :as cfg}]
(fn [props]
(defmethod ig/init-key ::tasks/archive
[_ cfg]
(fn [params]
;; NOTE: this let allows overwrite default configured values from
;; the repl, when manually invoking the task.
(let [enabled (or (contains? cf/flags :audit-log-archive)
(:enabled props false))
uri (or uri (:uri props))
cfg (assoc cfg :uri uri)]
(:enabled params false))
uri (cf/get :audit-log-archive-uri)
uri (or uri (:uri params))
cfg (assoc cfg ::uri uri)]
(when (and enabled (not uri))
(ex/raise :type :internal
@@ -263,20 +285,21 @@
(let [n (archive-events cfg)]
(if n
(do
(aa/thread-sleep 200)
(recur (+ total n)))
(px/sleep 100)
(recur (+ total ^long n)))
(when (pos? total)
(l/trace :hint "events chunk archived" :num total)))))))))
(l/debug :hint "events archived" :total total)))))))))
(def sql:retrieve-batch-of-audit-log
"select * from audit_log
(def ^:private sql:retrieve-batch-of-audit-log
"select *
from audit_log
where archived_at is null
order by created_at asc
limit 256
limit 128
for update skip locked;")
(defn archive-events
[{:keys [pool uri tokens http-client] :as cfg}]
[{:keys [::db/pool ::uri] :as cfg}]
(letfn [(decode-row [{:keys [props ip-addr context] :as row}]
(cond-> row
(db/pgobject? props)
@@ -300,9 +323,10 @@
:context]))
(send [events]
(let [token (tokens :generate {:iss "authentication"
:iat (dt/now)
:uid uuid/zero})
(let [token (tokens/generate (::main/props cfg)
{:iss "authentication"
:iat (dt/now)
:uid uuid/zero})
body (t/encode {:events events})
headers {"content-type" "application/transit+json"
"origin" (cf/get :public-uri)
@@ -312,7 +336,7 @@
:method :post
:headers headers
:body body}
resp (http-client params {:sync? true})]
resp (http.client/req! cfg params {:sync? true})]
(if (= (:status resp) 204)
true
(do
@@ -333,7 +357,7 @@
(map row->event))
events (into [] xform rows)]
(when-not (empty? events)
(l/debug :action "archive-events" :uri uri :events (count events))
(l/trace :hint "archive events chunk" :uri uri :events (count events))
(when (send events)
(mark-as-archived conn rows)
(count events)))))))
@@ -342,25 +366,21 @@
;; GC Task
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def sql:clean-archived
(def ^:private sql:clean-archived
"delete from audit_log
where archived_at is not null
and archived_at < now() - ?::interval")
where archived_at is not null")
(defn- clean-archived
[{:keys [pool max-age]}]
(let [interval (db/interval max-age)
result (db/exec-one! pool [sql:clean-archived interval])
result (:next.jdbc/update-count result)]
(l/debug :action "clean archived audit log" :removed result)
[{:keys [::db/pool]}]
(let [result (db/exec-one! pool [sql:clean-archived])
result (:next.jdbc/update-count result)]
(l/debug :hint "delete archived audit log entries" :deleted result)
result))
(s/def ::max-age ::cf/audit-log-gc-max-age)
(defmethod ig/pre-init-spec ::tasks/gc [_]
(s/keys :req [::db/pool]))
(defmethod ig/pre-init-spec ::gc-task [_]
(s/keys :req-un [::db/pool ::max-age]))
(defmethod ig/init-key ::gc-task
(defmethod ig/init-key ::tasks/gc
[_ cfg]
(fn [_]
(clean-archived cfg)))

View File

@@ -2,21 +2,23 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.loggers.database
"A specific logger impl that persists errors on the database."
(:require
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.uuid :as uuid]
[app.common.pprint :as pp]
[app.common.schema :as sm]
[app.common.spec :as us]
[app.config :as cf]
[app.db :as db]
[app.util.async :as aa]
[app.worker :as wrk]
[clojure.core.async :as a]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig]))
[integrant.core :as ig]
[promesa.exec :as px]
[promesa.exec.csp :as sp]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Error Listener
@@ -27,66 +29,86 @@
(defonce enabled (atom true))
(defn- persist-on-database!
[{:keys [pool] :as cfg} {:keys [id] :as event}]
[pool id report]
(when-not (db/read-only? pool)
(db/insert! pool :server-error-report {:id id :content (db/tjson event)})))
(db/insert! pool :server-error-report
{:id id
:version 3
:content (db/tjson report)})))
(defn- parse-event-data
[event]
(reduce-kv
(fn [acc k v]
(cond
(= k :id) (assoc acc k (uuid/uuid v))
(= k :profile-id) (assoc acc k (uuid/uuid v))
(str/blank? v) acc
:else (assoc acc k v)))
{}
event))
(defn record->report
[{:keys [::l/context ::l/message ::l/props ::l/logger ::l/level ::l/cause] :as record}]
(us/assert! ::l/record record)
(defn parse-event
[event]
(-> (parse-event-data event)
(assoc :tenant (cf/get :tenant))
(assoc :host (cf/get :host))
(assoc :public-uri (cf/get :public-uri))
(assoc :version (:full cf/version))
(update :id #(or % (uuid/next)))))
(let [data (ex-data cause)
ctx (-> context
(assoc :tenant (cf/get :tenant))
(assoc :host (cf/get :host))
(assoc :public-uri (cf/get :public-uri))
(assoc :logger/name logger)
(assoc :logger/level level)
(dissoc :request/params :value :params :data))]
(merge
{:context (-> (into (sorted-map) ctx)
(pp/pprint-str :width 200 :length 50 :level 10))
:props (pp/pprint-str props :width 200 :length 50)
:hint (or (ex-message cause) @message)
:trace (ex/format-throwable cause :data? false :explain? false :header? false :summary? false)}
(defn handle-event
[{:keys [executor] :as cfg} event]
(aa/with-thread executor
(try
(let [event (parse-event event)
uri (cf/get :public-uri)]
(when-let [params (or (:request/params context) (:params context))]
{:params (pp/pprint-str params :width 200 :length 50 :level 10)})
(l/debug :hint "registering error on database" :id (:id event)
:uri (str uri "/dbg/error/" (:id event)))
(when-let [value (:value context)]
{:value (pp/pprint-str value :width 200 :length 50 :level 10)})
(persist-on-database! cfg event))
(catch Exception cause
(l/warn :hint "unexpected exception on database error logger" :cause cause)))))
(when-let [data (some-> data (dissoc ::s/problems ::s/value ::s/spec ::sm/explain :hint))]
{:data (pp/pprint-str data :width 200)})
(when-let [explain (ex/explain data {:level 10 :length 50})]
{:explain explain}))))
(defn error-record?
[{:keys [::l/level ::l/cause]}]
(and (= :error level)
(ex/exception? cause)))
(defn- handle-event
[{:keys [::db/pool]} {:keys [::l/id] :as record}]
(try
(let [uri (cf/get :public-uri)
report (-> record record->report d/without-nils)]
(l/debug :hint "registering error on database" :id id
:uri (str uri "/dbg/error/" id))
(persist-on-database! pool id report))
(catch Throwable cause
(l/warn :hint "unexpected exception on database error logger" :cause cause))))
(defmethod ig/pre-init-spec ::reporter [_]
(s/keys :req-un [::wrk/executor ::db/pool ::receiver]))
(defn error-event?
[event]
(= "error" (:logger/level event)))
(s/keys :req [::db/pool]))
(defmethod ig/init-key ::reporter
[_ {:keys [receiver] :as cfg}]
(l/info :msg "initializing database error persistence")
(let [output (a/chan (a/sliding-buffer 5) (filter error-event?))]
(receiver :sub output)
(a/go-loop []
(let [msg (a/<! output)]
(if (nil? msg)
(l/info :msg "stoping error reporting loop")
(do
(a/<! (handle-event cfg msg))
(recur)))))
output))
[_ cfg]
(let [input (sp/chan :buf (sp/sliding-buffer 32)
:xf (filter error-record?))]
(add-watch l/log-record ::reporter #(sp/put! input %4))
(px/thread {:name "penpot/database-reporter" :virtual true}
(l/info :hint "initializing database error persistence")
(try
(loop []
(when-let [record (sp/take! input)]
(handle-event cfg record)
(recur)))
(catch InterruptedException _
(l/debug :hint "reporter interrupted"))
(catch Throwable cause
(l/error :hint "unexpected error" :cause cause))
(finally
(sp/close! input)
(remove-watch l/log-record ::reporter)
(l/info :hint "reporter terminated"))))))
(defmethod ig/halt-key! ::reporter
[_ output]
(a/close! output))
[_ thread]
(some-> thread px/interrupt!))

View File

@@ -1,93 +0,0 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
(ns app.loggers.loki
"A Loki integration."
(:require
[app.common.logging :as l]
[app.common.spec :as us]
[app.config :as cfg]
[app.util.json :as json]
[clojure.core.async :as a]
[clojure.spec.alpha :as s]
[integrant.core :as ig]))
(declare ^:private handle-event)
(declare ^:private start-rcv-loop)
(s/def ::uri ::us/string)
(s/def ::receiver fn?)
(s/def ::http-client fn?)
(defmethod ig/pre-init-spec ::reporter [_]
(s/keys :req-un [ ::receiver ::http-client]
:opt-un [::uri]))
(defmethod ig/init-key ::reporter
[_ {:keys [receiver uri] :as cfg}]
(when uri
(l/info :msg "initializing loki reporter" :uri uri)
(let [input (a/chan (a/dropping-buffer 2048))]
(receiver :sub input)
(doto (Thread. #(start-rcv-loop cfg input))
(.setDaemon true)
(.setName "penpot/loki-sender")
(.start))
input)))
(defmethod ig/halt-key! ::reporter
[_ output]
(when output
(a/close! output)))
(defn- start-rcv-loop
[cfg input]
(loop []
(let [msg (a/<!! input)]
(when-not (nil? msg)
(handle-event cfg msg)
(recur))))
(l/info :msg "stoping error reporting loop"))
(defn- prepare-payload
[event]
(let [labels {:host (cfg/get :host)
:tenant (cfg/get :tenant)
:version (:full cfg/version)
:logger (:logger/name event)
:level (:logger/level event)}]
{:streams
[{:stream labels
:values [[(str (* (inst-ms (:created-at event)) 1000000))
(str (:message event)
(when-let [error (:trace event)]
(str "\n" error)))]]}]}))
(defn- make-request
[{:keys [http-client uri] :as cfg} payload]
(http-client {:uri uri
:timeout 3000
:method :post
:headers {"content-type" "application/json"}
:body (json/write payload)}
{:sync? true}))
(defn- handle-event
[cfg event]
(try
(let [payload (prepare-payload event)
response (make-request cfg payload)]
(when-not (= 204 (:status response))
(map? response)
(l/error :hint "error on sending log to loki (unexpected response)"
:response (pr-str response))))
(catch Throwable cause
(l/error :hint "error on sending log to loki (unexpected exception)"
:cause cause))))

View File

@@ -2,74 +2,102 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.loggers.mattermost
"A mattermost integration for error reporting."
(:require
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.spec :as us]
[app.config :as cf]
[app.http.client :as http]
[app.loggers.database :as ldb]
[app.util.json :as json]
[clojure.core.async :as a]
[clojure.spec.alpha :as s]
[integrant.core :as ig]
[promesa.core :as p]))
[promesa.exec :as px]
[promesa.exec.csp :as sp]))
(defonce enabled (atom true))
(defn- send-mattermost-notification!
[{:keys [http-client] :as cfg} {:keys [host id public-uri] :as event}]
(let [uri (:uri cfg)
text (str "Exception on (host: " host ", url: " public-uri "/dbg/error/" id ")\n"
(when-let [pid (:profile-id event)]
(str "- profile-id: #uuid-" pid "\n")))]
(p/then
(http-client {:uri uri
:method :post
:headers {"content-type" "application/json"}
:body (json/write-str {:text text})})
(fn [{:keys [status] :as rsp}]
(when (not= status 200)
(l/warn :hint "error on sending data to mattermost"
:response (pr-str rsp)))))))
[cfg {:keys [id public-uri] :as report}]
(let [text (str "Exception: " public-uri "/dbg/error/" id " "
(when-let [pid (:profile-id report)]
(str "(pid: #uuid-" pid ")"))
"\n"
"```\n"
"- host: `" (:host report) "`\n"
"- tenant: `" (:tenant report) "`\n"
"- request-path: `" (:request-path report) "`\n"
"- frontend-version: `" (:frontend-version report) "`\n"
"- backend-version: `" (:backend-version report) "`\n"
"\n"
"Trace:\n"
(:trace report)
"```")
resp (http/req! cfg
{:uri (cf/get :error-report-webhook)
:method :post
:headers {"content-type" "application/json"}
:body (json/encode-str {:text text})}
{:sync? true})]
(when (not= 200 (:status resp))
(l/warn :hint "error on sending data"
:response (pr-str resp)))))
(defn record->report
[{:keys [::l/context ::l/id ::l/cause] :as record}]
(us/assert! ::l/record record)
{:id id
:tenant (cf/get :tenant)
:host (cf/get :host)
:public-uri (cf/get :public-uri)
:backend-version (or (:version/backend context) (:full cf/version))
:frontend-version (:version/frontend context)
:profile-id (:request/profile-id context)
:request-path (:request/path context)
:trace (ex/format-throwable cause :detail? false :header? false)})
(defn handle-event
[cfg event]
(let [ch (a/chan)]
(-> (p/let [event (ldb/parse-event event)]
(send-mattermost-notification! cfg event))
(p/finally (fn [_ cause]
(when cause
(l/warn :hint "unexpected exception on error reporter" :cause cause))
(a/close! ch))))
ch))
(s/def ::http-client fn?)
(s/def ::uri ::cf/error-report-webhook)
[cfg record]
(when @enabled
(try
(let [report (record->report record)]
(send-mattermost-notification! cfg report))
(catch Throwable cause
(l/warn :hint "unhandled error" :cause cause)))))
(defmethod ig/pre-init-spec ::reporter [_]
(s/keys :req-un [::http-client ::receiver]
:opt-un [::uri]))
(s/keys :req [::http/client]))
(defmethod ig/init-key ::reporter
[_ {:keys [receiver uri] :as cfg}]
(when uri
(l/info :msg "initializing mattermost error reporter" :uri uri)
(let [output (a/chan (a/sliding-buffer 128)
(filter (fn [event]
(= (:logger/level event) "error"))))]
(receiver :sub output)
(a/go-loop []
(let [msg (a/<! output)]
(if (nil? msg)
(l/info :msg "stoping error reporting loop")
(do
(a/<! (handle-event cfg msg))
(recur)))))
output)))
[_ cfg]
(when-let [uri (cf/get :error-report-webhook)]
(px/thread
{:name "penpot/mattermost-reporter"
:virtual true}
(l/info :hint "initializing error reporter" :uri uri)
(let [input (sp/chan :buf (sp/sliding-buffer 128)
:xf (filter ldb/error-record?))]
(add-watch l/log-record ::reporter #(sp/put! input %4))
(try
(loop []
(when-let [msg (sp/take! input)]
(handle-event cfg msg)
(recur)))
(catch InterruptedException _
(l/debug :hint "reporter interrupted"))
(catch Throwable cause
(l/error :hint "unexpected error" :cause cause))
(finally
(sp/close! input)
(remove-watch l/log-record ::reporter)
(l/info :hint "reporter terminated")))))))
(defmethod ig/halt-key! ::reporter
[_ output]
(when output
(a/close! output)))
[_ thread]
(some-> thread px/interrupt!))

View File

@@ -1,170 +0,0 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
(ns app.loggers.sentry
"A mattermost integration for error reporting."
(:require
[app.common.logging :as l]
[app.common.uuid :as uuid]
[app.config :as cf]
[app.db :as db]
[app.util.async :as aa]
[app.worker :as wrk]
[clojure.core.async :as a]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig])
(:import
io.sentry.Scope
io.sentry.IHub
io.sentry.Hub
io.sentry.NoOpHub
io.sentry.protocol.User
io.sentry.SentryOptions
io.sentry.SentryLevel
io.sentry.ScopeCallback))
(defonce enabled (atom true))
(defn- parse-context
[event]
(reduce-kv
(fn [acc k v]
(cond
(= k :id) (assoc acc k (uuid/uuid v))
(= k :profile-id) (assoc acc k (uuid/uuid v))
(str/blank? v) acc
:else (assoc acc k v)))
{}
(:context event)))
(defn- parse-event
[event]
(assoc event :context (parse-context event)))
(defn- build-sentry-options
[cfg]
(let [version (:base cf/version)]
(doto (SentryOptions.)
(.setDebug (:debug cfg false))
(.setTracesSampleRate (:traces-sample-rate cfg 1.0))
(.setDsn (:dsn cfg))
(.setServerName (cf/get :host))
(.setEnvironment (cf/get :tenant))
(.setAttachServerName true)
(.setAttachStacktrace (:attach-stack-trace cfg false))
(.setRelease (str "backend@" (if (= version "0.0.0") "develop" version))))))
(defn handle-event
[^IHub shub event]
(letfn [(set-user! [^Scope scope {:keys [context] :as event}]
(let [user (User.)]
(.setIpAddress ^User user ^String (:ip-addr context))
(when-let [pid (:profile-id context)]
(.setId ^User user ^String (str pid)))
(.setUser scope ^User user)))
(set-level! [^Scope scope]
(.setLevel scope SentryLevel/ERROR))
(set-context! [^Scope scope {:keys [context] :as event}]
(let [uri (str (cf/get :public-uri) "/dbg/error-by-id/" (:id context))]
(.setContexts scope "detailed_error_uri" ^String uri))
(when-let [vers (:frontend-version event)]
(.setContexts scope "frontend_version" ^String vers))
(when-let [puri (:public-uri event)]
(.setContexts scope "public_uri" ^String (str puri)))
(when-let [uagent (:user-agent context)]
(.setContexts scope "user_agent" ^String uagent))
(when-let [tenant (:tenant event)]
(.setTag scope "tenant" ^String tenant))
(when-let [type (:error-type context)]
(.setTag scope "error_type" ^String (str type)))
(when-let [code (:error-code context)]
(.setTag scope "error_code" ^String (str code)))
)
(capture [^Scope scope {:keys [context error] :as event}]
(let [msg (str (:message error) "\n\n"
"======================================================\n"
"=================== Params ===========================\n"
"======================================================\n"
(:params context) "\n"
(when (:explain context)
(str "======================================================\n"
"=================== Explain ==========================\n"
"======================================================\n"
(:explain context) "\n"))
(when (:data context)
(str "======================================================\n"
"=================== Error Data =======================\n"
"======================================================\n"
(:data context) "\n"))
(str "======================================================\n"
"=================== Stack Trace ======================\n"
"======================================================\n"
(:trace error))
"\n")]
(set-user! scope event)
(set-level! scope)
(set-context! scope event)
(.captureMessage ^IHub shub msg)
))
]
(when @enabled
(.withScope ^IHub shub (reify ScopeCallback
(run [_ scope]
(->> event
(parse-event)
(capture scope))))))
))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Error Listener
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(s/def ::receiver any?)
(s/def ::dsn ::cf/sentry-dsn)
(s/def ::trace-sample-rate ::cf/sentry-trace-sample-rate)
(s/def ::attach-stack-trace ::cf/sentry-attach-stack-trace)
(s/def ::debug ::cf/sentry-debug)
(defmethod ig/pre-init-spec ::reporter [_]
(s/keys :req-un [::wrk/executor ::db/pool ::receiver]
:opt-un [::dsn ::trace-sample-rate ::attach-stack-trace]))
(defmethod ig/init-key ::reporter
[_ {:keys [receiver dsn executor] :as cfg}]
(l/info :msg "initializing sentry reporter" :dsn dsn)
(let [opts (build-sentry-options cfg)
shub (if dsn
(Hub. ^SentryOptions opts)
(NoOpHub/getInstance))
output (a/chan (a/sliding-buffer 128)
(filter #(= (:level %) "error")))]
(receiver :sub output)
(a/go-loop []
(let [event (a/<! output)]
(if (nil? event)
(do
(l/info :msg "stoping error reporting loop")
(.close ^IHub shub))
(do
(a/<! (aa/with-thread executor (handle-event shub event)))
(recur)))))
output))
(defmethod ig/halt-key! ::reporter
[_ output]
(when output
(a/close! output)))

View File

@@ -0,0 +1,186 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) KALEIDOS INC
(ns app.loggers.webhooks
"A mattermost integration for error reporting."
(:require
[app.common.data :as d]
[app.common.data.macros :as dm]
[app.common.logging :as l]
[app.common.transit :as t]
[app.common.uri :as uri]
[app.config :as cf]
[app.db :as db]
[app.http.client :as http]
[app.util.json :as json]
[app.util.time :as dt]
[app.worker :as wrk]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig]))
;; --- HELPERS
(defn key-fn
[k & keys]
(fn [params]
(reduce #(dm/str %1 ":" (get params %2))
(dm/str (get params k))
keys)))
;; --- PROC
(defn- lookup-webhooks-by-team
[pool team-id]
(db/exec! pool ["select w.* from webhook as w where team_id=? and is_active=true" team-id]))
(defn- lookup-webhooks-by-project
[pool project-id]
(let [sql [(str "select w.* from webhook as w"
" join project as p on (p.team_id = w.team_id)"
" where p.id = ? and w.is_active = true")
project-id]]
(db/exec! pool sql)))
(defn- lookup-webhooks-by-file
[pool file-id]
(let [sql [(str "select w.* from webhook as w"
" join project as p on (p.team_id = w.team_id)"
" join file as f on (f.project_id = p.id)"
" where f.id = ? and w.is_active = true")
file-id]]
(db/exec! pool sql)))
(defn- lookup-webhooks
[{:keys [::db/pool]} {:keys [props] :as event}]
(or (some->> (:team-id props) (lookup-webhooks-by-team pool))
(some->> (:project-id props) (lookup-webhooks-by-project pool))
(some->> (:file-id props) (lookup-webhooks-by-file pool))))
(defmethod ig/pre-init-spec ::process-event-handler [_]
(s/keys :req [::db/pool]))
(defmethod ig/init-key ::process-event-handler
[_ {:keys [::db/pool] :as cfg}]
(fn [{:keys [props] :as task}]
(let [event (::event props)]
(l/debug :hint "process webhook event"
:name (:name event))
(when-let [items (lookup-webhooks cfg event)]
(l/trace :hint "webhooks found for event" :total (count items))
(db/with-atomic [conn pool]
(doseq [item items]
(wrk/submit! ::wrk/conn conn
::wrk/task :run-webhook
::wrk/queue :webhooks
::wrk/max-retries 3
::event event
::config item)))))))
;; --- RUN
(declare interpret-exception)
(declare interpret-response)
(def ^:private json-mapper
(json/mapper
{:encode-key-fn str/camel
:decode-key-fn (comp keyword str/kebab)
:pretty true}))
(defmethod ig/pre-init-spec ::run-webhook-handler [_]
(s/keys :req [::http/client ::db/pool]))
(defmethod ig/prep-key ::run-webhook-handler
[_ cfg]
(merge {::max-errors 3} (d/without-nils cfg)))
(defmethod ig/init-key ::run-webhook-handler
[_ {:keys [::db/pool ::max-errors] :as cfg}]
(letfn [(update-webhook! [whook err]
(if err
(let [sql [(str "update webhook "
" set error_code=?, "
" error_count=error_count+1 "
" where id=?")
err
(:id whook)]
res (db/exec-one! pool sql {::db/return-keys? true})]
(when (>= (:error-count res) max-errors)
(db/update! pool :webhook {:is-active false} {:id (:id whook)})))
(db/update! pool :webhook
{:updated-at (dt/now)
:error-code nil
:error-count 0}
{:id (:id whook)})))
(report-delivery! [whook req rsp err]
(db/insert! pool :webhook-delivery
{:webhook-id (:id whook)
:created-at (dt/now)
:error-code err
:req-data (db/tjson req)
:rsp-data (db/tjson rsp)}))]
(fn [{:keys [props] :as task}]
(let [event (::event props)
whook (::config props)
body (case (:mtype whook)
"application/json" (json/encode-str event json-mapper)
"application/transit+json" (t/encode-str event)
"application/x-www-form-urlencoded" (uri/map->query-string event))]
(l/debug :hint "run webhook"
:event-name (:name event)
:webhook-id (:id whook)
:webhook-uri (:uri whook)
:webhook-mtype (:mtype whook))
(let [req {:uri (:uri whook)
:headers {"content-type" (:mtype whook)
"user-agent" (str/ffmt "penpot/%" (:main cf/version))}
:timeout (dt/duration "4s")
:method :post
:body body}]
(try
(let [rsp (http/req! cfg req {:response-type :input-stream :sync? true})
err (interpret-response rsp)]
(report-delivery! whook req rsp err)
(update-webhook! whook err))
(catch Throwable cause
(let [err (interpret-exception cause)]
(report-delivery! whook req nil err)
(update-webhook! whook err)
(when (= err "unknown")
(l/error :hint "unknown error on webhook request"
:cause cause))))))))))
(defn interpret-response
[{:keys [status] :as response}]
(when-not (or (= 200 status)
(= 204 status))
(str/ffmt "unexpected-status:%" status)))
(defn interpret-exception
[cause]
(cond
(instance? javax.net.ssl.SSLHandshakeException cause)
"ssl-validation-error"
(instance? java.net.ConnectException cause)
"connection-error"
(instance? java.lang.IllegalArgumentException cause)
"invalid-uri"
(instance? java.net.http.HttpConnectTimeoutException cause)
"timeout"
))

View File

@@ -1,110 +0,0 @@
;; This Source Code Form is subject to the terms of the Mozilla Public
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
(ns app.loggers.zmq
"A generic ZMQ listener."
(:require
[app.common.exceptions :as ex]
[app.common.logging :as l]
[app.common.spec :as us]
[app.util.json :as json]
[app.util.time :as dt]
[clojure.core.async :as a]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[integrant.core :as ig])
(:import
org.zeromq.SocketType
org.zeromq.ZMQ$Socket
org.zeromq.ZContext))
(declare prepare)
(declare start-rcv-loop)
(s/def ::endpoint ::us/string)
(defmethod ig/pre-init-spec ::receiver [_]
(s/keys :opt-un [::endpoint]))
(defmethod ig/init-key ::receiver
[_ {:keys [endpoint] :as cfg}]
(l/info :msg "initializing ZMQ receiver" :bind endpoint)
(let [buffer (a/chan 1)
output (a/chan 1 (comp (filter map?)
(keep prepare)))
mult (a/mult output)]
(when endpoint
(let [thread (Thread. #(start-rcv-loop {:out buffer :endpoint endpoint}))]
(.setDaemon thread false)
(.setName thread "penpot/zmq-logger-receiver")
(.start thread)))
(a/pipe buffer output)
(with-meta
(fn [cmd ch]
(case cmd
:sub (a/tap mult ch)
:unsub (a/untap mult ch))
ch)
{::output output
::buffer buffer
::mult mult})))
(defmethod ig/halt-key! ::receiver
[_ f]
(a/close! (::buffer (meta f))))
(def ^:private json-mapper
(json/mapper
{:encode-key-fn str/camel
:decode-key-fn (comp keyword str/kebab)}))
(defn- start-rcv-loop
([] (start-rcv-loop nil))
([{:keys [out endpoint] :or {endpoint "tcp://localhost:5556"}}]
(let [out (or out (a/chan 1))
zctx (ZContext. 1)
socket (.. zctx (createSocket SocketType/SUB))]
(.. socket (connect ^String endpoint))
(.. socket (subscribe ""))
(.. socket (setReceiveTimeOut 5000))
(loop []
(let [msg (.recv ^ZMQ$Socket socket)
msg (ex/ignoring (json/read msg json-mapper))
msg (if (nil? msg) :empty msg)]
(if (a/>!! out msg)
(recur)
(do
(.close ^java.lang.AutoCloseable socket)
(.destroy ^ZContext zctx))))))))
(s/def ::logger-name string?)
(s/def ::level string?)
(s/def ::thread string?)
(s/def ::time-millis integer?)
(s/def ::message string?)
(s/def ::context-map map?)
(s/def ::thrown map?)
(s/def ::log4j-event
(s/keys :req-un [::logger-name ::level ::thread ::time-millis ::message]
:opt-un [::context-map ::thrown]))
(defn- prepare
[event]
(if (s/valid? ::log4j-event event)
(merge {:message (:message event)
:created-at (dt/instant (:time-millis event))
:logger/name (:logger-name event)
:logger/level (str/lower (:level event))}
(when-let [trace (-> event :thrown :extended-stack-trace)]
{:trace trace})
(:context-map event))
(do
(l/warn :hint "invalid event" :event event)
nil)))

View File

@@ -2,120 +2,240 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.main
(:require
[app.auth.oidc]
[app.auth.ldap :as-alias ldap]
[app.auth.oidc :as-alias oidc]
[app.auth.oidc.providers :as-alias oidc.providers]
[app.common.logging :as l]
[app.config :as cf]
[app.db :as-alias db]
[app.email :as-alias email]
[app.http :as-alias http]
[app.http.assets :as-alias http.assets]
[app.http.awsns :as http.awsns]
[app.http.client :as-alias http.client]
[app.http.debug :as-alias http.debug]
[app.http.session :as-alias session]
[app.http.session.tasks :as-alias session.tasks]
[app.http.websocket :as http.ws]
[app.loggers.audit.tasks :as-alias audit.tasks]
[app.loggers.webhooks :as-alias webhooks]
[app.metrics :as-alias mtx]
[app.metrics.definition :as-alias mdef]
[app.msgbus :as-alias mbus]
[app.redis :as-alias rds]
[app.rpc :as-alias rpc]
[app.rpc.doc :as-alias rpc.doc]
[app.setup :as-alias setup]
[app.srepl :as-alias srepl]
[app.storage :as-alias sto]
[app.storage.fs :as-alias sto.fs]
[app.storage.s3 :as-alias sto.s3]
[app.util.time :as dt]
[integrant.core :as ig])
[app.worker :as-alias wrk]
[cuerdas.core :as str]
[integrant.core :as ig]
[promesa.exec :as px])
(:gen-class))
(def default-metrics
{:update-file-changes
{::mdef/name "penpot_rpc_update_file_changes_total"
::mdef/help "A total number of changes submitted to update-file."
::mdef/type :counter}
:update-file-bytes-processed
{::mdef/name "penpot_rpc_update_file_bytes_processed_total"
::mdef/help "A total number of bytes processed by update-file."
::mdef/type :counter}
:rpc-mutation-timing
{::mdef/name "penpot_rpc_mutation_timing"
::mdef/help "RPC mutation method call timing."
::mdef/labels ["name"]
::mdef/type :histogram}
:rpc-command-timing
{::mdef/name "penpot_rpc_command_timing"
::mdef/help "RPC command method call timing."
::mdef/labels ["name"]
::mdef/type :histogram}
:rpc-query-timing
{::mdef/name "penpot_rpc_query_timing"
::mdef/help "RPC query method call timing."
::mdef/labels ["name"]
::mdef/type :histogram}
:websocket-active-connections
{::mdef/name "penpot_websocket_active_connections"
::mdef/help "Active websocket connections gauge"
::mdef/type :gauge}
:websocket-messages-total
{::mdef/name "penpot_websocket_message_total"
::mdef/help "Counter of processed messages."
::mdef/labels ["op"]
::mdef/type :counter}
:websocket-session-timing
{::mdef/name "penpot_websocket_session_timing"
::mdef/help "Websocket session timing (seconds)."
::mdef/type :summary}
:session-update-total
{::mdef/name "penpot_http_session_update_total"
::mdef/help "A counter of session update batch events."
::mdef/type :counter}
:tasks-timing
{::mdef/name "penpot_tasks_timing"
::mdef/help "Background tasks timing (milliseconds)."
::mdef/labels ["name"]
::mdef/type :summary}
:redis-eval-timing
{::mdef/name "penpot_redis_eval_timing"
::mdef/help "Redis EVAL commands execution timings (ms)"
::mdef/labels ["name"]
::mdef/type :summary}
:rpc-climit-queue
{::mdef/name "penpot_rpc_climit_queue"
::mdef/help "Current number of queued submissions."
::mdef/labels ["name"]
::mdef/type :gauge}
:rpc-climit-permits
{::mdef/name "penpot_rpc_climit_permits"
::mdef/help "Current number of available permits"
::mdef/labels ["name"]
::mdef/type :gauge}
:rpc-climit-timing
{::mdef/name "penpot_rpc_climit_timing"
::mdef/help "Summary of the time between queuing and executing on the CLIMIT"
::mdef/labels ["name"]
::mdef/type :summary}
:audit-http-handler-queue-size
{::mdef/name "penpot_audit_http_handler_queue_size"
::mdef/help "Current number of queued submissions on the audit log http handler"
::mdef/labels []
::mdef/type :gauge}
:audit-http-handler-concurrency
{::mdef/name "penpot_audit_http_handler_concurrency"
::mdef/help "Current number of used concurrency capacity on the audit log http handler"
::mdef/labels []
::mdef/type :gauge}
:audit-http-handler-timing
{::mdef/name "penpot_audit_http_handler_timing"
::mdef/help "Summary of the time between queuing and executing on the audit log http handler"
::mdef/labels []
::mdef/type :summary}
:executors-active-threads
{::mdef/name "penpot_executors_active_threads"
::mdef/help "Current number of threads available in the executor service."
::mdef/labels ["name"]
::mdef/type :gauge}
:executors-completed-tasks
{::mdef/name "penpot_executors_completed_tasks_total"
::mdef/help "Approximate number of completed tasks by the executor."
::mdef/labels ["name"]
::mdef/type :counter}
:executors-running-threads
{::mdef/name "penpot_executors_running_threads"
::mdef/help "Current number of threads with state RUNNING."
::mdef/labels ["name"]
::mdef/type :gauge}
:executors-queued-submissions
{::mdef/name "penpot_executors_queued_submissions"
::mdef/help "Current number of queued submissions."
::mdef/labels ["name"]
::mdef/type :gauge}})
(def system-config
{:app.db/pool
{:uri (cf/get :database-uri)
:username (cf/get :database-username)
:password (cf/get :database-password)
:read-only (cf/get :database-readonly false)
:metrics (ig/ref :app.metrics/metrics)
:migrations (ig/ref :app.migrations/all)
:name :main
:min-size (cf/get :database-min-pool-size 0)
:max-size (cf/get :database-max-pool-size 30)}
{::db/pool
{::db/uri (cf/get :database-uri)
::db/username (cf/get :database-username)
::db/password (cf/get :database-password)
::db/read-only? (cf/get :database-readonly false)
::db/min-size (cf/get :database-min-pool-size 0)
::db/max-size (cf/get :database-max-pool-size 60)
::mtx/metrics (ig/ref ::mtx/metrics)}
;; Default thread pool for IO operations
[::default :app.worker/executor]
{:parallelism (cf/get :default-executor-parallelism 60)
:prefix :default}
::wrk/executor
{::wrk/parallelism (cf/get :default-executor-parallelism
(+ 3 (* (px/get-available-processors) 3)))}
;; Constrained thread pool. Should only be used from high resources
;; demanding operations.
[::blocking :app.worker/executor]
{:parallelism (cf/get :blocking-executor-parallelism 10)
:prefix :blocking}
;; Dedicated thread pool for backround tasks execution.
[::worker :app.worker/executor]
{:parallelism (cf/get :worker-executor-parallelism 10)
:prefix :worker}
:app.worker/scheduler
{:parallelism 1
:prefix :scheduler}
:app.worker/executors
{:default (ig/ref [::default :app.worker/executor])
:worker (ig/ref [::worker :app.worker/executor])
:blocking (ig/ref [::blocking :app.worker/executor])}
:app.worker/executors-monitor
{:metrics (ig/ref :app.metrics/metrics)
:scheduler (ig/ref :app.worker/scheduler)
:executors (ig/ref :app.worker/executors)}
::wrk/monitor
{::mtx/metrics (ig/ref ::mtx/metrics)
::wrk/name "default"
::wrk/executor (ig/ref ::wrk/executor)}
:app.migrations/migrations
{}
{::db/pool (ig/ref ::db/pool)}
:app.metrics/metrics
{}
::mtx/metrics
{:default default-metrics}
:app.migrations/all
{:main (ig/ref :app.migrations/migrations)}
::mtx/routes
{::mtx/metrics (ig/ref ::mtx/metrics)}
:app.msgbus/msgbus
{:backend (cf/get :msgbus-backend :redis)
:executor (ig/ref [::default :app.worker/executor])
:redis-uri (cf/get :redis-uri)}
::rds/redis
{::rds/uri (cf/get :redis-uri)
::mtx/metrics (ig/ref ::mtx/metrics)
::wrk/executor (ig/ref ::wrk/executor)}
:app.tokens/tokens
{:keys (ig/ref :app.setup/keys)}
::mbus/msgbus
{::wrk/executor (ig/ref ::wrk/executor)
::rds/redis (ig/ref ::rds/redis)}
:app.storage.tmp/cleaner
{:executor (ig/ref [::worker :app.worker/executor])
:scheduler (ig/ref :app.worker/scheduler)}
{::wrk/executor (ig/ref ::wrk/executor)}
:app.storage/gc-deleted-task
{:pool (ig/ref :app.db/pool)
:storage (ig/ref :app.storage/storage)
:executor (ig/ref [::worker :app.worker/executor])}
::sto/gc-deleted-task
{::db/pool (ig/ref ::db/pool)
::sto/storage (ig/ref ::sto/storage)}
:app.storage/gc-touched-task
{:pool (ig/ref :app.db/pool)}
::sto/gc-touched-task
{::db/pool (ig/ref ::db/pool)}
:app.http/client
{:executor (ig/ref [::default :app.worker/executor])}
::http.client/client
{::wrk/executor (ig/ref ::wrk/executor)}
:app.http/session
{:store (ig/ref :app.http.session/store)}
::session/manager
{::db/pool (ig/ref ::db/pool)}
:app.http.session/store
{:pool (ig/ref :app.db/pool)
:tokens (ig/ref :app.tokens/tokens)
:executor (ig/ref [::default :app.worker/executor])}
::session.tasks/gc
{::db/pool (ig/ref ::db/pool)}
:app.http.session/gc-task
{:pool (ig/ref :app.db/pool)
:max-age (cf/get :auth-token-cookie-max-age)}
::http.awsns/routes
{::props (ig/ref ::setup/props)
::db/pool (ig/ref ::db/pool)
::http.client/client (ig/ref ::http.client/client)
::wrk/executor (ig/ref ::wrk/executor)}
:app.http.awsns/handler
{:tokens (ig/ref :app.tokens/tokens)
:pool (ig/ref :app.db/pool)
:http-client (ig/ref :app.http/client)
:executor (ig/ref [::worker :app.worker/executor])}
::http/server
{::http/port (cf/get :http-server-port)
::http/host (cf/get :http-server-host)
::http/router (ig/ref ::http/router)
::wrk/executor (ig/ref ::wrk/executor)
::http/io-threads (cf/get :http-server-io-threads)
::http/max-body-size (cf/get :http-server-max-body-size)
::http/max-multipart-body-size (cf/get :http-server-max-multipart-body-size)}
:app.http/server
{:port (cf/get :http-server-port)
:host (cf/get :http-server-host)
:router (ig/ref :app.http/router)
:metrics (ig/ref :app.metrics/metrics)
:executor (ig/ref [::default :app.worker/executor])
:io-threads (cf/get :http-server-io-threads)
:max-body-size (cf/get :http-server-max-body-size)
:max-multipart-body-size (cf/get :http-server-max-multipart-body-size)}
:app.auth.ldap/provider
::ldap/provider
{:host (cf/get :ldap-host)
:port (cf/get :ldap-port)
:ssl (cf/get :ldap-ssl)
@@ -129,256 +249,233 @@
:bind-password (cf/get :ldap-bind-password)
:enabled? (contains? cf/flags :login-with-ldap)}
:app.auth.oidc/google-provider
{:enabled? (contains? cf/flags :login-with-google)
:client-id (cf/get :google-client-id)
:client-secret (cf/get :google-client-secret)}
::oidc.providers/google
{}
:app.auth.oidc/github-provider
{:enabled? (contains? cf/flags :login-with-github)
:http-client (ig/ref :app.http/client)
:client-id (cf/get :github-client-id)
:client-secret (cf/get :github-client-secret)}
::oidc.providers/github
{::http.client/client (ig/ref ::http.client/client)}
:app.auth.oidc/gitlab-provider
{:enabled? (contains? cf/flags :login-with-gitlab)
:base-uri (cf/get :gitlab-base-uri "https://gitlab.com")
:client-id (cf/get :gitlab-client-id)
:client-secret (cf/get :gitlab-client-secret)}
::oidc.providers/gitlab
{}
:app.auth.oidc/generic-provider
{:enabled? (contains? cf/flags :login-with-oidc)
:http-client (ig/ref :app.http/client)
::oidc.providers/generic
{::http.client/client (ig/ref ::http.client/client)}
:client-id (cf/get :oidc-client-id)
:client-secret (cf/get :oidc-client-secret)
:base-uri (cf/get :oidc-base-uri)
:token-uri (cf/get :oidc-token-uri)
:auth-uri (cf/get :oidc-auth-uri)
:user-uri (cf/get :oidc-user-uri)
:scopes (cf/get :oidc-scopes)
:roles-attr (cf/get :oidc-roles-attr)
:roles (cf/get :oidc-roles)}
:app.auth.oidc/routes
{:providers {:google (ig/ref :app.auth.oidc/google-provider)
:github (ig/ref :app.auth.oidc/github-provider)
:gitlab (ig/ref :app.auth.oidc/gitlab-provider)
:oidc (ig/ref :app.auth.oidc/generic-provider)}
:tokens (ig/ref :app.tokens/tokens)
:http-client (ig/ref :app.http/client)
:pool (ig/ref :app.db/pool)
:session (ig/ref :app.http/session)
:public-uri (cf/get :public-uri)
:executor (ig/ref [::default :app.worker/executor])}
::oidc/routes
{::http.client/client (ig/ref ::http.client/client)
::db/pool (ig/ref ::db/pool)
::props (ig/ref ::setup/props)
::oidc/providers {:google (ig/ref ::oidc.providers/google)
:github (ig/ref ::oidc.providers/github)
:gitlab (ig/ref ::oidc.providers/gitlab)
:oidc (ig/ref ::oidc.providers/generic)}
::session/manager (ig/ref ::session/manager)}
:app.http/router
{:assets (ig/ref :app.http.assets/handlers)
:feedback (ig/ref :app.http.feedback/handler)
:session (ig/ref :app.http/session)
:awsns-handler (ig/ref :app.http.awsns/handler)
:debug-routes (ig/ref :app.http.debug/routes)
:oidc-routes (ig/ref :app.auth.oidc/routes)
:ws (ig/ref :app.http.websocket/handler)
:metrics (ig/ref :app.metrics/metrics)
:public-uri (cf/get :public-uri)
:storage (ig/ref :app.storage/storage)
:tokens (ig/ref :app.tokens/tokens)
:audit-handler (ig/ref :app.loggers.audit/http-handler)
:rpc-routes (ig/ref :app.rpc/routes)
:doc-routes (ig/ref :app.rpc.doc/routes)
:executor (ig/ref [::default :app.worker/executor])}
{::session/manager (ig/ref ::session/manager)
::db/pool (ig/ref ::db/pool)
::rpc/routes (ig/ref ::rpc/routes)
::rpc.doc/routes (ig/ref ::rpc.doc/routes)
::props (ig/ref ::setup/props)
::mtx/routes (ig/ref ::mtx/routes)
::oidc/routes (ig/ref ::oidc/routes)
::http.debug/routes (ig/ref ::http.debug/routes)
::http.assets/routes (ig/ref ::http.assets/routes)
::http.ws/routes (ig/ref ::http.ws/routes)
::http.awsns/routes (ig/ref ::http.awsns/routes)}
:app.http.debug/routes
{:pool (ig/ref :app.db/pool)
:executor (ig/ref [::worker :app.worker/executor])
:storage (ig/ref :app.storage/storage)
:session (ig/ref :app.http/session)}
{::db/pool (ig/ref ::db/pool)
::wrk/executor (ig/ref ::wrk/executor)
::session/manager (ig/ref ::session/manager)
::sto/storage (ig/ref ::sto/storage)}
:app.http.websocket/handler
{:pool (ig/ref :app.db/pool)
:metrics (ig/ref :app.metrics/metrics)
:msgbus (ig/ref :app.msgbus/msgbus)}
::http.ws/routes
{::db/pool (ig/ref ::db/pool)
::mtx/metrics (ig/ref ::mtx/metrics)
::mbus/msgbus (ig/ref ::mbus/msgbus)
::session/manager (ig/ref ::session/manager)}
:app.http.assets/handlers
{:metrics (ig/ref :app.metrics/metrics)
:assets-path (cf/get :assets-path)
:storage (ig/ref :app.storage/storage)
:executor (ig/ref [::default :app.worker/executor])
:cache-max-age (dt/duration {:hours 24})
:signature-max-age (dt/duration {:hours 24 :minutes 5})}
:app.http.assets/routes
{::http.assets/path (cf/get :assets-path)
::http.assets/cache-max-age (dt/duration {:hours 24})
::http.assets/cache-max-agesignature-max-age (dt/duration {:hours 24 :minutes 5})
::sto/storage (ig/ref ::sto/storage)
::wrk/executor (ig/ref ::wrk/executor)}
:app.http.feedback/handler
{:pool (ig/ref :app.db/pool)
:executor (ig/ref [::default :app.worker/executor])}
:app.rpc/climit
{::mtx/metrics (ig/ref ::mtx/metrics)
::wrk/executor (ig/ref ::wrk/executor)}
:app.rpc/rlimit
{::wrk/executor (ig/ref ::wrk/executor)}
:app.rpc/methods
{:pool (ig/ref :app.db/pool)
:session (ig/ref :app.http/session)
:tokens (ig/ref :app.tokens/tokens)
:metrics (ig/ref :app.metrics/metrics)
:storage (ig/ref :app.storage/storage)
:msgbus (ig/ref :app.msgbus/msgbus)
:public-uri (cf/get :public-uri)
:audit (ig/ref :app.loggers.audit/collector)
:ldap (ig/ref :app.auth.ldap/provider)
:http-client (ig/ref :app.http/client)
:executors (ig/ref :app.worker/executors)}
{::http.client/client (ig/ref ::http.client/client)
::db/pool (ig/ref ::db/pool)
::wrk/executor (ig/ref ::wrk/executor)
::session/manager (ig/ref ::session/manager)
::ldap/provider (ig/ref ::ldap/provider)
::sto/storage (ig/ref ::sto/storage)
::mtx/metrics (ig/ref ::mtx/metrics)
::mbus/msgbus (ig/ref ::mbus/msgbus)
::rds/redis (ig/ref ::rds/redis)
::rpc/climit (ig/ref ::rpc/climit)
::rpc/rlimit (ig/ref ::rpc/rlimit)
::setup/templates (ig/ref ::setup/templates)
::props (ig/ref ::setup/props)
:pool (ig/ref ::db/pool)
}
:app.rpc.doc/routes
{:methods (ig/ref :app.rpc/methods)}
:app.rpc/routes
{:methods (ig/ref :app.rpc/methods)}
{::rpc/methods (ig/ref :app.rpc/methods)
::db/pool (ig/ref ::db/pool)
::wrk/executor (ig/ref ::wrk/executor)
::session/manager (ig/ref ::session/manager)
::props (ig/ref ::setup/props)}
:app.worker/registry
{:metrics (ig/ref :app.metrics/metrics)
:tasks
{:sendmail (ig/ref :app.emails/sendmail-handler)
::wrk/registry
{::mtx/metrics (ig/ref ::mtx/metrics)
::wrk/tasks
{:sendmail (ig/ref ::email/handler)
:objects-gc (ig/ref :app.tasks.objects-gc/handler)
:file-gc (ig/ref :app.tasks.file-gc/handler)
:file-xlog-gc (ig/ref :app.tasks.file-xlog-gc/handler)
:storage-gc-deleted (ig/ref :app.storage/gc-deleted-task)
:storage-gc-touched (ig/ref :app.storage/gc-touched-task)
:storage-gc-deleted (ig/ref ::sto/gc-deleted-task)
:storage-gc-touched (ig/ref ::sto/gc-touched-task)
:tasks-gc (ig/ref :app.tasks.tasks-gc/handler)
:telemetry (ig/ref :app.tasks.telemetry/handler)
:session-gc (ig/ref :app.http.session/gc-task)
:audit-log-archive (ig/ref :app.loggers.audit/archive-task)
:audit-log-gc (ig/ref :app.loggers.audit/gc-task)}}
:session-gc (ig/ref ::session.tasks/gc)
:audit-log-archive (ig/ref ::audit.tasks/archive)
:audit-log-gc (ig/ref ::audit.tasks/gc)
:app.emails/sendmail-handler
{:host (cf/get :smtp-host)
:port (cf/get :smtp-port)
:ssl (cf/get :smtp-ssl)
:tls (cf/get :smtp-tls)
:username (cf/get :smtp-username)
:password (cf/get :smtp-password)
:metrics (ig/ref :app.metrics/metrics)
:default-reply-to (cf/get :smtp-default-reply-to)
:default-from (cf/get :smtp-default-from)}
:process-webhook-event
(ig/ref ::webhooks/process-event-handler)
:run-webhook
(ig/ref ::webhooks/run-webhook-handler)}}
::email/sendmail
{::email/host (cf/get :smtp-host)
::email/port (cf/get :smtp-port)
::email/ssl (cf/get :smtp-ssl)
::email/tls (cf/get :smtp-tls)
::email/username (cf/get :smtp-username)
::email/password (cf/get :smtp-password)
::email/default-reply-to (cf/get :smtp-default-reply-to)
::email/default-from (cf/get :smtp-default-from)}
::email/handler
{::email/sendmail (ig/ref ::email/sendmail)
::mtx/metrics (ig/ref ::mtx/metrics)}
:app.tasks.tasks-gc/handler
{:pool (ig/ref :app.db/pool)
:max-age cf/deletion-delay}
{::db/pool (ig/ref ::db/pool)}
:app.tasks.objects-gc/handler
{:pool (ig/ref :app.db/pool)
:storage (ig/ref :app.storage/storage)}
{::db/pool (ig/ref ::db/pool)
::sto/storage (ig/ref ::sto/storage)}
:app.tasks.file-gc/handler
{:pool (ig/ref :app.db/pool)}
{::db/pool (ig/ref ::db/pool)
::sto/storage (ig/ref ::sto/storage)}
:app.tasks.file-xlog-gc/handler
{:pool (ig/ref :app.db/pool)}
{::db/pool (ig/ref ::db/pool)}
:app.tasks.telemetry/handler
{:pool (ig/ref :app.db/pool)
:version (:full cf/version)
:uri (cf/get :telemetry-uri)
:sprops (ig/ref :app.setup/props)
:http-client (ig/ref :app.http/client)}
{::db/pool (ig/ref ::db/pool)
::http.client/client (ig/ref ::http.client/client)
::props (ig/ref ::setup/props)}
:app.srepl/server
{:port (cf/get :srepl-port)
:host (cf/get :srepl-host)}
[::srepl/urepl ::srepl/server]
{::srepl/port (cf/get :urepl-port 6062)
::srepl/host (cf/get :urepl-host "localhost")}
:app.setup/props
{:pool (ig/ref :app.db/pool)
:key (cf/get :secret-key)}
[::srepl/prepl ::srepl/server]
{::srepl/port (cf/get :prepl-port 6063)
::srepl/host (cf/get :prepl-host "localhost")}
:app.setup/keys
{:props (ig/ref :app.setup/props)}
::setup/templates {}
:app.loggers.zmq/receiver
{:endpoint (cf/get :loggers-zmq-uri)}
::setup/props
{::db/pool (ig/ref ::db/pool)
::key (cf/get :secret-key)
:app.loggers.audit/http-handler
{:pool (ig/ref :app.db/pool)
:executor (ig/ref [::default :app.worker/executor])}
;; NOTE: this dependency is only necessary for proper initialization ordering, props
;; module requires the migrations to run before initialize.
::migrations (ig/ref :app.migrations/migrations)}
:app.loggers.audit/collector
{:pool (ig/ref :app.db/pool)
:executor (ig/ref [::worker :app.worker/executor])}
::audit.tasks/archive
{::props (ig/ref ::setup/props)
::db/pool (ig/ref ::db/pool)
::http.client/client (ig/ref ::http.client/client)}
:app.loggers.audit/archive-task
{:uri (cf/get :audit-log-archive-uri)
:tokens (ig/ref :app.tokens/tokens)
:pool (ig/ref :app.db/pool)
:http-client (ig/ref :app.http/client)}
::audit.tasks/gc
{::db/pool (ig/ref ::db/pool)}
:app.loggers.audit/gc-task
{:max-age (cf/get :audit-log-gc-max-age cf/deletion-delay)
:pool (ig/ref :app.db/pool)}
::webhooks/process-event-handler
{::db/pool (ig/ref ::db/pool)
::http.client/client (ig/ref ::http.client/client)}
:app.loggers.loki/reporter
{:uri (cf/get :loggers-loki-uri)
:receiver (ig/ref :app.loggers.zmq/receiver)
:http-client (ig/ref :app.http/client)}
::webhooks/run-webhook-handler
{::db/pool (ig/ref ::db/pool)
::http.client/client (ig/ref ::http.client/client)}
:app.loggers.mattermost/reporter
{:uri (cf/get :error-report-webhook)
:receiver (ig/ref :app.loggers.zmq/receiver)
:http-client (ig/ref :app.http/client)}
{::http.client/client (ig/ref ::http.client/client)}
:app.loggers.database/reporter
{:receiver (ig/ref :app.loggers.zmq/receiver)
:pool (ig/ref :app.db/pool)
:executor (ig/ref [::worker :app.worker/executor])}
{::db/pool (ig/ref ::db/pool)}
:app.storage/storage
{:pool (ig/ref :app.db/pool)
:executor (ig/ref [::default :app.worker/executor])
:backends
::sto/storage
{::db/pool (ig/ref ::db/pool)
::wrk/executor (ig/ref ::wrk/executor)
::sto/backends
{:assets-s3 (ig/ref [::assets :app.storage.s3/backend])
:assets-fs (ig/ref [::assets :app.storage.fs/backend])
;; keep this for backward compatibility
:s3 (ig/ref [::assets :app.storage.s3/backend])
:fs (ig/ref [::assets :app.storage.fs/backend])}}
:assets-fs (ig/ref [::assets :app.storage.fs/backend])}}
[::assets :app.storage.s3/backend]
{:region (cf/get :storage-assets-s3-region)
:endpoint (cf/get :storage-assets-s3-endpoint)
:bucket (cf/get :storage-assets-s3-bucket)
:executor (ig/ref [::default :app.worker/executor])}
{::sto.s3/region (cf/get :storage-assets-s3-region)
::sto.s3/endpoint (cf/get :storage-assets-s3-endpoint)
::sto.s3/bucket (cf/get :storage-assets-s3-bucket)
::wrk/executor (ig/ref ::wrk/executor)}
[::assets :app.storage.fs/backend]
{:directory (cf/get :storage-assets-fs-directory)}
{::sto.fs/directory (cf/get :storage-assets-fs-directory)}
})
(def worker-config
{ :app.worker/cron
{:executor (ig/ref [::worker :app.worker/executor])
:scheduler (ig/ref :app.worker/scheduler)
:tasks (ig/ref :app.worker/registry)
:pool (ig/ref :app.db/pool)
:entries
[{:cron #app/cron "0 0 0 * * ?" ;; daily
:task :file-gc}
{:cron #app/cron "0 0 * * * ?" ;; hourly
{::wrk/cron
{::wrk/registry (ig/ref ::wrk/registry)
::db/pool (ig/ref ::db/pool)
::wrk/entries
[{:cron #app/cron "0 0 * * * ?" ;; hourly
:task :file-xlog-gc}
{:cron #app/cron "0 0 0 * * ?" ;; daily
:task :storage-gc-deleted}
{:cron #app/cron "0 0 0 * * ?" ;; daily
:task :storage-gc-touched}
{:cron #app/cron "0 0 0 * * ?" ;; daily
{:cron #app/cron "0 0 0 * * ?" ;; daily
:task :session-gc}
{:cron #app/cron "0 0 0 * * ?" ;; daily
{:cron #app/cron "0 0 0 * * ?" ;; daily
:task :objects-gc}
{:cron #app/cron "0 0 0 * * ?" ;; daily
{:cron #app/cron "0 0 0 * * ?" ;; daily
:task :storage-gc-deleted}
{:cron #app/cron "0 0 0 * * ?" ;; daily
:task :storage-gc-touched}
{:cron #app/cron "0 0 0 * * ?" ;; daily
:task :tasks-gc}
{:cron #app/cron "0 0 2 * * ?" ;; daily
:task :file-gc}
{:cron #app/cron "0 30 */3,23 * * ?"
:task :telemetry}
@@ -387,14 +484,30 @@
:task :audit-log-archive})
(when (contains? cf/flags :audit-log-gc)
{:cron #app/cron "0 0 0 * * ?" ;; daily
{:cron #app/cron "30 */5 * * * ?" ;; every 5m
:task :audit-log-gc})]}
:app.worker/worker
{:executor (ig/ref [::worker :app.worker/executor])
:tasks (ig/ref :app.worker/registry)
:metrics (ig/ref :app.metrics/metrics)
:pool (ig/ref :app.db/pool)}})
::wrk/dispatcher
{::rds/redis (ig/ref ::rds/redis)
::mtx/metrics (ig/ref ::mtx/metrics)
::db/pool (ig/ref ::db/pool)}
[::default ::wrk/worker]
{::wrk/parallelism (cf/get ::worker-default-parallelism 1)
::wrk/queue :default
::rds/redis (ig/ref ::rds/redis)
::wrk/registry (ig/ref ::wrk/registry)
::mtx/metrics (ig/ref ::mtx/metrics)
::db/pool (ig/ref ::db/pool)}
[::webhook ::wrk/worker]
{::wrk/parallelism (cf/get ::worker-webhook-parallelism 1)
::wrk/queue :webhooks
::rds/redis (ig/ref ::rds/redis)
::wrk/registry (ig/ref ::wrk/registry)
::mtx/metrics (ig/ref ::mtx/metrics)
::db/pool (ig/ref ::db/pool)}})
(def system nil)
@@ -408,7 +521,9 @@
(merge worker-config))
(ig/prep)
(ig/init))))
(l/info :msg "welcome to penpot"
(l/info :hint "welcome to penpot"
:flags (str/join "," (map name cf/flags))
:worker? (contains? cf/flags :backend-worker)
:version (:full cf/version)))
(defn stop
@@ -419,4 +534,9 @@
(defn -main
[& _args]
(start))
(try
(start)
(catch Throwable cause
(l/error :hint (ex-message cause)
:cause cause)
(System/exit -1))))

View File

@@ -2,7 +2,7 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.media
"Media & Font postprocessing."
@@ -10,22 +10,31 @@
[app.common.data :as d]
[app.common.exceptions :as ex]
[app.common.media :as cm]
[app.common.schema :as sm]
[app.common.schema.generators :as sg]
[app.common.schema.openapi :as-alias oapi]
[app.common.spec :as us]
[app.config :as cf]
[app.db :as-alias db]
[app.storage :as-alias sto]
[app.storage.tmp :as tmp]
[app.util.bytes :as bs]
[app.util.svg :as svg]
[app.util.time :as dt]
[buddy.core.bytes :as bb]
[buddy.core.codecs :as bc]
[clojure.java.shell :as sh]
[clojure.spec.alpha :as s]
[cuerdas.core :as str]
[datoteka.core :as fs])
[datoteka.fs :as fs]
[datoteka.io :as io])
(:import
org.im4java.core.ConvertCmd
org.im4java.core.IMOperation
org.im4java.core.Info))
(def default-max-file-size
(* 1024 1024 30)) ; 30 MiB
(s/def ::path fs/path?)
(s/def ::filename string?)
(s/def ::size integer?)
@@ -41,6 +50,27 @@
(s/keys :req-un [::path]
:opt-un [::mtype]))
(sm/def! ::fs/path
{:type ::fs/path
:pred fs/path?
:type-properties
{:title "path"
:description "filesystem path"
:error/message "expected a valid fs path instance"
:gen/gen (sg/generator :string)
::oapi/type "string"
::oapi/format "unix-path"
::oapi/decode fs/path}})
(sm/def! ::upload
[:map {:title "Upload"}
[:filename :string]
[:size :int]
[:path ::fs/path]
[:mtype {:optional true} :string]
[:headers {:optional true}
[:map-of :string :string]]])
(defn validate-media-type!
([upload] (validate-media-type! upload cm/valid-image-types))
([upload allowed]
@@ -51,6 +81,16 @@
upload))
(defn validate-media-size!
[upload]
(when (> (:size upload) (cf/get :media-max-file-size default-max-file-size))
(ex/raise :type :restriction
:code :media-max-file-size-reached
:hint (str/ffmt "the uploaded file size % is greater than the maximum %"
(:size upload)
default-max-file-size)))
upload)
(defmulti process :cmd)
(defmulti process-error class)
@@ -166,7 +206,7 @@
(ex/raise :type :validation
:code :invalid-svg-file
:hint "uploaded svg does not provides dimensions"))
(merge input info))
(merge input info {:ts (dt/now)}))
(let [instance (Info. (str path))
mtype' (.getProperty instance "Mime type")]
@@ -181,7 +221,8 @@
;; any frame.
(assoc input
:width (.getPageWidth instance)
:height (.getPageHeight instance))))))
:height (.getPageHeight instance)
:ts (dt/now))))))
(defmethod process-error org.im4java.core.InfoException
[error]
@@ -199,7 +240,7 @@
(letfn [(ttf->otf [data]
(let [finput (tmp/tempfile :prefix "penpot.font." :suffix "")
foutput (fs/path (str finput ".otf"))
_ (bs/write-to-file! data finput)
_ (io/write-to-file! data finput)
res (sh/sh "fontforge" "-lang=ff" "-c"
(str/fmt "Open('%s'); Generate('%s')"
(str finput)
@@ -210,7 +251,7 @@
(otf->ttf [data]
(let [finput (tmp/tempfile :prefix "penpot.font." :suffix "")
foutput (fs/path (str finput ".ttf"))
_ (bs/write-to-file! data finput)
_ (io/write-to-file! data finput)
res (sh/sh "fontforge" "-lang=ff" "-c"
(str/fmt "Open('%s'); Generate('%s')"
(str finput)
@@ -220,29 +261,18 @@
(ttf-or-otf->woff [data]
;; NOTE: foutput is not used directly, it represents the
;; default output of the exection of the underlying
;; default output of the execution of the underlying
;; command.
(let [finput (tmp/tempfile :prefix "penpot.font." :suffix "")
foutput (fs/path (str finput ".woff"))
_ (bs/write-to-file! data finput)
_ (io/write-to-file! data finput)
res (sh/sh "sfnt2woff" (str finput))]
(when (zero? (:exit res))
foutput)))
(ttf-or-otf->woff2 [data]
;; NOTE: foutput is not used directly, it represents the
;; default output of the exection of the underlying
;; command.
(let [finput (tmp/tempfile :prefix "penpot.font." :suffix ".tmp")
foutput (fs/path (str (fs/base finput) ".woff2"))
_ (bs/write-to-file! data finput)
res (sh/sh "woff2_compress" (str finput))]
(when (zero? (:exit res))
foutput)))
(woff->sfnt [data]
(let [finput (tmp/tempfile :prefix "penpot" :suffix "")
_ (bs/write-to-file! data finput)
_ (io/write-to-file! data finput)
res (sh/sh "woff2sfnt" (str finput)
:out-enc :bytes)]
(when (zero? (:exit res))
@@ -271,15 +301,13 @@
(let [data (get input "font/ttf")]
(-> input
(update "font/otf" gen-if-nil #(ttf->otf data))
(update "font/woff" gen-if-nil #(ttf-or-otf->woff data))
(assoc "font/woff2" (ttf-or-otf->woff2 data))))
(update "font/woff" gen-if-nil #(ttf-or-otf->woff data))))
(contains? current "font/otf")
(let [data (get input "font/otf")]
(-> input
(update "font/woff" gen-if-nil #(ttf-or-otf->woff data))
(assoc "font/ttf" (otf->ttf data))
(assoc "font/woff2" (ttf-or-otf->woff2 data))))
(assoc "font/ttf" (otf->ttf data))))
(contains? current "font/woff")
(let [data (get input "font/woff")
@@ -291,8 +319,7 @@
(let [stype (get-sfnt-type sfnt)]
(cond-> input
true
(-> (assoc "font/woff" data)
(assoc "font/woff2" (ttf-or-otf->woff2 sfnt)))
(-> (assoc "font/woff" data))
(= stype :otf)
(-> (assoc "font/otf" sfnt)
@@ -311,8 +338,7 @@
"Given storage map, returns a storage configured with the appropriate
backend for assets and optional connection attached."
([storage]
(assoc storage :backend (cf/get :assets-storage-backend :assets-fs)))
([storage conn]
(-> storage
(assoc :conn conn)
(assoc :backend (cf/get :assets-storage-backend :assets-fs)))))
(assoc storage ::sto/backend (cf/get :assets-storage-backend :assets-fs)))
([storage pool-or-conn]
(-> (configure-assets-storage storage)
(assoc ::db/pool-or-conn pool-or-conn))))

View File

@@ -2,12 +2,14 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.metrics
(:refer-clojure :exclude [run!])
(:require
[app.common.logging :as l]
[app.common.spec :as us]
[app.metrics.definition :as-alias mdef]
[clojure.spec.alpha :as s]
[integrant.core :as ig])
(:import
@@ -16,11 +18,12 @@
io.prometheus.client.Counter$Child
io.prometheus.client.Gauge
io.prometheus.client.Gauge$Child
io.prometheus.client.Summary
io.prometheus.client.Summary$Child
io.prometheus.client.Summary$Builder
io.prometheus.client.Histogram
io.prometheus.client.Histogram$Child
io.prometheus.client.SimpleCollector
io.prometheus.client.Summary
io.prometheus.client.Summary$Builder
io.prometheus.client.Summary$Child
io.prometheus.client.exporter.common.TextFormat
io.prometheus.client.hotspot.DefaultExports
java.io.StringWriter))
@@ -28,137 +31,82 @@
(set! *warn-on-reflection* true)
(declare create-registry)
(declare create)
(declare create-collector)
(declare handler)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; METRICS SERVICE PROVIDER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(def default-metrics
{:update-file-changes
{:name "rpc_update_file_changes_total"
:help "A total number of changes submitted to update-file."
:type :counter}
(s/def ::mdef/name string?)
(s/def ::mdef/help string?)
(s/def ::mdef/labels (s/every string? :kind vector?))
(s/def ::mdef/type #{:gauge :counter :summary :histogram})
:update-file-bytes-processed
{:name "rpc_update_file_bytes_processed_total"
:help "A total number of bytes processed by update-file."
:type :counter}
(s/def ::mdef/instance
#(instance? SimpleCollector %))
:rpc-mutation-timing
{:name "rpc_mutation_timing"
:help "RPC mutation method call timming."
:labels ["name"]
:type :histogram}
(s/def ::mdef/definition
(s/keys :req [::mdef/name
::mdef/help
::mdef/type]
:opt [::mdef/labels
::mdef/instance]))
:rpc-command-timing
{:name "rpc_command_timing"
:help "RPC command method call timming."
:labels ["name"]
:type :histogram}
(s/def ::definitions
(s/map-of keyword? ::mdef/definition))
:rpc-query-timing
{:name "rpc_query_timing"
:help "RPC query method call timing."
:labels ["name"]
:type :histogram}
(s/def ::registry
#(instance? CollectorRegistry %))
:websocket-active-connections
{:name "websocket_active_connections"
:help "Active websocket connections gauge"
:type :gauge}
(s/def ::handler fn?)
(s/def ::metrics
(s/keys :req [::registry
::handler
::definitions]))
:websocket-messages-total
{:name "websocket_message_total"
:help "Counter of processed messages."
:labels ["op"]
:type :counter}
(s/def ::default ::definitions)
:websocket-session-timing
{:name "websocket_session_timing"
:help "Websocket session timing (seconds)."
:type :summary}
:session-update-total
{:name "http_session_update_total"
:help "A counter of session update batch events."
:type :counter}
:tasks-timing
{:name "penpot_tasks_timing"
:help "Background tasks timing (milliseconds)."
:labels ["name"]
:type :summary}
:rlimit-queued-submissions
{:name "penpot_rlimit_queued_submissions"
:help "Current number of queued submissions on RLIMIT."
:labels ["name"]
:type :gauge}
:rlimit-used-permits
{:name "penpot_rlimit_used_permits"
:help "Current number of used permits on RLIMIT."
:labels ["name"]
:type :gauge}
:rlimit-acquires-total
{:name "penpot_rlimit_acquires_total"
:help "Total number of acquire operations on RLIMIT."
:labels ["name"]
:type :counter}
:executors-active-threads
{:name "penpot_executors_active_threads"
:help "Current number of threads available in the executor service."
:labels ["name"]
:type :gauge}
:executors-completed-tasks
{:name "penpot_executors_completed_tasks_total"
:help "Aproximate number of completed tasks by the executor."
:labels ["name"]
:type :counter}
:executors-running-threads
{:name "penpot_executors_running_threads"
:help "Current number of threads with state RUNNING."
:labels ["name"]
:type :gauge}
:executors-queued-submissions
{:name "penpot_executors_queued_submissions"
:help "Current number of queued submissions."
:labels ["name"]
:type :gauge}})
(defmethod ig/pre-init-spec ::metrics [_]
(s/keys :req-un [::default]))
(defmethod ig/init-key ::metrics
[_ _]
[_ cfg]
(l/info :action "initialize metrics")
(let [registry (create-registry)
definitions (reduce-kv (fn [res k v]
(->> (assoc v :registry registry)
(create)
(->> (assoc v ::registry registry)
(create-collector)
(assoc res k)))
{}
default-metrics)]
{:handler (partial handler registry)
:definitions definitions
:registry registry}))
(:default cfg))]
(us/verify! ::definitions definitions)
{::handler (partial handler registry)
::definitions definitions
::registry registry}))
(s/def ::handler fn?)
(s/def ::registry #(instance? CollectorRegistry %))
(s/def ::metrics
(s/keys :req-un [::registry ::handler]))
(defn- handler
[registry _ respond _]
[registry _]
(let [samples (.metricFamilySamples ^CollectorRegistry registry)
writer (StringWriter.)]
(TextFormat/write004 writer samples)
(respond {:headers {"content-type" TextFormat/CONTENT_TYPE_004}
:body (.toString writer)})))
{:headers {"content-type" TextFormat/CONTENT_TYPE_004}
:body (.toString writer)}))
(s/def ::routes vector?)
(defmethod ig/pre-init-spec ::routes [_]
(s/keys :req [::metrics]))
(defmethod ig/init-key ::routes
[_ {:keys [::metrics]}]
(let [registry (::registry metrics)]
["/metrics" {:handler (partial handler registry)
:allowed-methods #{:get}}]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Implementation
@@ -174,13 +122,16 @@
(def default-histogram-buckets
[1 5 10 25 50 75 100 250 500 750 1000 2500 5000 7500])
(defmulti run-collector! (fn [mdef _] (::mdef/type mdef)))
(defmulti create-collector ::mdef/type)
(defn run!
[{:keys [definitions]} {:keys [id] :as params}]
[{:keys [::definitions]} & {:keys [id] :as params}]
(when-let [mobj (get definitions id)]
((::fn mobj) params)
(run-collector! mobj params)
true))
(defn create-registry
(defn- create-registry
[]
(let [registry (CollectorRegistry.)]
(DefaultExports/register registry)
@@ -192,79 +143,89 @@
(and (.isArray ^Class oc)
(= (.getComponentType oc) String))))
(defn make-counter
[{:keys [name help registry reg labels] :as props}]
(defmethod run-collector! :counter
[{:keys [::mdef/instance]} {:keys [inc labels] :or {inc 1 labels default-empty-labels}}]
(let [instance (.labels ^Counter instance (if (is-array? labels) labels (into-array String labels)))]
(.inc ^Counter$Child instance (double inc))))
(defmethod run-collector! :gauge
[{:keys [::mdef/instance]} {:keys [inc dec labels val] :or {labels default-empty-labels}}]
(let [instance (.labels ^Gauge instance (if (is-array? labels) labels (into-array String labels)))]
(cond (number? inc) (.inc ^Gauge$Child instance (double inc))
(number? dec) (.dec ^Gauge$Child instance (double dec))
(number? val) (.set ^Gauge$Child instance (double val)))))
(defmethod run-collector! :summary
[{:keys [::mdef/instance]} {:keys [val labels] :or {labels default-empty-labels}}]
(let [instance (.labels ^Summary instance (if (is-array? labels) labels (into-array String labels)))]
(.observe ^Summary$Child instance val)))
(defmethod run-collector! :histogram
[{:keys [::mdef/instance]} {:keys [val labels] :or {labels default-empty-labels}}]
(let [instance (.labels ^Histogram instance (if (is-array? labels) labels (into-array String labels)))]
(.observe ^Histogram$Child instance val)))
(defmethod create-collector :counter
[{::mdef/keys [name help reg labels]
::keys [registry]
:as props}]
(let [registry (or registry reg)
instance (.. (Counter/build)
(name name)
(help help))
_ (when (seq labels)
(.labelNames instance (into-array String labels)))
instance (.register instance registry)]
(help help))]
(when (seq labels)
(.labelNames instance (into-array String labels)))
{::instance instance
::fn (fn [{:keys [inc labels] :or {inc 1 labels default-empty-labels}}]
(let [instance (.labels instance (if (is-array? labels) labels (into-array String labels)))]
(.inc ^Counter$Child instance (double inc))))}))
(assoc props ::mdef/instance (.register instance registry))))
(defn make-gauge
[{:keys [name help registry reg labels] :as props}]
(defmethod create-collector :gauge
[{::mdef/keys [name help reg labels]
::keys [registry]
:as props}]
(let [registry (or registry reg)
instance (.. (Gauge/build)
(name name)
(help help))
_ (when (seq labels)
(.labelNames instance (into-array String labels)))
instance (.register instance registry)]
{::instance instance
::fn (fn [{:keys [inc dec labels val] :or {labels default-empty-labels}}]
(let [instance (.labels ^Gauge instance (if (is-array? labels) labels (into-array String labels)))]
(cond (number? inc) (.inc ^Gauge$Child instance (double inc))
(number? dec) (.dec ^Gauge$Child instance (double dec))
(number? val) (.set ^Gauge$Child instance (double val)))))}))
(help help))]
(when (seq labels)
(.labelNames instance (into-array String labels)))
(defn make-summary
[{:keys [name help registry reg labels max-age quantiles buckets]
:or {max-age 3600 buckets 12 quantiles default-quantiles} :as props}]
(assoc props ::mdef/instance (.register instance registry))))
(defmethod create-collector :summary
[{::mdef/keys [name help reg labels max-age quantiles buckets]
::keys [registry]
:or {max-age 3600 buckets 12 quantiles default-quantiles}
:as props}]
(let [registry (or registry reg)
builder (doto (Summary/build)
(.name name)
(.help help))
_ (when (seq quantiles)
(.maxAgeSeconds ^Summary$Builder builder ^long max-age)
(.ageBuckets ^Summary$Builder builder buckets))
_ (doseq [[q e] quantiles]
(.quantile ^Summary$Builder builder q e))
_ (when (seq labels)
(.labelNames ^Summary$Builder builder (into-array String labels)))
instance (.register ^Summary$Builder builder registry)]
(.help help))]
{::instance instance
::fn (fn [{:keys [val labels] :or {labels default-empty-labels}}]
(let [instance (.labels ^Summary instance (if (is-array? labels) labels (into-array String labels)))]
(.observe ^Summary$Child instance val)))}))
(when (seq quantiles)
(.maxAgeSeconds ^Summary$Builder builder ^long max-age)
(.ageBuckets ^Summary$Builder builder buckets))
(defn make-histogram
[{:keys [name help registry reg labels buckets]
:or {buckets default-histogram-buckets}}]
(doseq [[q e] quantiles]
(.quantile ^Summary$Builder builder q e))
(when (seq labels)
(.labelNames ^Summary$Builder builder (into-array String labels)))
(assoc props ::mdef/instance (.register ^Summary$Builder builder registry))))
(defmethod create-collector :histogram
[{::mdef/keys [name help reg labels buckets]
::keys [registry]
:or {buckets default-histogram-buckets}
:as props}]
(let [registry (or registry reg)
instance (doto (Histogram/build)
(.name name)
(.help help)
(.buckets (into-array Double/TYPE buckets)))
_ (when (seq labels)
(.labelNames instance (into-array String labels)))
instance (.register instance registry)]
(.buckets (into-array Double/TYPE buckets)))]
{::instance instance
::fn (fn [{:keys [val labels] :or {labels default-empty-labels}}]
(let [instance (.labels ^Histogram instance (if (is-array? labels) labels (into-array String labels)))]
(.observe ^Histogram$Child instance val)))}))
(when (seq labels)
(.labelNames instance (into-array String labels)))
(defn create
[{:keys [type] :as props}]
(case type
:counter (make-counter props)
:gauge (make-gauge props)
:summary (make-summary props)
:histogram (make-histogram props)))
(assoc props ::mdef/instance (.register instance registry))))

View File

@@ -2,12 +2,16 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.migrations
(:require
[app.common.data.macros :as dm]
[app.common.logging :as l]
[app.db :as db]
[app.migrations.clj.migration-0023 :as mg0023]
[app.util.migrations :as mg]
[clojure.spec.alpha :as s]
[integrant.core :as ig]))
(def migrations
@@ -244,7 +248,99 @@
{:name "0078-mod-file-media-object-table-drop-cascade"
:fn (mg/resource "app/migrations/sql/0078-mod-file-media-object-table-drop-cascade.sql")}
{:name "0079-mod-profile-table"
:fn (mg/resource "app/migrations/sql/0079-mod-profile-table.sql")}
{:name "0080-mod-index-names"
:fn (mg/resource "app/migrations/sql/0080-mod-index-names.sql")}
{:name "0081-add-deleted-at-index-to-file-table"
:fn (mg/resource "app/migrations/sql/0081-add-deleted-at-index-to-file-table.sql")}
{:name "0082-add-features-column-to-file-table"
:fn (mg/resource "app/migrations/sql/0082-add-features-column-to-file-table.sql")}
{:name "0083-add-file-data-fragment-table"
:fn (mg/resource "app/migrations/sql/0083-add-file-data-fragment-table.sql")}
{:name "0084-add-features-column-to-file-change-table"
:fn (mg/resource "app/migrations/sql/0084-add-features-column-to-file-change-table.sql")}
{:name "0085-add-webhook-table"
:fn (mg/resource "app/migrations/sql/0085-add-webhook-table.sql")}
{:name "0086-add-webhook-delivery-table"
:fn (mg/resource "app/migrations/sql/0086-add-webhook-delivery-table.sql")}
{:name "0087-mod-task-table"
:fn (mg/resource "app/migrations/sql/0087-mod-task-table.sql")}
{:name "0088-mod-team-profile-rel-table"
:fn (mg/resource "app/migrations/sql/0088-mod-team-profile-rel-table.sql")}
{:name "0089-mod-project-profile-rel-table"
:fn (mg/resource "app/migrations/sql/0089-mod-project-profile-rel-table.sql")}
{:name "0090-mod-http-session-table"
:fn (mg/resource "app/migrations/sql/0090-mod-http-session-table.sql")}
{:name "0091-mod-team-project-profile-rel-table"
:fn (mg/resource "app/migrations/sql/0091-mod-team-project-profile-rel-table.sql")}
{:name "0092-mod-team-invitation-table"
:fn (mg/resource "app/migrations/sql/0092-mod-team-invitation-table.sql")}
{:name "0093-del-file-share-tokens-table"
:fn (mg/resource "app/migrations/sql/0093-del-file-share-tokens-table.sql")}
{:name "0094-del-profile-attr-table"
:fn (mg/resource "app/migrations/sql/0094-del-profile-attr-table.sql")}
{:name "0095-del-storage-data-table"
:fn (mg/resource "app/migrations/sql/0095-del-storage-data-table.sql")}
{:name "0096-del-storage-pending-table"
:fn (mg/resource "app/migrations/sql/0096-del-storage-pending-table.sql")}
{:name "0098-add-quotes-table"
:fn (mg/resource "app/migrations/sql/0098-add-quotes-table.sql")}
{:name "0099-add-access-token-table"
:fn (mg/resource "app/migrations/sql/0099-add-access-token-table.sql")}
{:name "0100-mod-profile-indexes"
:fn (mg/resource "app/migrations/sql/0100-mod-profile-indexes.sql")}
{:name "0101-mod-server-error-report-table"
:fn (mg/resource "app/migrations/sql/0101-mod-server-error-report-table.sql")}
{:name "0102-mod-access-token-table"
:fn (mg/resource "app/migrations/sql/0102-mod-access-token-table.sql")}
{:name "0103-mod-file-object-thumbnail-table"
:fn (mg/resource "app/migrations/sql/0103-mod-file-object-thumbnail-table.sql")}
{:name "0104-mod-file-thumbnail-table"
:fn (mg/resource "app/migrations/sql/0104-mod-file-thumbnail-table.sql")}
{:name "0105-mod-server-error-report-table"
:fn (mg/resource "app/migrations/sql/0105-mod-server-error-report-table.sql")}
])
(defn apply-migrations!
[pool name migrations]
(dm/with-open [conn (db/open pool)]
(mg/setup! conn)
(mg/migrate! conn {:name name :steps migrations})))
(defmethod ig/init-key ::migrations [_ _] migrations)
(defmethod ig/pre-init-spec ::migrations
[_]
(s/keys :req [::db/pool]))
(defmethod ig/init-key ::migrations
[module {:keys [::db/pool]}]
(when-not (db/read-only? pool)
(l/info :hint "running migrations" :module module)
(some->> (seq migrations) (apply-migrations! pool "main"))))

View File

@@ -2,7 +2,7 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
;; Copyright (c) UXBOX Labs SL
;; Copyright (c) KALEIDOS INC
(ns app.migrations.clj.migration-0023
(:require

View File

@@ -0,0 +1,2 @@
ALTER TABLE profile
ADD COLUMN is_blocked boolean DEFAULT false;

Some files were not shown because too many files have changed in this diff Show More