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

Introducing GDPR compliance checks and policy #10064

Merged
merged 33 commits into from
Aug 28, 2023
Merged
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
90441d8
Introduced gdpr dialog
calixtus Jul 3, 2023
487695b
Added check for first run
calixtus Jul 3, 2023
8ac58ee
l10n
calixtus Jul 3, 2023
c490423
Merge remote-tracking branch 'upstream/main' into gdpr_checks
calixtus Jul 3, 2023
d370647
Adjust icon size
calixtus Jul 3, 2023
d9ac20d
Removed dialog
calixtus Aug 19, 2023
dffff2f
Fixed enable web search
calixtus Aug 19, 2023
45c956e
Bind search button to enable preference
calixtus Aug 19, 2023
5badfe5
Merge remote-tracking branch 'upstream/main' into gdpr_checks
calixtus Aug 19, 2023
4285f32
Added privacy policy
calixtus Aug 24, 2023
611429e
Small changes, introducing journals
calixtus Aug 24, 2023
3e3f7ad
Removed inconsistency
calixtus Aug 24, 2023
5c77ca7
Removed inconsistency
calixtus Aug 24, 2023
25a1020
Add hint to zotero (and Markdown lint fixes)
koppor Aug 26, 2023
1578dc7
Update PRIVACY.md
calixtus Aug 26, 2023
4e84578
Update PRIVACY.md
calixtus Aug 26, 2023
c164462
Update PRIVACY.md
calixtus Aug 26, 2023
d72615e
Update PRIVACY.md
calixtus Aug 26, 2023
4f09174
Update PRIVACY.md
calixtus Aug 26, 2023
4ca3d9f
l10n
calixtus Aug 26, 2023
c652bec
Merge remote-tracking branch 'upstream/main' into gdpr_checks
calixtus Aug 26, 2023
dad9de1
Refactor and relocate journal popup preferences
calixtus Aug 27, 2023
b05be39
privacy.md displayed in installer
calixtus Aug 27, 2023
6a5dfbb
CHANGELOG.md
calixtus Aug 27, 2023
2339cbe
Added pref vor version check
calixtus Aug 27, 2023
705c9b4
Merge branch 'main' into gdpr_checks
calixtus Aug 27, 2023
4273a78
Merge remote-tracking branch 'upstream/main' into gdpr_checks
Siedlerchr Aug 28, 2023
3f8f0e8
mege license and privacy policy together
Siedlerchr Aug 28, 2023
ef2f60e
Rename LICENSE_With_Privacy.md to LICENSE_with_Privacy.md
koppor Aug 28, 2023
ad9987a
Update build.gradle
koppor Aug 28, 2023
9ec80b4
add privacy policy button to about view
Siedlerchr Aug 28, 2023
c25b0ce
Merge remote-tracking branch 'upstream/gdpr_checks' into gdpr_checks
Siedlerchr Aug 28, 2023
0906da7
checkstyle
Siedlerchr Aug 28, 2023
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
111 changes: 111 additions & 0 deletions PRIVACY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
# Privacy Policy
Last updated: 2023-08-24

Your privacy is a fundamental right JabRef e.V. respects and supports.
By using JabRef and its related online services, you choose to share some of this information.
calixtus marked this conversation as resolved.
Show resolved Hide resolved
In this Privacy Policy We explain how We collect, use, and share information about you, along with the choices you have.
calixtus marked this conversation as resolved.
Show resolved Hide resolved

Please remember that no method of transmission over the Internet, or method of electronic storage is absolute secure.
While We strive to use commercially acceptable means to protect your Personal Data, We cannot guarantee its absolute security.
Also, whenever you communicate through the internet, your IP-Address will be transmitted and retained by other parties for technical reasons.

The term 'Personal information' in this policy means any information that either directly identifies you or can be somehow linked to you. 'JabRef' is the software application, JabRef e.V. provides.
calixtus marked this conversation as resolved.
Show resolved Hide resolved
calixtus marked this conversation as resolved.
Show resolved Hide resolved

## JabRef
calixtus marked this conversation as resolved.
Show resolved Hide resolved

### Collecting information
JabRef does not collect any personal information directly linked to you.
However, on certain occasions the software application will send some information to the online services of JabRef e.V.:
- On application start, JabRef will check for the latest version online (by default *enabled*).
- Information about a journal you are citing when looking for more information about this journal, using our journal database (by default *enabled*).
- A pdf document you automatically want to extract citation information from, using our GROBID service (by default *disabled*).
- Anonymized statistical data on the use of the graphical user interface for internal analysis purposes (by default *disabled*).

### Storing information
JabRef does not store any personal information, except:
calixtus marked this conversation as resolved.
Show resolved Hide resolved
- Your proxy username and password, if you decide to store them (by default *disabled*).
- Any personal API key you use to access third party online services (by default *disabled*).

### Sharing information
Certain operations you perform in JabRef may trigger requests to public third-party services such as Zotero, Crossref or the Library of Congress for metadata retrieval.
These third parties may log besides your IP address and the search terms (e.g., DOI, ISBN or the current URL) according to their privacy policies.
calixtus marked this conversation as resolved.
Show resolved Hide resolved

These third-party services are the following:

| Service | Privacy Policy |
|-----------------------------------------------------------------------------------------------------------------|----------------|
| [ACM](https://www.acm.org/) | <https://www.acm.org/privacy-policy> |
| [ACS Publications](https://pubs.acs.org/) | <https://www.acs.org/privacy.html> |
| [APS Advancing Physics](https://harvest.aps.org/) | <https://www.aps.org/about/privacy.cfm#privacy> |
| [arXiv.org](https://arxiv.org/) | <https://info.arxiv.org/help/policies/privacy_policy.html> |
| [Bibliotheksverbund Bayern](https://www.bib-bvb.de/) | <https://www.bib-bvb.de/web/guest/datenschutzerklaerung-bvb-homepage> |
| [Biodiversity Heritage Library](https://www.biodiversitylibrary.org/) | <https://www.si.edu/Privacy> |
| [Collection of Computer Science Bibliographies](http://liinwww.ira.uka.de/) | **currently unavailable**, offline |
| [CrossRef](https://www.crossref.org/) | <https://www.crossref.org/operations-and-sustainability/privacy/> |
| [dblp](https://dblp.uni-trier.de/) | <https://dblp.uni-trier.de/db/about/privacy.html> |
| [Directory of Open Access Books](https://www.doabooks.org/) | <https://www.doabooks.org/en/resources/accessibility> |
| [Digitala Vetenskapliga Arkivet](https://www.diva-portal.org/) | <https://www.uu.se/en/about-uu/data-protection-policy/> |
| [DOI Foundation](https://www.doi.org/) | <https://www.doi.org/privacy-policy/> |
| [Elsevier](https://www.elsevier.com/) | <https://www.elsevier.com/legal/privacy-policy> |
| [Google Scholar](https://scholar.google.com/) | <https://policies.google.com/privacy> |
| [Gemeinsamer Verbundkatalog](https://www.gbv.de/) | <https://www.gbv.de/datenschutz> |
| [IACR](https://www.iacr.org/) | <https://www.iacr.org/privacy.html> |
| [IEEEXplore](https://ieeexplore.ieee.org/Xplore/home.jsp) | <https://www.ieee.org/security-privacy.html> |
| [INSPIRE](https://inspirehep.net/) | <https://cern.service-now.com/service-portal?id=privacy_policy&se=INSPIRE-Online&notice=main> |
| [JSTOR](https://www.jstor.org/) | <https://www.ithaka.org/privacypolicy/> |
| [Library of Congress](https://lccn.loc.gov/) | <https://www.loc.gov/legal/> |
| [National Library of Medicine](https://www.ncbi.nlm.nih.gov/) | <https://www.nlm.nih.gov/web_policies.html> |
| [MathSciNet](http://www.ams.org/mathscinet) | <https://www.ams.org/about-us/privacy> |
| [mEDRA](https://medra.org/) | <https://www.medra.org/stdoc/en/Servizio_DOI_Informativa_ENG.pdf> |
| [Mr. DLib](https://mr-dlib.org/) &ast; | <https://support.dataverse.harvard.edu/harvard-dataverse-privacy-policy> |
| [Openlibrary](https://openlibrary.org) | <https://archive.org/about/terms.php> |
| [ResearchGate](https://www.researchgate.net/) | <https://www.researchgate.net/privacy-policy> |
| [IETF Datatracker](https://datatracker.ietf.org/) | <https://www.ietf.org/privacy-statement/> |
| [Semantic Scholar](https://www.semanticscholar.org/), powered by [Allen Institute for AI](https://allenai.org/) | <https://allenai.org/privacy-policy> |
| [Springer Nature](https://dev.springernature.com/) | <https://dev.springernature.com/privacypolicy> |
| [The SAO/NASA Astrophysics Data System](https://ui.adsabs.harvard.edu/) | <https://ui.adsabs.harvard.edu/help/privacy/> |
| [Unpaywall](https://unpaywall.org/) | <https://unpaywall.org/legal/privacy> |
| [zbMATH Open](https://www.zbmath.org) | <https://zbmath.org/privacy-policy/> |

&ast; *Note: The Mr. DLib service is used for the related articles tab in the entry editor and collects also your language, your browser and operating system (by default *disabled*).*

## JabRef Browser Extension

No personal data (like name, email address, billing address or credit card) is collected.
By using the extension you will remain completely anonymous.
calixtus marked this conversation as resolved.
Show resolved Hide resolved

### Collecting information

When you access a website with your web browser, the Browser Extension is designed to save time by allowing you to quickly import bibliographic information into JabRef.
Therefor the extension collects and analyzes some information concerning your browser activity.
calixtus marked this conversation as resolved.
Show resolved Hide resolved
In particular, the following information is used:
- the url of the current website you are visiting,
- the content of the current website.

### Storing information
No data will be stored by the Browser Extension.

### Sharing information
The Browser Extension does not share any data except with the local instance of the JabRef software application, which stores the citation data as a new entry in its library.

## Links to other Websites
Our Service may contain links to other websites that are not operated by Us. If you click on a third party link, you will be directed to that third party's site. We strongly advise you to review the Privacy Policy of every site you visit.

We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.

## Changes to this Privacy Policy
This privacy policy may be changed eventually.
We encourage you to check this Privacy Policy periodically for any changes.
Any material change will be mentioned in the changelog and in our blog.

This privacy policy is in effect as of the day mentioned as "last updated" above and will remain in effect except with respect to any changes in its provisions in the future, which will be in effect immediately after being posted on this page.

## Contact
For any questions or concerns regarding the privacy policy, please send us an email to <[email protected]> or write to

JabRef e.V.<br>
calixtus marked this conversation as resolved.
Show resolved Hide resolved
Josef-Lanner-Str. 9<br>
71069 Sindelfingen<br>
Germany

If you get in touch with us, We may aks you to provide Us with certain personal information (e.g. name and email address) that can be used to contact or identify you.
calixtus marked this conversation as resolved.
Show resolved Hide resolved
15 changes: 10 additions & 5 deletions src/main/java/org/jabref/gui/JabRefGUI.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import org.jabref.preferences.PreferencesService;

import com.airhacks.afterburner.injection.Injector;
import com.tobiasdiez.easybind.EasyBind;
import impl.org.controlsfx.skin.DecorationPane;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -67,11 +68,15 @@ public JabRefGUI(Stage mainStage,

openWindow(mainStage);

new VersionWorker(Globals.BUILD_INFO.version,
mainFrame.getDialogService(),
Globals.TASK_EXECUTOR,
preferencesService.getInternalPreferences())
.checkForNewVersionDelayed();
EasyBind.subscribe(preferencesService.getInternalPreferences().versionCheckEnabledProperty(), enabled -> {
if (enabled) {
new VersionWorker(Globals.BUILD_INFO.version,
mainFrame.getDialogService(),
Globals.TASK_EXECUTOR,
preferencesService.getInternalPreferences())
.checkForNewVersionDelayed();
}
});

setupProxy();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ public class EntryEditorPreferences {
private final MapProperty<String, Set<Field>> defaultEntryEditorTabList;
private final BooleanProperty shouldOpenOnNewEntry;
private final BooleanProperty shouldShowRecommendationsTab;
private final BooleanProperty isMrdlibAccepted;
private final BooleanProperty shouldShowLatexCitationsTab;
private final BooleanProperty showSourceTabByDefault;
private final BooleanProperty enableValidation;
Expand All @@ -32,7 +31,6 @@ public EntryEditorPreferences(Map<String, Set<Field>> entryEditorTabList,
Map<String, Set<Field>> defaultEntryEditorTabList,
boolean shouldOpenOnNewEntry,
boolean shouldShowRecommendationsTab,
boolean isMrdlibAccepted,
boolean shouldShowLatexCitationsTab,
boolean showSourceTabByDefault,
boolean enableValidation,
Expand All @@ -44,7 +42,6 @@ public EntryEditorPreferences(Map<String, Set<Field>> entryEditorTabList,
this.defaultEntryEditorTabList = new SimpleMapProperty<>(FXCollections.observableMap(defaultEntryEditorTabList));
this.shouldOpenOnNewEntry = new SimpleBooleanProperty(shouldOpenOnNewEntry);
this.shouldShowRecommendationsTab = new SimpleBooleanProperty(shouldShowRecommendationsTab);
this.isMrdlibAccepted = new SimpleBooleanProperty(isMrdlibAccepted);
this.shouldShowLatexCitationsTab = new SimpleBooleanProperty(shouldShowLatexCitationsTab);
this.showSourceTabByDefault = new SimpleBooleanProperty(showSourceTabByDefault);
this.enableValidation = new SimpleBooleanProperty(enableValidation);
Expand Down Expand Up @@ -93,18 +90,6 @@ public void setShouldShowRecommendationsTab(boolean shouldShowRecommendationsTab
this.shouldShowRecommendationsTab.set(shouldShowRecommendationsTab);
}

public boolean isMrdlibAccepted() {
return isMrdlibAccepted.get();
}

public BooleanProperty isMrdlibAcceptedProperty() {
return isMrdlibAccepted;
}

public void setIsMrdlibAccepted(boolean isMrdlibAccepted) {
this.isMrdlibAccepted.set(isMrdlibAccepted);
}

public boolean shouldShowLatexCitationsTab() {
return shouldShowLatexCitationsTab.get();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -212,9 +212,8 @@ private ScrollPane getPrivacyDialog(BibEntry entry) {
vb.setSpacing(10);

button.setOnAction(event -> {
preferences.setIsMrdlibAccepted(true);

MrDlibPreferences mrDlibPreferences = preferencesService.getMrDlibPreferences();
mrDlibPreferences.setAcceptRecommendations(true);
mrDlibPreferences.setSendLanguage(cbLanguage.isSelected());
mrDlibPreferences.setSendOs(cbOS.isSelected());
mrDlibPreferences.setSendTimezone(cbTimezone.isSelected());
Expand All @@ -237,7 +236,7 @@ public boolean shouldShow(BibEntry entry) {
@Override
protected void bindToEntry(BibEntry entry) {
// Ask for consent to send data to Mr. DLib on first time to tab
if (preferences.isMrdlibAccepted()) {
if (preferencesService.getMrDlibPreferences().shouldAcceptRecommendations()) {
setContent(getRelatedArticlesPane(entry));
} else {
setContent(getPrivacyDialog(entry));
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/org/jabref/gui/help/SearchForUpdateAction.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ public SearchForUpdateAction(BuildInfo buildInfo, InternalPreferences internalPr
this.internalPreferences = internalPreferences;
this.dialogService = dialogService;
this.taskExecutor = taskExecutor;

this.executable.bind(internalPreferences.versionCheckEnabledProperty());
}

@Override
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/org/jabref/gui/help/VersionWorker.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,13 +58,21 @@ private Optional<Version> getNewVersion() throws IOException {
}

public void checkForNewVersionAsync() {
if (!internalPreferences.isVersionCheckEnabled()) {
return;
}

BackgroundTask.wrap(this::getNewVersion)
.onSuccess(version -> showUpdateInfo(version, true))
.onFailure(exception -> showConnectionError(exception, true))
.executeWith(taskExecutor);
}

public void checkForNewVersionDelayed() {
if (!internalPreferences.isVersionCheckEnabled()) {
return;
}

BackgroundTask.wrap(this::getNewVersion)
.onSuccess(version -> showUpdateInfo(version, false))
.onFailure(exception -> showConnectionError(exception, false))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.jabref.gui.importer.fetcher;

import javafx.beans.binding.BooleanExpression;
import javafx.css.PseudoClass;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
Expand Down Expand Up @@ -86,10 +87,12 @@ private void initialize() {
});

// Create button that triggers search
BooleanExpression importerEnabled = preferences.getImporterPreferences().importerEnabledProperty();
Button search = new Button(Localization.lang("Search"));
search.setDefaultButton(false);
search.setOnAction(event -> viewModel.search());
search.setMaxWidth(Double.MAX_VALUE);
search.disableProperty().bind(importerEnabled.not());
getChildren().addAll(fetcherContainer, query, search);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,13 @@ public StringProperty queryProperty() {
}

public void search() {
if (!preferencesService.getImporterPreferences().areImporterEnabled()) {
if (!preferencesService.getImporterPreferences().areImporterEnabled()) {
dialogService.notify(Localization.lang("Web search disabled"));
return;
}
}

String query = getQuery().trim();
if (StringUtil.isBlank(query)) {
dialogService.notify(Localization.lang("Please enter a search string"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import org.jabref.logic.l10n.Localization;
import org.jabref.model.entry.field.Field;
import org.jabref.model.entry.field.FieldFactory;
import org.jabref.preferences.MrDlibPreferences;
import org.jabref.preferences.PreferencesService;

public class EntryEditorTabViewModel implements PreferenceTabViewModel {
Expand All @@ -34,11 +35,13 @@ public class EntryEditorTabViewModel implements PreferenceTabViewModel {
private final DialogService dialogService;
private final PreferencesService preferencesService;
private final EntryEditorPreferences entryEditorPreferences;
private final MrDlibPreferences mrDlibPreferences;

public EntryEditorTabViewModel(DialogService dialogService, PreferencesService preferencesService) {
this.dialogService = dialogService;
this.preferencesService = preferencesService;
this.entryEditorPreferences = preferencesService.getEntryEditorPreferences();
this.mrDlibPreferences = preferencesService.getMrDlibPreferences();
}

@Override
Expand All @@ -49,7 +52,7 @@ public void setValues() {
openOnNewEntryProperty.setValue(entryEditorPreferences.shouldOpenOnNewEntry());
defaultSourceProperty.setValue(entryEditorPreferences.showSourceTabByDefault());
enableRelatedArticlesTabProperty.setValue(entryEditorPreferences.shouldShowRecommendationsTab());
acceptRecommendationsProperty.setValue(entryEditorPreferences.isMrdlibAccepted());
acceptRecommendationsProperty.setValue(mrDlibPreferences.shouldAcceptRecommendations());
enableLatexCitationsTabProperty.setValue(entryEditorPreferences.shouldShowLatexCitationsTab());
enableValidationProperty.setValue(entryEditorPreferences.shouldEnableValidation());
allowIntegerEditionProperty.setValue(entryEditorPreferences.shouldAllowIntegerEditionBibtex());
Expand Down Expand Up @@ -80,7 +83,7 @@ public void storeSettings() {
// entryEditorPreferences.setEntryEditorTabList();
entryEditorPreferences.setShouldOpenOnNewEntry(openOnNewEntryProperty.getValue());
entryEditorPreferences.setShouldShowRecommendationsTab(enableRelatedArticlesTabProperty.getValue());
entryEditorPreferences.setIsMrdlibAccepted(acceptRecommendationsProperty.getValue());
mrDlibPreferences.setAcceptRecommendations(acceptRecommendationsProperty.getValue());
entryEditorPreferences.setShouldShowLatexCitationsTab(enableLatexCitationsTabProperty.getValue());
entryEditorPreferences.setShowSourceTabByDefault(defaultSourceProperty.getValue());
entryEditorPreferences.setEnableValidation(enableValidationProperty.getValue());
Expand Down
Loading