Make public settings only visible to logged in users, reset new user dictionaries to not public if uploading for the first time.

This commit is contained in:
Robbie Antenesse 2015-12-22 11:20:33 -07:00
parent b98f1750d9
commit 9eda4e410e
8 changed files with 59 additions and 41 deletions

View File

@ -5,10 +5,10 @@ This document was last updated on November 02, 2015.
This Privacy Policy governs the manner in which Lexiconga Dictionary Builder collects, uses, maintains and discloses information collected from users (each, a "User") of the http://lexicon.ga website ("Site") and its accounts ("Account").
### Personal identification information
We may collect personal identification information from Users in a variety of ways, including, but not limited to, when Users visit our site, register on the site, and in connection with other activities, services, features or resources we make available on our Site. Users may be asked for, as appropriate, their email address. Users may, however, use our Site anonymously. We will collect personal identification information from Users only if they voluntarily submit such information to us. Users can always refuse to supply personal identification information, except that it may prevent them from engaging in certain Site-related activities.
We may collect personal identification information from Users in a variety of ways, including, but not limited to, when Users visit our site, register on the site, and in connection with other activities, services, features or resources we make available on our Site. Users may be asked for, as appropriate, their name and email address. Users may, however, use our Site anonymously. We will collect personal identification information from Users only if they voluntarily submit such information to us. Users can always refuse to supply personal identification information, except that it may prevent them from engaging in certain Site-related activities.
### Non-personal identification information
We may collect non-personal identification information about Users whenever they interact with our Site. Non-personal identification information may include the browser name, the type of computer and technical information about Users means of connection to our Site, such as the operating system and the Internet service providers utilized and other similar information.
We may collect non-personal identification information about Users whenever they interact with our Site through website analytics tools. Non-personal identification information may include the browser name, the type of computer and technical information about Users means of connection to our Site, such as the operating system and the Internet service providers utilized and other similar information.
### Web browser cookies
Our Site does not use "cookies" to enhance User experience, but it does use "local storage". User's web browser places local storage on their hard drive for record-keeping purposes and sometimes to track information about them, but we only use this to store your current dictionary. User may choose to set their web browser to refuse local storage usage, but if they do so, the Site will not function properly.
@ -20,13 +20,15 @@ Lexiconga Dictionary Builder may collect and use Users personal information for
### How we protect your information
If you are utilizing an Account, we protect your information by keeping your information on a trusted database server provided by the Site's web host. All data you save from an Account is uploaded to this database server from your browser.
If you utilize the ability to make dictionaries associated with an Account visible to the public, you accept all responsibility for its content being visible to anyone who might find it. We cannot protect what you willingly put in public, and we do not accept liability if information you place online is used against you somehow. Never put personal information online!
If you are not using an Account, then all of your information remains right on your own computer where it belongs. As mentioned previously, all data is stored in your browser's "local storage".
### Sharing your personal information
We do not sell, trade, or rent Users personal identification information to others. We may share generic aggregated demographic information not linked to any personal identification information regarding visitors and users with our business partners, trusted affiliates and advertisers for the purposes outlined above.
### Electronic newsletters
If User decides to opt-in to our mailing list, they will receive emails that may include company news, updates, related product or service information, etc. We may use third party service providers to help us operate our business and the Site or administer activities on our behalf, such as sending out newsletters or surveys. We may share your information with these third parties for those limited purposes provided that you have given us your permission.
If User decides to opt-in to our mailing list, they will receive emails that may include company news, updates, related product or service information, etc. We may use third party service providers like MailChimp to help us operate our business and the Site or administer activities on our behalf, such as sending out newsletters or surveys. We may share your information with these third parties for those limited purposes provided that you have given us your permission.
### Third party websites
Users may find advertising or other content on our Site that link to the sites and services of our partners, suppliers, advertisers, sponsors, licencors and other third parties. We do not control the content or links that appear on these sites and are not responsible for the practices employed by websites linked to or from our Site. In addition, these sites or services, including their content and links, may be constantly changing. These sites and services may have their own privacy policies and customer service policies. Browsing and interaction on any other website, including websites which have a link to our Site, is subject to that website's own terms and policies.
@ -44,4 +46,4 @@ Lexiconga Dictionary Builder has the discretion to update this privacy policy at
By using this Site, you signify your acceptance of this policy. If you do not agree to this policy, please do not use our Site. Your continued use of the Site following the posting of changes to this policy will be deemed your acceptance of those changes. This policy was originally generated using PrivacyPolicies.com and modified for our use.
### Contacting us
If you have any questions about this Privacy Policy, the practices of this site, or your dealings with this site, please contact us by email at gamedev (at) alamantus (dot) com or follow us Twitter @alamantus.
If you have any questions about this Privacy Policy, the practices of this site, or your dealings with this site, please contact us by email at help (at) lexicon (dot) ga or follow us Twitter @alamantus.

View File

@ -20,6 +20,7 @@ If you would like an added layer of accessibility and security (in case you clea
* [Differences](#differences)
* [Account Settings](#account-settings)
* [Dictionary Settings](#dictionary-settings)
* [Public Dictionaries](#public-dictionaries)
* [Forgot Your Password?](#forgot-your-password-)
* [Lockout](#lockout)
* [Problems or Requests](#problems-or-requests)
@ -114,6 +115,8 @@ The "Reset Password" button in the "Reset Your Password" section will allow you
#### Dictionary Settings
Under the Settings menu, you'll see some additional options:
The **Dictionary is Public** checkbox determines whether or not the current dictionary can be viewed by anyone online using the Public Link that appears when checked. Public dictionaries are explained more below.
The **Change Dicitonaries** dropdown box contains the names of all of your created dictionaries. If you have more than one, selecting a different dictionary from the list will immediately download and display that dictionary.
The **Create New Dictionary** button will instantly create and save a new blank dictionary to your account.
@ -122,6 +125,11 @@ The **Import Dictionary** button acts the same as before, but instead of overwri
The **Delete Current Dictionary** button will permanently and irretrievably delete the currently loaded dictionary from your account! Be careful with that one. After deleting, you will then be prompted to either select another dictionary to load or create a new one, _or_ if you have no other dictionaries, immediately create a new one for you.
#### Public Dictionaries
When a dictionary is marked as public, you can share its public link and allow anyone to view its contents without being able to make changes. The dictionary's description and the search/filter area is visible by default, and the viewer can scroll through or search your dictionary without being able to make changes.
To log in or create an account when viewing a dictionary, you need to go back to the main Lexiconga page. You can get there by clicking either the logo or the "Go Home" button.
### Forgot Your Password?
If you forget your password, you can request a password reset email by clicking the "Forgot Password" button on the "Log In/Create Account" button entering the email address associated with your account and clicking "Email Password Reset Key". This will send an email (_check your spam_) with a link that will allow you to reset your password. When you go to the link provided, you'll be able to enter a new password that you can log in with.

View File

@ -11,6 +11,13 @@ You may use our Service free of charge, and you are free to stop using our Servi
If you stop using our Service, your data will remain unless you request its removal. When data is removed from an Account in our Service, it becomes permanently irretrievable. You agree that you understand the implications of deleting or requesting the deletion of your data and that we are not liable for its loss.
Instructions for use are visible through the "About Lexiconga" button on the site.
### Public Dictionaries
Any dictionaries created and associated with an Account are private by default and only visible to the owner of the Account. You may make your dictionaries visible to the public at any time by utilizing the appropriate dictionarys setting.
If you utilize the ability to make dictionaries associated with an Account visible to the public, you accept all responsibility for any and all damages that may come as a result of the information you place online and acknowledge that we are not liable in any way. Do not put any personal information online. We cannot protect what you deliberately make publicly visible.
### Termination
We may terminate or suspend access to our Service immediately, without prior notice or liability, for any reason whatsoever, including without limitation if you breach the Terms. All provisions of the Terms which by their nature should survive termination shall survive termination, including, without limitation, ownership provisions, warranty disclaimers, indemnity and limitations of liability.
@ -30,4 +37,4 @@ We reserve the right, at our sole discretion, to modify or replace these Terms a
By continuing to access or use our Service after those revisions become effective, you agree to be bound by the revised terms. If you do not agree to the new terms, please stop using the Service.
### Contact Us
If you have any questions about these Terms, please contact us by email at gamedev (at) alamantus (dot) com or follow us on Twitter @alamantus.
If you have any questions about these Terms, please contact us by email at help (at) lexicon (dot) ga or follow us on Twitter @alamantus.

View File

@ -164,18 +164,20 @@ require_once(SITE_LOCATION . '/php/notificationconditiontree.php');
<span class="checkboxlabel">Dictionary is Complete</span>
<input type="checkbox" id="dictionaryIsComplete" />
</label>
<label class="inline">
<span class="checkboxlabel">Dictionary is Public</span>
<input type="checkbox" id="dictionaryIsPublic" onchange="TogglePublicLink()" />
</label> <span class="helperlink clickable" onclick='alert("If you save your settings with this checked, your dictionary will be viewable by anyone if they have the public link.");'>?</span>
<div id="publicLink"></div>
<?php if ($current_user > 0) { //If logged in, show the log out button. ?>
<label class="inline">
<span class="checkboxlabel">Dictionary is Public</span>
<input type="checkbox" id="dictionaryIsPublic" onchange="TogglePublicLink()" />
</label> <span class="helperlink clickable" onclick='alert("If you save your settings with this checked, your dictionary will be viewable by anyone if they have the public link.");'>?</span>
<div id="publicLink"></div>
<?php } ?>
</div>
<div class="settingsCol">
<label>
<b>Total Entries:</b> <i id="numberOfWordsInDictionary"></i>
</label>
<label><button type="button" onclick="ExportDictionary()" style="cursor:pointer;">Export Current Dictionary</button></label>
<?php if ($current_user > 0) { //If logged in, show the log out button. ?>
<?php if ($current_user > 0) { //If logged in, show the special options. ?>
<label><span>Change Dictionaries</span>
<select id="userDictionaries" onchange="ChangeDictionary();"></select>
</label>

View File

@ -342,7 +342,9 @@ function SaveSettings() {
currentDictionary.settings.sortByEquivalent = document.getElementById("dictionarySortByEquivalent").checked;
currentDictionary.settings.isComplete = document.getElementById("dictionaryIsComplete").checked;
currentDictionary.settings.isPublic = document.getElementById("dictionaryIsPublic").checked;
if (document.getElementById("dictionaryIsPublic")) {
currentDictionary.settings.isPublic = document.getElementById("dictionaryIsPublic").checked;
}
HideSettingsWhenComplete();
@ -505,8 +507,9 @@ function LoadDictionary() {
loadDictionary.onreadystatechange = function() {
if (loadDictionary.readyState == 4 && loadDictionary.status == 200) {
if (loadDictionary.responseText == "no dictionaries") {
// If there are no dictionaries in the database and there's one in memory, remove the id and send it as a new one.
// If there are no dictionaries in the database and there's one in memory, remove the id & public setting and send it as a new one.
currentDictionary.externalID = 0;
currentDictionary.settings.isPublic = false;
SendDictionary(true);
} else if (loadDictionary.responseText.length < 60) {
console.log(loadDictionary.responseText);
@ -621,6 +624,7 @@ function ImportDictionary() {
{
currentDictionary = JSON.parse(reader.result);
currentDictionary.externalID = 0; // Reset external id for imported dictionary.
currentDictionary.settings.isPublic = false; // Reset public setting for imported dictionary.
SaveDictionary(true, true);
ProcessLoad();
HideSettings();

View File

@ -136,3 +136,15 @@ function PublicDictionaryEntry(itemIndex) {
return entryText;
}
function SetPublicPartsOfSpeech () {
var wordFilterSelect = document.getElementById("wordFilter");
var newPartsOfSpeech = htmlEntitiesParse(publicDictionary.settings.partsOfSpeech).trim().split(",");
for (var j = 0; j < newPartsOfSpeech.length; j++) {
var wordFilterOption = document.createElement('option');
wordFilterOption.appendChild(document.createTextNode(newPartsOfSpeech[j].trim()));
wordFilterOption.value = newPartsOfSpeech[j].trim();
wordFilterSelect.appendChild(wordFilterOption);
}
}

View File

@ -320,8 +320,10 @@ function ShowSettings() {
document.getElementById("dictionaryCaseSensitive").checked = currentDictionary.settings.caseSensitive;
document.getElementById("dictionarySortByEquivalent").checked = currentDictionary.settings.sortByEquivalent;
document.getElementById("dictionaryIsComplete").checked = currentDictionary.settings.isComplete;
document.getElementById("dictionaryIsPublic").checked = currentDictionary.settings.isPublic;
TogglePublicLink();
if (document.getElementById("dictionaryIsPublic")) {
document.getElementById("dictionaryIsPublic").checked = currentDictionary.settings.isPublic;
TogglePublicLink();
}
document.getElementById("numberOfWordsInDictionary").innerHTML = currentDictionary.words.length.toString();
}

View File

@ -9,9 +9,6 @@ $current_user = isset($_SESSION['user']) ? $_SESSION['user'] : 0;
$dictionary_to_load = (isset($_GET['dict'])) ? intval($_GET['dict']) : 0;
$the_public_dictionary = '"That dictionary doesn\'t exist."';
$announcement = get_include_contents(SITE_LOCATION . '/announcement.php');
$notificationMessage = "";
if ($current_user > 0 || !isset($_SESSION['loginfailures']) || (isset($_SESSION['loginlockouttime']) && time() - $_SESSION['loginlockouttime'] >= 3600)) {
// If logged in, never failed, or more than 1 hour has passed, reset login failures.
$_SESSION['loginfailures'] = 0;
@ -45,9 +42,7 @@ try {
}
}
}
catch (PDOException $ex) {
print_r($dbconnection->errorInfo());
}
catch (PDOException $ex) {}
?>
<!DOCTYPE html>
@ -70,35 +65,20 @@ catch (PDOException $ex) {
<span id="aboutButton" class="clickable" onclick="ShowInfo('aboutText')">About Lexiconga</span>
</div>
<div id="loginoutArea" style="font-size:12px;">
<?php if ($current_user > 0) { //If logged in, show the log out button. ?>
<a href="../" class="clickable">Back to My Account</span> <a href="?logout" id="logoutLink" class="clickable">Log Out</a>
<?php } elseif (!isset($_SESSION['loginfailures']) || (isset($_SESSION['loginfailures']) && $_SESSION['loginfailures'] < 10)) { ?>
<span id="loginLink" class="clickable" onclick="ShowInfo('loginForm')">Log In/Create Account</span>
<?php } else { ?>
<span id="loginLink" class="clickable" title="<?php echo $hoverlockoutmessage; ?>" onclick="alert('<?php echo $alertlockoutmessage; ?>');">Can't Login</span>
<?php } ?>
<a id="loginLink" class="clickable" href="../" title="Go home to log in or create an account.">Go Home</a>
</div>
</div>
</header>
<contents>
<div id="announcementArea" style="display:<?php echo (($announcement) ? "block" : "none"); ?>;margin-bottom:10px;">
<span id="announcementCloseButton" class="clickable" onclick="document.getElementById('announcementArea').style.display='none';">Close</span>
<div id="announcement"><?php echo $announcement; ?></div>
</div>
<div id="notificationArea" style="display:<?php echo (($notificationMessage) ? "block" : "none"); ?>;">
<span id="notificationCloseButton" class="clickable" onclick="document.getElementById('notificationArea').style.display='none';">Close</span>
<div id="notificationMessage"><?php echo $notificationMessage; ?></div>
</div>
<div id="dictionaryContainer">
<h1 id="dictionaryName"></h1>
<h4 id="dictionaryBy"></h4>
<span id="descriptionToggle" class="clickable" onclick="ToggleDescription();">Show Description</span>
<div id="dictionaryDescription" style="display:none;"></div>
<span id="descriptionToggle" class="clickable" onclick="ToggleDescription();">Hide Description</span>
<div id="dictionaryDescription" style="display:block;"></div>
<span id="searchFilterToggle" class="clickable" onclick="ToggleSearchFilter();">Search/Filter Options</span>
<div id="searchFilterArea" style="display:none;">
<span id="searchFilterToggle" class="clickable" onclick="ToggleSearchFilter();">Hide Search/Filter Options</span>
<div id="searchFilterArea" style="display:block;">
<div id="searchArea" style="display:block;">
<label style="margin-top:10px;">
<span>Search</span>
@ -158,6 +138,7 @@ catch (PDOException $ex) {
var aboutText = termsText = privacyText = loginForm = forgotForm = "Loading...";
window.onload = function () {
ShowPublicDictionary();
SetPublicPartsOfSpeech();
GetTextFile("../README.md", "aboutText", true);
GetTextFile("../TERMS.md", "termsText", true);