Skip to content

Commit e98aed2

Browse files
authored
Merge pull request #19 from brave/cookies
Add settings for cookies and referrer blocking
2 parents 510031b + 26205d7 commit e98aed2

File tree

18 files changed

+244
-44
lines changed

18 files changed

+244
-44
lines changed

app/actions/shieldsPanelActions.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,10 @@ export const blockFingerprinting: actions.BlockFingerprinting = (setting) => {
5858
setting
5959
}
6060
}
61+
62+
export const blockCookies: actions.BlockCookies = (setting) => {
63+
return {
64+
type: types.BLOCK_COOKIES,
65+
setting
66+
}
67+
}

app/background/api/shieldsAPI.ts

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,13 @@ export const getShieldSettingsForTabData = (tabData?: chrome.tabs.Tab) => {
2626
chrome.contentSettings.plugins.getAsync({ primaryUrl: origin, resourceIdentifier: { id: resourceIdentifiers.RESOURCE_IDENTIFIER_TRACKERS } }),
2727
chrome.contentSettings.plugins.getAsync({ primaryUrl: origin, resourceIdentifier: { id: resourceIdentifiers.RESOURCE_IDENTIFIER_HTTP_UPGRADABLE_RESOURCES } }),
2828
chrome.contentSettings.javascript.getAsync({ primaryUrl: origin }),
29-
chrome.contentSettings.plugins.getAsync({ primaryUrl: origin, resourceIdentifier: { id: resourceIdentifiers.RESOURCE_IDENTIFIER_FINGERPRINTING } }),
30-
chrome.contentSettings.plugins.getAsync({ primaryUrl: origin, secondaryUrl: 'https://firstParty/*', resourceIdentifier: { id: resourceIdentifiers.RESOURCE_IDENTIFIER_FINGERPRINTING } })
29+
chrome.contentSettings.plugins.getAsync({ primaryUrl: origin }),
30+
chrome.contentSettings.plugins.getAsync({ primaryUrl: origin, secondaryUrl: 'https://firstParty/*', resourceIdentifier: { id: resourceIdentifiers.RESOURCE_IDENTIFIER_FINGERPRINTING } }),
31+
chrome.contentSettings.plugins.getAsync({ primaryUrl: origin, resourceIdentifier: { id: resourceIdentifiers.RESOURCE_IDENTIFIER_COOKIES } }),
32+
chrome.contentSettings.plugins.getAsync({ primaryUrl: origin, secondaryUrl: 'https://firstParty/', resourceIdentifier: { id: resourceIdentifiers.RESOURCE_IDENTIFIER_COOKIES } })
3133
]).then((details) => {
3234
const fingerprinting = details[5].setting !== details[6].setting ? 'block_third_party' : details[5].setting
35+
const cookies = details[7].setting !== details[8].setting ? 'block_third_party' : details[7].setting
3336
return {
3437
url: url.href,
3538
origin,
@@ -40,7 +43,8 @@ export const getShieldSettingsForTabData = (tabData?: chrome.tabs.Tab) => {
4043
trackers: details[2].setting,
4144
httpUpgradableResources: details[3].setting,
4245
javascript: details[4].setting,
43-
fingerprinting
46+
fingerprinting,
47+
cookies
4448
}
4549
}).catch(() => {
4650
return {
@@ -171,6 +175,37 @@ export const setAllowFingerprinting = (origin: string, setting: string) => {
171175
return Promise.all([p1, p2])
172176
}
173177

178+
/**
179+
* Changes the cookie at origin to be allowed or blocked.
180+
* @param {string} origin the origin of the site to change the setting for
181+
* @return a promise which resolves with the setting is set
182+
*/
183+
export const setAllowCookies = (origin: string, setting: string) => {
184+
const originSetting = setting === 'allow' ? 'allow' : 'block'
185+
const firstPartySetting = setting === 'block' ? 'block' : 'allow'
186+
187+
const p1 = chrome.contentSettings.plugins.setAsync({
188+
primaryPattern: origin + '/*',
189+
resourceIdentifier: { id: resourceIdentifiers.RESOURCE_IDENTIFIER_REFERRERS },
190+
setting: originSetting
191+
})
192+
193+
const p2 = chrome.contentSettings.plugins.setAsync({
194+
primaryPattern: origin + '/*',
195+
resourceIdentifier: { id: resourceIdentifiers.RESOURCE_IDENTIFIER_COOKIES },
196+
setting: originSetting
197+
})
198+
199+
const p3 = chrome.contentSettings.plugins.setAsync({
200+
primaryPattern: origin + '/*',
201+
secondaryPattern: 'https://firstParty/*',
202+
resourceIdentifier: { id: resourceIdentifiers.RESOURCE_IDENTIFIER_COOKIES },
203+
setting: firstPartySetting
204+
})
205+
206+
return Promise.all([p1, p2, p3])
207+
}
208+
174209
/**
175210
* Toggles the input value between allow and block
176211
* @return the toggled value

app/background/reducers/shieldsPanelReducer.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
setAllowHTTPUpgradableResources,
1414
setAllowJavaScript,
1515
setAllowFingerprinting,
16+
setAllowCookies,
1617
toggleShieldsValue,
1718
requestShieldPanelData
1819
} from '../api/shieldsAPI'
@@ -226,6 +227,21 @@ export default function shieldsPanelReducer (state: State = { tabs: {}, windows:
226227
})
227228
break
228229
}
230+
case shieldsPanelTypes.BLOCK_COOKIES:
231+
{
232+
const tabData: Tab = shieldsPanelState.getActiveTabData(state)
233+
setAllowCookies(tabData.origin, action.setting)
234+
.then(() => {
235+
requestShieldPanelData(shieldsPanelState.getActiveTabId(state))
236+
reloadTab(tabData.id, true).catch(() => {
237+
console.error('Tab reload was not successful')
238+
})
239+
})
240+
.catch(() => {
241+
console.error('Could not set cookies setting')
242+
})
243+
break
244+
}
229245
}
230246
return state
231247
}

app/components/braveShields/braveShields.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ interface Props {
1818
httpsEverywhereToggled: shieldActions.HttpsEverywhereToggled
1919
javascriptToggled: shieldActions.JavascriptToggled
2020
blockFingerprinting: shieldActions.BlockFingerprinting
21+
blockCookies: shieldActions.BlockCookies
2122
}
2223
shieldsPanelTabData: Tab
2324
}
@@ -58,6 +59,8 @@ export default class BraveShields extends React.Component<Props, object> {
5859
controlsOpen={shieldsPanelTabData.controlsOpen}
5960
fingerprinting={shieldsPanelTabData.fingerprinting}
6061
blockFingerprinting={actions.blockFingerprinting}
62+
cookies={shieldsPanelTabData.cookies}
63+
blockCookies={actions.blockCookies}
6164
/>
6265
<BraveShieldsFooter />
6366
</div>

app/components/braveShields/braveShieldsControls.tsx

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import * as React from 'react'
66
import { Grid, Column, SwitchButton, BrowserSelect, ContentToggle } from 'brave-ui'
77
import * as shieldActions from '../../types/actions/shieldsPanelActions'
8-
import { BlockOptions, BlockFPOptions } from '../../types/other/blockTypes'
8+
import { BlockOptions, BlockFPOptions, BlockCookiesOptions } from '../../types/other/blockTypes'
99
import { getMessage } from '../../background/api/localeAPI'
1010

1111
export interface Props {
@@ -16,32 +16,30 @@ export interface Props {
1616
trackers: BlockOptions
1717
javascript: BlockOptions
1818
fingerprinting: BlockFPOptions
19+
cookies: BlockCookiesOptions
1920
blockAdsTrackers: shieldActions.BlockAdsTrackers
2021
controlsToggled: shieldActions.ControlsToggled
2122
httpsEverywhereToggled: shieldActions.HttpsEverywhereToggled
2223
javascriptToggled: shieldActions.JavascriptToggled
2324
blockFingerprinting: shieldActions.BlockFingerprinting
25+
blockCookies: shieldActions.BlockCookies
2426
}
2527

2628
export default class BraveShieldsControls extends React.Component<Props, object> {
2729
constructor (props: Props) {
2830
super(props)
2931
this.onChangeAdControl = this.onChangeAdControl.bind(this)
30-
this.onChangeCookieControl = this.onChangeCookieControl.bind(this)
3132
this.onToggleControls = this.onToggleControls.bind(this)
3233
this.onToggleHTTPSEverywhere = this.onToggleHTTPSEverywhere.bind(this)
3334
this.onToggleJavaScript = this.onToggleJavaScript.bind(this)
3435
this.onChangeFingerprintingProtection = this.onChangeFingerprintingProtection.bind(this)
36+
this.onChangeCookiesProtection = this.onChangeCookiesProtection.bind(this)
3537
}
3638

3739
onChangeAdControl (e: HTMLSelectElement) {
3840
this.props.blockAdsTrackers(e.target.value)
3941
}
4042

41-
onChangeCookieControl (e: HTMLSelectElement) {
42-
// TODO: @cezaraugusto
43-
}
44-
4543
onToggleControls () {
4644
this.props.controlsToggled(!this.props.controlsOpen)
4745
}
@@ -58,8 +56,12 @@ export default class BraveShieldsControls extends React.Component<Props, object>
5856
this.props.blockFingerprinting(e.target.value)
5957
}
6058

59+
onChangeCookiesProtection (e: HTMLSelectElement) {
60+
this.props.blockCookies(e.target.value)
61+
}
62+
6163
render () {
62-
const { braveShields, ads, trackers, controlsOpen, httpUpgradableResources, javascript, fingerprinting } = this.props
64+
const { braveShields, ads, trackers, controlsOpen, httpUpgradableResources, javascript, fingerprinting, cookies } = this.props
6365
return (
6466
<Grid
6567
id='braveShieldsControls'
@@ -84,16 +86,16 @@ export default class BraveShieldsControls extends React.Component<Props, object>
8486
<option value='allow'>{getMessage('shieldsControlsAdControlOptionBlockAds')}</option>
8587
<option value='block'>{getMessage('shieldsControlsAdControlOptionAllowAdsTracking')}</option>
8688
</BrowserSelect>
87-
{/* TODO @cezaraugusto */}
89+
8890
<BrowserSelect
8991
disabled={braveShields === 'block'}
9092
titleName={getMessage('shieldsControlsCookieControl')}
91-
value='someVALUE'
92-
onChange={this.onChangeCookieControl}
93+
value={braveShields !== 'block' ? cookies : 'allow'}
94+
onChange={this.onChangeCookiesProtection}
9395
>
94-
<option value='SOME'>{getMessage('shieldsControlsCookieOptionBlock3p')}</option>
95-
<option value='SOME'>{getMessage('shieldsControlsCookieOptionAllowAll')}</option>
96-
<option value='SOME'>{getMessage('shieldsControlsCookieOptionBlockAll')}</option>
96+
<option value='block_third_party'>{getMessage('shieldsControlsCookieOptionBlock3p')}</option>
97+
<option value='block'>{getMessage('shieldsControlsCookieOptionBlockAll')}</option>
98+
<option value='allow'>{getMessage('shieldsControlsCookieOptionAllowAll')}</option>
9799
</BrowserSelect>
98100

99101
<BrowserSelect

app/constants/resourceIdentifiers.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,5 @@ export const RESOURCE_IDENTIFIER_TRACKERS = 'trackers'
77
export const RESOURCE_IDENTIFIER_HTTP_UPGRADABLE_RESOURCES = 'httpUpgradableResources'
88
export const RESOURCE_IDENTIFIER_BRAVE_SHIELDS = 'braveShields'
99
export const RESOURCE_IDENTIFIER_FINGERPRINTING = 'fingerprinting'
10+
export const RESOURCE_IDENTIFIER_COOKIES = 'cookies'
11+
export const RESOURCE_IDENTIFIER_REFERRERS = 'referrers'

app/constants/shieldsPanelTypes.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ export const CONTROLS_TOGGLED = 'CONTROLS_TOGGLED'
1010
export const HTTPS_EVERYWHERE_TOGGLED = 'HTTPS_EVERYWHERE_TOGGLED'
1111
export const JAVASCRIPT_TOGGLED = 'JAVASCRIPT_TOGGLED'
1212
export const BLOCK_FINGERPRINTING = 'BLOCK_FINGERPRINTING'
13+
export const BLOCK_COOKIES = 'BLOCK_COOKIES'

app/types/actions/shieldsPanelActions.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* You can obtain one at http://mozilla.org/MPL/2.0/. */
44

55
import * as types from '../constants/shieldsPanelTypes'
6-
import { BlockTypes, BlockOptions, BlockFPOptions } from '../other/blockTypes'
6+
import { BlockTypes, BlockOptions, BlockFPOptions, BlockCookiesOptions } from '../other/blockTypes'
77

88
export interface ShieldDetails {
99
id: number
@@ -12,6 +12,7 @@ export interface ShieldDetails {
1212
httpUpgradableResources: BlockOptions
1313
javascript: BlockOptions
1414
fingerprinting: BlockFPOptions
15+
cookies: BlockCookiesOptions
1516
origin: string
1617
hostname: string
1718
}
@@ -66,6 +67,15 @@ export interface BlockFingerprinting {
6667
(setting: BlockFPOptions): BlockFingerprintingReturn
6768
}
6869

70+
interface BlockCookiesReturn {
71+
type: types.BLOCK_COOKIES
72+
setting: BlockCookiesOptions
73+
}
74+
75+
export interface BlockCookies {
76+
(setting: BlockCookiesOptions): BlockCookiesReturn
77+
}
78+
6979
interface ControlsToggledReturn {
7080
type: types.CONTROLS_TOGGLED
7181
setting: boolean
@@ -99,4 +109,5 @@ export type shieldPanelActions =
99109
ControlsToggledReturn |
100110
HttpsEverywhereToggledReturn |
101111
JavascriptToggledReturn |
102-
BlockFingerprintingReturn
112+
BlockFingerprintingReturn |
113+
BlockCookiesReturn

app/types/constants/resourceIdentifiers.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ export type RESOURCE_IDENTIFIER_ADS = typeof types.RESOURCE_IDENTIFIER_ADS
1212
export type RESOURCE_IDENTIFIER_TRACKERS = typeof types.RESOURCE_IDENTIFIER_TRACKERS
1313
export type RESOURCE_IDENTIFIER_HTTP_UPGRADABLE_RESOURCES = typeof types.RESOURCE_IDENTIFIER_HTTP_UPGRADABLE_RESOURCES
1414
export type RESOURCE_IDENTIFIER_FINGERPRINTING = typeof types.RESOURCE_IDENTIFIER_FINGERPRINTING
15+
export type RESOURCE_IDENTIFIER_COOKIES = typeof types.RESOURCE_IDENTIFIER_COOKIES

app/types/constants/shieldsPanelTypes.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ export type CONTROLS_TOGGLED = typeof types.CONTROLS_TOGGLED
1212
export type HTTPS_EVERYWHERE_TOGGLED = typeof types.HTTPS_EVERYWHERE_TOGGLED
1313
export type JAVASCRIPT_TOGGLED = typeof types.JAVASCRIPT_TOGGLED
1414
export type BLOCK_FINGERPRINTING = typeof types.BLOCK_FINGERPRINTING
15+
export type BLOCK_COOKIES = typeof types.BLOCK_COOKIES

0 commit comments

Comments
 (0)