Alexey Edelev 2 anni fa
parent
commit
8d1bc92b61
4 ha cambiato i file con 646 aggiunte e 360 eliminazioni
  1. 2 0
      build.sh
  2. 613 355
      common/gostfix.pb.go
  3. 6 3
      go.mod
  4. 25 2
      go.sum

+ 2 - 0
build.sh

@@ -1,6 +1,8 @@
 export GOBIN=$(go env GOPATH)/bin
 export PATH=$PATH:$GOBIN
 export RPC_PATH=common
+
+go env
 go install google.golang.org/protobuf/compiler/protogen
 go install github.com/amsokol/protoc-gen-gotag
 

+ 613 - 355
common/gostfix.pb.go

@@ -1,546 +1,804 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.25.0
+// 	protoc        v3.6.1
 // source: gostfix.proto
 
 package common
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type MailBody struct {
-	PlainText            string              `protobuf:"bytes,1,opt,name=plainText,proto3" json:"plainText,omitempty"`
-	RichText             string              `protobuf:"bytes,2,opt,name=richText,proto3" json:"richText,omitempty"`
-	Attachments          []*AttachmentHeader `protobuf:"bytes,3,rep,name=attachments,proto3" json:"attachments,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}            `json:"-" bson:"-"`
-	XXX_unrecognized     []byte              `json:"-" bson:"-"`
-	XXX_sizecache        int32               `json:"-" bson:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *MailBody) Reset()         { *m = MailBody{} }
-func (m *MailBody) String() string { return proto.CompactTextString(m) }
-func (*MailBody) ProtoMessage()    {}
-func (*MailBody) Descriptor() ([]byte, []int) {
-	return fileDescriptor_0ab36b6dc6e1dcaa, []int{0}
+	PlainText   string              `protobuf:"bytes,1,opt,name=plainText,proto3" json:"plainText,omitempty"`
+	RichText    string              `protobuf:"bytes,2,opt,name=richText,proto3" json:"richText,omitempty"`
+	Attachments []*AttachmentHeader `protobuf:"bytes,3,rep,name=attachments,proto3" json:"attachments,omitempty"`
 }
 
-func (m *MailBody) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_MailBody.Unmarshal(m, b)
-}
-func (m *MailBody) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_MailBody.Marshal(b, m, deterministic)
-}
-func (m *MailBody) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_MailBody.Merge(m, src)
+func (x *MailBody) Reset() {
+	*x = MailBody{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gostfix_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *MailBody) XXX_Size() int {
-	return xxx_messageInfo_MailBody.Size(m)
+
+func (x *MailBody) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *MailBody) XXX_DiscardUnknown() {
-	xxx_messageInfo_MailBody.DiscardUnknown(m)
+
+func (*MailBody) ProtoMessage() {}
+
+func (x *MailBody) ProtoReflect() protoreflect.Message {
+	mi := &file_gostfix_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_MailBody proto.InternalMessageInfo
+// Deprecated: Use MailBody.ProtoReflect.Descriptor instead.
+func (*MailBody) Descriptor() ([]byte, []int) {
+	return file_gostfix_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *MailBody) GetPlainText() string {
-	if m != nil {
-		return m.PlainText
+func (x *MailBody) GetPlainText() string {
+	if x != nil {
+		return x.PlainText
 	}
 	return ""
 }
 
-func (m *MailBody) GetRichText() string {
-	if m != nil {
-		return m.RichText
+func (x *MailBody) GetRichText() string {
+	if x != nil {
+		return x.RichText
 	}
 	return ""
 }
 
-func (m *MailBody) GetAttachments() []*AttachmentHeader {
-	if m != nil {
-		return m.Attachments
+func (x *MailBody) GetAttachments() []*AttachmentHeader {
+	if x != nil {
+		return x.Attachments
 	}
 	return nil
 }
 
 type MailHeader struct {
-	From                 string   `protobuf:"bytes,1,opt,name=from,proto3" json:"from,omitempty"`
-	To                   string   `protobuf:"bytes,2,opt,name=to,proto3" json:"to,omitempty"`
-	Cc                   string   `protobuf:"bytes,3,opt,name=cc,proto3" json:"cc,omitempty"`
-	Bcc                  string   `protobuf:"bytes,4,opt,name=bcc,proto3" json:"bcc,omitempty"`
-	Date                 int64    `protobuf:"zigzag64,5,opt,name=date,proto3" json:"date,omitempty"`
-	Subject              string   `protobuf:"bytes,6,opt,name=subject,proto3" json:"subject,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-" bson:"-"`
-	XXX_unrecognized     []byte   `json:"-" bson:"-"`
-	XXX_sizecache        int32    `json:"-" bson:"-"`
-}
-
-func (m *MailHeader) Reset()         { *m = MailHeader{} }
-func (m *MailHeader) String() string { return proto.CompactTextString(m) }
-func (*MailHeader) ProtoMessage()    {}
-func (*MailHeader) Descriptor() ([]byte, []int) {
-	return fileDescriptor_0ab36b6dc6e1dcaa, []int{1}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	From    string `protobuf:"bytes,1,opt,name=from,proto3" json:"from,omitempty"`
+	To      string `protobuf:"bytes,2,opt,name=to,proto3" json:"to,omitempty"`
+	Cc      string `protobuf:"bytes,3,opt,name=cc,proto3" json:"cc,omitempty"`
+	Bcc     string `protobuf:"bytes,4,opt,name=bcc,proto3" json:"bcc,omitempty"`
+	Date    int64  `protobuf:"zigzag64,5,opt,name=date,proto3" json:"date,omitempty"`
+	Subject string `protobuf:"bytes,6,opt,name=subject,proto3" json:"subject,omitempty"`
+}
+
+func (x *MailHeader) Reset() {
+	*x = MailHeader{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gostfix_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *MailHeader) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_MailHeader.Unmarshal(m, b)
-}
-func (m *MailHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_MailHeader.Marshal(b, m, deterministic)
-}
-func (m *MailHeader) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_MailHeader.Merge(m, src)
-}
-func (m *MailHeader) XXX_Size() int {
-	return xxx_messageInfo_MailHeader.Size(m)
+func (x *MailHeader) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *MailHeader) XXX_DiscardUnknown() {
-	xxx_messageInfo_MailHeader.DiscardUnknown(m)
+
+func (*MailHeader) ProtoMessage() {}
+
+func (x *MailHeader) ProtoReflect() protoreflect.Message {
+	mi := &file_gostfix_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_MailHeader proto.InternalMessageInfo
+// Deprecated: Use MailHeader.ProtoReflect.Descriptor instead.
+func (*MailHeader) Descriptor() ([]byte, []int) {
+	return file_gostfix_proto_rawDescGZIP(), []int{1}
+}
 
-func (m *MailHeader) GetFrom() string {
-	if m != nil {
-		return m.From
+func (x *MailHeader) GetFrom() string {
+	if x != nil {
+		return x.From
 	}
 	return ""
 }
 
-func (m *MailHeader) GetTo() string {
-	if m != nil {
-		return m.To
+func (x *MailHeader) GetTo() string {
+	if x != nil {
+		return x.To
 	}
 	return ""
 }
 
-func (m *MailHeader) GetCc() string {
-	if m != nil {
-		return m.Cc
+func (x *MailHeader) GetCc() string {
+	if x != nil {
+		return x.Cc
 	}
 	return ""
 }
 
-func (m *MailHeader) GetBcc() string {
-	if m != nil {
-		return m.Bcc
+func (x *MailHeader) GetBcc() string {
+	if x != nil {
+		return x.Bcc
 	}
 	return ""
 }
 
-func (m *MailHeader) GetDate() int64 {
-	if m != nil {
-		return m.Date
+func (x *MailHeader) GetDate() int64 {
+	if x != nil {
+		return x.Date
 	}
 	return 0
 }
 
-func (m *MailHeader) GetSubject() string {
-	if m != nil {
-		return m.Subject
+func (x *MailHeader) GetSubject() string {
+	if x != nil {
+		return x.Subject
 	}
 	return ""
 }
 
 type Mail struct {
-	Header               *MailHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"`
-	Body                 *MailBody   `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}    `json:"-" bson:"-"`
-	XXX_unrecognized     []byte      `json:"-" bson:"-"`
-	XXX_sizecache        int32       `json:"-" bson:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Mail) Reset()         { *m = Mail{} }
-func (m *Mail) String() string { return proto.CompactTextString(m) }
-func (*Mail) ProtoMessage()    {}
-func (*Mail) Descriptor() ([]byte, []int) {
-	return fileDescriptor_0ab36b6dc6e1dcaa, []int{2}
+	Header *MailHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"`
+	Body   *MailBody   `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"`
 }
 
-func (m *Mail) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Mail.Unmarshal(m, b)
-}
-func (m *Mail) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Mail.Marshal(b, m, deterministic)
-}
-func (m *Mail) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Mail.Merge(m, src)
+func (x *Mail) Reset() {
+	*x = Mail{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gostfix_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Mail) XXX_Size() int {
-	return xxx_messageInfo_Mail.Size(m)
+
+func (x *Mail) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Mail) XXX_DiscardUnknown() {
-	xxx_messageInfo_Mail.DiscardUnknown(m)
+
+func (*Mail) ProtoMessage() {}
+
+func (x *Mail) ProtoReflect() protoreflect.Message {
+	mi := &file_gostfix_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Mail proto.InternalMessageInfo
+// Deprecated: Use Mail.ProtoReflect.Descriptor instead.
+func (*Mail) Descriptor() ([]byte, []int) {
+	return file_gostfix_proto_rawDescGZIP(), []int{2}
+}
 
-func (m *Mail) GetHeader() *MailHeader {
-	if m != nil {
-		return m.Header
+func (x *Mail) GetHeader() *MailHeader {
+	if x != nil {
+		return x.Header
 	}
 	return nil
 }
 
-func (m *Mail) GetBody() *MailBody {
-	if m != nil {
-		return m.Body
+func (x *Mail) GetBody() *MailBody {
+	if x != nil {
+		return x.Body
 	}
 	return nil
 }
 
 type Attachment struct {
-	Header               *AttachmentHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"`
-	Data                 []byte            `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}          `json:"-" bson:"-"`
-	XXX_unrecognized     []byte            `json:"-" bson:"-"`
-	XXX_sizecache        int32             `json:"-" bson:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Attachment) Reset()         { *m = Attachment{} }
-func (m *Attachment) String() string { return proto.CompactTextString(m) }
-func (*Attachment) ProtoMessage()    {}
-func (*Attachment) Descriptor() ([]byte, []int) {
-	return fileDescriptor_0ab36b6dc6e1dcaa, []int{3}
+	Header *AttachmentHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"`
+	Data   []byte            `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
 }
 
-func (m *Attachment) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Attachment.Unmarshal(m, b)
-}
-func (m *Attachment) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Attachment.Marshal(b, m, deterministic)
-}
-func (m *Attachment) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Attachment.Merge(m, src)
+func (x *Attachment) Reset() {
+	*x = Attachment{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gostfix_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Attachment) XXX_Size() int {
-	return xxx_messageInfo_Attachment.Size(m)
+
+func (x *Attachment) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Attachment) XXX_DiscardUnknown() {
-	xxx_messageInfo_Attachment.DiscardUnknown(m)
+
+func (*Attachment) ProtoMessage() {}
+
+func (x *Attachment) ProtoReflect() protoreflect.Message {
+	mi := &file_gostfix_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Attachment proto.InternalMessageInfo
+// Deprecated: Use Attachment.ProtoReflect.Descriptor instead.
+func (*Attachment) Descriptor() ([]byte, []int) {
+	return file_gostfix_proto_rawDescGZIP(), []int{3}
+}
 
-func (m *Attachment) GetHeader() *AttachmentHeader {
-	if m != nil {
-		return m.Header
+func (x *Attachment) GetHeader() *AttachmentHeader {
+	if x != nil {
+		return x.Header
 	}
 	return nil
 }
 
-func (m *Attachment) GetData() []byte {
-	if m != nil {
-		return m.Data
+func (x *Attachment) GetData() []byte {
+	if x != nil {
+		return x.Data
 	}
 	return nil
 }
 
 type AttachmentHeader struct {
-	Id                   string   `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
-	FileName             string   `protobuf:"bytes,2,opt,name=fileName,proto3" json:"fileName,omitempty"`
-	ContentType          string   `protobuf:"bytes,3,opt,name=contentType,proto3" json:"contentType,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-" bson:"-"`
-	XXX_unrecognized     []byte   `json:"-" bson:"-"`
-	XXX_sizecache        int32    `json:"-" bson:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *AttachmentHeader) Reset()         { *m = AttachmentHeader{} }
-func (m *AttachmentHeader) String() string { return proto.CompactTextString(m) }
-func (*AttachmentHeader) ProtoMessage()    {}
-func (*AttachmentHeader) Descriptor() ([]byte, []int) {
-	return fileDescriptor_0ab36b6dc6e1dcaa, []int{4}
+	Id          string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	FileName    string `protobuf:"bytes,2,opt,name=fileName,proto3" json:"fileName,omitempty"`
+	ContentType string `protobuf:"bytes,3,opt,name=contentType,proto3" json:"contentType,omitempty"`
 }
 
-func (m *AttachmentHeader) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_AttachmentHeader.Unmarshal(m, b)
-}
-func (m *AttachmentHeader) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_AttachmentHeader.Marshal(b, m, deterministic)
-}
-func (m *AttachmentHeader) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_AttachmentHeader.Merge(m, src)
+func (x *AttachmentHeader) Reset() {
+	*x = AttachmentHeader{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gostfix_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *AttachmentHeader) XXX_Size() int {
-	return xxx_messageInfo_AttachmentHeader.Size(m)
+
+func (x *AttachmentHeader) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *AttachmentHeader) XXX_DiscardUnknown() {
-	xxx_messageInfo_AttachmentHeader.DiscardUnknown(m)
+
+func (*AttachmentHeader) ProtoMessage() {}
+
+func (x *AttachmentHeader) ProtoReflect() protoreflect.Message {
+	mi := &file_gostfix_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_AttachmentHeader proto.InternalMessageInfo
+// Deprecated: Use AttachmentHeader.ProtoReflect.Descriptor instead.
+func (*AttachmentHeader) Descriptor() ([]byte, []int) {
+	return file_gostfix_proto_rawDescGZIP(), []int{4}
+}
 
-func (m *AttachmentHeader) GetId() string {
-	if m != nil {
-		return m.Id
+func (x *AttachmentHeader) GetId() string {
+	if x != nil {
+		return x.Id
 	}
 	return ""
 }
 
-func (m *AttachmentHeader) GetFileName() string {
-	if m != nil {
-		return m.FileName
+func (x *AttachmentHeader) GetFileName() string {
+	if x != nil {
+		return x.FileName
 	}
 	return ""
 }
 
-func (m *AttachmentHeader) GetContentType() string {
-	if m != nil {
-		return m.ContentType
+func (x *AttachmentHeader) GetContentType() string {
+	if x != nil {
+		return x.ContentType
 	}
 	return ""
 }
 
 type UserInfo struct {
-	User                 string   `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"`
-	FullName             string   `protobuf:"bytes,2,opt,name=fullName,proto3" json:"fullName,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-" bson:"-"`
-	XXX_unrecognized     []byte   `json:"-" bson:"-"`
-	XXX_sizecache        int32    `json:"-" bson:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *UserInfo) Reset()         { *m = UserInfo{} }
-func (m *UserInfo) String() string { return proto.CompactTextString(m) }
-func (*UserInfo) ProtoMessage()    {}
-func (*UserInfo) Descriptor() ([]byte, []int) {
-	return fileDescriptor_0ab36b6dc6e1dcaa, []int{5}
+	User     string `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"`
+	FullName string `protobuf:"bytes,2,opt,name=fullName,proto3" json:"fullName,omitempty"`
 }
 
-func (m *UserInfo) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_UserInfo.Unmarshal(m, b)
-}
-func (m *UserInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_UserInfo.Marshal(b, m, deterministic)
-}
-func (m *UserInfo) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_UserInfo.Merge(m, src)
+func (x *UserInfo) Reset() {
+	*x = UserInfo{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gostfix_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *UserInfo) XXX_Size() int {
-	return xxx_messageInfo_UserInfo.Size(m)
+
+func (x *UserInfo) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *UserInfo) XXX_DiscardUnknown() {
-	xxx_messageInfo_UserInfo.DiscardUnknown(m)
+
+func (*UserInfo) ProtoMessage() {}
+
+func (x *UserInfo) ProtoReflect() protoreflect.Message {
+	mi := &file_gostfix_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_UserInfo proto.InternalMessageInfo
+// Deprecated: Use UserInfo.ProtoReflect.Descriptor instead.
+func (*UserInfo) Descriptor() ([]byte, []int) {
+	return file_gostfix_proto_rawDescGZIP(), []int{5}
+}
 
-func (m *UserInfo) GetUser() string {
-	if m != nil {
-		return m.User
+func (x *UserInfo) GetUser() string {
+	if x != nil {
+		return x.User
 	}
 	return ""
 }
 
-func (m *UserInfo) GetFullName() string {
-	if m != nil {
-		return m.FullName
+func (x *UserInfo) GetFullName() string {
+	if x != nil {
+		return x.FullName
 	}
 	return ""
 }
 
 type Frame struct {
-	Skip                 int32    `protobuf:"zigzag32,1,opt,name=skip,proto3" json:"skip,omitempty"`
-	Limit                int32    `protobuf:"zigzag32,2,opt,name=limit,proto3" json:"limit,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-" bson:"-"`
-	XXX_unrecognized     []byte   `json:"-" bson:"-"`
-	XXX_sizecache        int32    `json:"-" bson:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Frame) Reset()         { *m = Frame{} }
-func (m *Frame) String() string { return proto.CompactTextString(m) }
-func (*Frame) ProtoMessage()    {}
-func (*Frame) Descriptor() ([]byte, []int) {
-	return fileDescriptor_0ab36b6dc6e1dcaa, []int{6}
+	Skip  int32 `protobuf:"zigzag32,1,opt,name=skip,proto3" json:"skip,omitempty"`
+	Limit int32 `protobuf:"zigzag32,2,opt,name=limit,proto3" json:"limit,omitempty"`
 }
 
-func (m *Frame) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Frame.Unmarshal(m, b)
-}
-func (m *Frame) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Frame.Marshal(b, m, deterministic)
-}
-func (m *Frame) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Frame.Merge(m, src)
+func (x *Frame) Reset() {
+	*x = Frame{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gostfix_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Frame) XXX_Size() int {
-	return xxx_messageInfo_Frame.Size(m)
+
+func (x *Frame) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Frame) XXX_DiscardUnknown() {
-	xxx_messageInfo_Frame.DiscardUnknown(m)
+
+func (*Frame) ProtoMessage() {}
+
+func (x *Frame) ProtoReflect() protoreflect.Message {
+	mi := &file_gostfix_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Frame proto.InternalMessageInfo
+// Deprecated: Use Frame.ProtoReflect.Descriptor instead.
+func (*Frame) Descriptor() ([]byte, []int) {
+	return file_gostfix_proto_rawDescGZIP(), []int{6}
+}
 
-func (m *Frame) GetSkip() int32 {
-	if m != nil {
-		return m.Skip
+func (x *Frame) GetSkip() int32 {
+	if x != nil {
+		return x.Skip
 	}
 	return 0
 }
 
-func (m *Frame) GetLimit() int32 {
-	if m != nil {
-		return m.Limit
+func (x *Frame) GetLimit() int32 {
+	if x != nil {
+		return x.Limit
 	}
 	return 0
 }
 
 type Folder struct {
-	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	Custom               bool     `protobuf:"varint,2,opt,name=custom,proto3" json:"custom,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-" bson:"-"`
-	XXX_unrecognized     []byte   `json:"-" bson:"-"`
-	XXX_sizecache        int32    `json:"-" bson:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *Folder) Reset()         { *m = Folder{} }
-func (m *Folder) String() string { return proto.CompactTextString(m) }
-func (*Folder) ProtoMessage()    {}
-func (*Folder) Descriptor() ([]byte, []int) {
-	return fileDescriptor_0ab36b6dc6e1dcaa, []int{7}
+	Name   string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Custom bool   `protobuf:"varint,2,opt,name=custom,proto3" json:"custom,omitempty"`
 }
 
-func (m *Folder) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Folder.Unmarshal(m, b)
-}
-func (m *Folder) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Folder.Marshal(b, m, deterministic)
-}
-func (m *Folder) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Folder.Merge(m, src)
+func (x *Folder) Reset() {
+	*x = Folder{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gostfix_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *Folder) XXX_Size() int {
-	return xxx_messageInfo_Folder.Size(m)
+
+func (x *Folder) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Folder) XXX_DiscardUnknown() {
-	xxx_messageInfo_Folder.DiscardUnknown(m)
+
+func (*Folder) ProtoMessage() {}
+
+func (x *Folder) ProtoReflect() protoreflect.Message {
+	mi := &file_gostfix_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Folder proto.InternalMessageInfo
+// Deprecated: Use Folder.ProtoReflect.Descriptor instead.
+func (*Folder) Descriptor() ([]byte, []int) {
+	return file_gostfix_proto_rawDescGZIP(), []int{7}
+}
 
-func (m *Folder) GetName() string {
-	if m != nil {
-		return m.Name
+func (x *Folder) GetName() string {
+	if x != nil {
+		return x.Name
 	}
 	return ""
 }
 
-func (m *Folder) GetCustom() bool {
-	if m != nil {
-		return m.Custom
+func (x *Folder) GetCustom() bool {
+	if x != nil {
+		return x.Custom
 	}
 	return false
 }
 
 type FolderStat struct {
-	Folder               string   `protobuf:"bytes,1,opt,name=folder,proto3" json:"folder,omitempty"`
-	Total                uint32   `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"`
-	Unread               uint32   `protobuf:"varint,3,opt,name=unread,proto3" json:"unread,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-" bson:"-"`
-	XXX_unrecognized     []byte   `json:"-" bson:"-"`
-	XXX_sizecache        int32    `json:"-" bson:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *FolderStat) Reset()         { *m = FolderStat{} }
-func (m *FolderStat) String() string { return proto.CompactTextString(m) }
-func (*FolderStat) ProtoMessage()    {}
-func (*FolderStat) Descriptor() ([]byte, []int) {
-	return fileDescriptor_0ab36b6dc6e1dcaa, []int{8}
+	Folder string `protobuf:"bytes,1,opt,name=folder,proto3" json:"folder,omitempty"`
+	Total  uint32 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"`
+	Unread uint32 `protobuf:"varint,3,opt,name=unread,proto3" json:"unread,omitempty"`
 }
 
-func (m *FolderStat) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_FolderStat.Unmarshal(m, b)
-}
-func (m *FolderStat) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_FolderStat.Marshal(b, m, deterministic)
-}
-func (m *FolderStat) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_FolderStat.Merge(m, src)
+func (x *FolderStat) Reset() {
+	*x = FolderStat{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gostfix_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *FolderStat) XXX_Size() int {
-	return xxx_messageInfo_FolderStat.Size(m)
+
+func (x *FolderStat) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *FolderStat) XXX_DiscardUnknown() {
-	xxx_messageInfo_FolderStat.DiscardUnknown(m)
+
+func (*FolderStat) ProtoMessage() {}
+
+func (x *FolderStat) ProtoReflect() protoreflect.Message {
+	mi := &file_gostfix_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_FolderStat proto.InternalMessageInfo
+// Deprecated: Use FolderStat.ProtoReflect.Descriptor instead.
+func (*FolderStat) Descriptor() ([]byte, []int) {
+	return file_gostfix_proto_rawDescGZIP(), []int{8}
+}
 
-func (m *FolderStat) GetFolder() string {
-	if m != nil {
-		return m.Folder
+func (x *FolderStat) GetFolder() string {
+	if x != nil {
+		return x.Folder
 	}
 	return ""
 }
 
-func (m *FolderStat) GetTotal() uint32 {
-	if m != nil {
-		return m.Total
+func (x *FolderStat) GetTotal() uint32 {
+	if x != nil {
+		return x.Total
 	}
 	return 0
 }
 
-func (m *FolderStat) GetUnread() uint32 {
-	if m != nil {
-		return m.Unread
+func (x *FolderStat) GetUnread() uint32 {
+	if x != nil {
+		return x.Unread
 	}
 	return 0
 }
 
-func init() {
-	proto.RegisterType((*MailBody)(nil), "common.MailBody")
-	proto.RegisterType((*MailHeader)(nil), "common.MailHeader")
-	proto.RegisterType((*Mail)(nil), "common.Mail")
-	proto.RegisterType((*Attachment)(nil), "common.Attachment")
-	proto.RegisterType((*AttachmentHeader)(nil), "common.AttachmentHeader")
-	proto.RegisterType((*UserInfo)(nil), "common.UserInfo")
-	proto.RegisterType((*Frame)(nil), "common.Frame")
-	proto.RegisterType((*Folder)(nil), "common.Folder")
-	proto.RegisterType((*FolderStat)(nil), "common.FolderStat")
-}
-
-func init() { proto.RegisterFile("gostfix.proto", fileDescriptor_0ab36b6dc6e1dcaa) }
-
-var fileDescriptor_0ab36b6dc6e1dcaa = []byte{
-	// 437 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x53, 0xc1, 0x8e, 0xd3, 0x40,
-	0x0c, 0x55, 0xdb, 0x34, 0xb4, 0x0e, 0x45, 0x5d, 0x0b, 0xa1, 0x08, 0x71, 0xa8, 0x22, 0x0e, 0x15,
-	0x87, 0x0a, 0x0a, 0xa7, 0xbd, 0xc1, 0x61, 0x05, 0x07, 0x38, 0x0c, 0x8b, 0xc4, 0x91, 0xe9, 0x64,
-	0x42, 0x07, 0x92, 0x4c, 0x94, 0x38, 0xd2, 0xf6, 0xc6, 0xa7, 0x23, 0x3b, 0x93, 0x6d, 0x59, 0x89,
-	0x9b, 0x9f, 0xfd, 0xec, 0xf7, 0xec, 0x49, 0x60, 0xf5, 0xd3, 0x77, 0x54, 0xb8, 0xbb, 0x5d, 0xd3,
-	0x7a, 0xf2, 0x18, 0x1b, 0x5f, 0x55, 0xbe, 0xce, 0xfe, 0x4c, 0x60, 0xf1, 0x59, 0xbb, 0xf2, 0x83,
-	0xcf, 0x4f, 0xf8, 0x02, 0x96, 0x4d, 0xa9, 0x5d, 0x7d, 0x6b, 0xef, 0x28, 0x9d, 0x6c, 0x26, 0xdb,
-	0xa5, 0x3a, 0x27, 0xf0, 0x39, 0x2c, 0x5a, 0x67, 0x8e, 0x52, 0x9c, 0x4a, 0xf1, 0x1e, 0xe3, 0x35,
-	0x24, 0x9a, 0x48, 0x9b, 0x63, 0x65, 0x6b, 0xea, 0xd2, 0xd9, 0x66, 0xb6, 0x4d, 0xf6, 0xe9, 0x6e,
-	0x10, 0xd9, 0xbd, 0xbf, 0x2f, 0x7d, 0xb4, 0x3a, 0xb7, 0xad, 0xba, 0x24, 0xb3, 0x05, 0x60, 0x0b,
-	0x43, 0x0d, 0x11, 0xa2, 0xa2, 0xf5, 0x55, 0xd0, 0x97, 0x18, 0x9f, 0xc0, 0x94, 0x7c, 0x10, 0x9d,
-	0x92, 0x67, 0x6c, 0x4c, 0x3a, 0x1b, 0xb0, 0x31, 0xb8, 0x86, 0xd9, 0xc1, 0x98, 0x34, 0x92, 0x04,
-	0x87, 0x3c, 0x25, 0xd7, 0x64, 0xd3, 0xf9, 0x66, 0xb2, 0x45, 0x25, 0x31, 0xa6, 0xf0, 0xa8, 0xeb,
-	0x0f, 0xbf, 0xac, 0xa1, 0x34, 0x16, 0xe6, 0x08, 0xb3, 0xef, 0x10, 0xb1, 0x03, 0x7c, 0x05, 0xf1,
-	0x51, 0x5c, 0x88, 0x7a, 0xb2, 0xc7, 0x71, 0x83, 0xb3, 0x3f, 0x15, 0x18, 0xf8, 0x12, 0xa2, 0x83,
-	0xcf, 0x4f, 0xe2, 0x2a, 0xd9, 0xaf, 0x2f, 0x99, 0x7c, 0x4c, 0x25, 0xd5, 0x4c, 0x01, 0x9c, 0xb7,
-	0xc7, 0xd7, 0x0f, 0xe6, 0xff, 0xff, 0x42, 0xa3, 0xca, 0xb0, 0x87, 0x16, 0x95, 0xc7, 0xb2, 0x87,
-	0xce, 0x7e, 0xc0, 0xfa, 0x21, 0x9f, 0x2f, 0xe2, 0xf2, 0x70, 0xb3, 0xa9, 0xcb, 0xf9, 0xb1, 0x0a,
-	0x57, 0xda, 0x2f, 0xba, 0xb2, 0xe3, 0x63, 0x8d, 0x18, 0x37, 0x90, 0x18, 0x5f, 0x93, 0xad, 0xe9,
-	0xf6, 0xd4, 0xd8, 0x70, 0xc6, 0xcb, 0x54, 0x76, 0x0d, 0x8b, 0x6f, 0x9d, 0x6d, 0x3f, 0xd5, 0x85,
-	0x67, 0x07, 0x7d, 0x17, 0x1c, 0x2f, 0x95, 0xc4, 0x32, 0xbd, 0x2f, 0xcb, 0x7f, 0xa6, 0x07, 0x9c,
-	0xbd, 0x81, 0xf9, 0x4d, 0xcb, 0x32, 0x08, 0x51, 0xf7, 0xdb, 0x35, 0xd2, 0x78, 0xa5, 0x24, 0xc6,
-	0xa7, 0x30, 0x2f, 0x5d, 0xe5, 0x86, 0x0f, 0xe8, 0x4a, 0x0d, 0x20, 0x7b, 0x07, 0xf1, 0x8d, 0x2f,
-	0xc3, 0xba, 0x35, 0x0f, 0x0d, 0x62, 0x1c, 0xe3, 0x33, 0x88, 0x4d, 0xdf, 0x91, 0xaf, 0xa4, 0x69,
-	0xa1, 0x02, 0xe2, 0xd3, 0x0e, 0x5d, 0x5f, 0x49, 0x13, 0xb3, 0x0a, 0x41, 0xa1, 0x37, 0x20, 0x56,
-	0x24, 0x4f, 0xba, 0x94, 0xe6, 0x95, 0x1a, 0x00, 0xb3, 0xfb, 0xba, 0xb5, 0x3a, 0x97, 0xed, 0x57,
-	0x2a, 0xa0, 0x43, 0x2c, 0x7f, 0xc7, 0xdb, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xef, 0x23, 0xbe,
-	0x5d, 0x2e, 0x03, 0x00, 0x00,
+var File_gostfix_proto protoreflect.FileDescriptor
+
+var file_gostfix_proto_rawDesc = []byte{
+	0x0a, 0x0d, 0x67, 0x6f, 0x73, 0x74, 0x66, 0x69, 0x78, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
+	0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x4d, 0x61, 0x69, 0x6c,
+	0x42, 0x6f, 0x64, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x54, 0x65, 0x78,
+	0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x54, 0x65,
+	0x78, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x69, 0x63, 0x68, 0x54, 0x65, 0x78, 0x74, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x69, 0x63, 0x68, 0x54, 0x65, 0x78, 0x74, 0x12, 0x3a,
+	0x0a, 0x0b, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x41, 0x74, 0x74,
+	0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x0b, 0x61,
+	0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x0a, 0x4d,
+	0x61, 0x69, 0x6c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f,
+	0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x0e, 0x0a,
+	0x02, 0x74, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x0e, 0x0a,
+	0x02, 0x63, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x63, 0x63, 0x12, 0x10, 0x0a,
+	0x03, 0x62, 0x63, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x62, 0x63, 0x63, 0x12,
+	0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x12, 0x52, 0x04, 0x64,
+	0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x06,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x58, 0x0a,
+	0x04, 0x4d, 0x61, 0x69, 0x6c, 0x12, 0x2a, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d,
+	0x61, 0x69, 0x6c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65,
+	0x72, 0x12, 0x24, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x10, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x61, 0x69, 0x6c, 0x42, 0x6f, 0x64,
+	0x79, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x52, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63,
+	0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x41,
+	0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52,
+	0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x60, 0x0a, 0x10, 0x41,
+	0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12,
+	0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,
+	0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x0a,
+	0x08, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65,
+	0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a,
+	0x08, 0x66, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x08, 0x66, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x05, 0x46, 0x72, 0x61,
+	0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6b, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x11,
+	0x52, 0x04, 0x73, 0x6b, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x11, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x34, 0x0a, 0x06,
+	0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75,
+	0x73, 0x74, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x63, 0x75, 0x73, 0x74,
+	0x6f, 0x6d, 0x22, 0x52, 0x0a, 0x0a, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74,
+	0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61,
+	0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x16,
+	0x0a, 0x06, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06,
+	0x75, 0x6e, 0x72, 0x65, 0x61, 0x64, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_gostfix_proto_rawDescOnce sync.Once
+	file_gostfix_proto_rawDescData = file_gostfix_proto_rawDesc
+)
+
+func file_gostfix_proto_rawDescGZIP() []byte {
+	file_gostfix_proto_rawDescOnce.Do(func() {
+		file_gostfix_proto_rawDescData = protoimpl.X.CompressGZIP(file_gostfix_proto_rawDescData)
+	})
+	return file_gostfix_proto_rawDescData
+}
+
+var file_gostfix_proto_msgTypes = make([]protoimpl.MessageInfo, 9)
+var file_gostfix_proto_goTypes = []interface{}{
+	(*MailBody)(nil),         // 0: common.MailBody
+	(*MailHeader)(nil),       // 1: common.MailHeader
+	(*Mail)(nil),             // 2: common.Mail
+	(*Attachment)(nil),       // 3: common.Attachment
+	(*AttachmentHeader)(nil), // 4: common.AttachmentHeader
+	(*UserInfo)(nil),         // 5: common.UserInfo
+	(*Frame)(nil),            // 6: common.Frame
+	(*Folder)(nil),           // 7: common.Folder
+	(*FolderStat)(nil),       // 8: common.FolderStat
+}
+var file_gostfix_proto_depIdxs = []int32{
+	4, // 0: common.MailBody.attachments:type_name -> common.AttachmentHeader
+	1, // 1: common.Mail.header:type_name -> common.MailHeader
+	0, // 2: common.Mail.body:type_name -> common.MailBody
+	4, // 3: common.Attachment.header:type_name -> common.AttachmentHeader
+	4, // [4:4] is the sub-list for method output_type
+	4, // [4:4] is the sub-list for method input_type
+	4, // [4:4] is the sub-list for extension type_name
+	4, // [4:4] is the sub-list for extension extendee
+	0, // [0:4] is the sub-list for field type_name
+}
+
+func init() { file_gostfix_proto_init() }
+func file_gostfix_proto_init() {
+	if File_gostfix_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_gostfix_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MailBody); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gostfix_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MailHeader); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gostfix_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Mail); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gostfix_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Attachment); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gostfix_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AttachmentHeader); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gostfix_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UserInfo); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gostfix_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Frame); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gostfix_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Folder); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_gostfix_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*FolderStat); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_gostfix_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   9,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_gostfix_proto_goTypes,
+		DependencyIndexes: file_gostfix_proto_depIdxs,
+		MessageInfos:      file_gostfix_proto_msgTypes,
+	}.Build()
+	File_gostfix_proto = out.File
+	file_gostfix_proto_rawDesc = nil
+	file_gostfix_proto_goTypes = nil
+	file_gostfix_proto_depIdxs = nil
 }

+ 6 - 3
go.mod

@@ -3,21 +3,24 @@ module git.semlanik.org/semlanik/gostfix
 go 1.14
 
 require (
+	github.com/amsokol/protoc-gen-gotag v0.2.1 // indirect
+	github.com/fatih/structtag v1.2.0 // indirect
 	github.com/fsnotify/fsnotify v1.4.9
-	github.com/golang/protobuf v1.4.1
+	github.com/golang/protobuf v1.5.2
 	github.com/google/uuid v1.1.1
 	github.com/gorilla/sessions v1.2.0
 	github.com/gorilla/websocket v1.4.2
 	github.com/jhillyerd/enmime v0.8.1
 	github.com/jsimonetti/berkeleydb v0.0.0-20170815141343-5cde5eaaf78c // indirect
+	github.com/lyft/protoc-gen-star v0.6.0 // indirect
 	github.com/pkg/profile v1.5.0
 	github.com/semlanik/berkeleydb v0.0.0-20200324082802-7b28da5446c0
 	github.com/smartystreets/goconvey v1.6.4 // indirect
-	github.com/stretchr/testify v1.4.0 // indirect
 	go.mongodb.org/mongo-driver v1.3.5
 	golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586
 	golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9
-	google.golang.org/protobuf v1.25.0 // indirect
+	google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 // indirect
+	google.golang.org/protobuf v1.26.0
 	gopkg.in/go-ini/ini.v1 v1.57.0
 	gopkg.in/ini.v1 v1.57.0 // indirect
 )

+ 25 - 2
go.sum

@@ -1,5 +1,7 @@
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/amsokol/protoc-gen-gotag v0.2.1 h1:N3ovy0PyxxUBXz+jkuJJUA1iNlQ+7a/QVSW361XF0kc=
+github.com/amsokol/protoc-gen-gotag v0.2.1/go.mod h1:VGStdb9DuXf/2T+bgrIqBouu8Hl81egNzVxD/DyEPAg=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/cention-sany/utf7 v0.0.0-20170124080048-26cad61bd60a h1:MISbI8sU/PSK/ztvmWKFcI7UGb5/HQT7B+i3a2myKgI=
 github.com/cention-sany/utf7 v0.0.0-20170124080048-26cad61bd60a/go.mod h1:2GxOXOlEPAMFPfp014mK1SWq8G8BN8o7/dfYqJrVGn8=
@@ -9,6 +11,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
+github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
 github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
@@ -50,8 +54,12 @@ github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:x
 github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
 github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
 github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0=
 github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
 github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
 github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
@@ -61,6 +69,7 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
 github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w=
 github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
@@ -87,11 +96,14 @@ github.com/klauspost/compress v1.9.5 h1:U+CaK85mrNNb4k8BNOfgJtJ/gr6kswUCFj6miSzV
 github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
 github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/lyft/protoc-gen-star v0.6.0 h1:xOpFu4vwmIoUeUrRuAtdCrZZymT/6AkW/bsUWA506Fo=
+github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=
 github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
 github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=
 github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y=
@@ -105,6 +117,7 @@ github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/profile v1.5.0 h1:042Buzk+NhDI+DeSAA62RwJL8VAuZUMQZUjCsRz1Mug=
 github.com/pkg/profile v1.5.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18=
+github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@@ -122,6 +135,8 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykE
 github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
 github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/spf13/afero v1.3.3 h1:p5gZEKLYoL7wh8VrJesMaYeNxdEd1v3cb4irOk9zB54=
+github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
 github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf h1:pvbZ0lM0XWPBqUKqFU8cmavspvIl9nulOYwdy6IFRRo=
@@ -131,8 +146,9 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
 github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
 github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c h1:u40Z8hqBAAQyv+vATcGgV0YCnDjqSL7/q/JyPhhJSPk=
@@ -208,9 +224,14 @@ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQ
 google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
 google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
 google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
 google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -221,5 +242,7 @@ gopkg.in/ini.v1 v1.57.0 h1:9unxIsFcTt4I55uWluz+UmL95q4kdJ0buvQ1ZIqVQww=
 gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=