Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support microsoft login #4850

Closed
wants to merge 2,688 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
2688 commits
Select commit Hold shift + click to select a range
e668f2b
Fix double-scrollbar when in fullscreen (#4243)
stefanmaric Oct 16, 2019
0203bea
Migrate Sankey renderer to React (#4255)
kravets-levko Oct 17, 2019
3fd78d3
Restore <body> bottom padding (#4252)
kravets-levko Oct 17, 2019
da8c737
Migrate Sunburst Renderer to React (#4259)
kravets-levko Oct 17, 2019
9580be2
App Header React migration (#4245)
ranbena Oct 19, 2019
5a6ac27
Add "use-debounce" dependency (#4268)
kravets-levko Oct 19, 2019
cf41efa
Extracted alert menu button (#4273)
ranbena Oct 22, 2019
f89f03a
Minor alert bug fixes (#4274)
ranbena Oct 22, 2019
7f52d5d
show current worker job (alongside with minor cosmetic column tweaks)…
Oct 23, 2019
fabcfc1
avoid loading entire job data for queued jobs (#4257)
Oct 23, 2019
a6863c5
Monitor general RQ queues (default, periodic and schemas) (#4256)
Oct 23, 2019
dc9b825
extend the result_ttl of refresh_queries to 600 seconds to allow it t…
Oct 24, 2019
e6eb67f
Pin Cypress version (#4284)
arikfr Oct 24, 2019
2aaebb1
Migrate the application to Python 3 (#4251)
NicolasLM Oct 24, 2019
62621eb
Introduce inheritance to the Parameter structure (#4049)
gabrieldutra Oct 24, 2019
393fa62
Migrate Table visualization to React Part 2: Editor (#4175)
kravets-levko Oct 24, 2019
334cd5e
use rq_redis_connection instead of redis_connection (#4288)
Oct 25, 2019
65b311e
CircleCI workflow improvements (#4296)
arikfr Oct 27, 2019
19a0066
show more workers per page. also allow page size selection (#4300)
Oct 28, 2019
f4f56c1
Add V8 to the CHANGELOG.
arikfr Oct 28, 2019
db011ef
Move the setup scripts to their own home (#4310)
arikfr Oct 28, 2019
d081319
Migrate PermissionsEditor to React (#4266)
gabrieldutra Oct 29, 2019
08036cb
optimize work horse initialization by configuration mappers on the wo…
Oct 30, 2019
3b9d1a4
Skip favorites dropdown loading state on init (#4318)
gabrieldutra Oct 31, 2019
a80e43e
New feature - Alert muting (#4276)
ranbena Nov 2, 2019
9191b20
Feature/last x days parameter (#4333)
kykrueger Nov 5, 2019
8384214
Adjust RQ job priorities (#4301)
Nov 6, 2019
d380d7a
RQ: periodically clear failed jobs (#4306)
Nov 7, 2019
e3eb217
Update TagsList and Sidebar to use Ant components (#4338)
gabrieldutra Nov 7, 2019
e921079
Migrate Settings Screen to React (#4323)
gabrieldutra Nov 10, 2019
885eae9
auto-refresh data RQ jobs admin page (#4298)
Nov 11, 2019
38beb34
Restarting rq-scheduler reschedules all periodics (#4302)
Nov 11, 2019
2daf6bd
Admin status page's current tab does not preserve (#4299)
Nov 11, 2019
c42cf19
Fix the DB migration so that the correct key is used for encrypting D…
Jakdaw Nov 11, 2019
423a6f0
Migrate Cohort visualization to React (#4270)
kravets-levko Nov 13, 2019
a4bc4be
Fix: number based alerts evaluation isn't working (#4295)
arikfr Nov 13, 2019
9ff26a4
CLI command to reencrypt data source options (#4190)
Nov 13, 2019
047e045
use to set the hash instead of directly manipulating it (#4351)
Nov 13, 2019
539f336
Migrate Choropleth visualization to React (#4313)
kravets-levko Nov 14, 2019
8e1de37
Migrate Funnel visualization to React (#4267)
kravets-levko Nov 14, 2019
1bf5de0
Add some tests for Choropleth visualization (#4358)
kravets-levko Nov 14, 2019
1c03638
Remove Chrome Logger and update Cypress and Percy (#4354)
gabrieldutra Nov 14, 2019
d7ec665
Fix Cypress and Percy flakyness issues (#4365)
gabrieldutra Nov 18, 2019
a7cfbb3
Migrate Map visualization to React (#4278)
kravets-levko Nov 20, 2019
dcd12a5
Migrate Chart visualization to React Part 2: Editor (#4139)
kravets-levko Nov 20, 2019
74cf9b8
Remove unused npm dependencies (#4380)
arikfr Nov 21, 2019
c3ce761
fix typo at unsupportedRedirect.js (#4387)
uncletimmy3 Nov 24, 2019
324b733
Hide deprecated visualizations from query editor (#4388)
kravets-levko Nov 24, 2019
038568e
Table visualization: accept timestamp for date/time columns (#4389)
kravets-levko Nov 24, 2019
603f6f0
Migrate Home to React (#4379)
gabrieldutra Nov 24, 2019
b48b268
Add autoscroll to ng-view (#4337)
gabrieldutra Nov 24, 2019
48d1958
don't try to purge jobs which have already been deleted (#4396)
Nov 25, 2019
741f162
Table visualization with column named "children" renders +/- buttons …
kravets-levko Nov 26, 2019
876da1e
Fix Map spec and Alert Page snapshot flakyness (#4403)
gabrieldutra Nov 26, 2019
0de4775
Remove builtins invalid in Python 3 from Python runner (#4375)
NicolasLM Nov 27, 2019
b6b96e5
Amazon CloudWatch query runners (#4372)
arikfr Nov 27, 2019
9caaff9
avoid logging job parameters (#4311)
Nov 27, 2019
eba5c0e
Downgrade Kombu version to 4.6.3 (#4406)
arikfr Nov 27, 2019
ed3579c
add pyexasol datasource, ensure that integer dont overflow in javascr…
stefan-mees Nov 27, 2019
471f1b9
Update Snowflake connector version to address compatibility issue wit…
arikfr Nov 27, 2019
90e8164
refreshing snowflake schema w/o waking cluster (#4285)
monicagangwar Dec 2, 2019
78ec27d
Fix dragged parameter wrapping in some cases (#4415)
gabrieldutra Dec 3, 2019
1b9b1aa
Chart series switch places when picking Y axis or color (#4412)
kravets-levko Dec 4, 2019
ba69cc7
Set of improvements and refinements to visualizations after React mig…
kravets-levko Dec 4, 2019
bd469e3
Migrate AddToDashboard dialog to React (#4408)
kravets-levko Dec 4, 2019
61cb8fc
Cypress: Make sure params are saved before reload (#4420)
gabrieldutra Dec 4, 2019
d890cda
Add user/pass authentication support for Druid (#4315)
Jakdaw Dec 5, 2019
121cbcb
Update rds-combined-ca-bundle.pem(#4290) (#4304)
ikenji Dec 5, 2019
d255255
Remove --max-old-space-size=4096 from npm build command (#4381)
arikfr Dec 5, 2019
76a5bd7
Fix counter vizualization (#4385)
dmudro Dec 10, 2019
2b5aae5
Change eslint configuration and fix resulting issues (#4423)
arikfr Dec 11, 2019
5a98746
Remove codeclimate config (#4434)
arikfr Dec 11, 2019
69aea72
Black support for the Python codebase (#4297)
arikfr Dec 11, 2019
24b99fd
Remove Husky (#4435)
arikfr Dec 11, 2019
091864d
Prettier all the Javascript code & GitHub Action (#4433)
arikfr Dec 11, 2019
93d86fe
allow setting of custom sentry environments (#4437)
Dec 11, 2019
284ca15
Fix Restyled config (#4438)
gabrieldutra Dec 12, 2019
d9acc64
Adding application to Azure Kusto query runner (#4441)
Dec 13, 2019
187c0f0
Map: add tooltip and popup templating (#4443)
deecay Dec 14, 2019
cbe6dda
Third column not selectable for Bubble and Heatmap charts (#4449)
kravets-levko Dec 16, 2019
458ecca
Fix prettier commandline option to be recursive (#4458)
deecay Dec 17, 2019
61c8f32
Refactor QueryEditor component (#4464)
kravets-levko Dec 20, 2019
696e6d6
Migrate Dashboard and Public Dashboard to React (#4228)
gabrieldutra Dec 24, 2019
d5c1582
Migrate VisualizationEmbed to React (#4364)
gabrieldutra Dec 24, 2019
01827ab
Hive/Databricks: mark date types as TYPE_DATE. (#4419)
arikfr Dec 24, 2019
b3d17a4
Update pymapd to 0.19.0 (#4424)
randyzwitch Dec 24, 2019
c610d7f
totalRows are returned as a string and should be a number (#4481)
Dec 24, 2019
a960f58
fix all occurances of B306: BaseException.message has been deprecated…
Dec 25, 2019
10ff075
Snowflake: add missing date types (#4484)
arikfr Dec 25, 2019
e337c4c
Fix: query results query runner fails to load cached results. (#4486)
arikfr Dec 25, 2019
84e8bcf
Add explicit handling of 404 errors in query result requests. (#4487)
arikfr Dec 25, 2019
1d0c582
Retain tags when forking a query (#4489)
arikfr Dec 25, 2019
84f5bc6
Don't update query's updated_at when updating schedule_failures count…
arikfr Dec 25, 2019
b5eac24
adjust imports to match simple-salesforce 0.74.3 (#4490)
Dec 25, 2019
586cb1a
Support download as TSV File (#4445)
tsuyoshizawa Dec 26, 2019
dc84fbf
Chart: Bubble size control by coefficient and sizemode (#3928)
deecay Dec 26, 2019
025cf99
Update EditInPlace to use Antd components (#4493)
gabrieldutra Dec 26, 2019
a3b1c12
Refine permissions usage in Redash to allow for guest users (#4492)
arikfr Dec 30, 2019
4610589
Viz Embed: Add option to hide timestamp (#4491)
arikfr Dec 30, 2019
c77e898
Fix: properly encode UTF-8 filenames in query results request (#4498)
arikfr Dec 30, 2019
d932aac
Execute Queries in RQ (#4413)
Dec 30, 2019
780cbc5
Run prettier on cypress folder (#4510)
gabrieldutra Dec 30, 2019
886927a
Fix: don't try to access message property of an exception (#4516)
arikfr Dec 31, 2019
dfd9fb8
Multiprocess RQ workers (using supervisor) (#4371)
Jan 1, 2020
66b1022
Add error boundary to catch errors in visualizations (#4518)
kravets-levko Jan 6, 2020
9e925d0
Migrate Query pages to React (#4429)
gabrieldutra Jan 6, 2020
2a832d9
Replace angular-sanitize with DOMPurify (#4502)
gabrieldutra Jan 8, 2020
6c483c2
Hide unavailable page links to non-admin users in settings and header…
gabrieldutra Jan 8, 2020
5cee43a
Cypress: Add test for Settings Tabs (#4530)
gabrieldutra Jan 9, 2020
b714bd9
Add maildev missing settings (#4527)
gabrieldutra Jan 10, 2020
f03ccbc
Update description for the new setup repository (#4535)
ariarijp Jan 12, 2020
5fbfad5
Nuke Celery (#4521)
Jan 12, 2020
e0e3e1e
fix typo in azure kusto runner (#4537)
Jan 12, 2020
0d69503
Migrate services and replace $http with axios (#4497)
gabrieldutra Jan 13, 2020
7667006
adjust imports to match influxdb 5.2.3 (#4531)
Jan 13, 2020
fd18f6d
Google Analytics runner - iterate over keys the Python 3 way (#4538)
Jan 13, 2020
decf50a
Load collections in all workspaces (#4541)
ari-e Jan 14, 2020
e28af55
Get rid of six and fix str/unicode types regression that became activ…
jezdez Jan 14, 2020
6e2fb1a
webpack: remove children from output (#4540)
arikfr Jan 14, 2020
a03ec70
Add loading state to Query save button (#4551)
gabrieldutra Jan 16, 2020
6446653
Add padding to QueryExecutionStatus text (#4553)
gabrieldutra Jan 16, 2020
bfa5b17
Tags filter doesn't work because of wrong query params format (#4563)
kravets-levko Jan 20, 2020
e941d11
Fix Cypress issues after React version of Query Pages (#4545)
gabrieldutra Jan 20, 2020
45c8fd2
Upgrade snowflake-connector-python (#4567)
arikfr Jan 20, 2020
6efc581
Migrate router and <app-view> to React (#4525)
kravets-levko Jan 20, 2020
85adb7f
Add redshift role use option (#4532)
Jan 21, 2020
0d0c49e
delete variable (#3813)
taminif Jan 21, 2020
7d7cf09
Force saml auth scheme (#3614)
leosunmo Jan 21, 2020
dd17194
Save new query before adding new visualization (#4569)
kravets-levko Jan 21, 2020
cd37658
Fix Map visualization: L.layerGroup cannot compute its bounds (#4573)
kravets-levko Jan 22, 2020
d01a3b3
React migration cleanup (#4572)
kravets-levko Jan 22, 2020
f016453
Refine Timer and TimeAgo components (get rid of force update) (#4580)
kravets-levko Jan 23, 2020
f8ef0e7
Bug: when using global dashboard filters, widgets continuously update…
kravets-levko Jan 23, 2020
b4411d2
getredash/redash#173 Don't allow to fork query while previous fork is…
kravets-levko Jan 23, 2020
9fa7d56
Restore query execute notifications (missed during React migration) (…
kravets-levko Jan 23, 2020
fabc552
Fixes several bugs on dashboard page (see description) (#4571)
kravets-levko Jan 23, 2020
1ca33ac
Added support for running MongoDB queries on secondary in replicaset …
erans Jan 23, 2020
a6a168f
Fix empty values sent in dynamic form (#3886)
Jan 23, 2020
0d24cdf
Refine routes definitions (#4579)
kravets-levko Jan 26, 2020
774f601
Change visualizations import to be static (#4592)
kravets-levko Jan 28, 2020
9df3b4b
Query editor: fix shortcuts (#4598)
kravets-levko Jan 29, 2020
7285730
RQ: Missing currently executing queries view (#4558)
Feb 3, 2020
5541b82
Use correct logger when enqueuing a query execution. (#4614)
jezdez Feb 6, 2020
9027668
Force specific version of Werkzeug to prevent the breaking changes of…
DavidHernandez Feb 9, 2020
3162cc3
keep adhoc job results longer (determined by settings.JOB_EXPIRY_TIME…
Feb 9, 2020
a905426
Update copyright year to 2020 in LICENSE (#4616)
thewarpaint Feb 9, 2020
77a36ec
Sort schema columns alphabetically (#4595)
Feb 9, 2020
872c788
sync_user_details doens't really need a custom ttl (#4625)
Feb 9, 2020
161b513
If the error message happens to be empty, it will break serailization…
Feb 9, 2020
b6616cd
Fix: encode/decode bytestring for base64. (#4624)
arikfr Feb 9, 2020
0dae8cf
Fix treasuredata endpoint (#4582)
mickeey2525 Feb 9, 2020
8f92dc5
set correct values for ProxyFix (#4630)
Feb 9, 2020
7884892
Clickhouse: control whether to verify SSL certificate (#4631)
Feb 9, 2020
fa2fb28
getredash/redash#4601 Chart editor: enable search in columns selects …
kravets-levko Feb 9, 2020
9b70738
Check for LDAP Login in Organization Settings (#4359)
gabrieldutra Feb 10, 2020
db8e724
Snowflake: switch to simpler query for fetching columns (#4634)
arikfr Feb 10, 2020
0382f3d
Fix: no need to encode strings anymore (#4627)
arikfr Feb 10, 2020
fd4d175
Update cassandra-driver to 3.21.0. (#4636)
jezdez Feb 10, 2020
2538ebf
Handle stale jobs more carefully before purging them. (#4615)
jezdez Feb 11, 2020
9ed0c3d
Set default query execution time limit to unlimited (#4626)
Feb 11, 2020
4af7ab8
Fix dashboard editing permissions not working (#4613)
gabrieldutra Feb 13, 2020
ef2a0bd
support relative time in cloudwatch queries (#4649)
Feb 16, 2020
aa26b0e
Avoid timing out when no timeout is set (#4653)
Feb 18, 2020
49a45a6
getredash/redash#4655 Closing the Help Drawer redirects you the homep…
kravets-levko Feb 18, 2020
6628208
Fix Add Widget always shows recent queries list (#4658)
gabrieldutra Feb 18, 2020
b0d96aa
Query View redesign (#4536)
gabrieldutra Feb 19, 2020
cbfd24b
getredash/redash#4666 The download button on the dashboard will redir…
kravets-levko Feb 20, 2020
fa9a45e
Query Editor: Remove overflow visible from visualization (#4668)
gabrieldutra Feb 20, 2020
9311570
Remove core-js and polyfill include as we don't use Phantom anymore (…
arikfr Feb 23, 2020
d98e2ac
Enable ODBC and MS SQL ODBC support (#4676)
arikfr Feb 23, 2020
c1f9e13
Fix verification email url on home page (#4647)
gabrieldutra Feb 24, 2020
b2e9d2d
Query View page design adjustments (#4670)
gabrieldutra Feb 24, 2020
b18f3f6
Job timeout doesn't kill the mysql query (#4629)
Feb 24, 2020
9d2cb87
Fix: Chart with a horizontal legend sometimes doesn't render properly…
kravets-levko Feb 25, 2020
cc434e5
Perform cleanup on job timeouts (#4681)
Feb 26, 2020
2ad4d09
Use npm ci instead of npm install in CI scripts (#4688)
kravets-levko Feb 26, 2020
3f5b3c6
Use main react-grid-layout package instead of fork (#4687)
kravets-levko Feb 26, 2020
39737a5
Change visualization editor scroll to internal divs (#4689)
gabrieldutra Feb 26, 2020
679dbb3
Oracle: update DSN construction to support special characters in user…
juanvasquezreyes Feb 27, 2020
77ae699
remove rq_healthcheck entrypoint and deprecate celery_healthcheck (#4…
Feb 27, 2020
491c44c
refresh_queries shouldn't break because of a single query having a ba…
Mar 1, 2020
739d8d5
Snowflake: use different method of showing columns if no schema speci…
arikfr Mar 1, 2020
3fc049f
Fixed Clickhouse column name encoding problem (#4682)
erels Mar 1, 2020
4ab23df
Table visualization: Show which columns are being used for search (#4…
kravets-levko Mar 1, 2020
9742626
Solves redashlabs/product#47 (#4669)
Mar 1, 2020
21a905c
Fix error for query snippets with empty description (#4693)
gabrieldutra Mar 1, 2020
fcc9dbe
Query page: update empty state text (#4699)
arikfr Mar 3, 2020
42fbd6a
Dynamic Form: boolean fields related fixes (#4586)
arikfr Mar 3, 2020
15c1e4a
Fix: show size of actually used Redash database (#4706)
citrin Mar 3, 2020
8a6140b
allow comparison with strings containing numbers as alert values (#4705)
Mar 4, 2020
b3cfd9f
Mobile experience improvements (#4694)
gabrieldutra Mar 4, 2020
ae1e9f5
Cancel BigQuery Queries (#4701)
Mar 4, 2020
b1a63f6
Update Dashboard and Alert headers with the Query one (#4710)
gabrieldutra Mar 6, 2020
3eb1b54
Fix : Alembic migration for scheduled query from older to newer versi…
satyamkrishna Mar 8, 2020
124452c
Remove `route.resolve` feature (#4607)
kravets-levko Mar 10, 2020
2562705
Refactor dialog wrapper component (#4594)
kravets-levko Mar 10, 2020
5df2669
Cypress: Separate start command and update to v4.1.0 (#4690)
gabrieldutra Mar 11, 2020
6d478a2
Dashboard Performance: HtmlContent improvements (#4726)
gabrieldutra Mar 15, 2020
3115450
Trigger CI lint failure on warnings and fix failing frontend unit tes…
gabrieldutra Mar 16, 2020
3a081fe
getredash/redash#4728 DOMPurify by default removes 'target' attribute…
kravets-levko Mar 17, 2020
0e6327e
Cohort appearance settings (#4597)
kravets-levko Mar 17, 2020
909463b
Fix no button to add query tags (#4737)
gabrieldutra Mar 17, 2020
e7e2ca2
Set POSTGRES_HOST_AUTH_METHOD environment variable (#4740)
ezkl Mar 18, 2020
8fe2aee
Move data source/destination deprecated handling to frontend (#4753)
gabrieldutra Mar 24, 2020
83d6601
Fix query based param with no results crashing page (#4707)
gabrieldutra Mar 24, 2020
c20e0f1
Cypress: Add/Edit query and dashboard tags spec (#4744)
gabrieldutra Mar 24, 2020
8c6e746
Add apt update step in build docker image job.
arikfr Mar 24, 2020
1514dee
Fix there's no publish button on mobile query page (#4760)
gabrieldutra Mar 30, 2020
4b6f775
Sankey diagram should occupy all available area (not just the left pa…
kravets-levko Mar 31, 2020
8f71deb
Fix parameter spec flaky test (#4771)
gabrieldutra Apr 2, 2020
765c29d
feat: Add ssl options for Cassandra data source (#4665)
arihantsurana Apr 3, 2020
4da6738
Removing the PIP cache from the built image (#4766)
Apr 3, 2020
ba23d80
Fix: extendedEnum breaks JSONSchema parsing (#4774)
arikfr Apr 3, 2020
4a2281d
Add db thread pool option to keep idle connections alive (#4741)
gstaykov Apr 5, 2020
a88fa5c
Pie chart ignores series labels (#4775)
kravets-levko Apr 6, 2020
ebbf93a
Upgrade Plotly (#4752)
kravets-levko Apr 6, 2020
a738dd5
sent stack trace to Sentry when refresh_queries fails to enqueue a ce…
Apr 8, 2020
a33323f
4791 redshift schema bugfix (#4792)
atharvai Apr 12, 2020
96530ce
Fix Multi-Filters: "select all" makes table view unscrollable (#4782)
gabrieldutra Apr 13, 2020
adf9f3d
Remove "context" prop from visualizations (#4789)
gabrieldutra Apr 13, 2020
41db43a
feature: add ability to make the restriction of api calls to private …
loganprice Apr 14, 2020
6af2afe
Move the dropdown to the side in Edit Mode (#4758)
gabrieldutra Apr 14, 2020
378402a
Dashboard Performance: Memoize widgets (#4734)
gabrieldutra Apr 14, 2020
6d3a94d
Fix param added with empty query ignores options (#4736)
gabrieldutra Apr 14, 2020
8ecbeb6
Fix test connection on mongodb datasource (#4785)
wengkham Apr 14, 2020
8b509b0
Pie Chart: set contrast colors for text in sectors (#4783)
kravets-levko Apr 14, 2020
f7cc16c
use total_seconds to find stale jobs (#4777)
Apr 14, 2020
cf68a4d
Adds option to show 500 rows in the table visualization. Previous max…
susodapop Apr 14, 2020
61428b8
Datasource Exasol: support encryption setting (#4712)
stefan-mees Apr 14, 2020
ae01c0b
Added setting to hide Plotly mode bar (#4644)
daniellangnet Apr 14, 2020
f0b8c70
Disable Percy snapshot for Choropleth test (#4799)
arikfr Apr 14, 2020
574a396
Fix comparison error when scale is None (#4638)
cemremengu Apr 14, 2020
c2ee68a
Don't immediately remove notifications from notification trays (#4773)
mnoorenberghe Apr 14, 2020
a3a5136
Dashboard Search bug fix (#4804)
Ralnoc Apr 19, 2020
0efbdc2
reset is_invitation_pending if someone tries to login through a reset…
Apr 20, 2020
519fe5f
Reduce number of queries used to load the dashboards list (#4816)
arikfr Apr 21, 2020
db19698
Show explicit user name instead of avatar in lists. (#4828)
arikfr Apr 24, 2020
7b80a9e
ODBC Based Databricks Connector (#4814)
arikfr Apr 24, 2020
ff552e6
Add column description to table viz (#4831)
arikfr Apr 24, 2020
96c23bf
fix: Make sure boto installed (#4835)
koooge Apr 25, 2020
e4393e1
Visualizations customizable settings (#4793)
gabrieldutra Apr 25, 2020
06f75e9
Remove Helper Classes from visualizations (#4788)
gabrieldutra Apr 25, 2020
6bda8d7
Add ability to ship periodic RQ jobs as part of extensions again. (#4…
jezdez Apr 28, 2020
a3109f5
Specify restylers versions for restyled (#4842)
gabrieldutra Apr 29, 2020
8b621af
Fix dashboard not showing results while refreshing (#4840)
gabrieldutra Apr 29, 2020
348f84a
microsoft sso login supported
Apr 30, 2020
7e70140
microsoft sso login supported
yangyinchun Apr 30, 2020
6fbc7b4
add microsoft setting on ui
yangyinchun May 7, 2020
69d5943
add microsoft setting on UI
yangyinchun May 7, 2020
1c9b0f3
fix elasticsearch query runner and add sql for elasticsearch
yangyinchun Jun 8, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added client/app/assets/images/db-logos/aws_es_sql.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions client/app/assets/images/microsoft_logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
31 changes: 30 additions & 1 deletion client/app/pages/settings/OrganizationSettings.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ class OrganizationSettings extends React.Component {
}

disablePasswordLoginToggle = () =>
!(clientConfig.googleLoginEnabled || clientConfig.ldapLoginEnabled || this.state.formValues.auth_saml_enabled);
!(clientConfig.googleLoginEnabled || clientConfig.microsoftLoginEnabled || clientConfig.ldapLoginEnabled || this.state.formValues.auth_saml_enabled);

handleSubmit = e => {
e.preventDefault();
Expand Down Expand Up @@ -103,6 +103,34 @@ class OrganizationSettings extends React.Component {
);
}

renderMicrosoftLoginOptions() {
const { formValues } = this.state;
return (
<React.Fragment>
<h4>Microsoft Login</h4>
<Form.Item label="Allowed Microsoft Apps Domains">
<Select
mode="tags"
value={formValues.auth_microsoft_apps_domains}
onChange={value => this.handleChange("auth_microsoft_apps_domains", value)}
/>
{!isEmpty(formValues.auth_microsoft_apps_domains) && (
<Alert
message={
<p>
Any user registered with a <strong>{join(formValues.auth_microsoft_apps_domains, ", ")}</strong> Microsoft
Apps account will be able to login. If they don{"'"}t have an existing user, a new user will be
created and join the <strong>Default</strong> group.
</p>
}
className="m-t-15"
/>
)}
</Form.Item>
</React.Fragment>
);
}

renderSAMLOptions() {
const { formValues } = this.state;
return (
Expand Down Expand Up @@ -252,6 +280,7 @@ class OrganizationSettings extends React.Component {
</Checkbox>
</Form.Item>
{clientConfig.googleLoginEnabled && this.renderGoogleLoginOptions()}
{clientConfig.microsoftLoginEnabled && this.renderMicrosoftLoginOptions()}
{this.renderSAMLOptions()}
</React.Fragment>
);
Expand Down
2 changes: 2 additions & 0 deletions redash/authentication/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,7 @@ def logout_and_redirect_to_index():
def init_app(app):
from redash.authentication import (
google_oauth,
microsoft_oauth,
saml_auth,
remote_user_auth,
ldap_auth,
Expand All @@ -252,6 +253,7 @@ def init_app(app):
login_manager.anonymous_user = models.AnonymousUser

app.register_blueprint(google_oauth.blueprint)
app.register_blueprint(microsoft_oauth.blueprint)
app.register_blueprint(saml_auth.blueprint)
app.register_blueprint(remote_user_auth.blueprint)
app.register_blueprint(ldap_auth.blueprint)
Expand Down
119 changes: 119 additions & 0 deletions redash/authentication/microsoft_oauth.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
import logging
import requests
import jwt
from flask import redirect, url_for, Blueprint, flash, request, session
from flask_oauthlib.client import OAuth

from redash import models, settings
from redash.authentication import (
create_and_login_user,
logout_and_redirect_to_index,
get_next_path,
)
from redash.authentication.org_resolving import current_org

logger = logging.getLogger("microsoft_oauth")

oauth = OAuth()
blueprint = Blueprint("microsoft_oauth", __name__)

def microsoft_remote_app():
if "microsoft" not in oauth.remote_apps:
oauth.remote_app(
"microsoft",
base_url="https://login.microsoftonline.com",
authorize_url="https://login.microsoftonline.com/{}/oauth2/v2.0/authorize".format(settings.MICROSOFT_TENANT_ID),
request_token_url=None,
request_token_params={
"scope": "openid email",
},
access_token_url="https://login.microsoftonline.com/{}/oauth2/v2.0/token".format(settings.MICROSOFT_TENANT_ID),
access_token_method="POST",
consumer_key=settings.MICROSOFT_CLIENT_ID,
consumer_secret=settings.MICROSOFT_CLIENT_SECRET,
)

return oauth.microsoft


def get_user_profile(code):
resp = microsoft_remote_app().authorized_response()
id_token = resp.get("id_token")
if id_token is None:
logger.warning("Failed getting user profile.", resp)
return None
profile = jwt.decode(id_token.encode('utf-8'), verify=False)
profile['name'] = profile['email'].split('@', 1)[0]
return profile


def verify_profile(org, profile):
if org.is_public:
return True

email = profile["email"]
domain = email.split("@")[-1]

if domain in org.microsoft_apps_domains:
return True

if org.has_user(email) == 1:
return True

return False


@blueprint.route("/<org_slug>/oauth/microsoft", endpoint="authorize_org")
def org_login(org_slug):
session["org_slug"] = current_org.slug
return redirect(url_for(".authorize", next=request.args.get("next", None)))


@blueprint.route("/oauth/microsoft", endpoint="authorize")
def login():
callback = url_for(".callback", _external=True)
next_path = request.args.get(
"next", url_for("redash.index", org_slug=session.get("org_slug"))
)
logger.debug("Callback url: %s", callback)
logger.debug("Next is: %s", next_path)
return microsoft_remote_app().authorize(callback=callback, state=next_path)


@blueprint.route("/oauth/microsoft_callback", endpoint="callback")
def authorized():
code = request.args.get('code')
if code is None:
logger.warning("code missing in call back request.")
flash("Validation error. Please retry.")
return redirect(url_for("redash.login"))
profile = get_user_profile(code)
if profile is None:
flash("Validation error. Please retry.")
return redirect(url_for("redash.login"))

if "org_slug" in session:
org = models.Organization.get_by_slug(session.pop("org_slug"))
else:
org = current_org

if not verify_profile(org, profile):
logger.warning(
"User tried to login with unauthorized domain name: %s (org: %s)",
profile["email"],
org,
)
flash("Your microsoft Apps account ({}) isn't allowed.".format(profile["email"]))
return redirect(url_for("redash.login", org_slug=org.slug))

picture_url = profile.get('picture')
user = create_and_login_user(org, profile["name"], profile["email"], picture_url)
if user is None:
return logout_and_redirect_to_index()

unsafe_next_path = request.args.get("state") or url_for(
"redash.index", org_slug=org.slug
)
next_path = get_next_path(unsafe_next_path)

return redirect(next_path)
28 changes: 27 additions & 1 deletion redash/cli/organization.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def set_google_apps_domains(domains):
models.db.session.add(organization)
models.db.session.commit()
print(
"Updated list of allowed domains to: {}".format(
"Updated list of google allowed domains to: {}".format(
organization.google_apps_domains
)
)
Expand All @@ -33,6 +33,32 @@ def show_google_apps_domains():
)
)

@manager.command()
@argument("domains")
def set_microsoft_apps_domains(domains):
"""
Sets the allowable domains to the comma separated list DOMAINS.
"""
organization = models.Organization.query.first()
k = models.Organization.SETTING_MICROSOFT_APPS_DOMAINS
organization.settings[k] = domains.split(",")
models.db.session.add(organization)
models.db.session.commit()
print(
"Updated list of microsoft allowed domains to: {}".format(
organization.microsoft_apps_domains
)
)


@manager.command()
def show_microsoft_apps_domains():
organization = models.Organization.query.first()
print(
"Current list of Microsoft Apps domains: {}".format(
", ".join(organization.microsoft_apps_domains)
)
)

@manager.command(name="list")
def list_command():
Expand Down
10 changes: 10 additions & 0 deletions redash/handlers/authentication.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ def get_google_auth_url(next_path):
google_auth_url = url_for("google_oauth.authorize", next=next_path)
return google_auth_url

def get_microsoft_auth_url(next_path):
microsoft_auth_url = url_for("microsoft_oauth.authorize", next=next_path)
return microsoft_auth_url

def render_token_login_page(template, org_slug, token, invite):
try:
Expand Down Expand Up @@ -93,12 +96,15 @@ def render_token_login_page(template, org_slug, token, invite):
return redirect(url_for("redash.index", org_slug=org_slug))

google_auth_url = get_google_auth_url(url_for("redash.index", org_slug=org_slug))
microsoft_auth_url = get_microsoft_auth_url(url_for("redash.index", org_slug=org_slug))

return (
render_template(
template,
show_google_openid=settings.GOOGLE_OAUTH_ENABLED,
google_auth_url=google_auth_url,
show_microsoft_openid=settings.MICROSOFT_OAUTH_ENABLED,
microsoft_auth_url=microsoft_auth_url,
show_saml_login=current_org.get_setting("auth_saml_enabled"),
show_remote_user_login=settings.REMOTE_USER_LOGIN_ENABLED,
show_ldap_login=settings.LDAP_LOGIN_ENABLED,
Expand Down Expand Up @@ -215,6 +221,7 @@ def login(org_slug=None):
flash("Wrong email or password.")

google_auth_url = get_google_auth_url(next_path)
microsoft_auth_url = get_microsoft_auth_url(next_path)

return render_template(
"login.html",
Expand All @@ -223,6 +230,8 @@ def login(org_slug=None):
email=request.form.get("email", ""),
show_google_openid=settings.GOOGLE_OAUTH_ENABLED,
google_auth_url=google_auth_url,
show_microsoft_openid=settings.MICROSOFT_OAUTH_ENABLED,
microsoft_auth_url=microsoft_auth_url,
show_password_login=current_org.get_setting("auth_password_login_enabled"),
show_saml_login=current_org.get_setting("auth_saml_enabled"),
show_remote_user_login=settings.REMOTE_USER_LOGIN_ENABLED,
Expand Down Expand Up @@ -295,6 +304,7 @@ def client_config():
"dashboardRefreshIntervals": settings.DASHBOARD_REFRESH_INTERVALS,
"queryRefreshIntervals": settings.QUERY_REFRESH_INTERVALS,
"googleLoginEnabled": settings.GOOGLE_OAUTH_ENABLED,
"microsoftLoginEnabled": settings.MICROSOFT_OAUTH_ENABLED,
"ldapLoginEnabled": settings.LDAP_LOGIN_ENABLED,
"pageSize": settings.PAGE_SIZE,
"pageSizeOptions": settings.PAGE_SIZE_OPTIONS,
Expand Down
3 changes: 2 additions & 1 deletion redash/handlers/data_sources.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import logging

import traceback
from flask import make_response, request
from flask_restful import abort
from funcy import project
Expand Down Expand Up @@ -193,6 +193,7 @@ def get(self, data_source_id):
}
except Exception:
response["error"] = {"code": 2, "message": "Error retrieving schema."}
logging.ERROR(traceback.format_exc())

return response

Expand Down
4 changes: 4 additions & 0 deletions redash/handlers/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ def get_settings_with_defaults(defaults, org):
settings[setting] = current_value

settings["auth_google_apps_domains"] = org.google_apps_domains
settings["auth_microsoft_apps_domains"] = org.microsoft_apps_domains

return settings

Expand All @@ -44,6 +45,9 @@ def post(self):
if k == "auth_google_apps_domains":
previous_values[k] = self.current_org.google_apps_domains
self.current_org.settings[Organization.SETTING_GOOGLE_APPS_DOMAINS] = v
elif k == "auth_microsoft_apps_domains":
previous_values[k] = self.current_org.microsoft_apps_domains
self.current_org.settings[Organization.SETTING_MICROSOFT_APPS_DOMAINS] = v
else:
previous_values[k] = self.current_org.get_setting(
k, raise_on_missing=False
Expand Down
5 changes: 5 additions & 0 deletions redash/models/organizations.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
@generic_repr("id", "name", "slug")
class Organization(TimestampMixin, db.Model):
SETTING_GOOGLE_APPS_DOMAINS = "google_apps_domains"
SETTING_MICROSOFT_APPS_DOMAINS = "microsoft_apps_domains"
SETTING_IS_PUBLIC = "is_public"

id = Column(db.Integer, primary_key=True)
Expand Down Expand Up @@ -44,6 +45,10 @@ def default_group(self):
def google_apps_domains(self):
return self.settings.get(self.SETTING_GOOGLE_APPS_DOMAINS, [])

@property
def microsoft_apps_domains(self):
return self.settings.get(self.SETTING_MICROSOFT_APPS_DOMAINS, [])

@property
def is_public(self):
return self.settings.get(self.SETTING_IS_PUBLIC, False)
Expand Down
51 changes: 50 additions & 1 deletion redash/query_runner/amazon_elasticsearch.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from .elasticsearch import ElasticSearch
from .elasticsearch import BaseElasticSearch, ElasticSearch
from typing import Tuple, Optional
from . import register

try:
Expand Down Expand Up @@ -63,5 +64,53 @@ def __init__(self, configuration):

self.auth = AWSV4Sign(cred, region, "es")

class AmazonElasticsearchSqlService(AmazonElasticsearchService):
@classmethod
def name(cls):
return "Amazon Elasticsearch Service for SQL"

@classmethod
def enabled(cls):
return enabled

@classmethod
def type(cls):
return "aws_es_sql"

@classmethod
def configuration_schema(cls):
return {
"type": "object",
"properties": {
"server": {"type": "string", "title": "Endpoint"},
"region": {"type": "string"},
"access_key": {"type": "string", "title": "Access Key"},
"secret_key": {"type": "string", "title": "Secret Key"},
},
"secret": ["secret_key"],
"order": [
"server",
"region",
"access_key",
"secret_key",
],
"required": ["server", "region"],
}

def __init__(self, configuration):
super(AmazonElasticsearchSqlService, self).__init__(configuration)
self.syntax = 'sql'

def run_query(self, query, user):
return BaseElasticSearch.run_query(self, query, user)

def _build_query(self, query: str) -> Tuple[dict, str, Optional[list]]:
sql_query = {
'query': query
}
sql_query_url = '/_opendistro/_sql'
return None, sql_query, sql_query_url, None


register(AmazonElasticsearchService)
register(AmazonElasticsearchSqlService)
Loading