Skip to content

Conversation

@shivam-Purohit
Copy link
Contributor

@shivam-Purohit shivam-Purohit commented Dec 18, 2023

Button to switch between org only reports or all the reports
closes #1936

Description

Type of change

  • New feature (non-breaking change which adds functionality).

Checklist

  • I have read and understood the rules about how to Contribute to this project
  • The pull request is for the branch develop
  • A new plugin (analyzer, connector, visualizer, playbook, pivot or ingestor) was added or changed, in which case:
    • I strictly followed the documentation "How to create a Plugin"
    • Usage file was updated.
    • Advanced-Usage was updated (in case the plugin provides additional optional configuration).
    • If the plugin requires mocked testing, _monkeypatch() was used in its class to apply the necessary decorators.
    • I have dumped the configuration from Django Admin using the dumpplugin command and added it in the project as a data migration. [Doc]("How to create a Plugin")
    • If a File analyzer was added and it supports a mimetype which is not already supported, you added a sample of that type inside the archive test_files.zip and you added the default tests for that mimetype in test_classes.py.
    • If you created a new analyzer and it is free (does not require API keys), please add it in the FREE_TO_USE_ANALYZERS playbook in playbook_config.json.
    • Check if it could make sense to add that analyzer/connector to other freely available playbooks.
    • I have provided the resulting raw JSON of a finished analysis and a screenshot of the results.
  • If external libraries/packages with restrictive licenses were used, they were added in the Legal Notice section.
  • Linters (Black, Flake, Isort) gave 0 errors. If you have correctly installed pre-commit, it does these checks and adjustments on your behalf.
  • I have added tests for the feature/bug I solved (see tests folder). All the tests (new and old ones) gave 0 errors.
  • If changes were made to an existing model/serializer/view, the docs were updated and regenerated (check CONTRIBUTE.md).
  • If the GUI has been modified:
    • I have a provided a screenshot of the result in the PR.
    • I have created new frontend tests for the new component or updated existing ones.

Important Rules

  • If you miss to compile the Checklist properly, your PR won't be reviewed by the maintainers.
  • If your changes decrease the overall tests coverage (you will know after the Codecov CI job is done), you should add the required tests to fix the problem
  • Everytime you make changes to the PR and you think the work is done, you should explicitly ask for a review. After being reviewed and received a "change request", you should explicitly ask for a review again once you have made the requested changes.

@codecov
Copy link

codecov bot commented Dec 18, 2023

Codecov Report

Attention: 1628 lines in your changes are missing coverage. Please review.

Comparison is base (aa8820f) 66.75% compared to head (939141d) 75.60%.
Report is 1589 commits behind head on develop.

Additional details and impacted files

Impacted file tree graph

@@             Coverage Diff             @@
##           develop    #2028      +/-   ##
===========================================
+ Coverage    66.75%   75.60%   +8.84%     
===========================================
  Files           95      482     +387     
  Lines         3706    14461   +10755     
  Branches       519     1502     +983     
===========================================
+ Hits          2474    10933    +8459     
- Misses         941     2930    +1989     
- Partials       291      598     +307     
Files Coverage Δ
api_app/analyzers_manager/admin.py 100.00% <100.00%> (ø)
api_app/analyzers_manager/apps.py 100.00% <100.00%> (ø)
api_app/analyzers_manager/constants.py 100.00% <100.00%> (ø)
api_app/analyzers_manager/exceptions.py 100.00% <100.00%> (ø)
...app/analyzers_manager/file_analyzers/boxjs_scan.py 100.00% <100.00%> (ø)
...pi_app/analyzers_manager/file_analyzers/onenote.py 100.00% <100.00%> (ø)
...pi_app/analyzers_manager/file_analyzers/peframe.py 82.35% <100.00%> (ø)
...i_app/analyzers_manager/file_analyzers/rtf_info.py 48.64% <100.00%> (ø)
...s_manager/file_analyzers/xlm_macro_deobfuscator.py 62.50% <100.00%> (ø)
api_app/analyzers_manager/filters.py 100.00% <100.00%> (ø)
... and 237 more

... and 291 files with indirect coverage changes


Continue to review full report in Codecov by Sentry.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 3ae68f3...939141d. Read the comment docs.

@shivam-Purohit
Copy link
Contributor Author

@mlodic its almost done now. But the problem is the response is cached so if I change the users the previous response is shown not the new one.

@shivam-Purohit
Copy link
Contributor Author

this is how the UI looks like. I am not good with names. We can get the switch which has label inside the switch only. That looks way cooler though we will need to add one more library for that.
ubuntuMachine  Running  - Oracle VM VirtualBox 22-12-2023 13_05_45

@mlodic
Copy link
Member

mlodic commented Dec 22, 2023

hello @shivam-Purohit, thank you for your PR! :)

@mlodic its almost done now. But the problem is the response is cached so if I change the users the previous response is shown not the new one.

when you say "if I change the users", you mean if you logout and then login with another user?

We can get the switch which has label inside the switch only. That looks way cooler though we will need to add one more library for that.

Do you mean something like that?
image

This how we switch the visualization in the "Job Result" page. It could make sense to leverage the same component also here. Maybe you can call the 2 options: "Org / Global" and make it "toggable" only if the user is part of an org. Otherwise it could be hidden or disabled.
Maybe, I'd also put that component at the left of the time picker, not at the right.

Thoughts?

@mlodic mlodic linked an issue Dec 22, 2023 that may be closed by this pull request
Copy link
Member

@mlodic mlodic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there is some duplicated code that must be addressed

api_app/views.py Outdated
Comment on lines 688 to 524
if user:
filter_kwargs["user"] = user
if users:
filter_kwargs["user__in"] = users
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you can optimize the code by choosing a single parameter "users" here and change the filter based on the number of items in the list

api_app/views.py Outdated
Comment on lines 675 to 680
if organization:
return self.__aggregation_response_dynamic(
"md5", False, users=users_of_organization
)
else:
return self.__aggregation_response_dynamic("md5", False, user=current_user)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should call the aggregation method a single time, we need to optimize this code

api_app/views.py Outdated
Comment on lines 663 to 673
try:
if current_user.has_membership():
organization = current_user.membership.organization
if organization:
users_of_organization = [
membership.user for membership in organization.members.all()
]

except AttributeError:
# Handle the case where the user has no membership
logger.info("User has no membership.")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this code has been replicated lots of time. We need it just once

Comment on lines 38 to 50
/* eslint-disable */
var sendURL = JOB_AGG_STATUS_URI;
const porp = props.myprop;
const getValue = porp.key;
console.debug("props is ", getValue);
/* eslint-enable */

if (getValue) {
/* eslint-disable */
sendURL = JOB_AGG_STATUS_URI_ORG;
console.debug("this is sending to my urls", sendURL);
/* eslint-enable */
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

more generally, I don't think it is necessary to create new API endpoints for this case. We should use the URL parameters to customize the results. This would avoid a lot of additional code that would be really difficult to maintain.

Example:
aggregate/status -> like it is right now
aggregate/status?org=True -> with the toggle enabled

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah I was thinking the same. I just tried some sub-optimised code to check the core functionality. I will improve the code quality.

@shivam-Purohit
Copy link
Contributor Author

when you say "if I change the users", you mean if you logout and then login with another user?

yes same. To check / test the feature I created two more users and added one to my org. Though when i change the users i.e logout and login again I get the results from the previous user. But if we restart the container the new results do re-render. Either it caches the result or there is some bug in my code?

@shivam-Purohit
Copy link
Contributor Author

shivam-Purohit commented Dec 22, 2023

This how we switch the visualization in the "Job Result" page. It could make sense to leverage the same component also here. Maybe you can call the 2 options: "Org / Global" and make it "toggable" only if the user is part of an org. Otherwise it could be hidden or disabled.
Maybe, I'd also put that component at the left of the time picker, not at the right.

yes this look better. I will try that. But to disable the option if user is not part of any org we will need to send request to the backend during the rendering of dashboard.
if so then we wont need to check if user is part of any org in backend. Okay do need but the extra checks will be minimised

@mlodic
Copy link
Member

mlodic commented Dec 22, 2023

This how we switch the visualization in the "Job Result" page. It could make sense to leverage the same component also here. Maybe you can call the 2 options: "Org / Global" and make it "toggable" only if the user is part of an org. Otherwise it could be hidden or disabled.
Maybe, I'd also put that component at the left of the time picker, not at the right.

yes this look better. I will try that. But to disable the option if user is not part of any org we will need to send request to the backend during the rendering of dashboard. if so then we wont need to check if user is part of any org in backend.

yep I think there is already something similar in place for this case in the "plugin" section:
image
The button related to org's config is shown only if the user belongs to an org

@shivam-Purohit
Copy link
Contributor Author

button related to org's config is shown only if the user belongs to an org

thanks! i will take a look

@shivam-Purohit
Copy link
Contributor Author

ubuntuMachine  Running  - Oracle VM VirtualBox 28-12-2023 12_47_19
ubuntuMachine  Running  - Oracle VM VirtualBox 28-12-2023 11_49_46

@shivam-Purohit
Copy link
Contributor Author

hey @mlodic hope the Christmas went well!
i re-adjusted some code
changed the component to only render if the organisation exist for the user using useOrganisationStore components.
renamed new variables
and shifted some repeated code to new function

@shivam-Purohit
Copy link
Contributor Author

ubuntuMachine Running - Oracle VM VirtualBox 28-12-2023 12_47_19 ubuntuMachine Running - Oracle VM VirtualBox 28-12-2023 11_49_46

this is how it looks. I have to change some layout to fit in new structure. If I just move the buttongroup component above the timepicker in like the original code it was breaking like the buttongroup was moving to the left so i separated both the title and this components (timepicker and buttongroup).

@shivam-Purohit shivam-Purohit marked this pull request as ready for review December 28, 2023 07:27
@mlodic
Copy link
Member

mlodic commented Dec 29, 2023

hey, I hope this message finds you well :)

I saw the images, that feels good!

Copy link
Member

@mlodic mlodic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cool to me, do you want to make a little review @drosetti too?

api_app/views.py Outdated
)

logger = logging.getLogger(__name__)
logger = logging.getLogger("__name__")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why this change?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I changed it while I was trying to add a console logger. I was having some problem with log file to see the recent changes. I will revert it back.

api_app/views.py Outdated
Comment on lines 419 to 422
org_param = request.GET.get("org", "").lower() == "true"
users_of_organization = None
if org_param:
users_of_organization = self.get_org_members(request.user)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this could be a method returning users_of_organization, right?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes returns all the members in the organisation

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I meant that those 4 lines could be a method which returns users_of_organization.

I am telling you this because I saw the code repeated multiple times

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@shivam-Purohit onceyou get some time, if you could just do this little refactor then we can merge this PR :) thank you

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry i missed the comment above earlier. I think the new refactor should be good.

Copy link
Contributor

@drosetti drosetti left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you did a good job, I requested little changes (most of them on the names of the const/var). Be careful with eslint-disable, I know sometimes it's annoying, but it's useful to have same code style with many developers, it should be disabled only in rare cases.

Edit: you can ask to me to review the pr after the changes. In every case if you have some doubts or questions, ask me :D

Comment on lines 75 to 103
{/* <div className="g-0 d-flex align-items-baseline flex-column flex-lg-row mb-2">
<h3 className="fw-bold" id="Dashboard_title">
Dashboard
</h3>
<ButtonGroup className="ms-2 mb-3 d-flex align-items-center">
<Button
outline={!state}
color={state ? "primary" : "tertiary"}
onClick={() => handleChange()}
>
GLOBAL
</Button>
<Button
outline={state}
color={!state ? "primary" : "tertiary"}
onClick={() => handleChange()}
>
ORG
</Button>
</ButtonGroup>
<ElasticTimePicker
className="ms-auto"
size="sm"
defaultSelected={range}
onChange={onTimeIntervalChange}
id="Dashboard_timepicker"
/>
</div> */}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove this comment

<ButtonGroup className="mb-3">
<Button
outline={orgstate}
color={!orgstate ? "primary" : "tertiary"}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suggest to reverse the check, i think it's easier to understand:
orgstate ? "tertiary" : "primary"

// const isSelectedUI = JobResultSections.VISUALIZER;
const { guideState, setGuideState } = useGuideContext();

const [orgstate, setorgState] = useState(() => false);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's a very silly suggestion but I'd to have orgState, it has the same style of guideState (it's strange the linter doesn't mark this)

/* eslint-enable */

/* eslint-disable */
sendURL = `${JOB_AGG_STATUS_URI}?org=${getValue}`;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pls use a more specific name for this const, what do you think about ORG_JOB_AGG_STATUS_URI ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sure!

@shivam-Purohit
Copy link
Contributor Author

@drosetti I have made the changes requested. One more thing I noticed is in the aggregate_observable_classification.Its counts the new ipv6 addressing IPs in the generic and not in the IP classification. That also reflect in the chart named Job: Frequent IPs, Hash & Domains which also does not count ipv6 IPs.
I can create a new issue regarding this and if it is not on higher priority I can fix that.

@drosetti
Copy link
Contributor

drosetti commented Jan 4, 2024

@shivam-Purohit I think this problem in the dashboard is related to the fact that the regex doesn't allow IPv6, then they are classified as generic and not show in the dashboard charts. Matteo told me you previously changed the regex to accept IPv6, I think I deleted it during a refactor, my apologies. However, I resolved and restored your work on the regex: in the develop branch you can find the refex that accept both IPv4 and IPv6, with a rebase everything should work, let me know if you have some problems.

I also check your code and approved your pr from a frontend prospective, good work 💪

Signed-off-by: Shivam Purohit <[email protected]>
Signed-off-by: Shivam Purohit <[email protected]>
Signed-off-by: Shivam Purohit <[email protected]>
Signed-off-by: Shivam Purohit <[email protected]>
Signed-off-by: Shivam Purohit <[email protected]>
Signed-off-by: Shivam Purohit <[email protected]>
Signed-off-by: Shivam Purohit <[email protected]>
Signed-off-by: Shivam Purohit <[email protected]>
Signed-off-by: Shivam Purohit <[email protected]>
Signed-off-by: Shivam Purohit <[email protected]>
@shivam-Purohit
Copy link
Contributor Author

shivam-Purohit commented Jan 5, 2024

ubuntuMachine  Running  - Oracle VM VirtualBox 05-01-2024 18_09_39

@drosetti Thanks! I think we should be done here. Do let me know if further changes are required.

edit : there was some prettier error after the rebase in tests/constants/regexConst.test.js. I covered it in a commit if that's okay

Signed-off-by: Shivam Purohit <[email protected]>
Signed-off-by: Shivam Purohit <[email protected]>
@mlodic mlodic merged commit 3c9094f into intelowlproject:develop Jan 5, 2024
mlodic added a commit that referenced this pull request Jan 12, 2024
* Using correct pipeline to manage visualizers (#2044)

* Using correct pipeline to manage visualizers

Signed-off-by: 0ssigeno <[email protected]>

* Fix tests

Signed-off-by: 0ssigeno <[email protected]>

---------

Signed-off-by: 0ssigeno <[email protected]>

* tweaks to docs

* added exception catcher for Cymru analyzer

* fixed bug in info column in the plugin section

* fixed bug in multiple observable analysis (#2047)

* fixed bug in multiple observable analysis: all observable had the type of the first one

* linter

* restore IP regex to accept also IPv6

* removed env in the toolbar (#2050)

* removed env in the toolbar

* linter

* Dashboard improv: add button to filter for the user's org only (#2028)

* frontend : add switch for user's org

Signed-off-by: Shivam Purohit <[email protected]>

* backend:add endpoint for the req

Signed-off-by: Shivam Purohit <[email protected]>

* initial backend url

Signed-off-by: Shivam Purohit <[email protected]>

* improve frontend logic

Signed-off-by: Shivam Purohit <[email protected]>

* add user org filter

Signed-off-by: Shivam Purohit <[email protected]>

* fix : try except block

Signed-off-by: Shivam Purohit <[email protected]>

* remove redundant url endpoints

Signed-off-by: Shivam Purohit <[email protected]>

* remove unnecessary commented code

Signed-off-by: Shivam Purohit <[email protected]>

* add hide component logic

Signed-off-by: Shivam Purohit <[email protected]>

* rename props

Signed-off-by: Shivam Purohit <[email protected]>

* reduce redundant code via functions

Signed-off-by: Shivam Purohit <[email protected]>

* convert get_org_members to static

Signed-off-by: Shivam Purohit <[email protected]>

* remove logger changes

Signed-off-by: Shivam Purohit <[email protected]>

* remove comments and rename variables

Signed-off-by: Shivam Purohit <[email protected]>

* remove console statement

Signed-off-by: Shivam Purohit <[email protected]>

* refactor get_org_members

Signed-off-by: Shivam Purohit <[email protected]>

* fix:prettier

Signed-off-by: Shivam Purohit <[email protected]>

---------

Signed-off-by: Shivam Purohit <[email protected]>

* adjusted README

* Added check for path

Signed-off-by: 0ssigeno <[email protected]>

* Fix corner case for multiple playbook

Signed-off-by: 0ssigeno <[email protected]>

* Fix pointers

Signed-off-by: 0ssigeno <[email protected]>

* Backend always decide the classification

Signed-off-by: 0ssigeno <[email protected]>

* Job bi (#2052)

* job bi

Signed-off-by: 0ssigeno <[email protected]>

* More

Signed-off-by: 0ssigeno <[email protected]>

* Job bi

Signed-off-by: 0ssigeno <[email protected]>

* Migration

Signed-off-by: 0ssigeno <[email protected]>

* Fix

Signed-off-by: 0ssigeno <[email protected]>

* Fix

Signed-off-by: 0ssigeno <[email protected]>

* Added playbook in the elastic template

Signed-off-by: 0ssigeno <[email protected]>

* Fix

Signed-off-by: 0ssigeno <[email protected]>

* Missin migrations

Signed-off-by: 0ssigeno <[email protected]>

---------

Signed-off-by: 0ssigeno <[email protected]>

* Bump pillow from 10.0.1 to 10.2.0 in /requirements (#2055)

Bumps [pillow](https://github.com/python-pillow/Pillow) from 10.0.1 to 10.2.0.
- [Release notes](https://github.com/python-pillow/Pillow/releases)
- [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst)
- [Commits](python-pillow/Pillow@10.0.1...10.2.0)

---
updated-dependencies:
- dependency-name: pillow
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump checkdmarc from 4.8.4 to 5.2.7 in /requirements (#2054)

Bumps [checkdmarc](https://github.com/domainaware/checkdmarc) from 4.8.4 to 5.2.7.
- [Changelog](https://github.com/domainaware/checkdmarc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/domainaware/checkdmarc/commits)

---
updated-dependencies:
- dependency-name: checkdmarc
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump quark-engine from 23.9.1 to 23.12.1 in /requirements (#2045)

Bumps [quark-engine](https://github.com/quark-engine/quark-engine) from 23.9.1 to 23.12.1.
- [Release notes](https://github.com/quark-engine/quark-engine/releases)
- [Commits](ev-flow/quark-engine@v23.9.1...v23.12.1)

---
updated-dependencies:
- dependency-name: quark-engine
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump flake8 from 6.1.0 to 7.0.0 in /requirements (#2056)

Bumps [flake8](https://github.com/pycqa/flake8) from 6.1.0 to 7.0.0.
- [Commits](PyCQA/flake8@6.1.0...7.0.0)

---
updated-dependencies:
- dependency-name: flake8
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Frontend - fixed runtime config bugs (#2064)

* fixed runtime config bugs

* restored old comment

---------

Co-authored-by: Daniele Rosetti <[email protected]>

* updated frontend dependencies

* Refactoring of start.py script. Closes #1899 and #1866  (#2060)

* Removed initialize.sh root execution

* Remove sudo command from installation

* Added python3-venv installation

* Dropped support for docker compose V1

* Added redirection to stderr

* Dropped support for docker compose V1

* Fixed download directory of script

* Changed shebang for better compatibility

* First not finished bash script

* Formatting fix

* Added parameter checks

* Added other parameters check

* Fixed wrongly used check

* Removed start() function

* Used exact string matching for parameters

* Added mandatory argument parsing

* Moved declaration of array inside of logical function

* Added main parameter case

* Added help function

* Added default version to help

* Completed help function

* Added argument parsing

* Added help option

* Fixed subtle error with bash logic values

* Most of the work done

* Working docker cmd

* Added project directory specification

* Removed unused function

* Improved error message

* Removed reduntand if condition

* Added checks for empty strings

* Removed pycharm warnings

* Fixed IntelOwl version

* Fixed some bugs

* Fixed wrong for index

* Fixed git checkout

* Removed wrongly placed comment

* Removed python pre-requirements depencency

* Added execution of initialize.sh from start

* Entering venv

* Removed unused echo

* Added check for docker group

* Updated docs to use new startup script

* Fixed typo in doc

* Changed generic code blocks to bash

* Add curl dependency

* Add curl dependency

* Re added pre-requirements for compatibility

* Removed old occurrences of start.py

* Added test docker file for integrations

* Added manual usage to doc

* Removed python3 and venv dependency

* Updated major release informations

* Removed python and venv dependency for start

* Removed python and venv dependency for start from docs

* Made code-review-doctor happy

* Improved installation doc

* Added absolute path for application_restart

* Updated docs

* added deprecation notice

---------

Co-authored-by: Matteo Lodi <[email protected]>

* Fixed creating a playbook with an existing tag (#2057)

* changed playbook serializer

* deepsource

---------

Co-authored-by: Matteo Lodi <[email protected]>

* bump and changelog

---------

Signed-off-by: 0ssigeno <[email protected]>
Signed-off-by: Shivam Purohit <[email protected]>
Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Simone Berni <[email protected]>
Co-authored-by: Daniele Rosetti <[email protected]>
Co-authored-by: Daniele Rosetti <[email protected]>
Co-authored-by: Shivam Purohit <[email protected]>
Co-authored-by: 0ssigeno <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Martina Carella <[email protected]>
Co-authored-by: fgibertoni <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Dashboard improv: add button to filter for the user's org only

3 participants