1// Copyright 2015 Keybase, Inc. All rights reserved. Use of
2// this source code is governed by the included BSD license.
3
4package libkb
5
6/*
7 * Interfaces
8 *
9 *   Here are the interfaces that we're going to assume when
10 *   implementing the features of command-line clients or
11 *   servers.  Depending on the context, we might get different
12 *   instantiations of these interfaces.
13 */
14
15import (
16	"io"
17	"net/http"
18	"time"
19
20	"golang.org/x/net/context"
21
22	"github.com/PuerkitoBio/goquery"
23	gregor "github.com/keybase/client/go/gregor"
24	"github.com/keybase/client/go/logger"
25	"github.com/keybase/client/go/protocol/chat1"
26	gregor1 "github.com/keybase/client/go/protocol/gregor1"
27	keybase1 "github.com/keybase/client/go/protocol/keybase1"
28	stellar1 "github.com/keybase/client/go/protocol/stellar1"
29	clockwork "github.com/keybase/clockwork"
30	jsonw "github.com/keybase/go-jsonw"
31)
32
33type configGetter interface {
34	GetAPITimeout() (time.Duration, bool)
35	GetAppType() AppType
36	IsMobileExtension() (bool, bool)
37	GetSlowGregorConn() (bool, bool)
38	GetReadDeletedSigChain() (bool, bool)
39	GetAutoFork() (bool, bool)
40	GetChatDbFilename() string
41	GetPvlKitFilename() string
42	GetParamProofKitFilename() string
43	GetExternalURLKitFilename() string
44	GetProveBypass() (bool, bool)
45	GetCodeSigningKIDs() []string
46	GetConfigFilename() string
47	GetDbFilename() string
48	GetDebug() (bool, bool)
49	GetDebugJourneycard() (bool, bool)
50	GetDisplayRawUntrustedOutput() (bool, bool)
51	GetGpg() string
52	GetGpgHome() string
53	GetGpgOptions() []string
54	GetGregorDisabled() (bool, bool)
55	GetSecretStorePrimingDisabled() (bool, bool)
56	GetBGIdentifierDisabled() (bool, bool)
57	GetGregorPingInterval() (time.Duration, bool)
58	GetGregorPingTimeout() (time.Duration, bool)
59	GetGregorSaveInterval() (time.Duration, bool)
60	GetGregorURI() string
61	GetHome() string
62	GetMobileSharedHome() string
63	GetLinkCacheSize() (int, bool)
64	GetLocalRPCDebug() string
65	GetLocalTrackMaxAge() (time.Duration, bool)
66	GetLogFile() string
67	GetEKLogFile() string
68	GetPerfLogFile() string
69	GetGUILogFile() string
70	GetUseDefaultLogFile() (bool, bool)
71	GetUseRootConfigFile() (bool, bool)
72	GetLogPrefix() string
73	GetLogFormat() string
74	GetMerkleKIDs() []string
75	GetMountDir() string
76	GetMountDirDefault() string
77	GetPidFile() string
78	GetPinentry() string
79	GetProofCacheSize() (int, bool)
80	GetProxy() string
81	GetProxyType() string
82	IsCertPinningEnabled() bool
83	GetRunMode() (RunMode, error)
84	GetScraperTimeout() (time.Duration, bool)
85	GetSecretKeyringTemplate() string
86	GetServerURI() (string, error)
87	GetSessionFilename() string
88	GetSocketFile() string
89	GetStandalone() (bool, bool)
90	GetTimers() string
91	GetTorHiddenAddress() string
92	GetTorMode() (TorMode, error)
93	GetTorProxy() string
94	GetUPAKCacheSize() (int, bool)
95	GetUIDMapFullNameCacheSize() (int, bool)
96	GetUpdaterConfigFilename() string
97	GetGUIConfigFilename() string
98	GetDeviceCloneStateFilename() string
99	GetUserCacheMaxAge() (time.Duration, bool)
100	GetVDebugSetting() string
101	GetChatDelivererInterval() (time.Duration, bool)
102	GetFeatureFlags() (FeatureFlags, error)
103	GetLevelDBNumFiles() (int, bool)
104	GetLevelDBWriteBufferMB() (int, bool)
105	GetChatInboxSourceLocalizeThreads() (int, bool)
106	GetPayloadCacheSize() (int, bool)
107	GetRememberPassphrase(NormalizedUsername) (bool, bool)
108	GetAttachmentHTTPStartPort() (int, bool)
109	GetAttachmentDisableMulti() (bool, bool)
110	GetDisableTeamAuditor() (bool, bool)
111	GetDisableTeamBoxAuditor() (bool, bool)
112	GetDisableEKBackgroundKeygen() (bool, bool)
113	GetDisableMerkleAuditor() (bool, bool)
114	GetDisableSearchIndexer() (bool, bool)
115	GetDisableBgConvLoader() (bool, bool)
116	GetEnableBotLiteMode() (bool, bool)
117	GetExtraNetLogging() (bool, bool)
118	GetForceLinuxKeyring() (bool, bool)
119	GetForceSecretStoreFile() (bool, bool)
120	GetRuntimeStatsEnabled() (bool, bool)
121}
122
123type CommandLine interface {
124	configGetter
125
126	GetAPIDump() (bool, bool)
127	GetPGPFingerprint() *PGPFingerprint
128	GetNoAutoFork() (bool, bool)
129
130	// Lower-level functions
131	GetGString(string) string
132	GetString(string) string
133	GetBool(string, bool) (bool, bool)
134}
135
136type Server interface {
137}
138
139type DBKeySet map[DbKey]struct{}
140
141type LocalDbOps interface {
142	Put(id DbKey, aliases []DbKey, value []byte) error
143	Delete(id DbKey) error
144	Get(id DbKey) ([]byte, bool, error)
145	Lookup(alias DbKey) ([]byte, bool, error)
146}
147
148type LocalDbTransaction interface {
149	LocalDbOps
150	Commit() error
151	Discard()
152}
153
154type LocalDb interface {
155	LocalDbOps
156	Open() error
157	Stats() string
158	CompactionStats() (bool, bool, error)
159	ForceOpen() error
160	Close() error
161	Nuke() (string, error)
162	Clean(force bool) error
163	OpenTransaction() (LocalDbTransaction, error)
164	KeysWithPrefixes(prefixes ...[]byte) (DBKeySet, error)
165}
166
167type KVStorer interface {
168	GetInto(obj interface{}, id DbKey) (found bool, err error)
169	PutObj(id DbKey, aliases []DbKey, obj interface{}) (err error)
170	Delete(id DbKey) error
171	KeysWithPrefixes(prefixes ...[]byte) (DBKeySet, error)
172}
173
174type JSONReader interface {
175	GetStringAtPath(string) (string, bool)
176	GetInterfaceAtPath(string) (interface{}, error)
177	GetBoolAtPath(string) (bool, bool)
178	GetIntAtPath(string) (int, bool)
179	GetFloatAtPath(string) (float64, bool)
180	GetNullAtPath(string) bool
181}
182
183type ConfigReader interface {
184	JSONReader
185	configGetter
186
187	GetUserConfig() (*UserConfig, error)
188	GetUserConfigForUsername(s NormalizedUsername) (*UserConfig, error)
189	GetBundledCA(host string) string
190	GetProofCacheLongDur() (time.Duration, bool)
191	GetProofCacheMediumDur() (time.Duration, bool)
192	GetProofCacheShortDur() (time.Duration, bool)
193	GetLinkCacheCleanDur() (time.Duration, bool)
194	GetNoPinentry() (bool, bool)
195	GetDeviceID() keybase1.DeviceID
196	GetDeviceIDForUsername(nu NormalizedUsername) keybase1.DeviceID
197	GetPassphraseState() *keybase1.PassphraseState
198	GetPassphraseStateForUsername(nu NormalizedUsername) *keybase1.PassphraseState
199	GetDeviceIDForUID(u keybase1.UID) keybase1.DeviceID
200	GetUsernameForUID(u keybase1.UID) NormalizedUsername
201	GetUIDForUsername(n NormalizedUsername) keybase1.UID
202	GetUsername() NormalizedUsername
203	GetAllUsernames() (current NormalizedUsername, others []NormalizedUsername, err error)
204	GetAllUserConfigs() (current *UserConfig, others []UserConfig, err error)
205	GetUID() keybase1.UID
206	GetProxyCACerts() ([]string, error)
207	GetSecurityAccessGroupOverride() (bool, bool)
208	GetBug3964RepairTime(NormalizedUsername) (time.Time, error)
209	GetStayLoggedOut() (bool, bool)
210
211	GetUpdatePreferenceAuto() (bool, bool)
212	GetUpdatePreferenceSkip() string
213	GetUpdatePreferenceSnoozeUntil() keybase1.Time
214	GetUpdateLastChecked() keybase1.Time
215	GetUpdateURL() string
216	GetUpdateDisabled() (bool, bool)
217
218	GetAndroidInstallReferrerChecked() bool
219}
220
221type UpdaterConfigReader interface {
222	GetInstallID() InstallID
223}
224
225type ConfigWriterTransacter interface {
226	Commit() error
227	Rollback() error
228	Abort() error
229}
230
231type JSONWriter interface {
232	SetStringAtPath(string, string) error
233	SetBoolAtPath(string, bool) error
234	SetIntAtPath(string, int) error
235	SetFloatAtPath(string, float64) error
236	SetNullAtPath(string) error
237	SetWrapperAtPath(string, *jsonw.Wrapper) error
238	DeleteAtPath(string)
239}
240
241type ConfigWriter interface {
242	JSONWriter
243	SetUserConfig(cfg *UserConfig, overwrite bool) error
244	SwitchUser(un NormalizedUsername) error
245	NukeUser(un NormalizedUsername) error
246	SetDeviceID(keybase1.DeviceID) error
247	SetUpdatePreferenceAuto(bool) error
248	SetUpdatePreferenceSkip(string) error
249	SetUpdatePreferenceSnoozeUntil(keybase1.Time) error
250	SetUpdateLastChecked(keybase1.Time) error
251	SetBug3964RepairTime(NormalizedUsername, time.Time) error
252	SetRememberPassphrase(NormalizedUsername, bool) error
253	SetPassphraseState(keybase1.PassphraseState) error
254	SetStayLoggedOut(bool) error
255	Reset()
256	BeginTransaction() (ConfigWriterTransacter, error)
257
258	SetAndroidInstallReferrerChecked(b bool) error
259}
260
261type HTTPRequest interface {
262	SetEnvironment(env Env)
263}
264
265type Usage struct {
266	Config     bool
267	GpgKeyring bool
268	KbKeyring  bool
269	API        bool
270	Socket     bool
271	AllowRoot  bool
272}
273
274type Command interface {
275	GetUsage() Usage
276}
277
278type JSONPayload map[string]interface{}
279
280type APIRes struct {
281	Status     *jsonw.Wrapper
282	Body       *jsonw.Wrapper
283	HTTPStatus int
284	AppStatus  *AppStatus
285}
286
287type AppStatus struct {
288	Code   int               `json:"code"`
289	Name   string            `json:"name"`
290	Desc   string            `json:"desc"`
291	Fields map[string]string `json:"fields"`
292}
293
294type APIResponseWrapper interface {
295	GetAppStatus() *AppStatus
296}
297
298type ExternalHTMLRes struct {
299	HTTPStatus int
300	GoQuery    *goquery.Document
301}
302
303type ExternalTextRes struct {
304	HTTPStatus int
305	Body       string
306}
307
308type ExternalAPIRes struct {
309	HTTPStatus int
310	Body       *jsonw.Wrapper
311}
312
313type API interface {
314	Get(MetaContext, APIArg) (*APIRes, error)
315	GetDecode(MetaContext, APIArg, APIResponseWrapper) error
316	GetDecodeCtx(context.Context, APIArg, APIResponseWrapper) error
317	GetResp(MetaContext, APIArg) (*http.Response, func(), error)
318	Post(MetaContext, APIArg) (*APIRes, error)
319	PostJSON(MetaContext, APIArg) (*APIRes, error)
320	PostDecode(MetaContext, APIArg, APIResponseWrapper) error
321	PostDecodeCtx(context.Context, APIArg, APIResponseWrapper) error
322	PostRaw(MetaContext, APIArg, string, io.Reader) (*APIRes, error)
323	Delete(MetaContext, APIArg) (*APIRes, error)
324}
325
326type ExternalAPI interface {
327	Get(MetaContext, APIArg) (*ExternalAPIRes, error)
328	Post(MetaContext, APIArg) (*ExternalAPIRes, error)
329	GetHTML(MetaContext, APIArg) (*ExternalHTMLRes, error)
330	GetText(MetaContext, APIArg) (*ExternalTextRes, error)
331	PostHTML(MetaContext, APIArg) (*ExternalHTMLRes, error)
332}
333
334type IdentifyUI interface {
335	Start(MetaContext, string, keybase1.IdentifyReason, bool) error
336	FinishWebProofCheck(MetaContext, keybase1.RemoteProof, keybase1.LinkCheckResult) error
337	FinishSocialProofCheck(MetaContext, keybase1.RemoteProof, keybase1.LinkCheckResult) error
338	Confirm(MetaContext, *keybase1.IdentifyOutcome) (keybase1.ConfirmResult, error)
339	DisplayCryptocurrency(MetaContext, keybase1.Cryptocurrency) error
340	DisplayStellarAccount(MetaContext, keybase1.StellarAccount) error
341	DisplayKey(MetaContext, keybase1.IdentifyKey) error
342	ReportLastTrack(MetaContext, *keybase1.TrackSummary) error
343	LaunchNetworkChecks(MetaContext, *keybase1.Identity, *keybase1.User) error
344	DisplayTrackStatement(MetaContext, string) error
345	DisplayUserCard(MetaContext, keybase1.UserCard) error
346	ReportTrackToken(MetaContext, keybase1.TrackToken) error
347	Cancel(MetaContext) error
348	Finish(MetaContext) error
349	DisplayTLFCreateWithInvite(MetaContext, keybase1.DisplayTLFCreateWithInviteArg) error
350	Dismiss(MetaContext, string, keybase1.DismissReason) error
351}
352
353type Checker struct {
354	F             func(string) bool
355	Transform     func(string) string
356	Normalize     func(string) string
357	Hint          string
358	PreserveSpace bool
359}
360
361type PromptArg struct {
362	TerminalPrompt string
363	PinentryDesc   string
364	PinentryPrompt string
365	Checker        *Checker
366	RetryMessage   string
367	UseSecretStore bool
368	ShowTyping     bool
369}
370
371type LoginUI interface {
372	keybase1.LoginUiInterface
373}
374
375type ProveUI interface {
376	PromptOverwrite(context.Context, keybase1.PromptOverwriteArg) (bool, error)
377	PromptUsername(context.Context, keybase1.PromptUsernameArg) (string, error)
378	OutputPrechecks(context.Context, keybase1.OutputPrechecksArg) error
379	PreProofWarning(context.Context, keybase1.PreProofWarningArg) (bool, error)
380	OutputInstructions(context.Context, keybase1.OutputInstructionsArg) error
381	OkToCheck(context.Context, keybase1.OkToCheckArg) (bool, error)
382	Checking(context.Context, keybase1.CheckingArg) error
383	ContinueChecking(context.Context, int) (bool, error)
384	DisplayRecheckWarning(context.Context, keybase1.DisplayRecheckWarningArg) error
385}
386
387type SecretUI interface {
388	GetPassphrase(pinentry keybase1.GUIEntryArg, terminal *keybase1.SecretEntryArg) (keybase1.GetPassphraseRes, error)
389}
390
391type SaltpackUI interface {
392	SaltpackPromptForDecrypt(context.Context, keybase1.SaltpackPromptForDecryptArg, bool) error
393	SaltpackVerifySuccess(context.Context, keybase1.SaltpackVerifySuccessArg) error
394	SaltpackVerifyBadSender(context.Context, keybase1.SaltpackVerifyBadSenderArg) error
395}
396
397type LogUI interface {
398	Debug(format string, args ...interface{})
399	Info(format string, args ...interface{})
400	Warning(format string, args ...interface{})
401	Notice(format string, args ...interface{})
402	Errorf(format string, args ...interface{})
403	Critical(format string, args ...interface{})
404}
405
406type LogFunc func(format string, args ...interface{})
407
408type GPGUI interface {
409	keybase1.GpgUiInterface
410}
411
412type PgpUI interface {
413	keybase1.PGPUiInterface
414}
415
416type ProvisionUI interface {
417	keybase1.ProvisionUiInterface
418}
419
420type ChatUI interface {
421	ChatInboxUnverified(context.Context, chat1.ChatInboxUnverifiedArg) error
422	ChatInboxConversation(context.Context, chat1.ChatInboxConversationArg) error
423	ChatInboxFailed(context.Context, chat1.ChatInboxFailedArg) error
424	ChatInboxLayout(context.Context, string) error
425	ChatThreadCached(context.Context, *string) error
426	ChatThreadFull(context.Context, string) error
427	ChatThreadStatus(context.Context, chat1.UIChatThreadStatus) error
428	ChatConfirmChannelDelete(context.Context, chat1.ChatConfirmChannelDeleteArg) (bool, error)
429	ChatSearchHit(context.Context, chat1.ChatSearchHitArg) error
430	ChatSearchDone(context.Context, chat1.ChatSearchDoneArg) error
431	ChatSearchInboxHit(context.Context, chat1.ChatSearchInboxHitArg) error
432	ChatSearchInboxStart(context.Context) error
433	ChatSearchInboxDone(context.Context, chat1.ChatSearchInboxDoneArg) error
434	ChatSearchIndexStatus(context.Context, chat1.ChatSearchIndexStatusArg) error
435	ChatSearchConvHits(context.Context, chat1.UIChatSearchConvHits) error
436	ChatSearchTeamHits(context.Context, chat1.UIChatSearchTeamHits) error
437	ChatSearchBotHits(context.Context, chat1.UIChatSearchBotHits) error
438	ChatStellarShowConfirm(context.Context) error
439	ChatStellarDataConfirm(context.Context, chat1.UIChatPaymentSummary) (bool, error)
440	ChatStellarDataError(context.Context, keybase1.Status) (bool, error)
441	ChatStellarDone(context.Context, bool) error
442	ChatGiphySearchResults(ctx context.Context, convID chat1.ConversationID,
443		results chat1.GiphySearchResults) error
444	ChatGiphyToggleResultWindow(ctx context.Context, convID chat1.ConversationID, show, clearInput bool) error
445	ChatShowManageChannels(context.Context, string) error
446	ChatCoinFlipStatus(context.Context, []chat1.UICoinFlipStatus) error
447	ChatCommandMarkdown(context.Context, chat1.ConversationID, *chat1.UICommandMarkdown) error
448	ChatMaybeMentionUpdate(context.Context, string, string, chat1.UIMaybeMentionInfo) error
449	ChatLoadGalleryHit(context.Context, chat1.UIMessage) error
450	ChatWatchPosition(context.Context, chat1.ConversationID, chat1.UIWatchPositionPerm) (chat1.LocationWatchID, error)
451	ChatClearWatch(context.Context, chat1.LocationWatchID) error
452	ChatCommandStatus(context.Context, chat1.ConversationID, string, chat1.UICommandStatusDisplayTyp,
453		[]chat1.UICommandStatusActionTyp) error
454	ChatBotCommandsUpdateStatus(context.Context, chat1.ConversationID, chat1.UIBotCommandsUpdateStatus) error
455	TriggerContactSync(context.Context) error
456}
457
458type PromptDefault int
459
460const (
461	PromptDefaultNo PromptDefault = iota
462	PromptDefaultYes
463	PromptDefaultNeither
464)
465
466type PromptDescriptor int
467type OutputDescriptor int
468
469type TerminalUI interface {
470	// The ErrorWriter is not escaped: it should not be used to show unescaped user-originated data.
471	ErrorWriter() io.Writer
472	Output(string) error
473	OutputDesc(OutputDescriptor, string) error
474	OutputWriter() io.Writer
475	UnescapedOutputWriter() io.Writer
476	Printf(fmt string, args ...interface{}) (int, error)
477	PrintfUnescaped(fmt string, args ...interface{}) (int, error)
478	// Prompt strings are not escaped: they should not be used to show unescaped user-originated data.
479	Prompt(PromptDescriptor, string) (string, error)
480	PromptForConfirmation(prompt string) error
481	PromptPassword(PromptDescriptor, string) (string, error)
482	PromptPasswordMaybeScripted(PromptDescriptor, string) (string, error)
483	PromptYesNo(PromptDescriptor, string, PromptDefault) (bool, error)
484	TerminalSize() (width int, height int)
485}
486
487type DumbOutputUI interface {
488	Printf(fmt string, args ...interface{}) (int, error)
489	PrintfStderr(fmt string, args ...interface{}) (int, error)
490	PrintfUnescaped(fmt string, args ...interface{}) (int, error)
491}
492
493type UI interface {
494	GetIdentifyUI() IdentifyUI
495	GetIdentifyTrackUI() IdentifyUI
496	GetLoginUI() LoginUI
497	GetSecretUI() SecretUI
498	GetTerminalUI() TerminalUI
499	GetDumbOutputUI() DumbOutputUI
500	GetProveUI() ProveUI
501	GetLogUI() LogUI
502	GetGPGUI() GPGUI
503	GetProvisionUI(role KexRole) ProvisionUI
504	GetPgpUI() PgpUI
505	Configure() error
506	Shutdown() error
507}
508
509type UIRouter interface {
510	SetUI(ConnectionID, UIKind)
511
512	// These are allowed to return nil for the UI even if
513	// error is nil.
514	GetIdentifyUI() (IdentifyUI, error)
515	GetIdentifyUICtx(ctx context.Context) (int, IdentifyUI, error)
516	GetSecretUI(sessionID int) (SecretUI, error)
517	GetRekeyUI() (keybase1.RekeyUIInterface, int, error)
518	GetRekeyUINoSessionID() (keybase1.RekeyUIInterface, error)
519	GetHomeUI() (keybase1.HomeUIInterface, error)
520	GetIdentify3UIAdapter(MetaContext) (IdentifyUI, error)
521	GetIdentify3UI(MetaContext) (keybase1.Identify3UiInterface, error)
522	GetChatUI() (ChatUI, error)
523	GetLogUI() (LogUI, error)
524
525	// WaitForUIType returns true if a UI of the specified type is registered,
526	// or waits until timeout for such UI to register and returns false if this
527	// does not happen.
528	WaitForUIType(uiKind UIKind, timeout time.Duration) bool
529
530	DumpUIs() map[UIKind]ConnectionID
531	Shutdown()
532}
533
534type UIConsumer interface {
535	Name() string
536	RequiredUIs() []UIKind
537	SubConsumers() []UIConsumer
538}
539
540type Triplesec interface {
541	DeriveKey(l int) ([]byte, []byte, error)
542	Decrypt([]byte) ([]byte, error)
543	Encrypt([]byte) ([]byte, error)
544	Scrub()
545}
546
547type Clock interface {
548	Now() time.Time
549}
550
551type GregorState interface {
552	State(ctx context.Context) (gregor.State, error)
553	UpdateCategory(ctx context.Context, cat string, body []byte,
554		dtime gregor1.TimeOrOffset) (res gregor1.MsgID, err error)
555	InjectItem(ctx context.Context, cat string, body []byte, dtime gregor1.TimeOrOffset) (gregor1.MsgID, error)
556	DismissItem(ctx context.Context, cli gregor1.IncomingInterface, id gregor.MsgID) error
557	DismissCategory(ctx context.Context, cat gregor1.Category) error
558	LocalDismissItem(ctx context.Context, id gregor.MsgID) error
559}
560
561type GregorInBandMessageHandler interface {
562	IsAlive() bool
563	Name() string
564	Create(ctx context.Context, cli gregor1.IncomingInterface, category string, ibm gregor.Item) (bool, error)
565	Dismiss(ctx context.Context, cli gregor1.IncomingInterface, category string, ibm gregor.Item) (bool, error)
566}
567
568type GregorFirehoseHandler interface {
569	IsAlive() bool
570	PushState(gregor1.State, keybase1.PushReason)
571	PushOutOfBandMessages([]gregor1.OutOfBandMessage)
572}
573
574type GregorListener interface {
575	PushHandler(handler GregorInBandMessageHandler)
576	PushFirehoseHandler(handler GregorFirehoseHandler)
577}
578
579type LogContext interface {
580	GetLog() logger.Logger
581}
582
583type VLogContext interface {
584	LogContext
585	GetVDebugLog() *VDebugLog
586}
587
588// APIContext defines methods for accessing API server
589type APIContext interface {
590	GetAPI() API
591	GetExternalAPI() ExternalAPI
592	GetServerURI() (string, error)
593}
594
595type NetContext interface {
596	GetNetContext() context.Context
597}
598
599type DNSNameServerFetcher interface {
600	GetServers() []string
601}
602
603type DNSContext interface {
604	GetDNSNameServerFetcher() DNSNameServerFetcher
605}
606
607type AssertionContext interface {
608	Ctx() context.Context
609	NormalizeSocialName(service string, username string) (string, error)
610}
611
612// ProofChecker is an interface for performing a remote check for a proof
613
614type ProofCheckerMode int
615
616const (
617	ProofCheckerModePassive ProofCheckerMode = iota
618	ProofCheckerModeActive  ProofCheckerMode = iota
619)
620
621type ProofChecker interface {
622	// `h` is the server provided sigHint. If the client can provide validated
623	// information it returns this. The verifiedSigHint is preferred over the
624	// server-trust one when displaying to users.
625	CheckStatus(m MetaContext, h SigHint, pcm ProofCheckerMode, pvlU keybase1.MerkleStoreEntry) (*SigHint, ProofError)
626	GetTorError() ProofError
627}
628
629// ServiceType is an interface for describing an external proof service, like 'Twitter'
630// or 'GitHub', etc.
631type ServiceType interface {
632	Key() string
633
634	// NormalizeUsername normalizes the given username, assuming
635	// that it's free of any leading strings like '@' or 'dns://'.
636	NormalizeUsername(string) (string, error)
637
638	// NormalizeRemote normalizes the given remote username, which
639	// is usually but not always the same as the username. It also
640	// allows leaders like '@' and 'dns://'.
641	//
642	// In the case of Facebook, this version does the standard downcasing, but
643	// leaves the dots in (that NormalizeUsername above would strip out). This
644	// lets us keep the dots in the proof text, and display them on your
645	// profile page, even though we ignore them for proof checking.
646	NormalizeRemoteName(m MetaContext, name string) (string, error)
647
648	GetPrompt() string
649	LastWriterWins() bool
650	PreProofCheck(m MetaContext, remotename string) (*Markup, error)
651	PreProofWarning(remotename string) *Markup
652	ToServiceJSON(remotename string) *jsonw.Wrapper
653	PostInstructions(remotename string) *Markup
654	DisplayName() string
655	RecheckProofPosting(tryNumber int, status keybase1.ProofStatus, remotename string) (warning *Markup, err error)
656	GetProofType() string
657	GetTypeName() string
658	PickerSubtext() string
659	CheckProofText(text string, id keybase1.SigID, sig string) error
660	FormatProofText(mctx MetaContext, ppr *PostProofRes,
661		kbUsername, remoteUsername string, sigID keybase1.SigID) (string, error)
662	GetAPIArgKey() string
663	IsDevelOnly() bool
664	GetLogoKey() string
665
666	MakeProofChecker(l RemoteProofChainLink) ProofChecker
667	SetDisplayConfig(*keybase1.ServiceDisplayConfig)
668	CanMakeNewProofs(mctx MetaContext) bool
669	CanMakeNewProofsSkipFeatureFlag(mctx MetaContext) bool
670	DisplayPriority() int
671	DisplayGroup() string
672	IsNew(MetaContext) bool
673}
674
675type ExternalServicesCollector interface {
676	GetServiceType(context.Context, string) ServiceType
677	ListProofCheckers(MetaContext) []string
678	ListServicesThatAcceptNewProofs(MetaContext) []string
679	ListDisplayConfigs(MetaContext) (res []keybase1.ServiceDisplayConfig)
680	SuggestionFoldPriority(MetaContext) int
681	Shutdown()
682}
683
684// Generic store for data that is hashed into the merkle root. Used by pvl and
685// parameterized proofs.
686type MerkleStore interface {
687	GetLatestEntry(m MetaContext) (keybase1.MerkleStoreEntry, error)
688	GetLatestEntryWithKnown(MetaContext, *keybase1.MerkleStoreKitHash) (*keybase1.MerkleStoreEntry, error)
689}
690
691// UserChangedHandler is a generic interface for handling user changed events.
692// If the call returns an error, we'll remove this handler from the list, under the
693// supposition that it's now dead.
694type UserChangedHandler interface {
695	// HandlerUserChanged is called when the with User with the given UID has
696	// changed, either because of a sigchain change, or a profile change.
697	HandleUserChanged(uid keybase1.UID) error
698}
699
700type ConnectivityMonitorResult int
701
702const (
703	ConnectivityMonitorYes ConnectivityMonitorResult = iota
704	ConnectivityMonitorNo
705	ConnectivityMonitorUnknown
706)
707
708type ConnectivityMonitor interface {
709	IsConnected(ctx context.Context) ConnectivityMonitorResult
710	CheckReachability(ctx context.Context) error
711}
712
713type TeamLoader interface {
714	VerifyTeamName(ctx context.Context, id keybase1.TeamID, name keybase1.TeamName) error
715	ImplicitAdmins(ctx context.Context, teamID keybase1.TeamID) (impAdmins []keybase1.UserVersion, err error)
716	// MapTeamAncestors runs `f` for each of a team's ancestors, excluding the team itself.
717	// `f` is an arbitrary function. if it returns an error, the load halts.
718	// `teamID` is the team whose ancestors we are mapping over.
719	// `reason` is a context string used for logging.
720	// `forceFullReloadOnceToAssert` is a predicate that will cause a force full reload if it is
721	//		false. It can be used when a new field is added to keybase1.SigChainState that requires
722	//		a full reload to obtain.
723	MapTeamAncestors(ctx context.Context, f func(t keybase1.TeamSigChainState, n keybase1.TeamName) error, teamID keybase1.TeamID, reason string, forceFullReloadOnceToAssert func(t keybase1.TeamSigChainState) bool) error
724	NotifyTeamRename(ctx context.Context, id keybase1.TeamID, newName string) error
725	Load(context.Context, keybase1.LoadTeamArg) (*keybase1.TeamData, *keybase1.HiddenTeamChain, error)
726	// Freezing a team clears most data and forces a full reload when the team
727	// is loaded again. The team loader checks that the previous tail is
728	// contained within the new chain post-freeze. In particular, since we load
729	// a team before deleting it in response to the server-driven delete gregor
730	// notifications, the server can't roll-back to a state where the team is
731	// undeleted, so we don't have to special-case team deletion.
732	Freeze(ctx context.Context, teamID keybase1.TeamID) error
733	// Tombstoning a team prevents it from being loaded ever again, as long as
734	// that cache entry exists. Used to prevent server from "undeleting" a
735	// team. While a team is tombstoned, most data is cleared.
736	Tombstone(ctx context.Context, teamID keybase1.TeamID) error
737	// Untrusted hint of what a team's latest seqno is
738	HintLatestSeqno(ctx context.Context, id keybase1.TeamID, seqno keybase1.Seqno) error
739	ResolveNameToIDUntrusted(ctx context.Context, teamName keybase1.TeamName, public bool, allowCache bool) (id keybase1.TeamID, err error)
740	ForceRepollUntil(ctx context.Context, t gregor.TimeOrOffset) error
741	IsOpenCached(ctx context.Context, teamID keybase1.TeamID) (bool, error)
742	// Clear the in-memory cache. Does not affect the disk cache.
743	ClearMem()
744}
745
746type FastTeamLoader interface {
747	Load(MetaContext, keybase1.FastTeamLoadArg) (keybase1.FastTeamLoadRes, error)
748	// Untrusted hint of what a team's latest seqno is
749	HintLatestSeqno(m MetaContext, id keybase1.TeamID, seqno keybase1.Seqno) error
750	VerifyTeamName(m MetaContext, id keybase1.TeamID, name keybase1.TeamName, forceRefresh bool) error
751	ForceRepollUntil(m MetaContext, t gregor.TimeOrOffset) error
752	// See comment in TeamLoader#Freeze.
753	Freeze(MetaContext, keybase1.TeamID) error
754	// See comment in TeamLoader#Tombstone.
755	Tombstone(MetaContext, keybase1.TeamID) error
756}
757
758type HiddenTeamChainManager interface {
759	// We got gossip about what the latest chain-tail should be, so ratchet the
760	// chain forward; the next call to Advance() has to match.
761	Ratchet(MetaContext, keybase1.TeamID, keybase1.HiddenTeamChainRatchetSet) error
762	// We got a bunch of new links downloaded via slow or fast loader, so add them
763	// onto the HiddenTeamChain state. Ensure that the updated state is at least up to the
764	// given ratchet value.
765	Advance(mctx MetaContext, update keybase1.HiddenTeamChain, expectedPrev *keybase1.LinkTriple) error
766	// Access the tail of the HiddenTeamChain, for embedding into gossip vectors.
767	Tail(MetaContext, keybase1.TeamID) (*keybase1.LinkTriple, error)
768	// Load the latest data for the given team ID, and just return it wholesale.
769	Load(MetaContext, keybase1.TeamID) (dat *keybase1.HiddenTeamChain, err error)
770	// See comment in TeamLoader#Freeze.
771	Freeze(MetaContext, keybase1.TeamID) error
772	// See comment in TeamLoader#Tombstone.
773	Tombstone(MetaContext, keybase1.TeamID) error
774	// Untrusted hint of what a team's latest seqno is
775	HintLatestSeqno(m MetaContext, id keybase1.TeamID, seqno keybase1.Seqno) error
776	Shutdown(m MetaContext)
777	TeamSupportsHiddenChain(m MetaContext, id keybase1.TeamID) (state bool, err error)
778	ClearSupportFlagIfFalse(m MetaContext, id keybase1.TeamID)
779}
780
781type TeamRoleMapManager interface {
782	Get(m MetaContext, retryOnFail bool) (res keybase1.TeamRoleMapAndVersion, err error)
783	Update(m MetaContext, version keybase1.UserTeamVersion) (err error)
784	FlushCache()
785}
786
787type TeamAuditor interface {
788	AuditTeam(m MetaContext, id keybase1.TeamID, isPublic bool, headMerkleSeqno keybase1.Seqno,
789		chain map[keybase1.Seqno]keybase1.LinkID, hiddenChain map[keybase1.Seqno]keybase1.LinkID,
790		maxSeqno keybase1.Seqno, maxHiddenSeqno keybase1.Seqno, lastMerkleRoot *MerkleRoot, auditMode keybase1.AuditMode) (err error)
791}
792
793type TeamBoxAuditor interface {
794	AssertUnjailedOrReaudit(m MetaContext, id keybase1.TeamID) (didReaudit bool, err error)
795	IsInJail(m MetaContext, id keybase1.TeamID) (bool, error)
796	RetryNextBoxAudit(m MetaContext) (attempt *keybase1.BoxAuditAttempt, err error)
797	BoxAuditRandomTeam(m MetaContext) (attempt *keybase1.BoxAuditAttempt, err error)
798	BoxAuditTeam(m MetaContext, id keybase1.TeamID) (attempt *keybase1.BoxAuditAttempt, err error)
799	MaybeScheduleDelayedBoxAuditTeam(m MetaContext, id keybase1.TeamID)
800	Attempt(m MetaContext, id keybase1.TeamID, rotateBeforeAudit bool) keybase1.BoxAuditAttempt
801}
802
803// MiniChatPayment is the argument for sending an in-chat payment.
804type MiniChatPayment struct {
805	Username NormalizedUsername
806	Amount   string
807	Currency string
808}
809
810// MiniChatPaymentResult is the result of sending an in-chat payment to
811// one username.
812type MiniChatPaymentResult struct {
813	Username  NormalizedUsername
814	PaymentID stellar1.PaymentID
815	Error     error
816}
817
818// MiniChatPaymentSpec describes the amounts involved in a MiniChatPayment.
819type MiniChatPaymentSpec struct {
820	Username      NormalizedUsername
821	Error         error
822	XLMAmount     string
823	DisplayAmount string // optional
824}
825
826// MiniChatPaymentSummary contains all the recipients and the amounts they
827// will receive plus a total in XLM and in the sender's preferred currency.
828type MiniChatPaymentSummary struct {
829	Specs        []MiniChatPaymentSpec
830	XLMTotal     string
831	DisplayTotal string
832}
833
834type Stellar interface {
835	CreateWalletSoft(context.Context)
836	Upkeep(context.Context) error
837	GetServerDefinitions(context.Context) (stellar1.StellarServerDefinitions, error)
838	KickAutoClaimRunner(MetaContext, gregor.MsgID)
839	UpdateUnreadCount(ctx context.Context, accountID stellar1.AccountID, unread int) error
840	SpecMiniChatPayments(mctx MetaContext, payments []MiniChatPayment) (*MiniChatPaymentSummary, error)
841	SendMiniChatPayments(mctx MetaContext, convID chat1.ConversationID, payments []MiniChatPayment) ([]MiniChatPaymentResult, error)
842	HandleOobm(context.Context, gregor.OutOfBandMessage) (bool, error)
843	RemovePendingTx(mctx MetaContext, accountID stellar1.AccountID, txID stellar1.TransactionID) error
844	KnownCurrencyCodeInstant(ctx context.Context, code string) (known, ok bool)
845	InformBundle(MetaContext, stellar1.BundleRevision, []stellar1.BundleEntry)
846	InformDefaultCurrencyChange(MetaContext)
847	Refresh(mctx MetaContext, reason string)
848}
849
850type DeviceEKStorage interface {
851	Put(mctx MetaContext, generation keybase1.EkGeneration, deviceEK keybase1.DeviceEk) error
852	Get(mctx MetaContext, generation keybase1.EkGeneration) (keybase1.DeviceEk, error)
853	GetAllActive(mctx MetaContext, merkleRoot MerkleRoot) ([]keybase1.DeviceEkMetadata, error)
854	MaxGeneration(mctx MetaContext, includeErrs bool) (keybase1.EkGeneration, error)
855	DeleteExpired(mctx MetaContext, merkleRoot MerkleRoot) ([]keybase1.EkGeneration, error)
856	ClearCache()
857	// Dangerous! Only for deprovisioning or shutdown/logout when in oneshot mode.
858	ForceDeleteAll(mctx MetaContext, username NormalizedUsername) error
859	// For keybase log send
860	ListAllForUser(mctx MetaContext) ([]string, error)
861	// Called on login/logout hooks to set the logged in username in the EK log
862	SetLogPrefix(mctx MetaContext)
863}
864
865type UserEKBoxStorage interface {
866	Put(mctx MetaContext, generation keybase1.EkGeneration, userEKBoxed keybase1.UserEkBoxed) error
867	Get(mctx MetaContext, generation keybase1.EkGeneration, contentCtime *gregor1.Time) (keybase1.UserEk, error)
868	MaxGeneration(mctx MetaContext, includeErrs bool) (keybase1.EkGeneration, error)
869	DeleteExpired(mctx MetaContext, merkleRoot MerkleRoot) ([]keybase1.EkGeneration, error)
870	ClearCache()
871}
872
873type TeamEKBoxStorage interface {
874	Put(mctx MetaContext, teamID keybase1.TeamID, generation keybase1.EkGeneration, teamEKBoxed keybase1.TeamEphemeralKeyBoxed) error
875	Get(mctx MetaContext, teamID keybase1.TeamID, generation keybase1.EkGeneration, contentCtime *gregor1.Time) (keybase1.TeamEphemeralKey, error)
876	MaxGeneration(mctx MetaContext, teamID keybase1.TeamID, includeErrs bool) (keybase1.EkGeneration, error)
877	DeleteExpired(mctx MetaContext, teamID keybase1.TeamID, merkleRoot MerkleRoot) ([]keybase1.EkGeneration, error)
878	PurgeCacheForTeamID(mctx MetaContext, teamID keybase1.TeamID) error
879	Delete(mctx MetaContext, teamID keybase1.TeamID, generation keybase1.EkGeneration) error
880	ClearCache()
881}
882
883type EKLib interface {
884	KeygenIfNeeded(mctx MetaContext) error
885	// Team ephemeral keys
886	GetOrCreateLatestTeamEK(mctx MetaContext, teamID keybase1.TeamID) (keybase1.TeamEphemeralKey, bool, error)
887	GetTeamEK(mctx MetaContext, teamID keybase1.TeamID, generation keybase1.EkGeneration, contentCtime *gregor1.Time) (keybase1.TeamEphemeralKey, error)
888	PurgeTeamEKCachesForTeamIDAndGeneration(mctx MetaContext, teamID keybase1.TeamID, generation keybase1.EkGeneration)
889	PurgeTeamEKCachesForTeamID(mctx MetaContext, teamID keybase1.TeamID)
890
891	// Teambot ephemeral keys
892	GetOrCreateLatestTeambotEK(mctx MetaContext, teamID keybase1.TeamID, botUID gregor1.UID) (keybase1.TeamEphemeralKey, bool, error)
893	GetTeambotEK(mctx MetaContext, teamID keybase1.TeamID, botUID gregor1.UID, generation keybase1.EkGeneration,
894		contentCtime *gregor1.Time) (keybase1.TeamEphemeralKey, error)
895	ForceCreateTeambotEK(mctx MetaContext, teamID keybase1.TeamID, botUID gregor1.UID,
896		generation keybase1.EkGeneration) (keybase1.TeamEphemeralKey, bool, error)
897	PurgeTeambotEKCachesForTeamIDAndGeneration(mctx MetaContext, teamID keybase1.TeamID, generation keybase1.EkGeneration)
898	PurgeTeambotEKCachesForTeamID(mctx MetaContext, teamID keybase1.TeamID)
899	PurgeAllTeambotMetadataCaches(mctx MetaContext)
900	PurgeTeambotMetadataCache(mctx MetaContext, teamID keybase1.TeamID, botUID keybase1.UID, generation keybase1.EkGeneration)
901
902	NewEphemeralSeed() (keybase1.Bytes32, error)
903	DeriveDeviceDHKey(seed keybase1.Bytes32) *NaclDHKeyPair
904	SignedDeviceEKStatementFromSeed(mctx MetaContext, generation keybase1.EkGeneration, seed keybase1.Bytes32, signingKey GenericKey) (keybase1.DeviceEkStatement, string, error)
905	BoxLatestUserEK(mctx MetaContext, receiverKey NaclDHKeyPair, deviceEKGeneration keybase1.EkGeneration) (*keybase1.UserEkBoxed, error)
906	PrepareNewUserEK(mctx MetaContext, merkleRoot MerkleRoot, pukSeed PerUserKeySeed) (string, []keybase1.UserEkBoxMetadata, keybase1.UserEkMetadata, *keybase1.UserEkBoxed, error)
907	BoxLatestTeamEK(mctx MetaContext, teamID keybase1.TeamID, uids []keybase1.UID) (*[]keybase1.TeamEkBoxMetadata, error)
908	PrepareNewTeamEK(mctx MetaContext, teamID keybase1.TeamID, signingKey NaclSigningKeyPair, uids []keybase1.UID) (string, *[]keybase1.TeamEkBoxMetadata, keybase1.TeamEkMetadata, *keybase1.TeamEkBoxed, error)
909	ClearCaches(mctx MetaContext)
910	// For testing
911	NewTeamEKNeeded(mctx MetaContext, teamID keybase1.TeamID) (bool, error)
912}
913
914type TeambotBotKeyer interface {
915	GetLatestTeambotKey(mctx MetaContext, teamID keybase1.TeamID, app keybase1.TeamApplication) (keybase1.TeambotKey, error)
916	GetTeambotKeyAtGeneration(mctx MetaContext, teamID keybase1.TeamID, app keybase1.TeamApplication,
917		generation keybase1.TeambotKeyGeneration) (keybase1.TeambotKey, error)
918
919	DeleteTeambotKeyForTest(mctx MetaContext, teamID keybase1.TeamID, app keybase1.TeamApplication,
920		generation keybase1.TeambotKeyGeneration) error
921}
922
923type TeambotMemberKeyer interface {
924	GetOrCreateTeambotKey(mctx MetaContext, teamID keybase1.TeamID, botUID gregor1.UID,
925		appKey keybase1.TeamApplicationKey) (keybase1.TeambotKey, bool, error)
926	PurgeCache(mctx MetaContext)
927	PurgeCacheAtGeneration(mctx MetaContext, teamID keybase1.TeamID, botUID keybase1.UID,
928		app keybase1.TeamApplication, generation keybase1.TeambotKeyGeneration)
929}
930
931type ImplicitTeamConflictInfoCacher interface {
932	Get(context.Context, bool, keybase1.TeamID) *keybase1.ImplicitTeamConflictInfo
933	Put(context.Context, bool, keybase1.TeamID, keybase1.ImplicitTeamConflictInfo) error
934}
935
936type KVStoreContext interface {
937	GetKVStore() KVStorer
938}
939
940type LRUContext interface {
941	VLogContext
942	KVStoreContext
943	ClockContext
944}
945
946type LRUKeyer interface {
947	MemKey() string
948	DbKey() DbKey
949}
950
951type LRUer interface {
952	Get(context.Context, LRUContext, LRUKeyer) (interface{}, error)
953	Put(context.Context, LRUContext, LRUKeyer, interface{}) error
954	OnLogout(mctx MetaContext) error
955	OnDbNuke(mctx MetaContext) error
956}
957
958type MemLRUer interface {
959	Get(key interface{}) (interface{}, bool)
960	Put(key, value interface{}) bool
961	OnLogout(mctx MetaContext) error
962	OnDbNuke(mctx MetaContext) error
963}
964
965type ClockContext interface {
966	GetClock() clockwork.Clock
967}
968
969type UIDMapperContext interface {
970	VLogContext
971	APIContext
972	KVStoreContext
973	ClockContext
974}
975
976type UsernamePackage struct {
977	NormalizedUsername NormalizedUsername
978	FullName           *keybase1.FullNamePackage
979}
980
981type SkinnyLogger interface {
982	// Error logs a message at error level, with formatting args
983	Errorf(format string, args ...interface{})
984	// Debug logs a message at debug level, with formatting args.
985	Debug(format string, args ...interface{})
986}
987
988type UIDMapper interface {
989	// CheckUIDAginstUsername makes sure that the UID actually does map to the given username.
990	// For new UIDs, it's a question of just SHA2'ing. For legacy usernames, we check the
991	// hardcoded map.
992	CheckUIDAgainstUsername(uid keybase1.UID, un NormalizedUsername) bool
993
994	// MapHardcodedUsernameToUID will map the given legacy username to a UID if it exists
995	// in the hardcoded map. If not, it will return the nil UID.
996	MapHardcodedUsernameToUID(un NormalizedUsername) keybase1.UID
997
998	// MapUIDToUsernamePackages maps the given set of UIDs to the username
999	// packages, which include a username and a fullname, and when the mapping
1000	// was loaded from the server. It blocks on the network until all usernames
1001	// are known. If the `forceNetworkForFullNames` flag is specified, it will
1002	// block on the network too. If the flag is not specified, then stale
1003	// values (or unknown values) are OK, we won't go to network if we lack
1004	// them. All network calls are limited by the given timeBudget, or if 0 is
1005	// specified, there is indefinite budget. In the response, a nil
1006	// FullNamePackage means that the lookup failed. A non-nil FullNamePackage
1007	// means that some previous lookup worked, but might be arbitrarily out of
1008	// date (depending on the cachedAt time). A non-nil FullNamePackage with an
1009	// empty fullName field means that the user just hasn't supplied a
1010	// fullName.
1011	//
1012	// *NOTE* that this function can return useful data and an error. In this
1013	// regard, the error is more like a warning. But if, for instance, the
1014	// mapper runs out of time budget, it will return the data
1015	MapUIDsToUsernamePackages(ctx context.Context, g UIDMapperContext, uids []keybase1.UID, fullNameFreshness time.Duration,
1016		networktimeBudget time.Duration, forceNetworkForFullNames bool) ([]UsernamePackage, error)
1017
1018	// SetTestingNoCachingMode puts the UID mapper into a mode where it never serves cached results, *strictly
1019	// for use in tests*
1020	SetTestingNoCachingMode(enabled bool)
1021
1022	ClearUIDFullName(context.Context, UIDMapperContext, keybase1.UID) error
1023
1024	// ClearUID is called to clear the given UID out of the cache, if the given eldest
1025	// seqno doesn't match what's currently cached.
1026	ClearUIDAtEldestSeqno(context.Context, UIDMapperContext, keybase1.UID, keybase1.Seqno) error
1027
1028	// InformOfEldestSeqno informs the mapper of an up-to-date (uid,eldestSeqno) pair.
1029	// If the cache has a different value, it will clear the cache and then plumb
1030	// the pair all the way through to the server, whose cache may also be in need
1031	// of busting. Will return true if the cached value was up-to-date, and false
1032	// otherwise.
1033	InformOfEldestSeqno(context.Context, UIDMapperContext, keybase1.UserVersion) (bool, error)
1034
1035	// MapUIDsToUsernamePackagesOffline maps given set of UIDs to username packages
1036	// from the cache only. No network calls will be made. Results might contains
1037	// unresolved usernames (caller should check with `IsNil()`).
1038	MapUIDsToUsernamePackagesOffline(ctx context.Context, g UIDMapperContext,
1039		uids []keybase1.UID, fullNameFreshness time.Duration) ([]UsernamePackage, error)
1040}
1041
1042type UserServiceSummary map[string]string // service -> username
1043type UserServiceSummaryPackage struct {
1044	CachedAt   keybase1.Time
1045	ServiceMap UserServiceSummary
1046}
1047
1048type ServiceSummaryMapper interface {
1049	MapUIDsToServiceSummaries(ctx context.Context, g UIDMapperContext, uids []keybase1.UID, freshness time.Duration,
1050		networkTimeBudget time.Duration) map[keybase1.UID]UserServiceSummaryPackage
1051	InformOfServiceSummary(ctx context.Context, g UIDMapperContext, uid keybase1.UID, summary UserServiceSummary) error
1052}
1053
1054type ChatHelper interface {
1055	NewConversation(ctx context.Context, uid gregor1.UID, tlfName string,
1056		topicName *string, topicType chat1.TopicType, membersType chat1.ConversationMembersType,
1057		vis keybase1.TLFVisibility) (chat1.ConversationLocal, bool, error)
1058	NewConversationSkipFindExisting(ctx context.Context, uid gregor1.UID, tlfName string,
1059		topicName *string, topicType chat1.TopicType, membersType chat1.ConversationMembersType,
1060		vis keybase1.TLFVisibility) (chat1.ConversationLocal, bool, error)
1061	NewConversationWithMemberSourceConv(ctx context.Context, uid gregor1.UID, tlfName string,
1062		topicName *string, topicType chat1.TopicType, membersType chat1.ConversationMembersType,
1063		vis keybase1.TLFVisibility, retentionPolicy *chat1.RetentionPolicy,
1064		memberSourceConv *chat1.ConversationID) (chat1.ConversationLocal, bool, error)
1065	SendTextByID(ctx context.Context, convID chat1.ConversationID,
1066		tlfName string, text string, vis keybase1.TLFVisibility) error
1067	SendMsgByID(ctx context.Context, convID chat1.ConversationID,
1068		tlfName string, body chat1.MessageBody, msgType chat1.MessageType, vis keybase1.TLFVisibility) error
1069	SendTextByIDNonblock(ctx context.Context, convID chat1.ConversationID,
1070		tlfName string, text string, outboxID *chat1.OutboxID, replyTo *chat1.MessageID) (chat1.OutboxID, error)
1071	SendMsgByIDNonblock(ctx context.Context, convID chat1.ConversationID,
1072		tlfName string, body chat1.MessageBody, msgType chat1.MessageType, outboxID *chat1.OutboxID,
1073		replyTo *chat1.MessageID) (chat1.OutboxID, error)
1074	SendTextByName(ctx context.Context, name string, topicName *string,
1075		membersType chat1.ConversationMembersType, ident keybase1.TLFIdentifyBehavior, text string) error
1076	SendMsgByName(ctx context.Context, name string, topicName *string,
1077		membersType chat1.ConversationMembersType, ident keybase1.TLFIdentifyBehavior, body chat1.MessageBody,
1078		msgType chat1.MessageType) error
1079	SendTextByNameNonblock(ctx context.Context, name string, topicName *string,
1080		membersType chat1.ConversationMembersType, ident keybase1.TLFIdentifyBehavior, text string,
1081		outboxID *chat1.OutboxID) (chat1.OutboxID, error)
1082	SendMsgByNameNonblock(ctx context.Context, name string, topicName *string,
1083		membersType chat1.ConversationMembersType, ident keybase1.TLFIdentifyBehavior, body chat1.MessageBody,
1084		msgType chat1.MessageType, outboxID *chat1.OutboxID) (chat1.OutboxID, error)
1085	DeleteMsg(ctx context.Context, convID chat1.ConversationID, tlfName string,
1086		msgID chat1.MessageID) error
1087	DeleteMsgNonblock(ctx context.Context, convID chat1.ConversationID, tlfName string,
1088		msgID chat1.MessageID) error
1089	FindConversations(ctx context.Context, name string,
1090		topicName *string, topicType chat1.TopicType, membersType chat1.ConversationMembersType,
1091		vis keybase1.TLFVisibility) ([]chat1.ConversationLocal, error)
1092	FindConversationsByID(ctx context.Context, convIDs []chat1.ConversationID) ([]chat1.ConversationLocal, error)
1093	JoinConversationByID(ctx context.Context, uid gregor1.UID, convID chat1.ConversationID) error
1094	JoinConversationByName(ctx context.Context, uid gregor1.UID, tlfName, topicName string,
1095		topicType chat1.TopicType, vid keybase1.TLFVisibility) error
1096	LeaveConversation(ctx context.Context, uid gregor1.UID, convID chat1.ConversationID) error
1097	GetChannelTopicName(context.Context, keybase1.TeamID, chat1.TopicType, chat1.ConversationID) (string, error)
1098	GetMessages(ctx context.Context, uid gregor1.UID, convID chat1.ConversationID,
1099		msgIDs []chat1.MessageID, resolveSupersedes bool, reason *chat1.GetThreadReason) ([]chat1.MessageUnboxed, error)
1100	GetMessage(ctx context.Context, uid gregor1.UID, convID chat1.ConversationID,
1101		msgID chat1.MessageID, resolveSupersedes bool, reason *chat1.GetThreadReason) (chat1.MessageUnboxed, error)
1102	UpgradeKBFSToImpteam(ctx context.Context, tlfName string, tlfID chat1.TLFID, public bool) error
1103	UserReacjis(ctx context.Context, uid gregor1.UID) keybase1.UserReacjis
1104	JourneycardTimeTravel(context.Context, gregor1.UID, time.Duration) (int, int, error)
1105	JourneycardResetAllConvs(context.Context, gregor1.UID) error
1106	JourneycardDebugState(context.Context, gregor1.UID, keybase1.TeamID) (string, error)
1107	// InTeam gives a best effort to answer team membership based on the current state of the inbox cache
1108	InTeam(context.Context, gregor1.UID, keybase1.TeamID) (bool, error)
1109	BulkAddToConv(context.Context, gregor1.UID, chat1.ConversationID, []string) error
1110}
1111
1112// Resolver resolves human-readable usernames (joe) and user asssertions (joe+joe@github)
1113// into UIDs. It is based on sever-trust. All results are unverified. So you should check
1114// its answer if used in a security-sensitive setting. (See engine.ResolveAndCheck)
1115type Resolver interface {
1116	EnableCaching(m MetaContext)
1117	Shutdown(m MetaContext)
1118	ResolveFullExpression(m MetaContext, input string) (res ResolveResult)
1119	ResolveFullExpressionNeedUsername(m MetaContext, input string) (res ResolveResult)
1120	ResolveFullExpressionWithBody(m MetaContext, input string) (res ResolveResult)
1121	ResolveUser(m MetaContext, assertion string) (u keybase1.User, res ResolveResult, err error)
1122	ResolveWithBody(m MetaContext, input string) ResolveResult
1123	Resolve(m MetaContext, input string) ResolveResult
1124	PurgeResolveCache(m MetaContext, input string) error
1125	CacheTeamResolution(m MetaContext, id keybase1.TeamID, name keybase1.TeamName)
1126}
1127
1128type EnginePrereqs struct {
1129	TemporarySession bool
1130	Device           bool
1131}
1132
1133type Engine2 interface {
1134	Run(MetaContext) error
1135	Prereqs() EnginePrereqs
1136	UIConsumer
1137}
1138
1139type SaltpackRecipientKeyfinderEngineInterface interface {
1140	Engine2
1141	GetPublicKIDs() []keybase1.KID
1142	GetSymmetricKeys() []SaltpackReceiverSymmetricKey
1143	UsedUnresolvedSBSAssertion() (bool, string)
1144}
1145
1146type SaltpackRecipientKeyfinderArg struct {
1147	Recipients        []string // usernames or user assertions
1148	TeamRecipients    []string // team names
1149	NoSelfEncrypt     bool
1150	UseEntityKeys     bool // Both per user and per team keys (and implicit teams for non existing users)
1151	UsePaperKeys      bool
1152	UseDeviceKeys     bool // Does not include Paper Keys
1153	UseRepudiableAuth bool // This is needed as team keys (implicit or not) are not compatible with repudiable authentication, so we can error out.
1154	NoForcePoll       bool // if we want to stop forcepolling, which is on by default, but should be off for GUI
1155}
1156
1157type SaltpackReceiverSymmetricKey struct {
1158	Key        [32]byte
1159	Identifier []byte
1160}
1161
1162type StandaloneChatConnector interface {
1163	StartStandaloneChat(g *GlobalContext) error
1164}
1165
1166type SyncedContactListProvider interface {
1167	SaveProcessedContacts(MetaContext, []keybase1.ProcessedContact) error
1168	RetrieveContacts(MetaContext) ([]keybase1.ProcessedContact, error)
1169	RetrieveAssertionToName(MetaContext) (map[string]string, error)
1170	UnresolveContactsWithComponent(MetaContext, *keybase1.PhoneNumber, *keybase1.EmailAddress)
1171}
1172
1173type KVRevisionCacher interface {
1174	Check(mctx MetaContext, entryID keybase1.KVEntryID, ciphertext *string, teamKeyGen keybase1.PerTeamKeyGeneration, revision int) (err error)
1175	Put(mctx MetaContext, entryID keybase1.KVEntryID, ciphertext *string, teamKeyGen keybase1.PerTeamKeyGeneration, revision int) (err error)
1176	CheckForUpdate(mctx MetaContext, entryID keybase1.KVEntryID, revision int) (err error)
1177	MarkDeleted(mctx MetaContext, entryID keybase1.KVEntryID, revision int) (err error)
1178}
1179
1180type AvatarLoaderSource interface {
1181	LoadUsers(MetaContext, []string, []keybase1.AvatarFormat) (keybase1.LoadAvatarsRes, error)
1182	LoadTeams(MetaContext, []string, []keybase1.AvatarFormat) (keybase1.LoadAvatarsRes, error)
1183
1184	ClearCacheForName(MetaContext, string, []keybase1.AvatarFormat) error
1185	OnDbNuke(MetaContext) error // Called after leveldb data goes away after db nuke
1186
1187	StartBackgroundTasks(MetaContext)
1188	StopBackgroundTasks(MetaContext)
1189}
1190
1191type RuntimeStats interface {
1192	Start(context.Context)
1193	Stop(context.Context) chan struct{}
1194	PushPerfEvent(keybase1.PerfEvent)
1195}
1196