nibdo / bloben-app Goto Github PK
View Code? Open in Web Editor NEWCalendar client for CalDAV
Home Page: https://bloben.com
License: GNU Affero General Public License v3.0
Calendar client for CalDAV
Home Page: https://bloben.com
License: GNU Affero General Public License v3.0
Initially I thought about doing separate apps for todos and notes. Tasks app is now in state "proof of concept".
However I have been thinking about removing those apps from road map as there are many actively developed alternatives and it seems little bit redundant.
Todos will be then integrated directly to calendar app (like in other calendar apps).
This is of course still open to discussion, if you are interested to use bloben with separate todo and notes apps (with your standard DAV server) or if you are here just for calendar.
bloben appears to send calendar-multiget REPORT requests that include a "filter" element that's not allowed in calendar-multiget.
<c:calendar-multiget xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:caldav">
<d:prop>
<d:getetag/>
<c:calendar-data/>
</d:prop>
<d:href>/user/calendars/calendar/EDITED.ics</d:href>
<c:filter/>
<c:timezone/>
</c:calendar-multiget>
With the latest version, I can't delete a single event in a recurring event series anymore. I get this error message:
{"level":"error","message":"Unknown error: {\"stack\":\"PayloadTooLargeError: request entity too large\\n at readStream (/usr/app/api/node_modules/raw-body/index.js:156:17)\\n at getRawBody (/usr/app/api/node_modules/raw-body/index.js:109:12)\\n at read (/usr/app/api/node_modules/body-parser/lib/read.js:79:3)\\n at jsonParser (/usr/app/api/node_modules/body-parser/lib/types/json.js:135:5)\\n at Layer.handle [as handle_request] (/usr/app/api/node_modules/express/lib/router/layer.js:95:5)\\n at trim_prefix (/usr/app/api/node_modules/express/lib/router/index.js:328:13)\\n at /usr/app/api/node_modules/express/lib/router/index.js:286:9\\n at Function.process_params (/usr/app/api/node_modules/express/lib/router/index.js:346:12)\\n at next (/usr/app/api/node_modules/express/lib/router/index.js:280:10)\\n at urlencodedParser (/usr/app/api/node_modules/body-parser/lib/types/urlencoded.js:100:7)\",\"message\":\"request entity too large\",\"name\":\"PayloadTooLargeError\",\"expected\":36201,\"length\":36201,\"limit\":20480,\"type\":\"entity.too.large\"}","method":"DELETE","path":"/api/v1/caldav-events/repeated","tags":["UNKNOWN","REST"],"timestamp":"2022-08-29 10:57:27"}
It may be something stupid, but I can't make bloben to work with baikal. Both installed on the same physical machine
Lighttpd config:
url.redirect += (
"^/.well-known/carddav(.*)" => "/dav.php$1",
"^/.well-known/caldav(.*)" => "/dav.php$1"
)
url.redirect-code = 308
After creating user in bloben admin and check is enabled
, I'm able to login into calendar.
Then after click on gear icon -> settings -> add account -> caldav - entering my baikal server https address and /dav.php which can be found in baikal user settings, username and passwords are correct.
But then I get:
[11/May/2022:14:55:44 +0300] "PROPFIND /.well-known/caldav HTTP/1.1" 308 0 "-" "node-fetch/1.0 (+https://github.com/bitinn/node-fetch)"
[11/May/2022:14:55:44 +0300] "PROPFIND /dav.php HTTP/1.1" 401 284 "-" "node-fetch/1.0 (+https://github.com/bitinn/node-fetch)"
and in bloben logs:
2022-05-11 11:55:01 error Unknown error: Error: getaddrinfo EAI_AGAIN bloben.com UNKNOWNREST
2022-05-11 11:55:01 error Unknown error: TypeError: Cannot read properties of null (reading 'identity') UNKNOWNREST
2022-05-11 11:55:45 error Cannot connect to calDav server: Error: Invalid credentials RESTCALDAV
2022-05-11 11:56:04 error Unknown error: Error: getaddrinfo EAI_AGAIN bloben.com UNKNOWNREST
It looks like there is connection to baikal, but if failed with 401
and Cannot connect to calDav server: Error: Invalid credentials RESTCALDAV
. I'm sure username and passwords are correct and also tried with very simple ones like test/test and still can't add account.
Are there any logs or other debug information which I can check from bloben side?
Hello !
I saw your post on reddit and was very enthusiastic. There are really few caldav calendar clients out there and yours looks like a breath of fresh air compared to others. So thank you.
Maybe you should know I'm not really familiar with coding or anything. I host a little server at home using docker, and I do what I can :p
So I tried installing Bloben. I manage to login as an admin and create accounts, but I can't log into them. I got a "unauthorized" message.
Is there any way I can easily delete unused accounts ?
Also, I'm not sure where https://my.calendar.domain.com/
should lead. I get a "Welcome to nginx!" page.
And last but not least, how can I connect to my caldav server ? I see nowhere to input the address and logins. When I add a CalDavAccount, I get an "Unknown error". I double checked caldav url (nextcloud) and username and password. Does it only support Baikal ?
Thanks for your answers.
Adding IMAP connection will be used to:
I've got bloben running in a docker container, and while I can succesfully login - all other operations against the API seem to result in a 403.
E.g. when I try to add a CalDAV account in the UI, I can see that requests against /api/app/v1/caldav-accounts are failing with a 403 and the following payload: {"code":403,"message":"Access forbidden"}
What's the best way of debugging this? There's nothing useful on standard out after:
2022-09-06T02:16:02: PM2 log: Launching in no daemon mode
2022-09-06T02:16:02: PM2 log: App [index:0] starting in -fork mode-
2022-09-06T02:16:02: PM2 log: App [index:0] online
[NODE_ENV]: development
Bloben Api listening at http://localhost:8081
I'll love to have the ability to search events.
App doesn't support exceptions when displaying/editing/deleting repeating CalDAV events. This will be included in one of the next releases.
In the details of a appointment the location is showen. It would be nice to be able to click on the location and get directly to google maps.
Links to g-maps work like this: https://developers.google.com/maps/documentation/urls/get-started#search-action .
Using:
Docker image version 0.15.0
Calendar version
Api version 0.15.0
Trying to add new event:
{"calendarID":"5cc2880e-0986-4f1a-a435-7beea71bee01","iCalString":"BEGIN:VCALENDAR\nPRODID:Bloben 1.0\nVERSION:2.0\nCALSCALE:GREGORIAN\nBEGIN:VEVENT\nDTSTART;TZID=floating:Invalid DateTime\nDTEND;TZID=floating:Invalid DateTime\nDTSTAMP:20220903T172624Z\nUID:33bd21e2-2100-4fb0-862a-237e96fe37e8\nCREATED:20220903T172539Z\nLAST-MODIFIED:20220903T172539Z\nSEQUENCE:0\nSTATUS:CONFIRMED\nSUMMARY:e32e32\nTRANSP:OPAQUE\nEND:VEVENT\nEND:VCALENDAR","externalID":"33bd21e2-2100-4fb0-862a-237e96fe37e8"}
failed with:
{"code":409,"message":"Cannot create event: Unsupported Media Type"}
It's OK if event take whole day for example:
{"calendarID":"5cc2880e-0986-4f1a-a435-7beea71bee01","iCalString":"BEGIN:VCALENDAR\nPRODID:Bloben 1.0\nVERSION:2.0\nCALSCALE:GREGORIAN\nBEGIN:VEVENT\nDTSTART;VALUE=DATE:20220908\nDTEND;VALUE=DATE:20220909\nDTSTAMP:20220903T172809Z\nUID:98c4ce6f-0929-454f-939c-faa6f3869e8b\nCREATED:20220903T172539Z\nLAST-MODIFIED:20220903T172539Z\nSEQUENCE:0\nSTATUS:CONFIRMED\nSUMMARY:e32e32\nTRANSP:OPAQUE\nEND:VEVENT\nEND:VCALENDAR","externalID":"98c4ce6f-0929-454f-939c-faa6f3869e8b"}
result:
{"message":"Event created"}
EDIT: I see TZID=floating:Invalid DateTime
In docker-compose.yml
I have set
environment:
TZ: 'Europe/Sofia'
What is correct way to set timezone?
all day
event on the month viewall day
all day
, day is now reduced by oneRepeat select and unselect to decrease the day by one every time. I don't think this is intended to work this way, I think the day should stay the same.
Additionally, maybe pick a time other than 0:00
as the default (when going from all day -> select time). The chance that someone wants to create an event that starts at 0:00
is quite low.
Furthermore, maybe remember the time that was selected when you didn't intend to click all day
, i.e. select time 13:00 - 14:00
, click all day
by mistake, unselect all day
, now the time is 0:00 - 0:00
again.
CardDAV support will be used for easier access to email contacts for event invites
Hey - I'm impressed by this project. Saw it on HN, thanks for sharing! I played around for a while and found a minor bug that I thought I'd share.
From the main week view, I expect to be able to click and drag the length of a new event. It works if I'm very slow, but if I click and drag the event at normal operating speed with the mouse, the start position of the event is missed. There seems to be ~100ms delay between my actual click start, and when the new event's position is registered.
Hope this makes sense, take care!
EDIT: Should have added, Windows 10 Edge v 100.0.1185.29
Was wondering if anybody feels neglected with current broken status for responsive UI. I think most of us use bloben as desktop app and we have other native calendar clients in our mobiles, so it was still low priority.
I think I wanted to use it only when sending event invites, but maybe with added calendar sharing it might be more in demand.
Error appears in console when trying to add account:
POST http://localhost/api/v1/caldav-accounts 409 (Conflict)
Env config:
NODE_ENV=production
HOST=localhost
PORT=8081
DB_HOST=databaseBloben
DB_PORT=5432
DB_USERNAME=bloben
DB_DATABASE=bloben_api
DB_CONNECTION=postgres
DB_SYNCHRONIZE=true
DB_LOGGING=false
DB_ENTITIES=usr/app/api/build/data/entity/*.js
DB_ENTITIES_DIR=usr/app/api/build/data/entity
DB_MIGRATIONS=usr/app/api/build/data/migrations/*.js
## Use same password for database for DB_PASSWORD and POSTGRES_PASSWORD
DB_PASSWORD=CHANGE_ME
POSTGRES_PASSWORD=CHANGE_ME
SESSION_SECRET=CHANGE_ME
OTP_SECRET=CHANGE_ME
INITIAL_ADMIN_PASSWORD=CHANGE_ME # your login password for admin account
REDIS_HOST=redisBloben
REDIS_PORT=6379
POSTGRES_DB=bloben_api
POSTGRES_USER=bloben
APP_DOMAIN=localhost
ENCRYPTION_PASSWORD=
SMTP_PORT=
SMTP_HOST=
SMTP_EMAIL=
SMTP_USERNAME=
SMTP_PASSWORD=
Server Docker Compose:
caldavServer:
image: ckulka/baikal:nginx
container_name: caldavServer
ports:
- '8082:80'
restart: always
Btw. what is "APP_DOMAIN"? In documentation is just mentioned "Your domain". Domain to caldav server? Domain to bloben?
Fix parsing event description with html tags.
Trying to paste a big text into a note causes an error when you want to create a new event:
{"level":"error","message":"Status: 400 Message: Bad Request: null","tags":["CALDAV","REST"],"timestamp":"2022-07-16 10:59:58"}
The error happens when I try to paste this text into the notes
field:
TEST testest test TESt tes testset
17.08.2022
Test Testet test Test tet test
Teste test Teste test testetset testetet Test-Teste. Test teste tes test, teste tetest tsetset tes te Teste tets test te Testet te Test tet Test tes teste. Test test 4 Teset test-Tetsetset test test tsets tsets test tset tset Test-Test testet.
Test Teste test.test.test teste test.test.tset
I would like to get my last missing calendars to work. Right now, the account was added successfully, the calendars are discovered and displayed on the left side. But no events are loaded. There are also no log messages indicating errors. On my davmail logs, this is logged, indicating some communication issue:
davmail-work-exchange-davmail-work-1 | 2022-05-27 05:54:52,743 ERROR [CaldavConnection-33232] davmail - Invalid Caldav request: Unexpected EOF in prolog
davmail-work-exchange-davmail-work-1 | at [row,col {unknown-source}]: [1,0]
davmail-work-exchange-davmail-work-1 | davmail.exception.DavMailException: Invalid Caldav request: Unexpected EOF in prolog
davmail-work-exchange-davmail-work-1 | at [row,col {unknown-source}]: [1,0]
davmail-work-exchange-davmail-work-1 | at davmail.caldav.CaldavConnection$CaldavRequest.parseXmlBody(CaldavConnection.java:1590)
davmail-work-exchange-davmail-work-1 | at davmail.caldav.CaldavConnection$CaldavRequest.<init>(CaldavConnection.java:1395)
davmail-work-exchange-davmail-work-1 | at davmail.caldav.CaldavConnection.handleRequest(CaldavConnection.java:224)
davmail-work-exchange-davmail-work-1 | at davmail.caldav.CaldavConnection.run(CaldavConnection.java:180)
Any idea why no error is logged and what could be done to debug this issue further?
Also, at some point, the calendar starts duplicating itself:
Adding mailto to imported webcalendar will be used to process different PARTSTAT statuses (accepted, rejected) relevant to user.
Hey,
first: very great Project!
I have installed bloben on my unraid and currently syncing against three different Nextcloud-instances. Two of them are working fine, but at one instance i cannot get any Calendars or appointments.
After adding the account do bloben i am getting the following error in my logs:
{"level":"error","message":"Sync caldav events error: Date is not valid - Error: Date is not valid\n at validateISOStringDate (/usr/app/api/node_modules/ical-js-parser/toJSON/validator.js:9:15)\n at formatToIsoDate (/usr/app/api/node_modules/ical-js-parser/toJSON/dateHelpers.js:19:43)\n at parseICalDate (/usr/app/api/node_modules/ical-js-parser/toJSON/dateHelpers.js:37:53)\n at splitRowToKeyValueObj (/usr/app/api/node_modules/ical-js-parser/toJSON/index.js:141:49)\n at formatStringToKeyValueObj (/usr/app/api/node_modules/ical-js-parser/toJSON/index.js:65:24)\n at getResult (/usr/app/api/node_modules/ical-js-parser/toJSON/index.js:85:43)\n at getOneEventJSON (/usr/app/api/node_modules/ical-js-parser/toJSON/index.js:99:12)\n at /usr/app/api/node_modules/ical-js-parser/toJSON/index.js:220:16\n at Array.map (<anonymous>)\n at Object.toJSON (/usr/app/api/node_modules/ical-js-parser/toJSON/index.js:219:31)","tags":["REST","CALDAV"],"timestamp":"2022-04-08 09:35:58"}
I think there is maybe a maleformed appointment in my calendar which is generating this exception. Is there any possibiliy to use some kind of try/catch to get the appointments?
Kinds
bam91
Hi,
I just noticed that the selected timezone settings do not get applied correctly on full-day events.
For example a full-day event from a Baikal server with TZ Europe/Berlin on 28. May 2022 is displayed as an event from 28. May, 02:00 until 29. May 2022, 02:00 in Bloben (also set to Europe/Berlin).
It works fine with non-full-day events (e.g. like from 09:00 'til 10:00).
Could somebody kindly look into this issue?
Thank you very much!
I've successfully managed to add my CalDav account with two calendars in it. It seems the syncing does not work. I'm using the current docker-compose
file.
Here is the error log:
{"level":"error","message":"Unknown error: {\"stack\":\"TypeError: Cannot read properties of null (reading 'identity')\\n at /usr/app/api/src/api/userEmailConfig/handlers/getUserEmailConfig.ts:34:33\\n at Generator.next (<anonymous>)\\n at fulfilled (/usr/app/api/build/api/userEmailConfig/handlers/getUserEmailConfig.js:5:58)\\n at processTicksAndRejections (node:internal/process/task_queues:96:5)\",\"message\":\"Cannot read properties of null (reading 'identity')\"}","method":"GET","path":"/api/v1/users/email-config","tags":["UNKNOWN","REST"],"timestamp":"2022-05-16 10:00:39"}
{"level":"warn","message":"Too many requests for URL: /api/v1/sync METHOD: GET","tags":["REST","SECURITY"],"timestamp":"2022-05-16 10:08:56"}
{"level":"warn","message":"Too many requests for URL: /api/v1/sync METHOD: GET","tags":["REST","SECURITY"],"timestamp":"2022-05-16 10:09:05"}
{"level":"error","message":"Unknown error: {\"stack\":\"TypeError: Cannot read properties of null (reading 'identity')\\n at /usr/app/api/src/api/userEmailConfig/handlers/getUserEmailConfig.ts:34:33\\n at Generator.next (<anonymous>)\\n at fulfilled (/usr/app/api/build/api/userEmailConfig/handlers/getUserEmailConfig.js:5:58)\\n at processTicksAndRejections (node:internal/process/task_queues:96:5)\",\"message\":\"Cannot read properties of null (reading 'identity')\"}","method":"GET","path":"/api/v1/users/email-config","tags":["UNKNOWN","REST"],"timestamp":"2022-05-16 10:09:06"}
{"level":"warn","message":"Too many requests for URL: /api/v1/sync METHOD: GET","tags":["REST","SECURITY"],"timestamp":"2022-05-16 10:09:09"}
{"level":"error","message":"Unknown error: {\"stack\":\"TypeError: Cannot read properties of null (reading 'identity')\\n at /usr/app/api/src/api/userEmailConfig/handlers/getUserEmailConfig.ts:34:33\\n at Generator.next (<anonymous>)\\n at fulfilled (/usr/app/api/build/api/userEmailConfig/handlers/getUserEmailConfig.js:5:58)\\n at processTicksAndRejections (node:internal/process/task_queues:96:5)\",\"message\":\"Cannot read properties of null (reading 'identity')\"}","method":"GET","path":"/api/v1/users/email-config","tags":["UNKNOWN","REST"],"timestamp":"2022-05-16 10:09:09"}
so i am installed, reverse proxied via Nginx Proxy Manager and have a subdomain all set up.
I cannot log into the Admin Login.
URL: https://calendar.mydomain.com/admin
.env:
INITIAL_ADMIN_PASSWORD=123
APP_DOMAIN=calendar.mydomain.com
What creds do i use to log in?
Username?
Password?
When I pick end repeat on date
then I expect that date to be included in the repetition. Instead, that last day is excluded:
I think usability wise one should include the last day, otherwise the last day is always missed in the repetition and you have to think and select one day in advance to include that day.
For some words, line breaks are inserted and the words are split, even though there is enough space to display it without splitting. The same word is split at the same position in every event containing that word. The word in the event is not split.
This happens in Agenda, Day, Three days, and Week view.
Hello,
I am trying to get this running on unraid.
I already have a redis docker container and have managed to get the post gres stuff working...
I am sitting in the logs with
`ReplyError: NOAUTH Authentication required.
at parseError (/usr/app/api/node_modules/redis-parser/lib/parser.js:179:12)
at parseType (/usr/app/api/node_modules/redis-parser/lib/parser.js:302:14) {
command: { name: 'info', args: [] }'
with basically;
Error: Connection is closed.
I have tried ENV vars REDIS_PASSWORD, REDIS_USERNAME, REDIS_DATABASE but none of these seem to play nice.
When adding Calendars at sharing the names of the seleected calendars are displayed in one row. When adding to much calendars the row gets to width and the pop up is getting out of the screen on both sides.
Possible fix: Showing all Calendars in a list, like in the selection
Aditional: A option to select all calendars would be nice.
PS: The sharing feature is really nice! Thanks!!
Bloben appears to send calendar-query requests without specifying what sort of properties it desires. As far as I can tell, this is allowed by the RFC but it isn't entirely clear to me what the expected behaviour is. It says that calendar-query mostly behaves like propfind, and propfind specifies that "an empty body" implies {DAV:}allprop.
<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:cs="http://calendarserver.org/ns/" xmlns:ca="http://apple.com/ns/ical/" xmlns:d="DAV:">
<c:filter>
<c:comp-filter name="VCALENDAR"/>
</c:filter>
</c:calendar-query>
I am trying to add my Radicale account, as a general account (ie, just the domain, not with the calendar GUID). Is there a way to just pass the login details?
ie:
url: radicale.domain.com
user: user
pass: pass
then Bloben discovers all available calendars? I belive the DAVx5 works this way.
This should also enable the creation of the new calendars too.
thanks
Hey,
Is there any possiblity to provide some "magic links" which will automatic login and show a specific view? (like heimdall) Something like calendar.url/magic?token=ABC123.
Kinds
bam91
The apiUrl is hardcoded on line: https://github.com/nibdo/bloben-calendar/blob/a759bc288de6b2e7fc9fc3a003431bab2a4631aa/src/layers/AuthProvider.tsx#L24-L26
I'll like to use this feature to easily share my calendar in read-only with anyone.
BTW, it is a fantastic project. I'm thrilled to have a nice-looking web calendar application. ๐
app version: 6.0.0
/admin
show login page, but /calendar
not show login page. fallback to 0.5.2 working
Hi, I would like to brainstorm little bit for next calendar sharing feature to catch most wanted and most useful cases for first iteration. And ditch useless one or redundant.
1. Public calendar
Public link where anybody will be able to see calendar events through Bloben interface.
2. Webcal link
Standard, which can be easily used in other clients.
3. Private sharing
Calendar will be protected either by token or password.
Could be possible to set expiration (view count or till date)
4. Sharing to existing Bloben user
Either you will need to know name of another user (but guess you are also admin, so you can get it easily) or there will have to be search function for users.
5. Sharing to not existing Bloben user
With shared link, user will be forced to create account before accessing calendar. This guest account will have lower permissions than standard user (not allowed to add email account, CalDAV account, etc.).
I'll try and explain this.
For example, I have tasks that I have to repeat over a month.
Say a client books days 1, 3, 4 and 7 of the month for a task. I'll create one event on the 1st day, then copy it to days 3, 4 and 7.
We could think of a clickable "copy" option which would make a small calendar appear letting us choose the days we want.
Later in the month, same client books same task on days 15, 21, 24 and 29. I just have to copy event from 1, 3, 4 or 7 to 15, 21, 24 and 29 from the "copy" option.
Would be easier than creating another event each day a client books.
I'm not sure I explained that well, or if that's the info you need.
Let me know if I can clarify.
Originally posted by @tiritibambix in #5 (comment)
Modifying the line width to 0.5
fixes the issue.
Using firefox.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.