all: Automatic/disabled folder-config when receive-encrypted (#7327)

This commit is contained in:
Simon Frei 2021-02-12 22:51:29 +01:00 committed by GitHub
parent 7e4e2f3720
commit 80fc238bec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 221 additions and 130 deletions

1
go.mod
View File

@ -48,7 +48,6 @@ require (
golang.org/x/sys v0.0.0-20201101102859-da207088b7d1
golang.org/x/text v0.3.4
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e
google.golang.org/protobuf v1.23.0
)
go 1.14

View File

@ -250,7 +250,7 @@
</div>
<div class="panel-footer clearfix">
<div class="pull-right">
<button type="button" class="btn btn-sm btn-success" ng-click="addFolderAndShare(folderID, offeringDevice.label, deviceID)" ng-if="!folders[folderID]">
<button type="button" class="btn btn-sm btn-success" ng-click="addFolderAndShare(folderID, pendingFolder, deviceID)" ng-if="!folders[folderID]">
<span class="fas fa-check"></span>&nbsp;<span translate>Add</span>
</button>
<button type="button" class="btn btn-sm btn-success" ng-click="shareFolderWithDevice(folderID, deviceID)" ng-if="folders[folderID]">

View File

@ -51,6 +51,7 @@ angular.module('syncthing.core')
$scope.globalChangeEvents = {};
$scope.metricRates = false;
$scope.folderPathErrors = {};
$scope.currentSharing = {};
$scope.currentFolder = {};
$scope.currentDevice = {};
$scope.ignores = {
@ -276,7 +277,8 @@ angular.module('syncthing.core')
arg.data.added.forEach(function (rejected) {
var offeringDevice = {
time: arg.time,
label: rejected.folderLabel
label: rejected.folderLabel,
receiveEncrypted: rejected.receiveEncrypted,
};
console.log("rejected folder", rejected.folderID, "from device:", rejected.deviceID, offeringDevice);
@ -1814,12 +1816,18 @@ angular.module('syncthing.core')
$scope.currentFolder.path = pathJoin($scope.config.defaults.folder.path, newvalue);
});
$scope.fsWatcherToggled = function () {
if ($scope.currentFolder.fsWatcherEnabled) {
$scope.currentFolder.rescanIntervalS = 3600;
} else {
$scope.currentFolder.rescanIntervalS = 60;
$scope.setFSWatcherIntervalDefault = function () {
var defaultRescanIntervals = [60, 3600];
if (defaultRescanIntervals.indexOf($scope.currentFolder.rescanIntervalS) === -1) {
return;
}
var idx;
if ($scope.currentFolder.fsWatcherEnabled) {
idx = 1;
} else {
idx = 0;
}
$scope.currentFolder.rescanIntervalS = defaultRescanIntervals[idx];
};
$scope.loadFormIntoScope = function (form) {
@ -1979,13 +1987,13 @@ angular.module('syncthing.core')
});
};
$scope.addFolderAndShare = function (folderID, folderLabel, device) {
$scope.addFolderAndShare = function (folderID, pendingFolder, device) {
addFolderInit(folderID).then(function() {
$scope.currentFolder.viewFlags = {
importFromOtherDevice: true
};
$scope.currentSharing.selected[device] = true;
$scope.currentFolder.label = folderLabel;
$scope.currentFolder.label = pendingFolder.offeredBy[device].label;
editFolderModal();
});
};

View File

@ -198,7 +198,7 @@
<div class="row">
<div class="col-md-6">
<label>
<input type="checkbox" ng-model="currentFolder.fsWatcherEnabled" ng-change="fsWatcherToggled()" tooltip data-original-title="{{'Use notifications from the filesystem to detect changed items.' | translate }}">&nbsp;<span translate>Watch for Changes</span>
<input type="checkbox" ng-model="currentFolder.fsWatcherEnabled" ng-change="setFSWatcherIntervalDefault()" tooltip data-original-title="{{'Use notifications from the filesystem to detect changed items.' | translate }}">&nbsp;<span translate>Watch for Changes</span>
</label>
<p translate class="help-block">Watching for changes discovers most changes without periodic scanning.</p>
</div>

View File

@ -250,7 +250,7 @@
</div>
<div class="panel-footer clearfix">
<div class="pull-right">
<button type="button" class="btn btn-sm btn-success" ng-click="addFolderAndShare(folderID, offeringDevice.label, deviceID)" ng-if="!folders[folderID]">
<button type="button" class="btn btn-sm btn-success" ng-click="addFolderAndShare(folderID, pendingFolder, deviceID)" ng-if="!folders[folderID]">
<span class="fas fa-check"></span>&nbsp;<span translate>Add</span>
</button>
<button type="button" class="btn btn-sm btn-success" ng-click="shareFolderWithDevice(folderID, deviceID)" ng-if="folders[folderID]">
@ -417,7 +417,7 @@
<span class="far fa-copy"></span>&nbsp;{{model[folder.id].localFiles | alwaysNumber | localeNumber}}&ensp;
<span class="far fa-folder"></span>&nbsp;{{model[folder.id].localDirectories | alwaysNumber | localeNumber}}&ensp;
<span class="far fa-hdd"></span>&nbsp;~{{model[folder.id].localBytes | binary}}B<!-- get rid of the annoying trailing whitespace
--><span ng-if="model[folder.id].ignorePatterns"><br/><i><small translate class="text-muted">Reduced by ignore patterns</small></i></span>
--><span ng-if="model[folder.id].ignorePatterns"><br/><i><small translate class="text-muted">Reduced by ignore patterns</small></i></span>
</span>
</td>
</tr>

View File

@ -51,6 +51,7 @@ angular.module('syncthing.core')
$scope.globalChangeEvents = {};
$scope.metricRates = false;
$scope.folderPathErrors = {};
$scope.currentSharing = {};
$scope.currentFolder = {};
$scope.currentDevice = {};
$scope.ignores = {
@ -276,7 +277,8 @@ angular.module('syncthing.core')
arg.data.added.forEach(function (rejected) {
var offeringDevice = {
time: arg.time,
label: rejected.folderLabel
label: rejected.folderLabel,
receiveEncrypted: rejected.receiveEncrypted,
};
console.log("rejected folder", rejected.folderID, "from device:", rejected.deviceID, offeringDevice);
@ -1831,12 +1833,31 @@ angular.module('syncthing.core')
$scope.currentFolder.path = pathJoin($scope.config.defaults.folder.path, newvalue);
});
$scope.fsWatcherToggled = function () {
if ($scope.currentFolder.fsWatcherEnabled) {
$scope.currentFolder.rescanIntervalS = 3600;
} else {
$scope.currentFolder.rescanIntervalS = 60;
$scope.setFSWatcherIntervalDefault = function () {
var defaultRescanIntervals = [60, 3600, 3600*24];
if (defaultRescanIntervals.indexOf($scope.currentFolder.rescanIntervalS) === -1) {
return;
}
var idx;
if ($scope.currentFolder.fsWatcherEnabled) {
idx = 1;
} else if ($scope.currentFolder.type === 'receiveencrypted') {
idx = 2;
} else {
idx = 0;
}
$scope.currentFolder.rescanIntervalS = defaultRescanIntervals[idx];
};
$scope.setDefaultsForFolderType = function () {
if ($scope.currentFolder.type === 'receiveencrypted') {
$scope.currentFolder.fsWatcherEnabled = false;
$scope.currentFolder.ignorePerms = true;
delete $scope.currentFolder.versioning;
} else {
$scope.currentFolder.fsWatcherEnabled = true;
}
$scope.setFSWatcherIntervalDefault();
};
$scope.loadFormIntoScope = function (form) {
@ -1857,6 +1878,7 @@ angular.module('syncthing.core')
function editFolderModal() {
initVersioningEditing();
$scope.currentFolder._recvEnc = $scope.currentFolder.type === 'receiveencrypted';
$scope.folderPathErrors = {};
$scope.folderEditor.$setPristine();
$('#editFolder').modal().one('shown.bs.tab', function (e) {
@ -1996,13 +2018,20 @@ angular.module('syncthing.core')
});
};
$scope.addFolderAndShare = function (folderID, folderLabel, device) {
$scope.addFolderAndShare = function (folderID, pendingFolder, device) {
addFolderInit(folderID).then(function() {
$scope.currentFolder.viewFlags = {
importFromOtherDevice: true
};
$scope.currentSharing.selected[device] = true;
$scope.currentFolder.label = folderLabel;
$scope.currentFolder.label = pendingFolder.offeredBy[device].label;
for (var k in pendingFolder.offeredBy) {
if (pendingFolder.offeredBy[k].receiveEncrypted) {
$scope.currentFolder.type = "receiveencrypted";
$scope.setDefaultsForFolderType();
break;
}
}
editFolderModal();
});
};

View File

@ -5,7 +5,7 @@
<li class="active"><a data-toggle="tab" href="#folder-general"><span class="fas fa-cog"></span> <span translate>General</span></a></li>
<li><a data-toggle="tab" href="#folder-sharing"><span class="fas fa-share-alt"></span> <span translate>Sharing</span></a></li>
<li><a data-toggle="tab" href="#folder-versioning"><span class="fas fa-copy"></span> <span translate>File Versioning</span></a></li>
<li ng-if="!editingDefaults"><a data-toggle="tab" href="#folder-ignores"><span class="fas fa-filter"></span> <span translate>Ignore Patterns</span></a></li>
<li ng-if="!editingDefaults" ng-class="{'disabled': currentFolder._recvEnc}"><a ng-attr-data-toggle="{{ currentFolder._recvEnc ? undefined : 'tab'}}" href="{{currentFolder._recvEnc ? '#' : '#folder-ignores'}}"><span class="fas fa-filter"></span> <span translate>Ignore Patterns</span></a></li>
<li><a data-toggle="tab" href="#folder-advanced"><span class="fas fa-cogs"></span> <span translate>Advanced</span></a></li>
</ul>
<div class="tab-content">
@ -186,7 +186,7 @@
<div class="row">
<div class="col-md-6">
<label>
<input type="checkbox" ng-model="currentFolder.fsWatcherEnabled" ng-change="fsWatcherToggled()" tooltip data-original-title="{{'Use notifications from the filesystem to detect changed items.' | translate }}">&nbsp;<span translate>Watch for Changes</span>
<input type="checkbox" ng-model="currentFolder.fsWatcherEnabled" ng-change="setFSWatcherIntervalDefault()" tooltip data-original-title="{{'Use notifications from the filesystem to detect changed items.' | translate }}">&nbsp;<span translate>Watch for Changes</span>
</label>
<p translate class="help-block">Watching for changes discovers most changes without periodic scanning.</p>
</div>
@ -205,7 +205,7 @@
<div class="col-md-6 form-group">
<label translate>Folder Type</label>
&nbsp;<a href="https://docs.syncthing.net/users/foldertypes.html" target="_blank"><span class="fas fa-question-circle"></span>&nbsp;<span translate>Help</span></a>
<select class="form-control" ng-model="currentFolder.type" ng-disabled="editingExisting && currentFolder.type === 'receiveencrypted'">
<select class="form-control" ng-change="setDefaultsForFolderType()" ng-model="currentFolder.type" ng-disabled="editingExisting && currentFolder.type === 'receiveencrypted'">
<option value="sendreceive" translate>Send &amp; Receive</option>
<option value="sendonly" translate>Send Only</option>
<option value="receiveonly" translate>Receive Only</option>
@ -255,7 +255,7 @@
</div>
<div class="col-md-6 form-group">
<label>
<input type="checkbox" ng-model="currentFolder.ignorePerms" /> <span translate>Ignore Permissions</span>
<input type="checkbox" ng-disabled="currentFolder._recvEnc" ng-model="currentFolder.ignorePerms" /> <span translate>Ignore Permissions</span>
</label>
<p translate class="help-block">
Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).

View File

@ -212,6 +212,10 @@ func (f *FolderConfiguration) prepare(myID protocol.DeviceID, existingDevices ma
} else if f.MaxConcurrentWrites > maxConcurrentWritesLimit {
f.MaxConcurrentWrites = maxConcurrentWritesLimit
}
if f.Type == FolderTypeReceiveEncrypted {
f.IgnorePerms = true
}
}
// RequiresRestartOnly returns a copy with only the attributes that require

View File

@ -66,14 +66,15 @@ func (db *Lowlevel) PendingDevices() (map[protocol.DeviceID]ObservedDevice, erro
return res, nil
}
func (db *Lowlevel) AddOrUpdatePendingFolder(id, label string, device protocol.DeviceID) error {
func (db *Lowlevel) AddOrUpdatePendingFolder(id, label string, device protocol.DeviceID, receiveEncrypted bool) error {
key, err := db.keyer.GeneratePendingFolderKey(nil, device[:], []byte(id))
if err != nil {
return err
}
of := ObservedFolder{
Time: time.Now().Round(time.Second),
Label: label,
Time: time.Now().Round(time.Second),
Label: label,
ReceiveEncrypted: receiveEncrypted,
}
bs, err := of.Marshal()
if err != nil {

View File

@ -400,8 +400,9 @@ func (m *VersionListDeprecated) XXX_DiscardUnknown() {
var xxx_messageInfo_VersionListDeprecated proto.InternalMessageInfo
type ObservedFolder struct {
Time time.Time `protobuf:"bytes,1,opt,name=time,proto3,stdtime" json:"time" xml:"time"`
Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label" xml:"label"`
Time time.Time `protobuf:"bytes,1,opt,name=time,proto3,stdtime" json:"time" xml:"time"`
Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label" xml:"label"`
ReceiveEncrypted bool `protobuf:"varint,3,opt,name=receive_encrypted,json=receiveEncrypted,proto3" json:"receiveEncrypted" xml:"receiveEncrypted"`
}
func (m *ObservedFolder) Reset() { *m = ObservedFolder{} }
@ -493,96 +494,98 @@ func init() {
func init() { proto.RegisterFile("lib/db/structs.proto", fileDescriptor_5465d80e8cba02e3) }
var fileDescriptor_5465d80e8cba02e3 = []byte{
// 1415 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xcf, 0x6f, 0xdb, 0xc6,
0x12, 0x36, 0x2d, 0xf9, 0x87, 0x56, 0xb2, 0x13, 0x33, 0x2f, 0x01, 0x9f, 0xdf, 0x7b, 0x5a, 0xbd,
0x8d, 0x03, 0xa8, 0x2d, 0x20, 0x03, 0x0e, 0x62, 0x14, 0x01, 0xda, 0x20, 0x8c, 0xe1, 0xc4, 0x41,
0x9a, 0x14, 0xeb, 0x20, 0x2d, 0x7a, 0x11, 0xf8, 0x63, 0x2d, 0x13, 0xa1, 0x48, 0x95, 0x4b, 0xdb,
0x51, 0x6e, 0xbd, 0x14, 0xe8, 0x2d, 0x08, 0x7a, 0x28, 0x8a, 0xa2, 0xc8, 0xa9, 0x7f, 0x42, 0xff,
0x82, 0x1e, 0x72, 0xf4, 0xb1, 0xe8, 0x81, 0x45, 0xec, 0x4b, 0xab, 0xa3, 0x4e, 0x45, 0x4f, 0xc5,
0xce, 0x2e, 0x97, 0x54, 0x8c, 0x14, 0x49, 0xea, 0x1b, 0xe7, 0x9b, 0x6f, 0x46, 0xe4, 0xec, 0x37,
0xb3, 0x23, 0xf4, 0xaf, 0x30, 0x70, 0x57, 0x7d, 0x77, 0x95, 0xa7, 0xc9, 0x9e, 0x97, 0xf2, 0xce,
0x20, 0x89, 0xd3, 0xd8, 0x9c, 0xf6, 0xdd, 0xe5, 0x8b, 0x09, 0x1b, 0xc4, 0x7c, 0x15, 0x00, 0x77,
0x6f, 0x67, 0xb5, 0x17, 0xf7, 0x62, 0x30, 0xe0, 0x49, 0x12, 0x97, 0x71, 0x2f, 0x8e, 0x7b, 0x21,
0x2b, 0x58, 0x69, 0xd0, 0x67, 0x3c, 0x75, 0xfa, 0x03, 0x45, 0xb8, 0x20, 0xf2, 0xc3, 0xa3, 0x17,
0x87, 0xab, 0x2e, 0xcb, 0xf1, 0x1a, 0x7b, 0x94, 0xca, 0x47, 0xf2, 0xfd, 0x34, 0xaa, 0x6f, 0x06,
0x21, 0x7b, 0xc0, 0x12, 0x1e, 0xc4, 0x91, 0x79, 0x07, 0xcd, 0xed, 0xcb, 0x47, 0xcb, 0x68, 0x19,
0xed, 0xfa, 0xda, 0xd9, 0x4e, 0x9e, 0xa0, 0xf3, 0x80, 0x79, 0x69, 0x9c, 0xd8, 0xad, 0xe7, 0x19,
0x9e, 0x1a, 0x65, 0x38, 0x27, 0x8e, 0x33, 0xbc, 0xf0, 0xa8, 0x1f, 0x5e, 0x25, 0xca, 0x26, 0x34,
0xf7, 0x98, 0xeb, 0x68, 0xce, 0x67, 0x21, 0x4b, 0x99, 0x6f, 0x4d, 0xb7, 0x8c, 0xf6, 0xbc, 0xfd,
0x5f, 0x11, 0xa7, 0x20, 0x1d, 0xa7, 0x6c, 0x42, 0x73, 0x8f, 0x79, 0x45, 0xc4, 0xed, 0x07, 0x1e,
0xe3, 0x56, 0xa5, 0x55, 0x69, 0x37, 0xec, 0xff, 0xc8, 0x38, 0x80, 0xc6, 0x19, 0x6e, 0xa8, 0x38,
0x61, 0x43, 0x18, 0x38, 0x4c, 0x8a, 0xce, 0x04, 0xd1, 0xbe, 0x13, 0x06, 0x7e, 0x37, 0x0f, 0xaf,
0x42, 0xf8, 0x3b, 0xa3, 0x0c, 0x2f, 0x2a, 0xd7, 0x86, 0xce, 0x72, 0x0e, 0xb2, 0x4c, 0xc0, 0x84,
0xbe, 0x44, 0x23, 0x5f, 0x18, 0xa8, 0xae, 0x8a, 0x73, 0x27, 0xe0, 0xa9, 0x19, 0xa2, 0x79, 0xf5,
0x75, 0xdc, 0x32, 0x5a, 0x95, 0x76, 0x7d, 0xed, 0x4c, 0xc7, 0x77, 0x3b, 0xa5, 0x1a, 0xda, 0xd7,
0x44, 0x81, 0x8e, 0x32, 0x5c, 0xa7, 0xce, 0x81, 0xc2, 0xf8, 0x28, 0xc3, 0x3a, 0xee, 0x44, 0xc1,
0x9e, 0x1e, 0xae, 0x94, 0xb9, 0x54, 0x33, 0xaf, 0x56, 0xbf, 0x79, 0x86, 0xa7, 0xc8, 0x1f, 0x08,
0x2d, 0x89, 0x1f, 0xd8, 0x8a, 0x76, 0xe2, 0xfb, 0xc9, 0x5e, 0xe4, 0x39, 0xa2, 0x48, 0xef, 0xa2,
0x6a, 0xe4, 0xf4, 0x19, 0x9c, 0x53, 0xcd, 0xbe, 0x30, 0xca, 0x30, 0xd8, 0xe3, 0x0c, 0x23, 0xc8,
0x2e, 0x0c, 0x42, 0x01, 0x13, 0x5c, 0x1e, 0x3c, 0x66, 0x56, 0xa5, 0x65, 0xb4, 0x2b, 0x92, 0x2b,
0x6c, 0xcd, 0x15, 0x06, 0xa1, 0x80, 0x99, 0xd7, 0x10, 0xea, 0xc7, 0x7e, 0xb0, 0x13, 0x30, 0xbf,
0xcb, 0xad, 0x19, 0x88, 0x68, 0x8d, 0x32, 0x5c, 0xcb, 0xd1, 0xed, 0x71, 0x86, 0xcf, 0x40, 0x98,
0x46, 0x08, 0x2d, 0xbc, 0xe6, 0x8f, 0x06, 0xaa, 0xeb, 0x0c, 0xee, 0xd0, 0x6a, 0xb4, 0x8c, 0x76,
0xd5, 0xfe, 0xda, 0x10, 0x65, 0xf9, 0x25, 0xc3, 0x97, 0x7b, 0x41, 0xba, 0xbb, 0xe7, 0x76, 0xbc,
0xb8, 0xbf, 0xca, 0x87, 0x91, 0x97, 0xee, 0x06, 0x51, 0xaf, 0xf4, 0x54, 0x16, 0x6d, 0x67, 0x7b,
0x37, 0x4e, 0xd2, 0xad, 0x8d, 0x51, 0x86, 0xf5, 0x4b, 0xd9, 0xc3, 0x71, 0x86, 0xcf, 0x4e, 0xfc,
0xbe, 0x3d, 0x24, 0xdf, 0x1e, 0xae, 0xbc, 0x4d, 0x62, 0x5a, 0x4a, 0x5b, 0x16, 0x7f, 0xed, 0x9f,
0x8b, 0xff, 0x2a, 0x9a, 0xe7, 0xec, 0xf3, 0x3d, 0x16, 0x79, 0xcc, 0x42, 0x50, 0xc5, 0xa6, 0x50,
0x41, 0x8e, 0x8d, 0x33, 0xbc, 0x28, 0x6b, 0xaf, 0x00, 0x42, 0xb5, 0xcf, 0xbc, 0x87, 0x16, 0xf9,
0xb0, 0x1f, 0x06, 0xd1, 0xc3, 0x6e, 0xea, 0x24, 0x3d, 0x96, 0x5a, 0x4b, 0x70, 0xca, 0xed, 0x51,
0x86, 0x17, 0x94, 0xe7, 0x3e, 0x38, 0xb4, 0x8e, 0x27, 0x50, 0x42, 0x27, 0x59, 0xe6, 0x0d, 0x54,
0x77, 0xc3, 0xd8, 0x7b, 0xc8, 0xbb, 0xbb, 0x0e, 0xdf, 0xb5, 0xcc, 0x96, 0xd1, 0x6e, 0xd8, 0x44,
0x94, 0x55, 0xc2, 0xb7, 0x1c, 0xbe, 0xab, 0xcb, 0x5a, 0x40, 0x84, 0x96, 0xfc, 0xe6, 0x87, 0xa8,
0xc6, 0x22, 0x2f, 0x19, 0x0e, 0x44, 0x43, 0x9f, 0x83, 0x14, 0x20, 0x0c, 0x0d, 0x6a, 0x61, 0x68,
0x84, 0xd0, 0xc2, 0x6b, 0xda, 0xa8, 0x9a, 0x0e, 0x07, 0x0c, 0x66, 0xc1, 0xe2, 0xda, 0x85, 0xa2,
0xb8, 0x5a, 0xdc, 0xc3, 0x01, 0x93, 0xea, 0x14, 0x3c, 0xad, 0x4e, 0x61, 0x10, 0x0a, 0x98, 0xb9,
0x89, 0xea, 0x03, 0x96, 0xf4, 0x03, 0x2e, 0x5b, 0xb0, 0xda, 0x32, 0xda, 0x0b, 0xf6, 0xca, 0x28,
0xc3, 0x65, 0x78, 0x9c, 0xe1, 0x25, 0x88, 0x2c, 0x61, 0x84, 0x96, 0x19, 0xe6, 0xed, 0x92, 0x46,
0x23, 0x6e, 0xd5, 0x5b, 0x46, 0x7b, 0x06, 0xe6, 0x84, 0x16, 0xc4, 0x5d, 0x7e, 0x42, 0x67, 0x77,
0x39, 0xf9, 0x33, 0xc3, 0x95, 0x20, 0x4a, 0x69, 0x89, 0x66, 0xee, 0x20, 0x59, 0xa5, 0x2e, 0xf4,
0xd8, 0x02, 0xa4, 0xba, 0x79, 0x94, 0xe1, 0x06, 0x75, 0x0e, 0x6c, 0xe1, 0xd8, 0x0e, 0x1e, 0x33,
0x51, 0x28, 0x37, 0x37, 0x74, 0xa1, 0x34, 0x92, 0x27, 0x7e, 0x7a, 0xb8, 0x32, 0x11, 0x46, 0x8b,
0x20, 0x73, 0x03, 0xd5, 0xc3, 0xd8, 0x73, 0xc2, 0xee, 0x4e, 0xe8, 0xf4, 0xb8, 0xf5, 0xdb, 0x1c,
0x7c, 0x3c, 0x9c, 0x22, 0xe0, 0x9b, 0x02, 0xd6, 0x2f, 0x5d, 0x40, 0x84, 0x96, 0xfc, 0xe6, 0x2d,
0xd4, 0x50, 0x12, 0x95, 0x5a, 0xf8, 0x7d, 0x0e, 0x4e, 0x12, 0x6a, 0xa8, 0x1c, 0x4a, 0x0d, 0x4b,
0x65, 0x65, 0x4b, 0x39, 0x94, 0x19, 0xe5, 0xf1, 0x3e, 0xfb, 0x26, 0xe3, 0x9d, 0xa2, 0x39, 0x35,
0x65, 0xad, 0x39, 0x88, 0x7b, 0xff, 0x28, 0xc3, 0x88, 0x3a, 0x07, 0x5b, 0x12, 0x15, 0x59, 0x14,
0x41, 0x67, 0x51, 0xb6, 0x98, 0x95, 0x25, 0x26, 0xcd, 0x79, 0xa2, 0x63, 0xa2, 0xb8, 0x5b, 0x96,
0xc6, 0x3c, 0xa4, 0x86, 0x8e, 0x89, 0xe2, 0x8f, 0x27, 0xc4, 0x21, 0x3b, 0x66, 0x02, 0x25, 0x74,
0x92, 0xa5, 0x46, 0xef, 0x27, 0xa8, 0x06, 0x47, 0x01, 0xb3, 0xff, 0x36, 0x9a, 0x95, 0xdd, 0xa0,
0x26, 0xff, 0xb9, 0x42, 0xc1, 0x40, 0x12, 0x12, 0xb6, 0xff, 0xa7, 0x26, 0x84, 0xa2, 0x8e, 0x33,
0x5c, 0x2f, 0x4e, 0x9a, 0x50, 0x05, 0x93, 0x1f, 0x0c, 0x74, 0x7e, 0x2b, 0xf2, 0x83, 0x84, 0x79,
0xa9, 0xaa, 0x27, 0xe3, 0xf7, 0xa2, 0x70, 0x78, 0x3a, 0xad, 0x7a, 0x6a, 0x87, 0x4c, 0xbe, 0xab,
0xa2, 0xd9, 0x1b, 0xf1, 0x5e, 0x94, 0x72, 0xf3, 0x0a, 0x9a, 0xd9, 0x09, 0x42, 0xc6, 0xe1, 0xca,
0x99, 0xb1, 0xf1, 0x28, 0xc3, 0x12, 0xd0, 0x1f, 0x09, 0x96, 0xee, 0x11, 0xe9, 0x34, 0x3f, 0x42,
0x75, 0xf9, 0x9d, 0x71, 0x12, 0x30, 0x0e, 0xdd, 0x3f, 0x63, 0xbf, 0x27, 0xde, 0xa4, 0x04, 0xeb,
0x37, 0x29, 0x61, 0x3a, 0x51, 0x99, 0x68, 0x5e, 0x47, 0xf3, 0x6a, 0xb6, 0x71, 0xb8, 0xcf, 0x66,
0xec, 0x4b, 0x30, 0x57, 0x15, 0x56, 0xcc, 0x55, 0x05, 0xe8, 0x2c, 0x9a, 0x62, 0x7e, 0x50, 0x08,
0xb7, 0x0a, 0x19, 0x2e, 0xfe, 0x9d, 0x70, 0xf3, 0x78, 0xad, 0xdf, 0x0e, 0x9a, 0x71, 0x87, 0x29,
0xcb, 0x2f, 0x47, 0x4b, 0xd4, 0x01, 0x80, 0xe2, 0xb0, 0x85, 0x45, 0xa8, 0x44, 0x27, 0x6e, 0x82,
0xd9, 0x37, 0xbc, 0x09, 0xb6, 0x51, 0x4d, 0xee, 0x32, 0xdd, 0xc0, 0x87, 0x4b, 0xa0, 0x61, 0xaf,
0x1f, 0x65, 0x78, 0x5e, 0xee, 0x27, 0x70, 0x33, 0xce, 0x4b, 0xc2, 0x96, 0xaf, 0x13, 0xe5, 0x80,
0xe8, 0x16, 0xcd, 0xa4, 0x9a, 0x27, 0x24, 0x56, 0x1e, 0x24, 0xe6, 0xdb, 0xcc, 0x11, 0xd5, 0x20,
0x5f, 0x1a, 0xa8, 0x26, 0xe5, 0xb1, 0xcd, 0x52, 0xf3, 0x3a, 0x9a, 0xf5, 0xc0, 0x50, 0x1d, 0x82,
0xc4, 0x6e, 0x24, 0xdd, 0x45, 0x63, 0x48, 0x86, 0xae, 0x15, 0x98, 0x84, 0x2a, 0x58, 0x0c, 0x15,
0x2f, 0x61, 0x4e, 0xbe, 0x33, 0x56, 0xe4, 0x50, 0x51, 0x90, 0x3e, 0x1b, 0x65, 0x13, 0x9a, 0x7b,
0xc8, 0x57, 0xd3, 0xe8, 0x7c, 0x69, 0x0b, 0xdb, 0x60, 0x83, 0x84, 0xc9, 0x45, 0xe9, 0x74, 0x77,
0xda, 0x35, 0x34, 0x2b, 0xeb, 0x08, 0xaf, 0xd7, 0xb0, 0x97, 0xc5, 0x27, 0x49, 0xe4, 0xc4, 0x66,
0xaa, 0x70, 0xf1, 0x4d, 0xf9, 0xc0, 0xab, 0x14, 0x83, 0xf2, 0x55, 0x23, 0xae, 0x18, 0x6a, 0xeb,
0x93, 0x3a, 0x7d, 0xdd, 0x01, 0x4b, 0x0e, 0xd0, 0xf9, 0xd2, 0xce, 0x5a, 0x2a, 0xc5, 0xa7, 0x27,
0xb6, 0xd7, 0x7f, 0xbf, 0xb4, 0xbd, 0x16, 0x64, 0xfb, 0xff, 0xaa, 0x28, 0xaf, 0x5e, 0x5c, 0x4f,
0x6c, 0xaa, 0x4f, 0x0c, 0xb4, 0x78, 0xcf, 0xe5, 0x2c, 0xd9, 0x67, 0xfe, 0x66, 0x1c, 0xfa, 0x2c,
0x31, 0xef, 0xa2, 0xaa, 0xf8, 0x5f, 0xa2, 0x4a, 0xbf, 0xdc, 0x91, 0x7f, 0x5a, 0x3a, 0xf9, 0x9f,
0x96, 0xce, 0xfd, 0xfc, 0x4f, 0x8b, 0xdd, 0x54, 0xbf, 0x07, 0xfc, 0xe2, 0xf2, 0x0f, 0xfa, 0x8c,
0x3c, 0xf9, 0x15, 0x1b, 0x14, 0x70, 0xd1, 0x7c, 0xa1, 0xe3, 0xb2, 0x10, 0xca, 0x5f, 0x93, 0xcd,
0x07, 0x80, 0x16, 0x14, 0x58, 0x84, 0x4a, 0x94, 0xfc, 0x54, 0x7a, 0x25, 0xd9, 0x0a, 0xa7, 0xfe,
0x4a, 0xf9, 0x26, 0x3e, 0xfd, 0x1a, 0x9b, 0xf8, 0x3a, 0x9a, 0x73, 0x7c, 0x3f, 0x61, 0x5c, 0x0e,
0xaf, 0x9a, 0x3c, 0x52, 0x05, 0xe9, 0x02, 0x2b, 0x9b, 0xd0, 0xdc, 0x63, 0xdf, 0x7c, 0xfe, 0xa2,
0x39, 0x75, 0xf8, 0xa2, 0x39, 0xf5, 0xfc, 0xa8, 0x69, 0x1c, 0x1e, 0x35, 0x8d, 0x27, 0xc7, 0xcd,
0xa9, 0x67, 0xc7, 0x4d, 0xe3, 0xf0, 0xb8, 0x39, 0xf5, 0xf3, 0x71, 0x73, 0xea, 0xb3, 0x4b, 0xaf,
0xb1, 0xfe, 0xfa, 0xae, 0x3b, 0x0b, 0x9f, 0x79, 0xf9, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9e,
0xa0, 0xbe, 0xf2, 0x7d, 0x0e, 0x00, 0x00,
// 1445 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xcf, 0x6f, 0x1b, 0x45,
0x14, 0xce, 0xc6, 0xce, 0x0f, 0x8f, 0x9d, 0xb4, 0xd9, 0xd2, 0xc8, 0x04, 0xf0, 0x98, 0x69, 0x2a,
0x19, 0x90, 0x1c, 0x29, 0x55, 0x23, 0x54, 0x09, 0xaa, 0x6e, 0x43, 0xda, 0x54, 0xa5, 0x45, 0x93,
0xaa, 0x20, 0x38, 0x58, 0xfb, 0x63, 0xe2, 0xac, 0xba, 0xde, 0x35, 0x3b, 0x9b, 0xa4, 0xee, 0x8d,
0x0b, 0x12, 0xb7, 0xaa, 0xe2, 0x80, 0x10, 0x42, 0x3d, 0xf1, 0x27, 0xf0, 0x17, 0x70, 0xe8, 0x31,
0x47, 0xc4, 0x61, 0x51, 0x93, 0x0b, 0x58, 0xe2, 0xe2, 0x13, 0xe2, 0x84, 0xe6, 0xcd, 0xec, 0xec,
0xba, 0x51, 0x51, 0x5b, 0x72, 0xdb, 0xf7, 0xbd, 0xef, 0x3d, 0xef, 0xbc, 0xf9, 0xde, 0xdb, 0x67,
0xf4, 0x5a, 0xe0, 0x3b, 0x2b, 0x9e, 0xb3, 0xc2, 0x93, 0x78, 0xd7, 0x4d, 0x78, 0xbb, 0x1f, 0x47,
0x49, 0x64, 0x4e, 0x7a, 0xce, 0xd2, 0xb9, 0x98, 0xf5, 0x23, 0xbe, 0x02, 0x80, 0xb3, 0xbb, 0xbd,
0xd2, 0x8d, 0xba, 0x11, 0x18, 0xf0, 0x24, 0x89, 0x4b, 0xb8, 0x1b, 0x45, 0xdd, 0x80, 0xe5, 0xac,
0xc4, 0xef, 0x31, 0x9e, 0xd8, 0xbd, 0xbe, 0x22, 0x2c, 0x8a, 0xfc, 0xf0, 0xe8, 0x46, 0xc1, 0x8a,
0xc3, 0x32, 0xbc, 0xc2, 0xee, 0x27, 0xf2, 0x91, 0xfc, 0x38, 0x89, 0xaa, 0x1b, 0x7e, 0xc0, 0xee,
0xb2, 0x98, 0xfb, 0x51, 0x68, 0xde, 0x44, 0x33, 0x7b, 0xf2, 0xb1, 0x6e, 0x34, 0x8d, 0x56, 0x75,
0xf5, 0x74, 0x3b, 0x4b, 0xd0, 0xbe, 0xcb, 0xdc, 0x24, 0x8a, 0xad, 0xe6, 0x93, 0x14, 0x4f, 0x0c,
0x53, 0x9c, 0x11, 0x47, 0x29, 0x9e, 0xbb, 0xdf, 0x0b, 0x2e, 0x11, 0x65, 0x13, 0x9a, 0x79, 0xcc,
0x35, 0x34, 0xe3, 0xb1, 0x80, 0x25, 0xcc, 0xab, 0x4f, 0x36, 0x8d, 0xd6, 0xac, 0xf5, 0xa6, 0x88,
0x53, 0x90, 0x8e, 0x53, 0x36, 0xa1, 0x99, 0xc7, 0xbc, 0x28, 0xe2, 0xf6, 0x7c, 0x97, 0xf1, 0x7a,
0xa9, 0x59, 0x6a, 0xd5, 0xac, 0x37, 0x64, 0x1c, 0x40, 0xa3, 0x14, 0xd7, 0x54, 0x9c, 0xb0, 0x21,
0x0c, 0x1c, 0x26, 0x45, 0xa7, 0xfc, 0x70, 0xcf, 0x0e, 0x7c, 0xaf, 0x93, 0x85, 0x97, 0x21, 0xfc,
0x9d, 0x61, 0x8a, 0xe7, 0x95, 0x6b, 0x5d, 0x67, 0x39, 0x03, 0x59, 0xc6, 0x60, 0x42, 0x9f, 0xa1,
0x91, 0xaf, 0x0c, 0x54, 0x55, 0xc5, 0xb9, 0xe9, 0xf3, 0xc4, 0x0c, 0xd0, 0xac, 0x3a, 0x1d, 0xaf,
0x1b, 0xcd, 0x52, 0xab, 0xba, 0x7a, 0xaa, 0xed, 0x39, 0xed, 0x42, 0x0d, 0xad, 0xcb, 0xa2, 0x40,
0x87, 0x29, 0xae, 0x52, 0x7b, 0x5f, 0x61, 0x7c, 0x98, 0x62, 0x1d, 0x77, 0xac, 0x60, 0x8f, 0x0e,
0x96, 0x8b, 0x5c, 0xaa, 0x99, 0x97, 0xca, 0xdf, 0x3d, 0xc6, 0x13, 0xe4, 0x6f, 0x84, 0x16, 0xc4,
0x0f, 0x6c, 0x86, 0xdb, 0xd1, 0x9d, 0x78, 0x37, 0x74, 0x6d, 0x51, 0xa4, 0x77, 0x51, 0x39, 0xb4,
0x7b, 0x0c, 0xee, 0xa9, 0x62, 0x2d, 0x0e, 0x53, 0x0c, 0xf6, 0x28, 0xc5, 0x08, 0xb2, 0x0b, 0x83,
0x50, 0xc0, 0x04, 0x97, 0xfb, 0x0f, 0x58, 0xbd, 0xd4, 0x34, 0x5a, 0x25, 0xc9, 0x15, 0xb6, 0xe6,
0x0a, 0x83, 0x50, 0xc0, 0xcc, 0xcb, 0x08, 0xf5, 0x22, 0xcf, 0xdf, 0xf6, 0x99, 0xd7, 0xe1, 0xf5,
0x29, 0x88, 0x68, 0x0e, 0x53, 0x5c, 0xc9, 0xd0, 0xad, 0x51, 0x8a, 0x4f, 0x41, 0x98, 0x46, 0x08,
0xcd, 0xbd, 0xe6, 0xcf, 0x06, 0xaa, 0xea, 0x0c, 0xce, 0xa0, 0x5e, 0x6b, 0x1a, 0xad, 0xb2, 0xf5,
0xad, 0x21, 0xca, 0xf2, 0x5b, 0x8a, 0x2f, 0x74, 0xfd, 0x64, 0x67, 0xd7, 0x69, 0xbb, 0x51, 0x6f,
0x85, 0x0f, 0x42, 0x37, 0xd9, 0xf1, 0xc3, 0x6e, 0xe1, 0xa9, 0x28, 0xda, 0xf6, 0xd6, 0x4e, 0x14,
0x27, 0x9b, 0xeb, 0xc3, 0x14, 0xeb, 0x97, 0xb2, 0x06, 0xa3, 0x14, 0x9f, 0x1e, 0xfb, 0x7d, 0x6b,
0x40, 0xbe, 0x3f, 0x58, 0x7e, 0x95, 0xc4, 0xb4, 0x90, 0xb6, 0x28, 0xfe, 0xca, 0xff, 0x17, 0xff,
0x25, 0x34, 0xcb, 0xd9, 0x97, 0xbb, 0x2c, 0x74, 0x59, 0x1d, 0x41, 0x15, 0x1b, 0x42, 0x05, 0x19,
0x36, 0x4a, 0xf1, 0xbc, 0xac, 0xbd, 0x02, 0x08, 0xd5, 0x3e, 0xf3, 0x36, 0x9a, 0xe7, 0x83, 0x5e,
0xe0, 0x87, 0xf7, 0x3a, 0x89, 0x1d, 0x77, 0x59, 0x52, 0x5f, 0x80, 0x5b, 0x6e, 0x0d, 0x53, 0x3c,
0xa7, 0x3c, 0x77, 0xc0, 0xa1, 0x75, 0x3c, 0x86, 0x12, 0x3a, 0xce, 0x32, 0xaf, 0xa2, 0xaa, 0x13,
0x44, 0xee, 0x3d, 0xde, 0xd9, 0xb1, 0xf9, 0x4e, 0xdd, 0x6c, 0x1a, 0xad, 0x9a, 0x45, 0x44, 0x59,
0x25, 0x7c, 0xdd, 0xe6, 0x3b, 0xba, 0xac, 0x39, 0x44, 0x68, 0xc1, 0x6f, 0x7e, 0x88, 0x2a, 0x2c,
0x74, 0xe3, 0x41, 0x5f, 0x34, 0xf4, 0x19, 0x48, 0x01, 0xc2, 0xd0, 0xa0, 0x16, 0x86, 0x46, 0x08,
0xcd, 0xbd, 0xa6, 0x85, 0xca, 0xc9, 0xa0, 0xcf, 0x60, 0x16, 0xcc, 0xaf, 0x2e, 0xe6, 0xc5, 0xd5,
0xe2, 0x1e, 0xf4, 0x99, 0x54, 0xa7, 0xe0, 0x69, 0x75, 0x0a, 0x83, 0x50, 0xc0, 0xcc, 0x0d, 0x54,
0xed, 0xb3, 0xb8, 0xe7, 0x73, 0xd9, 0x82, 0xe5, 0xa6, 0xd1, 0x9a, 0xb3, 0x96, 0x87, 0x29, 0x2e,
0xc2, 0xa3, 0x14, 0x2f, 0x40, 0x64, 0x01, 0x23, 0xb4, 0xc8, 0x30, 0x6f, 0x14, 0x34, 0x1a, 0xf2,
0x7a, 0xb5, 0x69, 0xb4, 0xa6, 0x60, 0x4e, 0x68, 0x41, 0xdc, 0xe2, 0xc7, 0x74, 0x76, 0x8b, 0x93,
0x7f, 0x52, 0x5c, 0xf2, 0xc3, 0x84, 0x16, 0x68, 0xe6, 0x36, 0x92, 0x55, 0xea, 0x40, 0x8f, 0xcd,
0x41, 0xaa, 0x6b, 0x87, 0x29, 0xae, 0x51, 0x7b, 0xdf, 0x12, 0x8e, 0x2d, 0xff, 0x01, 0x13, 0x85,
0x72, 0x32, 0x43, 0x17, 0x4a, 0x23, 0x59, 0xe2, 0x47, 0x07, 0xcb, 0x63, 0x61, 0x34, 0x0f, 0x32,
0xd7, 0x51, 0x35, 0x88, 0x5c, 0x3b, 0xe8, 0x6c, 0x07, 0x76, 0x97, 0xd7, 0xff, 0x98, 0x81, 0xc3,
0xc3, 0x2d, 0x02, 0xbe, 0x21, 0x60, 0xfd, 0xd2, 0x39, 0x44, 0x68, 0xc1, 0x6f, 0x5e, 0x47, 0x35,
0x25, 0x51, 0xa9, 0x85, 0x3f, 0x67, 0xe0, 0x26, 0xa1, 0x86, 0xca, 0xa1, 0xd4, 0xb0, 0x50, 0x54,
0xb6, 0x94, 0x43, 0x91, 0x51, 0x1c, 0xef, 0xd3, 0x2f, 0x33, 0xde, 0x29, 0x9a, 0x51, 0x53, 0xb6,
0x3e, 0x03, 0x71, 0xef, 0x1f, 0xa6, 0x18, 0x51, 0x7b, 0x7f, 0x53, 0xa2, 0x22, 0x8b, 0x22, 0xe8,
0x2c, 0xca, 0x16, 0xb3, 0xb2, 0xc0, 0xa4, 0x19, 0x4f, 0x74, 0x4c, 0x18, 0x75, 0x8a, 0xd2, 0x98,
0x85, 0xd4, 0xd0, 0x31, 0x61, 0xf4, 0xc9, 0x98, 0x38, 0x64, 0xc7, 0x8c, 0xa1, 0x84, 0x8e, 0xb3,
0xd4, 0xe8, 0xfd, 0x14, 0x55, 0xe0, 0x2a, 0x60, 0xf6, 0xdf, 0x40, 0xd3, 0xb2, 0x1b, 0xd4, 0xe4,
0x3f, 0x93, 0x2b, 0x18, 0x48, 0x42, 0xc2, 0xd6, 0x5b, 0x6a, 0x42, 0x28, 0xea, 0x28, 0xc5, 0xd5,
0xfc, 0xa6, 0x09, 0x55, 0x30, 0xf9, 0xc9, 0x40, 0x67, 0x37, 0x43, 0xcf, 0x8f, 0x99, 0x9b, 0xa8,
0x7a, 0x32, 0x7e, 0x3b, 0x0c, 0x06, 0x27, 0xd3, 0xaa, 0x27, 0x76, 0xc9, 0xe4, 0x87, 0x32, 0x9a,
0xbe, 0x1a, 0xed, 0x86, 0x09, 0x37, 0x2f, 0xa2, 0xa9, 0x6d, 0x3f, 0x60, 0x1c, 0x3e, 0x39, 0x53,
0x16, 0x1e, 0xa6, 0x58, 0x02, 0xfa, 0x90, 0x60, 0xe9, 0x1e, 0x91, 0x4e, 0xf3, 0x63, 0x54, 0x95,
0xe7, 0x8c, 0x62, 0x9f, 0x71, 0xe8, 0xfe, 0x29, 0xeb, 0x3d, 0xf1, 0x26, 0x05, 0x58, 0xbf, 0x49,
0x01, 0xd3, 0x89, 0x8a, 0x44, 0xf3, 0x0a, 0x9a, 0x55, 0xb3, 0x8d, 0xc3, 0xf7, 0x6c, 0xca, 0x3a,
0x0f, 0x73, 0x55, 0x61, 0xf9, 0x5c, 0x55, 0x80, 0xce, 0xa2, 0x29, 0xe6, 0x07, 0xb9, 0x70, 0xcb,
0x90, 0xe1, 0xdc, 0x7f, 0x09, 0x37, 0x8b, 0xd7, 0xfa, 0x6d, 0xa3, 0x29, 0x67, 0x90, 0xb0, 0xec,
0xe3, 0x58, 0x17, 0x75, 0x00, 0x20, 0xbf, 0x6c, 0x61, 0x11, 0x2a, 0xd1, 0xb1, 0x2f, 0xc1, 0xf4,
0x4b, 0x7e, 0x09, 0xb6, 0x50, 0x45, 0xee, 0x32, 0x1d, 0xdf, 0x83, 0x8f, 0x40, 0xcd, 0x5a, 0x3b,
0x4c, 0xf1, 0xac, 0xdc, 0x4f, 0xe0, 0xcb, 0x38, 0x2b, 0x09, 0x9b, 0x9e, 0x4e, 0x94, 0x01, 0xa2,
0x5b, 0x34, 0x93, 0x6a, 0x9e, 0x90, 0x58, 0x71, 0x90, 0x98, 0xaf, 0x32, 0x47, 0x54, 0x83, 0x7c,
0x6d, 0xa0, 0x8a, 0x94, 0xc7, 0x16, 0x4b, 0xcc, 0x2b, 0x68, 0xda, 0x05, 0x43, 0x75, 0x08, 0x12,
0xbb, 0x91, 0x74, 0xe7, 0x8d, 0x21, 0x19, 0xba, 0x56, 0x60, 0x12, 0xaa, 0x60, 0x31, 0x54, 0xdc,
0x98, 0xd9, 0xd9, 0xce, 0x58, 0x92, 0x43, 0x45, 0x41, 0xfa, 0x6e, 0x94, 0x4d, 0x68, 0xe6, 0x21,
0xdf, 0x4c, 0xa2, 0xb3, 0x85, 0x2d, 0x6c, 0x9d, 0xf5, 0x63, 0x26, 0x17, 0xa5, 0x93, 0xdd, 0x69,
0x57, 0xd1, 0xb4, 0xac, 0x23, 0xbc, 0x5e, 0xcd, 0x5a, 0x12, 0x47, 0x92, 0xc8, 0xb1, 0xcd, 0x54,
0xe1, 0xe2, 0x4c, 0xd9, 0xc0, 0x2b, 0xe5, 0x83, 0xf2, 0x79, 0x23, 0x2e, 0x1f, 0x6a, 0x6b, 0xe3,
0x3a, 0x7d, 0xd1, 0x01, 0x4b, 0xf6, 0xd1, 0xd9, 0xc2, 0xce, 0x5a, 0x28, 0xc5, 0x67, 0xc7, 0xb6,
0xd7, 0xd7, 0x9f, 0xd9, 0x5e, 0x73, 0xb2, 0xf5, 0xb6, 0x2a, 0xca, 0xf3, 0x17, 0xd7, 0x63, 0x9b,
0xea, 0x5f, 0x06, 0x9a, 0xbf, 0xed, 0x70, 0x16, 0xef, 0x31, 0x6f, 0x23, 0x0a, 0x3c, 0x16, 0x9b,
0xb7, 0x50, 0x59, 0xfc, 0x2f, 0x51, 0xa5, 0x5f, 0x6a, 0xcb, 0x3f, 0x2d, 0xed, 0xec, 0x4f, 0x4b,
0xfb, 0x4e, 0xf6, 0xa7, 0xc5, 0x6a, 0xa8, 0xdf, 0x03, 0x7e, 0xfe, 0xf1, 0xf7, 0x7b, 0x8c, 0x3c,
0xfc, 0x1d, 0x1b, 0x14, 0x70, 0xd1, 0x7c, 0x81, 0xed, 0xb0, 0x00, 0xca, 0x5f, 0x91, 0xcd, 0x07,
0x80, 0x16, 0x14, 0x58, 0x84, 0x4a, 0xd4, 0xfc, 0x02, 0x2d, 0xc4, 0xcc, 0x65, 0xfe, 0x1e, 0xeb,
0xe4, 0xcb, 0x8b, 0xbc, 0x85, 0xf6, 0x30, 0xc5, 0xa7, 0x95, 0xf3, 0xa3, 0xc2, 0x0e, 0xb3, 0x08,
0x69, 0x9e, 0x75, 0x10, 0x7a, 0x8c, 0x4b, 0x7e, 0x29, 0x9c, 0x57, 0xf6, 0xd9, 0x89, 0x9f, 0x37,
0x5b, 0xf3, 0x27, 0x5f, 0x60, 0xcd, 0x5f, 0x43, 0x33, 0xb6, 0xe7, 0xc5, 0x8c, 0xcb, 0xc9, 0x58,
0x91, 0x7a, 0x51, 0x90, 0xbe, 0x3d, 0x65, 0x13, 0x9a, 0x79, 0xac, 0x6b, 0x4f, 0x9e, 0x36, 0x26,
0x0e, 0x9e, 0x36, 0x26, 0x9e, 0x1c, 0x36, 0x8c, 0x83, 0xc3, 0x86, 0xf1, 0xf0, 0xa8, 0x31, 0xf1,
0xf8, 0xa8, 0x61, 0x1c, 0x1c, 0x35, 0x26, 0x7e, 0x3d, 0x6a, 0x4c, 0x7c, 0x7e, 0xfe, 0x05, 0x76,
0x6b, 0xcf, 0x71, 0xa6, 0xe1, 0x98, 0x17, 0xfe, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xbf, 0x3c, 0x81,
0x94, 0xda, 0x0e, 0x00, 0x00,
}
func (m *FileVersion) Marshal() (dAtA []byte, err error) {
@ -1142,6 +1145,16 @@ func (m *ObservedFolder) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
if m.ReceiveEncrypted {
i--
if m.ReceiveEncrypted {
dAtA[i] = 1
} else {
dAtA[i] = 0
}
i--
dAtA[i] = 0x18
}
if len(m.Label) > 0 {
i -= len(m.Label)
copy(dAtA[i:], m.Label)
@ -1456,6 +1469,9 @@ func (m *ObservedFolder) ProtoSize() (n int) {
if l > 0 {
n += 1 + l + sovStructs(uint64(l))
}
if m.ReceiveEncrypted {
n += 2
}
return n
}
@ -3099,6 +3115,26 @@ func (m *ObservedFolder) Unmarshal(dAtA []byte) error {
}
m.Label = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 3:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field ReceiveEncrypted", wireType)
}
var v int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowStructs
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
v |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
m.ReceiveEncrypted = bool(v != 0)
default:
iNdEx = preIndex
skippy, err := skipStructs(dAtA[iNdEx:])

View File

@ -1289,7 +1289,7 @@ func (m *model) ccHandleFolders(folders []protocol.Folder, deviceCfg config.Devi
tempIndexFolders := make([]string, 0, len(folders))
paused := make(map[string]struct{}, len(folders))
seenFolders := make(map[string]struct{}, len(folders))
updatedPending := make([]map[string]string, 0, len(folders))
updatedPending := make([]updatedPendingFolder, 0, len(folders))
deviceID := deviceCfg.DeviceID
for _, folder := range folders {
seenFolders[folder.ID] = struct{}{}
@ -1304,14 +1304,16 @@ func (m *model) ccHandleFolders(folders []protocol.Folder, deviceCfg config.Devi
l.Infof("Ignoring folder %s from device %s since we are configured to", folder.Description(), deviceID)
continue
}
if err := m.db.AddOrUpdatePendingFolder(folder.ID, folder.Label, deviceID); err != nil {
recvEnc := len(ccDeviceInfos[folder.ID].local.EncryptionPasswordToken) > 0
if err := m.db.AddOrUpdatePendingFolder(folder.ID, folder.Label, deviceID, recvEnc); err != nil {
l.Warnf("Failed to persist pending folder entry to database: %v", err)
}
indexSenders.addPending(cfg, ccDeviceInfos[folder.ID])
updatedPending = append(updatedPending, map[string]string{
"folderID": folder.ID,
"folderLabel": folder.Label,
"deviceID": deviceID.String(),
updatedPending = append(updatedPending, updatedPendingFolder{
FolderID: folder.ID,
FolderLabel: folder.Label,
DeviceID: deviceID,
ReceiveEncrypted: recvEnc,
})
// DEPRECATED: Only for backwards compatibility, should be removed.
m.evLogger.Log(events.FolderRejected, map[string]string{
@ -2022,6 +2024,10 @@ func (m *model) LoadIgnores(folder string) ([]string, []string, error) {
}
}
if cfg.Type == config.FolderTypeReceiveEncrypted {
return nil, nil, nil
}
// On creation a new folder with ignore patterns validly has no marker yet.
if err := cfg.CheckPath(); err != nil && err != config.ErrMarkerMissing {
return nil, nil, err
@ -3177,3 +3183,10 @@ func newFolderConfiguration(w config.Wrapper, id, label string, fsType fs.Filesy
fcfg.Path = path
return fcfg
}
type updatedPendingFolder struct {
FolderID string `json:"folderID"`
FolderLabel string `json:"folderLabel"`
DeviceID protocol.DeviceID `json:"deviceID"`
ReceiveEncrypted bool `json:"receiveEncrypted"`
}

View File

@ -4177,7 +4177,7 @@ func TestPendingFolder(t *testing.T) {
setDevice(t, w, config.DeviceConfiguration{DeviceID: device2})
pfolder := "default"
if err := m.db.AddOrUpdatePendingFolder(pfolder, pfolder, device2); err != nil {
if err := m.db.AddOrUpdatePendingFolder(pfolder, pfolder, device2, false); err != nil {
t.Fatal(err)
}
deviceFolders, err := m.PendingFolders(protocol.EmptyDeviceID)
@ -4193,7 +4193,7 @@ func TestPendingFolder(t *testing.T) {
device3, err := protocol.DeviceIDFromString("AIBAEAQ-CAIBAEC-AQCAIBA-EAQCAIA-BAEAQCA-IBAEAQC-CAIBAEA-QCAIBA7")
setDevice(t, w, config.DeviceConfiguration{DeviceID: device3})
if err := m.db.AddOrUpdatePendingFolder(pfolder, pfolder, device3); err != nil {
if err := m.db.AddOrUpdatePendingFolder(pfolder, pfolder, device3, false); err != nil {
t.Fatal(err)
}
deviceFolders, err = m.PendingFolders(device2)

View File

@ -91,8 +91,9 @@ message VersionListDeprecated {
}
message ObservedFolder {
google.protobuf.Timestamp time = 1 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false];
string label = 2;
google.protobuf.Timestamp time = 1 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false];
string label = 2;
bool receive_encrypted = 3;
}
message ObservedDevice {