Skip to content

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

@Fumesover

Description

@Fumesover

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)

codimd login --email [email protected] password

Then, connecting to the socket.

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:

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:

#!/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}]}]

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 you can find the source file

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions