common

package
v2.3.6+incompatible Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 15, 2021 License: AGPL-3.0 Imports: 3 Imported by: 1,194

Documentation

Overview

Package common provides a library of tools used by all pydio services

Index

Constants

View Source
const (
	ServiceNats = "nats"

	ServiceLog         = "log"
	ServiceConfig      = "config"
	ServiceInstall     = "install"
	ServiceUpdate      = "update"
	ServiceHealthCheck = "healthcheck"
	ServiceBroker      = "broker"
	ServiceRegistry    = "registry"

	ServiceTagBroker     = "broker"
	ServiceTagData       = "data"
	ServiceTagDatasource = "datasource"
	ServiceTagDiscovery  = "discovery"
	ServiceTagFrontend   = "frontend"
	ServiceTagGateway    = "gateway"
	ServiceTagIdm        = "idm"
	ServiceTagScheduler  = "scheduler"

	ServiceAcl       = "acl"
	ServiceShare     = "share"
	ServiceRole      = "role"
	ServiceUser      = "user"
	ServiceAuth      = "auth"
	ServiceOAuth     = "oauth"
	ServiceToken     = "token"
	ServiceWorkspace = "workspace"
	ServicePolicy    = "policy"
	ServiceGraph     = "graph"
	ServiceUserMeta  = "user-meta"

	ServiceUserKey   = "user-key"
	ServiceTree      = "tree"
	ServiceMeta      = "meta"
	ServiceEncKey    = "data-key"
	ServiceSearch    = "search"
	ServiceChanges   = "changes"
	ServiceSync      = "sync"
	ServiceTemplates = "templates"

	ServiceActivity     = "activity"
	ServiceMailer       = "mailer"
	ServiceWebSocket    = "websocket"
	ServiceChat         = "chat"
	ServiceFrontend     = "frontend"
	ServiceFrontStatics = "statics"

	ServiceTimer    = "timer"
	ServiceJobs     = "jobs"
	ServiceTasks    = "tasks"
	ServiceVersions = "versions"
	ServiceDocStore = "docstore"

	ServiceData_        = "data."
	ServiceDataIndex    = ServiceData_ + "index"
	ServiceDataObjects  = ServiceData_ + "objects"
	ServiceDataSync     = ServiceData_ + "sync"
	ServiceDataIndex_   = ServiceDataIndex + "."
	ServiceDataObjects_ = ServiceDataObjects + "."
	ServiceDataSync_    = ServiceDataSync + "."

	ServiceGrpcNamespace_    = "pydio.grpc."
	ServiceWebNamespace_     = "pydio.web."
	ServiceRestNamespace_    = "pydio.rest."
	ServiceGatewayNamespace_ = "pydio.gateway."
	ServiceTestNamespace_    = "pydio.test."
	ServiceStorageNamespace_ = "pydio.storage."

	ServiceGatewayProxy     = ServiceGatewayNamespace_ + "proxy"
	ServiceGatewayData      = ServiceGatewayNamespace_ + "data"
	ServiceGatewayGrpc      = ServiceGatewayNamespace_ + "grpc"
	ServiceGatewayGrpcClear = ServiceGatewayNamespace_ + "grpc.clear"
	ServiceGatewayDav       = ServiceGatewayNamespace_ + "dav"
	ServiceGatewayWopi      = ServiceGatewayNamespace_ + "wopi"
	ServiceMicroApi         = ServiceGatewayNamespace_ + "rest"
)

Defines all constants for services names.

View Source
const (
	TopicServiceRegistration = "topic.pydio.service.registration"
	TopicProxyRestarted      = "topic.pydio.proxy.restarted"
	TopicServiceStop         = "topic.pydio.service.stop" // @todo This is used in "stop" command but probably out-of-date

	EventTypeServiceRegistered        = "registered"
	EventTypeServiceUnregistered      = "unregistered"
	EventHeaderServiceRegisterService = "x-service-name"
	EventHeaderServiceRegisterPeer    = "x-service-peer"
	EventTypeDebugPrintInternals      = "debug"

	TopicReloadAssets    = "topic.pydio.assets.reload"
	TopicIndexChanges    = "topic.pydio.index.nodes.changes"
	TopicTreeChanges     = "topic.pydio.tree.nodes.changes"
	TopicMetaChanges     = "topic.pydio.meta.nodes.changes"
	TopicTimerEvent      = "topic.pydio.meta.timer.event"
	TopicJobConfigEvent  = "topic.pydio.jobconfig.event"
	TopicJobTaskEvent    = "topic.pydio.jobconfig.event"
	TopicIdmEvent        = "topic.pydio.idm.event"
	TopicActivityEvent   = "topic.pydio.activity.event"
	TopicChatEvent       = "topic.pydio.chat.event"
	TopicDatasourceEvent = "topic.pydio.datasource.event"
	TopicIndexEvent      = "topic.pydio.index.event"
)

Define constants for Event Bus Topics

View Source
const (
	MetaNamespaceDatasourceName      = "pydio:meta-data-source-name"
	MetaNamespaceDatasourcePath      = "pydio:meta-data-source-path"
	MetaNamespaceDatasourceInternal  = "pydio:meta-data-source-internal"
	MetaNamespaceNodeTestLocalFolder = "pydio:test:local-folder-storage"
	MetaNamespaceRecycleRestore      = "pydio:recycle_restore"
	MetaNamespaceNodeName            = "name"
	MetaNamespaceMime                = "mime"
	RecycleBinName                   = "recycle_bin"

	PydioThumbstoreNamespace       = "pydio-thumbstore"
	PydioDocstoreBinariesNamespace = "pydio-binaries"
	PydioVersionsNamespace         = "versions-store"
)

Define constants for metadata and fixed datasources

View Source
const (
	PydioContextUserKey         = "X-Pydio-User"
	PydioSystemUsername         = "pydio.system.user"
	PydioS3AnonUsername         = "pydio.anon.user"
	PydioSyncHiddenFile         = ".pydio"
	XAmzMetaClearSize           = "X-Amz-Meta-Pydio-Clear-Size"
	XAmzMetaClearSizeUnkown     = "unknown"
	XAmzMetaNodeUuid            = "X-Amz-Meta-Pydio-Node-Uuid"
	XAmzMetaContentMd5          = "X-Amz-Meta-Content-Md5"
	XAmzMetaDirective           = "X-Amz-Metadata-Directive"
	XPydioClientUuid            = "X-Pydio-Client-Uuid"
	XPydioSessionUuid           = "X-Pydio-Session"
	XPydioIndexationSessionUuid = "X-Pydio-Indexation-Session"
	XPydioFrontendSessionUuid   = "X-Pydio-Frontend-Session"
	XPydioMoveUuid              = "X-Pydio-Move"
	XContentType                = "Content-Type"
	SyncSessionClose_           = "close-"
	SyncSessionPrefixCopy       = "copy-"
	SyncSessionPrefixMove       = "move-"

	PydioProfileAdmin    = "admin"
	PydioProfileStandard = "standard"
	PydioProfileShared   = "shared"
	PydioProfileAnon     = "anon"

	KeyringMasterKey             = "keyring.master"
	MetaFlagReadonly             = "node_readonly"
	MetaFlagLevelReadonly        = "level_readonly"
	MetaFlagEncrypted            = "datasource_encrypted"
	MetaFlagVersioning           = "datasource_versioning"
	MetaFlagIndexed              = "datasource_node_indexed"
	MetaFlagWorkspaceRoot        = "ws_root"
	MetaFlagWorkspaceScope       = "ws_scope"
	MetaFlagWorkspaceSyncable    = "ws_syncable"
	MetaFlagWorkspacePermissions = "ws_permissions"
	MetaFlagWorkspaceLabel       = "ws_label"
	MetaFlagWorkspaceDescription = "ws_description"
	MetaFlagWorkspaceSlug        = "ws_slug"
	MetaFlagWorkspaceUuid        = "ws_uuid"
	MetaFlagVirtualRoot          = "virtual_root"
	MetaFlagBucket               = "ds_bucket"
	NodeFlagEtagTemporary        = "temporary"
)

Additional constants for authentication/authorization aspects

View Source
const (
	DocStoreIdSelections         = "selections"
	DocStoreIdVirtualNodes       = "virtualnodes"
	DocStoreIdVersioningPolicies = "versioningPolicies"
	DocStoreIdShares             = "share"
	DocStoreIdResetPassKeys      = "resetPasswordKeys"
)

DocStore constants for StoreID's

View Source
const (
	KeyMsgId  = "MsgId"
	KeyTs     = "Ts"
	KeyNano   = "Nano"
	KeyLevel  = "Level"
	KeyLogger = "Logger"
	KeyMsg    = "Msg"
)

Define string used as keys.

View Source
const (
	// Login
	AuditLoginSucceed      = "1"
	AuditLoginFailed       = "2"
	AuditLoginPolicyDenial = "3"
	AuditInvalidJwt        = "4"
	AuditLockUser          = "5"

	// Tree events
	AuditNodeCreate     = "11"
	AuditNodeRead       = "12"
	AuditNodeList       = "13"
	AuditNodeUpdate     = "14"
	AuditNodeDelete     = "15"
	AuditWsCreate       = "16"
	AuditWsUpdate       = "17"
	AuditWsDelete       = "18"
	AuditNodeMovedToBin = "19"

	// S3 Objects
	AuditObjectGet = "21"
	AuditObjectPut = "22"

	// Users, Group, Roles
	AuditUserCreate  = "41"
	AuditUserRead    = "42"
	AuditUserUpdate  = "43"
	AuditUserDelete  = "44"
	AuditGroupCreate = "46"
	AuditGroupRead   = "47"
	AuditGroupUpdate = "48"
	AuditGroupDelete = "49"
	AuditRoleCreate  = "51"
	AuditRoleRead    = "52"
	AuditRoleUpdate  = "53"
	AuditRoleDelete  = "54"

	// Policies
	AuditPolicyGroupStore  = "61"
	AuditPolicyGroupDelete = "62"
	AuditPolicyStore       = "63"
	AuditPolicyDelete      = "64"

	// ShareLinks And Cells
	AuditCellCreate = "71"
	AuditCellRead   = "72"
	AuditCellUpdate = "73"
	AuditCellDelete = "74"
	AuditLinkCreate = "75"
	AuditLinkRead   = "76"
	AuditLinkUpdate = "77"
	AuditLinkDelete = "78"
)

Known audit message IDs

View Source
const (
	KeyContext = "Context"

	// Follow a given request between the various services
	KeySpanUuid       = "SpanUuid"
	KeySpanParentUuid = "SpanParentUuid"
	KeySpanRootUuid   = "SpanRootUuid"

	// Group messages for a given high level operation
	KeyOperationUuid  = "OperationUuid"
	KeyOperationLabel = "OperationLabel"

	KeyNode     = "Node"
	KeyNodeUuid = "NodeUuid"
	KeyNodePath = "NodePath"

	KeyWorkspace      = "Workspace"
	KeyWorkspaceUuid  = "WorkspaceUuid"
	KeyWorkspaceScope = "WorkspaceScope"

	KeyChangeLog        = "ChangeLog"
	KeyNodeChangeEvent  = "NodeChangeEvent"
	KeyVersioningPolicy = "VersioningPolicy"

	KeyActivitySubscription  = "ActivitySubscription"
	KeyActivityStreamRequest = "StreamActivitiesRequest"
	KeyActivityPostEvent     = "PostActivityEvent"
	KeyActivityObject        = "ActivityObject"

	KeyRole     = "Role"
	KeyRoleUuid = "RoleUuid"
	KeyRoles    = "Roles"
	KeyProfile  = "Profile"

	KeyUser     = "User"
	KeyUsername = "UserName"
	KeyUserUuid = "UserUuid"

	KeyGroupPath = "GroupPath"

	KeyConnector = "Connector"

	// Should be ACL and ACLID if we use proto names, changed to stay homogeneous with the other fields
	KeyAcl   = "Acl"
	KeyAclId = "AclId"

	// Pydio internal merged representation of all ACLs that a user has access to
	KeyAccessList = "AccessList"

	KeyPolicyGroup     = "PolicyGroup"
	KeyPolicyGroupUuid = "PolicyGroupUuid"
	KeyPolicy          = "Policy"
	KeyPolicyId        = "PolicyId"
	KeyPolicyRequest   = "PolicyRequest"

	// Scheduler
	KeyJob      = "Job"
	KeyJobId    = "JobId"
	KeyAction   = "Action"
	KeyActionId = "ActionId"
	KeyTask     = "Task"
	KeyTaskId   = "TaskId"
	// Running tasks in scheduler
	KeySchedulerJobId      = "SchedulerJobUuid"
	KeySchedulerTaskId     = "SchedulerTaskUuid"
	KeySchedulerActionPath = "SchedulerTaskActionPath"

	// Cells
	KeyCell     = "Cell"
	KeyCellUuid = "CellUuid"
	KeyLink     = "ShareLink"
	KeyLinkUuid = "ShareLinkUuid"

	// Chat
	KeyChatRoom        = "ChatRoom"
	KeyChatListRoomReq = "ChatListRoomRequest"
	KeyChatListMsgReq  = "ChatListMsgRequest"
	KeyChatPostMsgReq  = "ChatPostMsgRequest"
)

Known audit message IDs

View Source
const (
	KeyFrontIp      = "FrontIp"
	KeyFrontUserid  = "UserId"
	KeyFrontWksid   = "WorkspaceId"
	KeyFrontSource  = "Source"
	KeyFrontPrefix  = "Prefix"
	KeyFrontMessage = "Message"
	KeyFrontNodes   = "Nodes"
)

Keys for the front end

Variables

View Source
var (
	BuildStamp    string
	BuildRevision string
)

Main code information. Set by the go linker in the resulting binary when doing 'make main'

View Source
var (
	PackageType  string
	PackageLabel string
)

Package info. Initialised by main.

View Source
var (
	UpdateDefaultChannel   = "stable"
	UpdateDefaultServerUrl = "https://updatecells.pydio.com/"
	UpdateDefaultPublicKey = `` /* 424-byte string literal not displayed */
)

Update Server default values.

View Source
var (
	LogConfig        LogConfigType
	LogLevel         zapcore.Level
	LogCaptureStdOut bool
)

Logging Levels.

View Source
var (
	LogEventLabels = map[string]string{
		AuditLoginSucceed: "Login succeed",
		AuditLoginFailed:  "Login failed",
		AuditNodeCreate:   "Create Node",
		AuditNodeRead:     "Read Node",
		AuditNodeList:     "List Node",
		AuditNodeUpdate:   "Upadate Node",
		AuditNodeDelete:   "Delete Node",
		AuditObjectGet:    "Get Object",
		AuditObjectPut:    "Put Object",
	}
)
View Source
var (
	// PydioUserProfiles order reflects the level of authorizations
	PydioUserProfiles = []string{
		PydioProfileAnon,
		PydioProfileShared,
		PydioProfileStandard,
		PydioProfileAdmin,
	}
)

Functions

func Version

func Version() *hashiversion.Version

Version returns the current code version as an object.

Types

type Converter

type Converter interface {
	Convert(*any.Any) (string, bool)
}

Converter interface

type LogConfigType

type LogConfigType string

Various custom types internally used by Pydio.

const (
	LogConfigConsole    LogConfigType = "console"
	LogConfigProduction LogConfigType = "production"
)

Define constants for Loggging configuration

type Manager

type Manager interface {
	Get(string) interface{}
	Set(string, interface{}) error
	Del(string) error
	Map(string) map[string]interface{}
}

Manager interface

type Scanner

type Scanner interface {
	Scan(val interface{}) error
}

type ServiceName

type ServiceName string

Various custom types internally used by Pydio.

type ServiceTag

type ServiceTag string

Various custom types internally used by Pydio.

type ServiceType

type ServiceType string

Various custom types internally used by Pydio.

type XMLSerializableForm added in v1.2.2

type XMLSerializableForm interface {
	Serialize(languages ...string) interface{}
}

Directories

Path Synopsis
Package auth provides tools related to authentication of pydio services
Package auth provides tools related to authentication of pydio services
claim
Package claim wraps the JWT claims with util functions
Package claim wraps the JWT claims with util functions
Package BoltDB provides tools for using Bolt as a standard persistence layer for services
Package BoltDB provides tools for using Bolt as a standard persistence layer for services
Package config provides tools for managing configurations
Package config provides tools for managing configurations
micro/envvar
Package envvar implements Pydio specific interface for dynamic configurations that are backed by OS environment variables.
Package envvar implements Pydio specific interface for dynamic configurations that are backed by OS environment variables.
micro/remote
Package source implements a configuration client backed by a config server
Package source implements a configuration client backed by a config server
sql
Package crypto provides tools for data encryption and certificates management
Package crypto provides tools for data encryption and certificates management
Package dao provides abstraction of persistence layer used by pydio services.
Package dao provides abstraction of persistence layer used by pydio services.
etl
Package event wraps protobuf events to add context information
Package event wraps protobuf events to add context information
Package forms provides utility methods to generate XML that is interpreted by the Front End to build forms.
Package forms provides utility methods to generate XML that is interpreted by the Front End to build forms.
* Copyright (c) 2018-2021.
* Copyright (c) 2018-2021.
Package defaults initializes the defaults GRPC clients and servers used by services
Package defaults initializes the defaults GRPC clients and servers used by services
broker/stan
Package stan provides a NATS Streaming broker
Package stan provides a NATS Streaming broker
client/grpc
Package grpc provides a gRPC client Package grpc provides a gRPC options
Package grpc provides a gRPC client Package grpc provides a gRPC options
router
Package router provides api service routing
Package router provides api service routing
selector/cache
Package cache is a caching selector.
Package cache is a caching selector.
server/grpc
Package grpc provides a grpc server
Package grpc provides a grpc server
server/http
Package http implements a go-micro.Server
Package http implements a go-micro.Server
Package mocks should provide utils used by tests to mock various layers.
Package mocks should provide utils used by tests to mock various layers.
## Protobuf Definitions This folder contains all Protobufs used by services to communicate
## Protobuf Definitions This folder contains all Protobufs used by services to communicate
activity
Package activity is a generated protocol buffer package.
Package activity is a generated protocol buffer package.
auth
Package auth is a generated protocol buffer package.
Package auth is a generated protocol buffer package.
broker
Package broker is a generated protocol buffer package.
Package broker is a generated protocol buffer package.
chat
Package chat is a generated protocol buffer package.
Package chat is a generated protocol buffer package.
ctl
Package ctl is a generated protocol buffer package.
Package ctl is a generated protocol buffer package.
docstore
Package docstore is a generated protocol buffer package.
Package docstore is a generated protocol buffer package.
encryption
Package encryption is a generated protocol buffer package.
Package encryption is a generated protocol buffer package.
front
Package front is a generated protocol buffer package.
Package front is a generated protocol buffer package.
idm
Package idm is a generated protocol buffer package.
Package idm is a generated protocol buffer package.
install
Package install is a generated protocol buffer package.
Package install is a generated protocol buffer package.
jobs
Package jobs is a generated protocol buffer package.
Package jobs is a generated protocol buffer package.
log
Package log is a generated protocol buffer package.
Package log is a generated protocol buffer package.
mailer
Package mailer is a generated protocol buffer package.
Package mailer is a generated protocol buffer package.
object
Package object is a generated protocol buffer package.
Package object is a generated protocol buffer package.
registry
Package go_micro_registry is a generated protocol buffer package.
Package go_micro_registry is a generated protocol buffer package.
rest
Package rest is a generated protocol buffer package.
Package rest is a generated protocol buffer package.
rest/cmd
Package cmd provides a specific tool for transforming json swagger file into a go file
Package cmd provides a specific tool for transforming json swagger file into a go file
storage
Package storage is a generated protocol buffer package.
Package storage is a generated protocol buffer package.
sync
Package sync is a generated protocol buffer package.
Package sync is a generated protocol buffer package.
test
Package test is a generated protocol buffer package.
Package test is a generated protocol buffer package.
tree
Package tree is a generated protocol buffer package.
Package tree is a generated protocol buffer package.
update
Package update is a generated protocol buffer package.
Package update is a generated protocol buffer package.
Package registry provides the main glue between services It wraps micro registry (running services declared to the discovery server) into a more generic registry where all actual plugins are self-declared.
Package registry provides the main glue between services It wraps micro registry (running services declared to the discovery server) into a more generic registry where all actual plugins are self-declared.
Package service acts as a factory for all Pydio services.
Package service acts as a factory for all Pydio services.
context
Package servicecontext performs context values read/write, generally through server or client wrappers
Package servicecontext performs context values read/write, generally through server or client wrappers
frontend
Package frontend provides tools to publish static data from within any micro service It implements a simple Union HttpFS to be exposed by a standard net.HttpFileServer interface.
Package frontend provides tools to publish static data from within any micro service It implements a simple Union HttpFS to be exposed by a standard net.HttpFileServer interface.
proto
Package service is a generated protocol buffer package.
Package service is a generated protocol buffer package.
resources
Package resources provides extendable service Handler for managing resource-policy based data.
Package resources provides extendable service Handler for managing resource-policy based data.
sql
Package sql provides tools and DAOs for speaking SQL as well as managing tables migrations
Package sql provides tools and DAOs for speaking SQL as well as managing tables migrations
index
Package index provides ready-to-use tables and DAOs for storing hierarchical data using the nested sets pattern * Copyright (c) 2018.
Package index provides ready-to-use tables and DAOs for storing hierarchical data using the nested sets pattern * Copyright (c) 2018.
resources
Package resources provides ready-to-use SQL schemes and DAOs for attaching resource policies to any data
Package resources provides ready-to-use SQL schemes and DAOs for attaching resource policies to any data
sync
endpoints/cells
Package cells provides endpoints for speaking either with a local server using a views.Router (and connecting to the local NATS registry), or a remote Cells server using a GRPC gateway client.
Package cells provides endpoints for speaking either with a local server using a views.Router (and connecting to the local NATS registry), or a remote Cells server using a GRPC gateway client.
endpoints/filesystem
Package file system provides endpoints for reading/writing from/to a local folder
Package file system provides endpoints for reading/writing from/to a local folder
endpoints/index
Package index provides a GRPC client for storing information into any tree.NodeProviderClient/tree.NodeReceiverClient service.
Package index provides a GRPC client for storing information into any tree.NodeProviderClient/tree.NodeReceiverClient service.
endpoints/memory
Package memory provides an in-memory basic implementation of an Endpoint, with nodes stored in a map.
Package memory provides an in-memory basic implementation of an Endpoint, with nodes stored in a map.
endpoints/s3
Package s3 provides an endpoint for connecting to Amazon S3 or an S3-compatible storage
Package s3 provides an endpoint for connecting to Amazon S3 or an S3-compatible storage
endpoints/snapshot
Package snapshot provides fast in-memory or on-file implementations of endpoint for storing snapshots
Package snapshot provides fast in-memory or on-file implementations of endpoint for storing snapshots
filters
Package filters provides batchers and filters to analyze and simplify sync events
Package filters provides batchers and filters to analyze and simplify sync events
merger
Package merger implements all logic to compare trees and create set of operations to be applied
Package merger implements all logic to compare trees and create set of operations to be applied
model
Package model gathers the main structs and interfaces used in sync library.
Package model gathers the main structs and interfaces used in sync library.
proc
Package proc provides actual actions to be performed once the sync has filtered all events
Package proc provides actual actions to be performed once the sync has filtered all events
task
Package task defines a synchronization task
Package task defines a synchronization task
Package utils provides swiss-knife tools for all services
Package utils provides swiss-knife tools for all services
cache
Package cache provides ready-to-use in-memory cache mechanisms
Package cache provides ready-to-use in-memory cache mechanisms
context
Package context manipulates context metadata
Package context manipulates context metadata
error
Package error creates and parses common errors
Package error creates and parses common errors
i18n
Package i18n wraps go-i18n lib for manipulating bundles
Package i18n wraps go-i18n lib for manipulating bundles
meta
Package meta provides tool for reading metadata from services declaring "MetaProvider" support
Package meta provides tool for reading metadata from services declaring "MetaProvider" support
mtree
Package mtree provides advanced tools for encoding tree paths in a material format
Package mtree provides advanced tools for encoding tree paths in a material format
net
Package net provides tools for reading IPs, available Ports, extending HTTP requests, etc.
Package net provides tools for reading IPs, available Ports, extending HTTP requests, etc.
permissions
Package permissions provides high-level tools for computing permissions from ACLs
Package permissions provides high-level tools for computing permissions from ACLs
schedule
Package schedule provides a fixed ticker based on a start time iso8601 interval periods are supported
Package schedule provides a fixed ticker based on a start time iso8601 interval periods are supported
std
Package std provides tools for standard types (strings, int, floats, etc).
Package std provides tools for standard types (strings, int, floats, etc).
Package views provides high-level clients for talking to the main data tree in certain context.
Package views provides high-level clients for talking to the main data tree in certain context.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL