1// Copyright 2015 Keybase, Inc. All rights reserved. Use of
2// this source code is governed by the included BSD license.
3
4package engine
5
6import (
7	"sort"
8
9	"github.com/keybase/client/go/libkb"
10	keybase1 "github.com/keybase/client/go/protocol/keybase1"
11)
12
13// DevList is an engine that gets a list of all the user's
14// devices.
15type DevList struct {
16	devices []keybase1.Device
17	libkb.Contextified
18}
19
20// NewDevList creates a DevList engine.
21func NewDevList(g *libkb.GlobalContext) *DevList {
22	return &DevList{
23		Contextified: libkb.NewContextified(g),
24	}
25}
26
27func (d *DevList) Name() string {
28	return "DevList"
29}
30
31func (d *DevList) Prereqs() Prereqs {
32	return Prereqs{Device: true}
33}
34
35func (d *DevList) RequiredUIs() []libkb.UIKind {
36	return []libkb.UIKind{libkb.LogUIKind}
37}
38
39func (d *DevList) SubConsumers() []libkb.UIConsumer {
40	return nil
41}
42
43// Run starts the engine.
44func (d *DevList) Run(m libkb.MetaContext) (err error) {
45	defer m.Trace("DevList#Run", &err)()
46
47	var devs libkb.DeviceKeyMap
48	var ss *libkb.SecretSyncer
49
50	ss, err = m.ActiveDevice().SyncSecretsForce(m)
51	if err != nil {
52		return err
53	}
54	devs, err = ss.ActiveDevices(libkb.AllDeviceTypes)
55	if err != nil {
56		return err
57	}
58
59	var pdevs []keybase1.Device
60	for k, v := range devs {
61		pdevs = append(pdevs, keybase1.Device{
62			Type:         v.Type,
63			Name:         v.Display(),
64			DeviceID:     k,
65			CTime:        keybase1.TimeFromSeconds(v.CTime),
66			MTime:        keybase1.TimeFromSeconds(v.MTime),
67			LastUsedTime: keybase1.TimeFromSeconds(v.LastUsedTime),
68		})
69	}
70	sort.Sort(dname(pdevs))
71	d.devices = pdevs
72
73	return nil
74}
75
76// List returns the devices for a user.
77func (d *DevList) List() []keybase1.Device {
78	return d.devices
79}
80
81type dname []keybase1.Device
82
83func (d dname) Len() int           { return len(d) }
84func (d dname) Swap(i, j int)      { d[i], d[j] = d[j], d[i] }
85func (d dname) Less(i, j int) bool { return d[i].Name < d[j].Name }
86