hedgedoc / hedgedoc/cli

Find out how socket.io works in order to edit notes.

Open
#10 2 comments 3 reactions 0 assignees View on GitHub
Dominant language
Shell
Stars
166
Forks
40
PR merge metrics
No merged PRs in 30d

Description

I'm trying to figure out how to edit a note directly from the command line, unfortunately I can't delete text successfully.
So I leave here what I found, and if someone can make it work, it would be a great addition to this client.

First of all, let's authentificate cf #9. (Idk if it's necessary)
```bash
codimd login --email user@email.com password
```

Then, connecting to the socket.

```bash
NOTEID=3_jUrZCYRTOtcEAJG6Oywg

# The socket url
URL=$CODIMD_SERVER/socket.io/?noteId=$NOTEID\&EIO=3\&transport=polling

# get the 'io' token
curl -c /tmp/codimd-cookies.txt \
-b /tmp/codimd-cookies.txt \
$URL\&t=$(python yeast.py) \
&> /dev/null
```

Then, all messages must be passed to `$SERVER/socket.io/?noteId=$NOTEID&EIO=3&transport=polling&t=$(python yeast.py)&sid\=$TOKEN`, TOKEN is the token we just picked up.

To do so:

```bash
TOKEN=$(cat /tmp/codimd-cookies.txt | grep io | awk '{print $7}')

curl -b /tmp/codimd-cookies.txt \
$URL\&t\=$(python yeast.py)\&sid\=$TOKEN \
-H "Content-Type: text/plain;charset=UTF-8" \
-d @msg_0
```

This will send the data from the file `msg_0` to the socket.

As an example, on a fresh new note:

```bash
#!/bin/bash

SERVER=https://xxxxxxxxxxxxxx
NOTEID=xxxxxxxxxxxxxxxxxxxxxx

URL=$SERVER/socket.io/?noteId=$NOTEID\&EIO=3\&transport=polling

curl -c /tmp/codimd-cookies.txt \
-b /tmp/codimd-cookies.txt \
$URL\&t=$(python yeast.py) \
&> /dev/null

TOKEN=$(cat /tmp/codimd-cookies.txt | grep io | awk '{print $7}')

curl -b /tmp/codimd-cookies.txt \
$URL\&t\=$(python yeast.py)\&sid\=$TOKEN \
-H "Content-Type: text/plain;charset=UTF-8" \
-d @msg_4
```

With msg_4 containing `61:42["operation",0,["test"],{"ranges":[{"anchor":4,"head":4}]}]`

![](https://i.imgur.com/X63cwwG.png)

Then, by analyzing the different possible messages I think the format is as follows:

`$1:42["operation",$2,["$3",$4],{"ranges":[{"anchor":$5,"head":$5}]}]`

- $1 is the len of the message after `:`
- $2 is the number of the operation (starts at 0, then must be increased by one at each request)
- $3 is the text that you want to add (optional)
- $4 is the number of chars to remove (optional)
- $5 is the location of the modification

For example:
- Add test to the note
- `61:42["operation",0,["test"],{"ranges":[{"anchor":4,"head":4}]}]`
- Remove test and replace it by 01234
- `65:42["operation",0,["01234",-4],{"ranges":[{"anchor":5,"head":5}]}]`
- Remove the last char
- `59:42["operation",0,[4,-1],{"ranges":[{"anchor":4,"head":4}]}]`

This payloads are working when I'm inspecting the network on my browser, but I can't reproduce it (text deletion) by using curl. Even if the socket returns `ok` to me every time.

I hope I can help, if someone can figure out how to do it.
This is the last thing before being able to edit notes from codimd-cli.

PS: [here](https://gist.github.com/Fumesover/3e5c5529a493635126a264878c2a1fa0) you can find the source file

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.