Skip to content

Instantly share code, notes, and snippets.

Криптопосты

Задача

Хочется дать пользователям возможность писать посты (с возможностью комментирования), текст и комментарии к которым доступны только определённым читателям и недоступны никому больше, в том числе серверу. На сервере должы храниться только зашифрованные версии текстов.

Как написать пост

Пусть Алиса хочет создать криптопост, видимый ей, Бобу и Кларе. Для этого все трое должны иметь пары GPG(?)-ключей, причём все публичные ключи (Ka, Kb, Kc) должны быть доступны (например, в самоописании юзера), бразуер/клиент возможного читателя поста также должен знать приватный ключ читателя.

{
"page-background": "url(\"https://images.unsplash.com/photo-1584203095493-6d23037b6b13?w=1920&q=80\")",
"box-header-background": "#f3c635",
"link-color": "#a56c0b"
}
@davidmz
davidmz / settable-context.jsx
Last active April 20, 2020 09:24
React context that can be updated from the consumer
import React, { createContext, useState, useCallback } from 'react';
export const context = createContext({
query: '',
setQuery: () => undefined,
});
export function Provider({ children }) {
const [query, setStateQuery] = useState('');
const setQuery = useCallback((q) => setStateQuery(q), []);
@davidmz
davidmz / snippet.js
Created November 25, 2019 14:00
[500px sorder] Snipper for sorting 500px private gallery in photo id order #500px
(async () => {
const galleryId = (() => {
const m = /^\/g\/(\w+)$/.exec(location.pathname);
if (!m) {
throw new Error("Invalid location (not a private gallery)");
}
return m[1];
})();
const userId = window.currentUser.id;
const csrfToken = window.PxApp.csrf_token;
@davidmz
davidmz / loops.js
Last active September 12, 2019 13:06
Loop control script for MPV video player #video #mpv
var hotKey = "k";
var numRe = /\d+(?:\.\d+)?/g;
var interval = null;
mp.register_event("file-loaded", function() {
// Trying to load loops file
mp.remove_key_binding("loopContinue");
clearInterval(interval);
var videoPath = mp.get_property("path");
@davidmz
davidmz / frfTop20Hashtags.txt
Created September 9, 2019 07:54
[Top 20 freefeed post hashtags] At 2019-09-04 #freefeed
name | count
-------------------+-------
frf_inspired | 480
worldcup | 288
training | 259
wudru | 258
music | 255
poidem | 244
spb | 229
1 | 227
@davidmz
davidmz / 1-nested-routes.ts
Last active August 28, 2018 10:56
Nested routes for mobx-state-router
import { Route as PlainRoute, RouterStore, RouterState } from 'mobx-state-router';
import { TransitionHook } from 'mobx-state-router/dist/types/router-store';
export interface Route extends PlainRoute {
children?: Route[];
}
type KeysOfType<A extends object, B> = { [K in keyof A]: A[K] extends B ? K : never }[keyof A];
type HookKey = Exclude<KeysOfType<PlainRoute, TransitionHook | undefined>, undefined>;
@davidmz
davidmz / collect-links.php
Created February 22, 2017 14:45
Short link extractor for Friendfeed archives
@davidmz
davidmz / log-crypt.go
Last active November 20, 2016 19:33
Скрипт для обфуцирования юзернеймов, UUID-ов и токенов в логах Фидика
package main
import (
"bufio"
"crypto/hmac"
"crypto/sha1"
"encoding/hex"
"flag"
"fmt"
"os"
@davidmz
davidmz / Pragmatic_JSON_API.md
Last active April 30, 2016 15:39
Pragmatic JSON API

Запросы к API производятся методами GET (безопасные операции, не меняющие состояния сервера) и POST (все остальные + те, которым мешают ограничения GET).

Параметры запроса передаются как GET-параметры и/или как JSON-encoded тело POST-запроса.

Ответ сервера может быть двух типов: успех или ошибка. В обоих случаях используется HTTP-статус "200 OK". Ответ всегда представляет собой JSON-объект с обязательным полем status имеющим значение "ok" или "error".

Формат ответа «успех»: