Skip to content

Commit 20c4cc4

Browse files
Seed display names for session attribute fields (mattermost#37033)
* Seed display names for session attribute fields Co-authored-by: maria.nunez <maria.nunez@mattermost.com> * Extract session attribute display names into named constants Co-authored-by: maria.nunez <maria.nunez@mattermost.com> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com>
1 parent aad6c8a commit 20c4cc4

5 files changed

Lines changed: 119 additions & 22 deletions

File tree

server/channels/api4/user_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10693,6 +10693,47 @@ func TestGetSessionAttributesManifest(t *testing.T) {
1069310693
CheckOKStatus(t, resp)
1069410694
require.Empty(t, manifest)
1069510695
})
10696+
10697+
t.Run("enabled field carries its seeded display name", func(t *testing.T) {
10698+
const desktopUserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Mattermost/3.7.1 Chrome/56.0.2924.87 Electron/1.6.11 Safari/537.36"
10699+
10700+
group, appErr := th.App.GetPropertyGroup(th.Context, model.SessionAttributesPropertyGroupName)
10701+
require.Nil(t, appErr)
10702+
fields, appErr := th.App.SearchPropertyFields(th.Context, group.ID, model.PropertyFieldSearchOpts{PerPage: 100})
10703+
require.Nil(t, appErr)
10704+
10705+
var hardwareField *model.PropertyField
10706+
for _, field := range fields {
10707+
if field.Name == model.SessionAttributesPropertyFieldHardwareID {
10708+
hardwareField = field
10709+
break
10710+
}
10711+
}
10712+
require.NotNil(t, hardwareField)
10713+
if hardwareField.Attrs == nil {
10714+
hardwareField.Attrs = model.StringInterface{}
10715+
}
10716+
hardwareField.Attrs["enabled"] = true
10717+
_, _, appErr = th.App.UpdatePropertyFields(th.Context, group.ID, []*model.PropertyField{hardwareField}, true, "")
10718+
require.Nil(t, appErr)
10719+
10720+
th.Client.HTTPHeader = map[string]string{"User-Agent": desktopUserAgent}
10721+
defer func() { th.Client.HTTPHeader = nil }()
10722+
10723+
manifest, resp, err := th.Client.GetSessionAttributesManifest(context.Background())
10724+
require.NoError(t, err)
10725+
CheckOKStatus(t, resp)
10726+
10727+
var hardwareEntry *model.SessionAttributeManifestEntry
10728+
for _, entry := range manifest {
10729+
if entry.Name == model.SessionAttributesPropertyFieldHardwareID {
10730+
hardwareEntry = entry
10731+
break
10732+
}
10733+
}
10734+
require.NotNil(t, hardwareEntry)
10735+
require.Equal(t, model.SessionAttributesDisplayNameHardwareID, hardwareEntry.DisplayName)
10736+
})
1069610737
}
1069710738

1069810739
// setSessionAttributeDeviceID configures the test client to send a desktop

server/channels/app/migrations.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -892,6 +892,7 @@ func (s *Server) seedSessionAttributeFields(groupID string) error {
892892
if current, ok := existingByName[expected.Name]; ok {
893893
current.Type = expected.Type
894894
current.Attrs["platforms"] = expected.Attrs["platforms"]
895+
current.Attrs[model.SAAttrDisplayName] = expected.Attrs[model.SAAttrDisplayName]
895896
current.ObjectType = expected.ObjectType
896897
current.TargetType = expected.TargetType
897898
current.Protected = expected.Protected

server/channels/app/migrations_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,7 @@ func TestDoSetupSessionAttributesProperties(t *testing.T) {
387387
require.NotNil(t, field.PermissionValues)
388388
require.Equal(t, model.PermissionLevelSysadmin, *field.PermissionValues, "field %q permission_values", field.Name)
389389
require.Equal(t, false, field.Attrs["enabled"], "field %q must seed disabled", field.Name)
390+
require.NotEmpty(t, field.Attrs[model.SAAttrDisplayName], "field %q must seed a display name", field.Name)
390391
}
391392

392393
ipField := fieldsByName[model.SessionAttributesPropertyFieldIPAddress]
@@ -401,6 +402,7 @@ func TestDoSetupSessionAttributesProperties(t *testing.T) {
401402
// The typed attrs must survive the DB round trip so the app reads back what it seeded.
402403
saField, err := model.SAFieldFromPropertyField(networkField)
403404
require.NoError(t, err)
405+
require.Equal(t, model.SessionAttributesDisplayNameNetworkInterfaceType, saField.Attrs.DisplayName)
404406
require.Equal(t, model.SessionAttributeDefaultTTLNetworkIdentity, saField.Attrs.TTLSeconds)
405407
require.Equal(t, model.SessionAttributeDefaultGraceNetworkIdentity, saField.Attrs.GracePeriodSeconds)
406408
require.ElementsMatch(t,

server/public/model/session_attributes.go

Lines changed: 45 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,28 @@ const (
4040
SessionAttributesPropertyFieldIPAddress = "ip_address"
4141
)
4242

43+
const (
44+
SessionAttributesDisplayNameClientIPAddress = "Client IP address"
45+
SessionAttributesDisplayNameNetworkInterfaceType = "Network interface type"
46+
SessionAttributesDisplayNameVPNActive = "VPN active"
47+
SessionAttributesDisplayNameSSID = "SSID"
48+
SessionAttributesDisplayNameTLSDDeviceID = "TLS device ID"
49+
SessionAttributesDisplayNameClientDeviceID = "Device ID"
50+
SessionAttributesDisplayNameMDMEnrolled = "MDM enrolled"
51+
SessionAttributesDisplayNameHardwareID = "Hardware ID"
52+
SessionAttributesDisplayNameOSPlatform = "OS platform"
53+
SessionAttributesDisplayNameOSVersion = "OS version"
54+
SessionAttributesDisplayNameClientVersion = "Client version"
55+
SessionAttributesDisplayNameJailbreakDetected = "Jailbreak detected"
56+
SessionAttributesDisplayNameServerFQDN = "Server FQDN"
57+
SessionAttributesDisplayNameClientFQDN = "Client FQDN"
58+
SessionAttributesDisplayNameUserAgentPlatform = "User agent platform"
59+
SessionAttributesDisplayNameUserAgentOS = "User agent OS"
60+
SessionAttributesDisplayNameUserAgentBrowserName = "User agent browser name"
61+
SessionAttributesDisplayNameUserAgentBrowserVersion = "User agent browser version"
62+
SessionAttributesDisplayNameIPAddress = "IP address"
63+
)
64+
4365
const (
4466
SAAttrEnabled = "enabled"
4567
SAAttrPlatforms = "platforms"
@@ -184,8 +206,9 @@ func sessionAttributeFieldAttrs(platforms []string, ttl, grace int) StringInterf
184206
}
185207
}
186208

187-
func sessionAttributeField(groupID, name string, fieldType PropertyFieldType, platforms []string, ttl, grace int, extraAttrs StringInterface) *PropertyField {
209+
func sessionAttributeField(groupID, name, displayName string, fieldType PropertyFieldType, platforms []string, ttl, grace int, extraAttrs StringInterface) *PropertyField {
188210
attrs := sessionAttributeFieldAttrs(platforms, ttl, grace)
211+
attrs[SAAttrDisplayName] = displayName
189212
maps.Copy(attrs, extraAttrs)
190213
return &PropertyField{
191214
GroupID: groupID,
@@ -217,9 +240,9 @@ func SessionAttributeSystemFields(groupID string) []*PropertyField {
217240
}
218241

219242
return []*PropertyField{
220-
sessionAttributeField(groupID, SessionAttributesPropertyFieldIPAddress, PropertyFieldTypeText, allPlatforms, SessionAttributeDefaultTTLNetworkIdentity, SessionAttributeDefaultGraceNetworkIdentity, nil),
221-
sessionAttributeField(groupID, SessionAttributesPropertyFieldClientIPAddress, PropertyFieldTypeText, clientsOnly, SessionAttributeDefaultTTLNetworkIdentity, SessionAttributeDefaultGraceNetworkIdentity, nil),
222-
sessionAttributeField(groupID, SessionAttributesPropertyFieldNetworkInterfaceType, PropertyFieldTypeSelect, clientsOnly, SessionAttributeDefaultTTLNetworkIdentity, SessionAttributeDefaultGraceNetworkIdentity, StringInterface{
243+
sessionAttributeField(groupID, SessionAttributesPropertyFieldIPAddress, SessionAttributesDisplayNameIPAddress, PropertyFieldTypeText, allPlatforms, SessionAttributeDefaultTTLNetworkIdentity, SessionAttributeDefaultGraceNetworkIdentity, nil),
244+
sessionAttributeField(groupID, SessionAttributesPropertyFieldClientIPAddress, SessionAttributesDisplayNameClientIPAddress, PropertyFieldTypeText, clientsOnly, SessionAttributeDefaultTTLNetworkIdentity, SessionAttributeDefaultGraceNetworkIdentity, nil),
245+
sessionAttributeField(groupID, SessionAttributesPropertyFieldNetworkInterfaceType, SessionAttributesDisplayNameNetworkInterfaceType, PropertyFieldTypeSelect, clientsOnly, SessionAttributeDefaultTTLNetworkIdentity, SessionAttributeDefaultGraceNetworkIdentity, StringInterface{
223246
PropertyFieldAttributeOptions: []map[string]string{
224247
{"name": "wifi"},
225248
{"name": "ethernet"},
@@ -229,23 +252,23 @@ func SessionAttributeSystemFields(groupID string) []*PropertyField {
229252
{"name": "other"},
230253
},
231254
}),
232-
sessionAttributeField(groupID, SessionAttributesPropertyFieldVPNActive, PropertyFieldTypeSelect, clientsOnly, SessionAttributeDefaultTTLNetworkIdentity, SessionAttributeDefaultGraceNetworkIdentity, boolSelectOptions),
233-
sessionAttributeField(groupID, SessionAttributesPropertyFieldSSID, PropertyFieldTypeText, clientsOnly, SessionAttributeDefaultTTLNetworkIdentity, SessionAttributeDefaultGraceNetworkIdentity, nil),
234-
235-
sessionAttributeField(groupID, SessionAttributesPropertyFieldMDMEnrolled, PropertyFieldTypeSelect, clientsOnly, SessionAttributeDefaultTTLPosture, SessionAttributeDefaultGracePosture, boolSelectOptions),
236-
sessionAttributeField(groupID, SessionAttributesPropertyFieldJailbreakDetected, PropertyFieldTypeSelect, mobileOnly, SessionAttributeDefaultTTLPosture, SessionAttributeDefaultGracePosture, boolSelectOptions),
237-
sessionAttributeField(groupID, SessionAttributesPropertyFieldOSPlatform, PropertyFieldTypeText, clientsOnly, SessionAttributeDefaultTTLPosture, SessionAttributeDefaultGracePosture, nil),
238-
sessionAttributeField(groupID, SessionAttributesPropertyFieldOSVersion, PropertyFieldTypeText, clientsOnly, SessionAttributeDefaultTTLPosture, SessionAttributeDefaultGracePosture, nil),
239-
sessionAttributeField(groupID, SessionAttributesPropertyFieldClientVersion, PropertyFieldTypeText, clientsOnly, SessionAttributeDefaultTTLPosture, SessionAttributeDefaultGracePosture, nil),
240-
241-
sessionAttributeField(groupID, SessionAttributesPropertyFieldUserAgentPlatform, PropertyFieldTypeText, allPlatforms, SessionAttributeDefaultTTLIdentity, SessionAttributeDefaultGraceIdentity, nil),
242-
sessionAttributeField(groupID, SessionAttributesPropertyFieldUserAgentOS, PropertyFieldTypeText, allPlatforms, SessionAttributeDefaultTTLIdentity, SessionAttributeDefaultGraceIdentity, nil),
243-
sessionAttributeField(groupID, SessionAttributesPropertyFieldUserAgentBrowserName, PropertyFieldTypeText, allPlatforms, SessionAttributeDefaultTTLIdentity, SessionAttributeDefaultGraceIdentity, nil),
244-
sessionAttributeField(groupID, SessionAttributesPropertyFieldUserAgentBrowserVersion, PropertyFieldTypeText, allPlatforms, SessionAttributeDefaultTTLIdentity, SessionAttributeDefaultGraceIdentity, nil),
245-
sessionAttributeField(groupID, SessionAttributesPropertyFieldTLSDDeviceID, PropertyFieldTypeText, desktopBrowser, SessionAttributeDefaultTTLIdentity, SessionAttributeDefaultGraceIdentity, nil),
246-
sessionAttributeField(groupID, SessionAttributesPropertyFieldClientDeviceID, PropertyFieldTypeText, mobileOnly, SessionAttributeDefaultTTLIdentity, SessionAttributeDefaultGraceIdentity, nil),
247-
sessionAttributeField(groupID, SessionAttributesPropertyFieldHardwareID, PropertyFieldTypeText, desktopOnly, SessionAttributeDefaultTTLIdentity, SessionAttributeDefaultGraceIdentity, nil),
248-
sessionAttributeField(groupID, SessionAttributesPropertyFieldServerFQDN, PropertyFieldTypeText, clientsOnly, SessionAttributeDefaultTTLIdentity, SessionAttributeDefaultGraceIdentity, nil),
249-
sessionAttributeField(groupID, SessionAttributesPropertyFieldClientFQDN, PropertyFieldTypeText, desktopOnly, SessionAttributeDefaultTTLIdentity, SessionAttributeDefaultGraceIdentity, nil),
255+
sessionAttributeField(groupID, SessionAttributesPropertyFieldVPNActive, SessionAttributesDisplayNameVPNActive, PropertyFieldTypeSelect, clientsOnly, SessionAttributeDefaultTTLNetworkIdentity, SessionAttributeDefaultGraceNetworkIdentity, boolSelectOptions),
256+
sessionAttributeField(groupID, SessionAttributesPropertyFieldSSID, SessionAttributesDisplayNameSSID, PropertyFieldTypeText, clientsOnly, SessionAttributeDefaultTTLNetworkIdentity, SessionAttributeDefaultGraceNetworkIdentity, nil),
257+
258+
sessionAttributeField(groupID, SessionAttributesPropertyFieldMDMEnrolled, SessionAttributesDisplayNameMDMEnrolled, PropertyFieldTypeSelect, clientsOnly, SessionAttributeDefaultTTLPosture, SessionAttributeDefaultGracePosture, boolSelectOptions),
259+
sessionAttributeField(groupID, SessionAttributesPropertyFieldJailbreakDetected, SessionAttributesDisplayNameJailbreakDetected, PropertyFieldTypeSelect, mobileOnly, SessionAttributeDefaultTTLPosture, SessionAttributeDefaultGracePosture, boolSelectOptions),
260+
sessionAttributeField(groupID, SessionAttributesPropertyFieldOSPlatform, SessionAttributesDisplayNameOSPlatform, PropertyFieldTypeText, clientsOnly, SessionAttributeDefaultTTLPosture, SessionAttributeDefaultGracePosture, nil),
261+
sessionAttributeField(groupID, SessionAttributesPropertyFieldOSVersion, SessionAttributesDisplayNameOSVersion, PropertyFieldTypeText, clientsOnly, SessionAttributeDefaultTTLPosture, SessionAttributeDefaultGracePosture, nil),
262+
sessionAttributeField(groupID, SessionAttributesPropertyFieldClientVersion, SessionAttributesDisplayNameClientVersion, PropertyFieldTypeText, clientsOnly, SessionAttributeDefaultTTLPosture, SessionAttributeDefaultGracePosture, nil),
263+
264+
sessionAttributeField(groupID, SessionAttributesPropertyFieldUserAgentPlatform, SessionAttributesDisplayNameUserAgentPlatform, PropertyFieldTypeText, allPlatforms, SessionAttributeDefaultTTLIdentity, SessionAttributeDefaultGraceIdentity, nil),
265+
sessionAttributeField(groupID, SessionAttributesPropertyFieldUserAgentOS, SessionAttributesDisplayNameUserAgentOS, PropertyFieldTypeText, allPlatforms, SessionAttributeDefaultTTLIdentity, SessionAttributeDefaultGraceIdentity, nil),
266+
sessionAttributeField(groupID, SessionAttributesPropertyFieldUserAgentBrowserName, SessionAttributesDisplayNameUserAgentBrowserName, PropertyFieldTypeText, allPlatforms, SessionAttributeDefaultTTLIdentity, SessionAttributeDefaultGraceIdentity, nil),
267+
sessionAttributeField(groupID, SessionAttributesPropertyFieldUserAgentBrowserVersion, SessionAttributesDisplayNameUserAgentBrowserVersion, PropertyFieldTypeText, allPlatforms, SessionAttributeDefaultTTLIdentity, SessionAttributeDefaultGraceIdentity, nil),
268+
sessionAttributeField(groupID, SessionAttributesPropertyFieldTLSDDeviceID, SessionAttributesDisplayNameTLSDDeviceID, PropertyFieldTypeText, desktopBrowser, SessionAttributeDefaultTTLIdentity, SessionAttributeDefaultGraceIdentity, nil),
269+
sessionAttributeField(groupID, SessionAttributesPropertyFieldClientDeviceID, SessionAttributesDisplayNameClientDeviceID, PropertyFieldTypeText, mobileOnly, SessionAttributeDefaultTTLIdentity, SessionAttributeDefaultGraceIdentity, nil),
270+
sessionAttributeField(groupID, SessionAttributesPropertyFieldHardwareID, SessionAttributesDisplayNameHardwareID, PropertyFieldTypeText, desktopOnly, SessionAttributeDefaultTTLIdentity, SessionAttributeDefaultGraceIdentity, nil),
271+
sessionAttributeField(groupID, SessionAttributesPropertyFieldServerFQDN, SessionAttributesDisplayNameServerFQDN, PropertyFieldTypeText, clientsOnly, SessionAttributeDefaultTTLIdentity, SessionAttributeDefaultGraceIdentity, nil),
272+
sessionAttributeField(groupID, SessionAttributesPropertyFieldClientFQDN, SessionAttributesDisplayNameClientFQDN, PropertyFieldTypeText, desktopOnly, SessionAttributeDefaultTTLIdentity, SessionAttributeDefaultGraceIdentity, nil),
250273
}
251274
}

server/public/model/session_attributes_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,36 @@ func TestSAFieldFromPropertyField(t *testing.T) {
3333
assert.Equal(t, "VPN Active", saField.Attrs.DisplayName)
3434
}
3535

36+
func TestSessionAttributeSystemFieldsDisplayNames(t *testing.T) {
37+
fields := SessionAttributeSystemFields("group-id")
38+
require.NotEmpty(t, fields)
39+
40+
displayNamesByName := make(map[string]string, len(fields))
41+
for _, field := range fields {
42+
saField, err := SAFieldFromPropertyField(field)
43+
require.NoError(t, err)
44+
require.NotEmpty(t, saField.Attrs.DisplayName, "field %q must have a display name", field.Name)
45+
displayNamesByName[field.Name] = saField.Attrs.DisplayName
46+
}
47+
48+
expected := map[string]string{
49+
SessionAttributesPropertyFieldClientIPAddress: SessionAttributesDisplayNameClientIPAddress,
50+
SessionAttributesPropertyFieldNetworkInterfaceType: SessionAttributesDisplayNameNetworkInterfaceType,
51+
SessionAttributesPropertyFieldVPNActive: SessionAttributesDisplayNameVPNActive,
52+
SessionAttributesPropertyFieldSSID: SessionAttributesDisplayNameSSID,
53+
SessionAttributesPropertyFieldClientDeviceID: SessionAttributesDisplayNameClientDeviceID,
54+
SessionAttributesPropertyFieldHardwareID: SessionAttributesDisplayNameHardwareID,
55+
SessionAttributesPropertyFieldMDMEnrolled: SessionAttributesDisplayNameMDMEnrolled,
56+
SessionAttributesPropertyFieldClientVersion: SessionAttributesDisplayNameClientVersion,
57+
SessionAttributesPropertyFieldOSPlatform: SessionAttributesDisplayNameOSPlatform,
58+
SessionAttributesPropertyFieldOSVersion: SessionAttributesDisplayNameOSVersion,
59+
SessionAttributesPropertyFieldJailbreakDetected: SessionAttributesDisplayNameJailbreakDetected,
60+
}
61+
for name, displayName := range expected {
62+
assert.Equal(t, displayName, displayNamesByName[name], "display name for %q", name)
63+
}
64+
}
65+
3666
func TestSAFieldEnabledForPlatform(t *testing.T) {
3767
field := &PropertyField{
3868
Name: SessionAttributesPropertyFieldVPNActive,

0 commit comments

Comments
 (0)