Tomas Touceda
084fcdfec4
Disallow target ids null altogether ( #1578 )
2021-08-06 13:20:45 -03:00
Tomas Touceda
3b67366bf4
Allow filtering by status as well as label and match query when listing hosts ( #1562 )
2021-08-05 14:56:29 -03:00
Tomas Touceda
f8b7a83cc6
Process stored CPEs and store found CVEs ( #1533 )
...
* WIP
* WIP
* Make path optional and fix tests
* Add first generate
* Move to nvd package
* remove replace
* Re-add replace
* It's path, not file name
* Change how db path is set and use etag
* Fix typos
* Make db generation faster
* Remove quotes
* Doesn't like comments
* Samitize etag and save to file
* Refactor some things and improve writing of etagenv
* Compress file and truncate amount of items for faster testing
* Remove quotes
* Try to improve performance
* Ignore truncate error if not exists
* Minor cleanup and make sqlite have cpe prefix
* Simplify code and test sync
* Add VCR for sync test
* Check for nvdRelease nil
* Add test for the actual translation
* Address review comments
* Rename generate command because we'll have a cve one too
* Move to its own dir
* Add first cve db generation
* WIP but with final strategy, preparring to merge main
* Fix merge conflicts
* WIP
* wip
* Insert CVEs to the db
* Remove unused code
* Use wg instead of counting
* Call cancelFunc to avoid ctx leak
* Fix logs for better readability
* Point code to fleetdm instead of my repo
2021-08-04 18:01:39 -03:00
Tomas Touceda
8cdf61f8df
Remove inmem store ( #1534 )
...
* Remove inmem store
* Use full package name for db to avoid conflicts
* Fix lint
* Remove unneeded check/comment
2021-08-04 10:40:04 -03:00
Tomas Touceda
65630290d6
Ignore duplicate host software ( #1546 )
...
* Insert ignore software if there's a duplicate
* Add test for trigger of duplicate host software
2021-08-04 10:12:07 -03:00
Tomas Touceda
52ae04ecf5
Only log distributed queries ingestion errors (except for one case) ( #1535 )
...
* Don't return errors in distributed query ingestion, just log them
* Allow for multiple errors in the logging context
* Update check when loading host
* Log multiple errors and add tests for other changes
* Add missing host func
* Add another missing host func
* Add changes file
2021-08-04 10:11:51 -03:00
Zach Wasserman
416038a689
Update usage of os.IsNotExist ( #1539 )
...
Per [godoc](https://pkg.go.dev/os#IsNotExist ), this is the preferred method.
2021-08-03 13:02:15 -07:00
Tomas Touceda
f2837fd4b3
Make decoder completely generic and simplify things ( #1542 )
...
* Make decoder completely generic and simplify things
* Add commends and unexport func
2021-08-03 16:56:54 -03:00
Tomas Touceda
7730515be7
Implement team schedules ( #1528 )
...
* Implement team schedules
* Improve description
2021-08-03 10:33:27 -03:00
Tomas Touceda
5859db36bb
Move logger up to the HTTP layer and make it generic ( #1439 )
...
* Add basic idea
* Implement the new logging strategy everywhere
* Remove unused const
* Add tests and fix error cases
* Fix logging in osquery service
* If there are extras, log info unless force debug
* Change to info
* Fix test
* Make logging context more chainable and force info for sessions
2021-08-02 19:06:27 -03:00
Tomas Touceda
18037ab4bd
Skip match to not add empty searches ( #1522 )
2021-07-30 16:18:38 -03:00
Benjamin Edwards
c18214be37
add logging settings to config api response ( #1467 )
...
- add docker-compose file for locally testing aws dependencies
- update firehose & kinesis configs to optionally supply endpoint url override
- serialize `logging` field in appconfig api response
2021-07-30 11:45:49 -04:00
Tomas Touceda
46b0b7765b
Issue 1435 software to cpe ( #1488 )
...
* WIP
* WIP
* Make path optional and fix tests
* Add first generate
* Move to nvd package
* remove replace
* Re-add replace
* It's path, not file name
* Change how db path is set and use etag
* Fix typos
* Make db generation faster
* Remove quotes
* Doesn't like comments
* Samitize etag and save to file
* Refactor some things and improve writing of etagenv
* Compress file and truncate amount of items for faster testing
* Remove quotes
* Try to improve performance
* Ignore truncate error if not exists
* Minor cleanup and make sqlite have cpe prefix
* Simplify code and test sync
* Add VCR for sync test
* Check for nvdRelease nil
* Add test for the actual translation
* Address review comments
* Rename generate command because we'll have a cve one too
* Move to its own dir
* Address review comments
2021-07-29 13:10:34 -03:00
Tomas Touceda
866e8a2961
Fix typo, it's target_count ( #1478 )
...
* Fix typo, it's target_count
* Update server/service/service_campaigns.go
Co-authored-by: gillespi314 <73313222+gillespi314@users.noreply.github.com>
Co-authored-by: gillespi314 <73313222+gillespi314@users.noreply.github.com>
2021-07-26 16:12:18 -03:00
Tomas Touceda
8f854144c5
Return email as well in activities ( #1466 )
...
* Return email as well in activities
* Add team name
2021-07-23 17:00:26 -03:00
Tomas Touceda
4cd169cad7
Return gravatar whenever available ( #1448 )
2021-07-22 12:28:42 -03:00
Benjamin Edwards
799243ffb5
Windows friendly changes after walking through getting started guide ( #1441 )
...
* update .gitattributes to be explicit about line endings with regards to the test certs
* update building-fleet guide to include python2 dependency on windows
* update configuration to default to OS specific temporary directories
2021-07-21 20:49:44 -04:00
Tomas Touceda
484c6153e3
Issue 1359 fleetctl team transfer ( #1413 )
...
* wip
* Add delete user command and translator
* Add host transfer command
* Add changes file
* Undo bad refactor
* Fix copypaste error
* Implement with interfaces instead of assertions
* Ad documentation and simplify implementation further
* Update docs/1-Using-Fleet/3-REST-API.md
Co-authored-by: Zach Wasserman <zach@fleetdm.com>
Co-authored-by: Zach Wasserman <zach@fleetdm.com>
2021-07-21 14:03:10 -03:00
Tomas Touceda
ece05eeaed
Issue 1321 usage statistics ( #1415 )
...
* WIP
* Send usage analytics
* Improve loggin of cron tasks and fix test
* Implement appconfig method now that we are checking that as well
* Address review comments
2021-07-20 18:39:50 -03:00
Tomas Touceda
a6cff7ea89
Migrate all mysql tests to the new form ( #1408 )
...
* Migrate all mysql tests to the new form
* Only dump sql if MYSQL_TEST is on
* Removing parallel until we get rid of this code
* Move TestMain to an actual _test file
* A little experiment with tmpfs to speed up the db
* Let's make sure the dump.sql file is also in ram
2021-07-19 18:20:31 -03:00
Tomas Touceda
9863b0f4bb
Issue 1361 fleetctl teams ( #1405 )
...
* WIP
* Add get user_roles and apply for a user_roles spec to fleetctl
* Uncomment other tests
* Update test to check output
* Update test with the new struct
* Mock token so that it doesn't pick up the one in the local machine
* Address review comments
* Fix printJSON and printYaml
* Fix merge conflict error
* WIP
* wip
* wip
* Finish implementation
* Address review comments
* Fix flaky test
2021-07-19 16:48:49 -03:00
Tomas Touceda
29570bd860
Issue 1278 select leader ( #1367 )
...
* Add leader selection
* remove comment
* Address review comments
* Add changes file
* Simplify implementation
* Simplify further
* Whoops, removed a little too much
2021-07-19 15:08:41 -03:00
Tomas Touceda
545b3f396e
Issue 1362 fleetctl user roles ( #1397 )
...
* WIP
* Add get user_roles and apply for a user_roles spec to fleetctl
* Uncomment other tests
* Update test to check output
* Update test with the new struct
* Mock token so that it doesn't pick up the one in the local machine
* Address review comments
* Fix printJSON and printYaml
* Fix merge conflict error
* If both roles are specified, fail
* Fix test
* Switch arguments around
* Update test with the new rule
* Fix other tests that fell through the cracks
2021-07-16 15:28:13 -03:00
Tomas Touceda
a38a7f4ad4
Refactor one mysql test to be able to run independently ( #1379 )
...
* Refactor one mysql test to be able to run independently
* Initialize schema once
* Address review comments
2021-07-16 13:13:51 -03:00
Tomas Touceda
2d553db2aa
Issue 1231 add global schedule ( #1383 )
...
* Add Global Schedule
* Uncomment tests
* Uncomment integration tests
* Add targets for global schedule
* Add host label
* Simplify implementation
* wip
* Fix mock
* Add missing test
* Further simplify the implementation
* Forgot to remove test name
* Update names
2021-07-16 10:15:15 -03:00
Tomas Touceda
804136127e
Remove repository sources from software inventory ( #1387 )
2021-07-15 10:23:27 -03:00
Tomas Touceda
74fecf0d5b
Remove duplicate enroll secrets ( #1388 )
2021-07-14 19:05:54 -03:00
Tomas Touceda
82ab0a798e
Add host users ( #1334 )
...
* Add host users
* Add changes file and test removing pull_request from the on test
* Remove users and store the removal timestamp
* Improve test yml to allow for PRs from forks
2021-07-13 17:15:38 -03:00
Tomas Touceda
d5e40f329e
Issue 1324 add activity feed ( #1343 )
...
* Add activities generation
* Add activities endpoint
* Fix merge error
* Fix indentation issue
* Add changes file
* Address PR review comments
* Add mock activity func
* Address codacy warings
* Set foreign key but on delete set null
* Make user_id set to null if deleted
2021-07-13 16:54:22 -03:00
Tomas Touceda
322ac3c8f6
Make roles for users mandatory ( #1338 )
...
* Make roles for users mandatory
* Remove nop migration
* Add missing test for wrong role
* Properly validate global and team roles
* Address codacy issues
* Address codacy review
* No need to check for nil
2021-07-13 16:33:04 -03:00
Zach Wasserman
8723b83039
Fix data race in inmem query results test ( #1369 )
...
Missed locking caused a race condition detected with the --race flag:
```
==================
WARNING: DATA RACE
Read at 0x00c0004b2cf0 by goroutine 67:
runtime.mapaccess2_fast64()
/usr/local/Cellar/go/1.16.5/libexec/src/runtime/map_fast64.go:52 +0x0
github.com/fleetdm/fleet/v4/server/pubsub.(*inmemQueryResults).WriteResult()
/Users/zwass/dev/fleet/server/pubsub/inmem_query_results.go:37 +0x84
github.com/fleetdm/fleet/v4/server/service.(*Service).ingestDistributedQuery()
/Users/zwass/dev/fleet/server/service/service_osquery.go:1020 +0x258
github.com/fleetdm/fleet/v4/server/service.TestIngestDistributedQueryRecordCompletionError()
/Users/zwass/dev/fleet/server/service/service_osquery_test.go:1499 +0x61c
testing.tRunner()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1193 +0x202
Previous write at 0x00c0004b2cf0 by goroutine 104:
runtime.mapassign_fast64()
/usr/local/Cellar/go/1.16.5/libexec/src/runtime/map_fast64.go:92 +0x0
github.com/fleetdm/fleet/v4/server/pubsub.(*inmemQueryResults).getChannel()
/Users/zwass/dev/fleet/server/pubsub/inmem_query_results.go:31 +0x1a4
github.com/fleetdm/fleet/v4/server/pubsub.(*inmemQueryResults).ReadChannel()
/Users/zwass/dev/fleet/server/pubsub/inmem_query_results.go:53 +0x64
github.com/fleetdm/fleet/v4/server/service.TestIngestDistributedQueryRecordCompletionError.func1()
/Users/zwass/dev/fleet/server/service/service_osquery_test.go:1493 +0x117
Goroutine 67 (running) created at:
testing.(*T).Run()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1238 +0x5d7
testing.runTests.func1()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1511 +0xa6
testing.tRunner()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1193 +0x202
testing.runTests()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1509 +0x612
testing.(*M).Run()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1417 +0x3b3
main.main()
_testmain.go:303 +0x236
Goroutine 104 (running) created at:
github.com/fleetdm/fleet/v4/server/service.TestIngestDistributedQueryRecordCompletionError()
/Users/zwass/dev/fleet/server/service/service_osquery_test.go:1492 +0x558
testing.tRunner()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1193 +0x202
==================
==================
WARNING: DATA RACE
Read at 0x00c0000ff2d8 by goroutine 67:
github.com/fleetdm/fleet/v4/server/pubsub.(*inmemQueryResults).WriteResult()
/Users/zwass/dev/fleet/server/pubsub/inmem_query_results.go:37 +0xa4
github.com/fleetdm/fleet/v4/server/service.(*Service).ingestDistributedQuery()
/Users/zwass/dev/fleet/server/service/service_osquery.go:1020 +0x258
github.com/fleetdm/fleet/v4/server/service.TestIngestDistributedQueryRecordCompletionError()
/Users/zwass/dev/fleet/server/service/service_osquery_test.go:1499 +0x61c
testing.tRunner()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1193 +0x202
Previous write at 0x00c0000ff2d8 by goroutine 104:
github.com/fleetdm/fleet/v4/server/pubsub.(*inmemQueryResults).getChannel()
/Users/zwass/dev/fleet/server/pubsub/inmem_query_results.go:31 +0x1bc
github.com/fleetdm/fleet/v4/server/pubsub.(*inmemQueryResults).ReadChannel()
/Users/zwass/dev/fleet/server/pubsub/inmem_query_results.go:53 +0x64
github.com/fleetdm/fleet/v4/server/service.TestIngestDistributedQueryRecordCompletionError.func1()
/Users/zwass/dev/fleet/server/service/service_osquery_test.go:1493 +0x117
Goroutine 67 (running) created at:
testing.(*T).Run()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1238 +0x5d7
testing.runTests.func1()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1511 +0xa6
testing.tRunner()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1193 +0x202
testing.runTests()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1509 +0x612
testing.(*M).Run()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1417 +0x3b3
main.main()
_testmain.go:303 +0x236
Goroutine 104 (running) created at:
github.com/fleetdm/fleet/v4/server/service.TestIngestDistributedQueryRecordCompletionError()
/Users/zwass/dev/fleet/server/service/service_osquery_test.go:1492 +0x558
testing.tRunner()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1193 +0x202
==================
--- FAIL: TestIngestDistributedQueryRecordCompletionError (0.01s)
service_osquery_test.go:1502: PASS: QueryCompletedByHost(string,uint)
testing.go:1092: race detected during execution of test
==================
WARNING: DATA RACE
Read at 0x00c0000f8570 by goroutine 70:
runtime.mapaccess2_fast64()
/usr/local/Cellar/go/1.16.5/libexec/src/runtime/map_fast64.go:52 +0x0
github.com/fleetdm/fleet/v4/server/pubsub.(*inmemQueryResults).WriteResult()
/Users/zwass/dev/fleet/server/pubsub/inmem_query_results.go:37 +0x84
github.com/fleetdm/fleet/v4/server/service.(*Service).ingestDistributedQuery()
/Users/zwass/dev/fleet/server/service/service_osquery.go:1020 +0x258
github.com/fleetdm/fleet/v4/server/service.TestIngestDistributedQuery()
/Users/zwass/dev/fleet/server/service/service_osquery_test.go:1530 +0x5bc
testing.tRunner()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1193 +0x202
Previous write at 0x00c0000f8570 by goroutine 71:
runtime.mapassign_fast64()
/usr/local/Cellar/go/1.16.5/libexec/src/runtime/map_fast64.go:92 +0x0
github.com/fleetdm/fleet/v4/server/pubsub.(*inmemQueryResults).getChannel()
/Users/zwass/dev/fleet/server/pubsub/inmem_query_results.go:31 +0x1a4
github.com/fleetdm/fleet/v4/server/pubsub.(*inmemQueryResults).ReadChannel()
/Users/zwass/dev/fleet/server/pubsub/inmem_query_results.go:53 +0x64
github.com/fleetdm/fleet/v4/server/service.TestIngestDistributedQuery.func1()
/Users/zwass/dev/fleet/server/service/service_osquery_test.go:1524 +0x117
Goroutine 70 (running) created at:
testing.(*T).Run()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1238 +0x5d7
testing.runTests.func1()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1511 +0xa6
testing.tRunner()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1193 +0x202
testing.runTests()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1509 +0x612
testing.(*M).Run()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1417 +0x3b3
main.main()
_testmain.go:303 +0x236
Goroutine 71 (running) created at:
github.com/fleetdm/fleet/v4/server/service.TestIngestDistributedQuery()
/Users/zwass/dev/fleet/server/service/service_osquery_test.go:1523 +0x4f4
testing.tRunner()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1193 +0x202
==================
==================
WARNING: DATA RACE
Read at 0x00c000c480d8 by goroutine 70:
github.com/fleetdm/fleet/v4/server/pubsub.(*inmemQueryResults).WriteResult()
/Users/zwass/dev/fleet/server/pubsub/inmem_query_results.go:37 +0xa4
github.com/fleetdm/fleet/v4/server/service.(*Service).ingestDistributedQuery()
/Users/zwass/dev/fleet/server/service/service_osquery.go:1020 +0x258
github.com/fleetdm/fleet/v4/server/service.TestIngestDistributedQuery()
/Users/zwass/dev/fleet/server/service/service_osquery_test.go:1530 +0x5bc
testing.tRunner()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1193 +0x202
Previous write at 0x00c000c480d8 by goroutine 71:
github.com/fleetdm/fleet/v4/server/pubsub.(*inmemQueryResults).getChannel()
/Users/zwass/dev/fleet/server/pubsub/inmem_query_results.go:31 +0x1bc
github.com/fleetdm/fleet/v4/server/pubsub.(*inmemQueryResults).ReadChannel()
/Users/zwass/dev/fleet/server/pubsub/inmem_query_results.go:53 +0x64
github.com/fleetdm/fleet/v4/server/service.TestIngestDistributedQuery.func1()
/Users/zwass/dev/fleet/server/service/service_osquery_test.go:1524 +0x117
Goroutine 70 (running) created at:
testing.(*T).Run()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1238 +0x5d7
testing.runTests.func1()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1511 +0xa6
testing.tRunner()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1193 +0x202
testing.runTests()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1509 +0x612
testing.(*M).Run()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1417 +0x3b3
main.main()
_testmain.go:303 +0x236
Goroutine 71 (running) created at:
github.com/fleetdm/fleet/v4/server/service.TestIngestDistributedQuery()
/Users/zwass/dev/fleet/server/service/service_osquery_test.go:1523 +0x4f4
testing.tRunner()
/usr/local/Cellar/go/1.16.5/libexec/src/testing/testing.go:1193 +0x202
==================
--- FAIL: TestIngestDistributedQuery (0.01s)
service_osquery_test.go:1532: PASS: QueryCompletedByHost(string,uint)
testing.go:1092: race detected during execution of test
FAIL
FAIL github.com/fleetdm/fleet/v4/server/service 42.743s
```
2021-07-13 12:27:41 -07:00
Zach Wasserman
bc1698767e
Fix Kinesis/Firehose error messages ( #1316 )
...
Previously we unintentionally logged the *pointer* when we intended to
log the *value* of how many records failed.
2021-07-12 10:18:02 -07:00
Tomas Touceda
f534b8b6fe
When creating a pack store team, host, and label ids provided ( #1332 )
...
* When creating a pack store team, host, and label ids provided
* Mock store to test only the service
2021-07-12 10:48:50 -03:00
gillespi314
2d16ad1608
Fix asset url for email template images ( #1347 )
2021-07-09 18:34:08 -05:00
Tomas Touceda
7d3d84faaf
Make it possible to clear host settings from app config ( #1339 )
2021-07-09 15:13:11 -03:00
Tomas Touceda
12215bfbbd
Disable user sso_enable if org is disabling sso ( #1331 )
...
* Disable user sso_enable if org is disabling sso
* Cleanup test
* Add withTx and use it in SaveConfig
2021-07-09 13:12:21 -03:00
Tomas Touceda
18fa2f6a02
Issue 1009 calculate diff software ( #1305 )
...
* First approach to diff
* Refactor things for better readability and testing
* Remove draft comment for algorithm
* Format things a bit better
* Remove unused and simplify code a bit
* Refactor for readability and testing
* Add changes file
* Implement new approach based on review comments
* Make sure to only delete from the current host
* Add single uninstall test and fix code
* Improve code based on review
2021-07-08 13:57:43 -03:00
Tomas Touceda
39034071ca
Issue 1286 improve errors ( #1322 )
...
* Refactor error handling for better extensibility and add more scaffolding for specific db errors
* Add integration tests to check errors from mysql are translated properly
* Address review comments
* Add changes file
2021-07-08 12:50:43 -03:00
Zach Wasserman
d790ff7d80
Allow Redis connection with unknown CLUSTER command ( #1312 )
...
This improves compatibility with GCP Memorystore Redis.
2021-07-07 15:57:32 -07:00
Tomas Touceda
64f6a2f790
Return a distinct error when the auth header is not available vs when it's bad ( #1294 )
2021-07-05 10:17:31 -03:00
Tomas Touceda
05ba38ce2f
Fetch all data for a host when listing it ( #1293 )
2021-07-02 12:59:42 -03:00
Zach Wasserman
8384034e04
Update create user validation and documentation ( #1285 )
...
Closes #1272
2021-07-02 08:35:26 -07:00
Zach Wasserman
8be9068c1c
Fix migration for MariaDB compatibility ( #1280 )
...
Give unique names to each new foreign key in the migrations.
Fixes #1279
2021-07-01 15:59:31 -07:00
Scott Lampert
fee860bc7a
Fix fleetctl setup requiring https for localhost ( #1270 )
...
This fixes a reversion with fleetctl setup that requires https even for localhost connections. This was previously fixed in #489 .
2021-06-30 15:31:37 -07:00
Zach Wasserman
e0799bbc59
Include Team names when listing label hosts ( #1267 )
...
Fixes #1266
2021-06-30 09:28:45 -07:00
Zach Wasserman
a7461d3ece
Improvements to fleetctl enroll secret specs ( #1244 )
...
- Do not render Team ID if null.
- Make request and response schema consistent (breaking change).
Fixes #186
2021-06-29 10:58:15 -07:00
Zach Wasserman
782020c320
Add logging for Teams endpoints ( #1254 )
2021-06-29 10:36:49 -07:00
Zach Wasserman
959c1fda81
Allow global maintainer to transfer hosts between Teams ( #1243 )
...
Reclassify these operations as "host write" to apply the appropriate permissions.
Fixes #1237
2021-06-28 16:57:56 -07:00
Zach Wasserman
c5280c0517
Add v4 suffix in go.mod ( #1224 )
2021-06-25 21:46:51 -07:00
gillespi314
da6394a6b7
Fix invite email template ( #1202 )
2021-06-25 14:10:03 -05:00