Bug administration OwnNote
Sur les version 1.07 et 1.08, suite au passage à la version 9.0.0, les paramètres d'administration n'étaient plus modifiables. Pour la version 1.08, une tentative de résolution a été mise en place, mais elle n'est pas fonctionnelle dans le cas d'une mise en place d'extension dans un "répertoire" autre que apps
comme expliqué dans l'article suivant.
Cet article présente l'étude et un hotfix pour ce cas particulier.
Votre avis
Nobody voted on this yet
|
|
Etude
La sauvegarde des paramètres d'administration s'effectue à partir d'un appel Ajax, dont le code se trouve dans le fichier ownnote/js/admin.js
.
function ocOwnnoteUrl(url) {
var newurl = OC.linkTo("ownnote",url).replace("apps/ownnote","index.php/apps/ownnote");
return newurl;
}
$(document).ready(function() {
$('#ownnote-folder').change(function() {
var val = $(this).val();
$.post(ocOwnnoteUrl("ajax/v0.2/ajaxsetval"), { field: 'folder', value: val }, function (data) {
console.log('response', data);
});
});
$('#ownnote-type').change(function() {
var val = $(this).val();
if (val == "") {
$('#ownnote-folder').val('');
$('#ownnote-folder-settings').css('display', 'none');
$.post(ocOwnnoteUrl("ajax/v0.2/ajaxsetval"), { field: 'folder', value: '' }, function (data) {
console.log('response', data);
});
} else
$('#ownnote-folder-settings').css('display', 'block');
});
$('#ownnote-disableannouncement').change(function() {
var da = "";
var c = $(this).is(':checked');
if (c)
da = "checked";
$.post(ocOwnnoteUrl("ajax/v0.2/ajaxsetval"), { field: 'disableAnnouncement', val: da }, function (data) {
console.log('response', data);
});
});
});
La construction de l'URL est réalisée dans la fonction ocOwnnoteUrl
, qui va utiliser la fonction OC.linkTo
pour construire le lien. La valeur retournée est ensuite modifiée afin de replacer apps/ownnote
par index.php/apps/ownnote
.
L'objectif est d'obtenir une URL du type http://SERVEUR/owncloud/index.php/apps/ownnote/ajax/v0.2/ajaxsetval
.
Or la fonction OC.linkTo
est définie dans le Javascript de OwnCloud, fichier core/js/js.js
avec le code suivant.
/**
* Get an absolute url to a file in an app
* @param {string} app the id of the app the file belongs to
* @param {string} file the file path relative to the app folder
* @return {string} Absolute URL to a file
*/
linkTo:function(app,file){
return OC.filePath(app,'',file);
},
Dans ce cas, les arguments sont les suivants.
Paramètre | Valeur |
---|---|
app | ownnote |
file | ajax/v0.2/ajaxsetval |
Puis la fonction OC.filePath
est exécutée.
filePath:function(app,type,file){
var isCore=OC.coreApps.indexOf(app)!==-1,
link=OC.webroot;
if(file.substring(file.length-3) === 'php' && !isCore){
link+='/index.php/apps/' + app;
if (file != 'index.php') {
link+='/';
if(type){
link+=encodeURI(type + '/');
}
link+= file;
}
}else if(file.substring(file.length-3) !== 'php' && !isCore){
link=OC.appswebroots[app];
if(type){
link+= '/'+type+'/';
}
if(link.substring(link.length-1) !== '/'){
link+='/';
}
link+=file;
}else{
if ((app == 'settings' || app == 'core' || app == 'search') && type == 'ajax') {
link+='/index.php/';
}
else {
link+='/';
}
if(!isCore){
link+='apps/';
}
if (app !== '') {
app+='/';
link+=app;
}
if(type){
link+=type+'/';
}
link+=file;
}
return link;
},
Dans ce cas, les arguments sont les suivants.
Paramètre | Valeur |
---|---|
app | ownnote |
type | |
file | ajax/v0.2/ajaxsetval |
Par conséquent, la valeur de isCore
est définie à false
, et la variable link
est initialisée avec la racine du site. L'argument file
ne se terminant pas par php
, la deuxième condition est validée. Le problème va venir de link=OC.appswebroots[app];
qui retourne une URL du type http://SERVER/owncloud/exapps/ownnote
, ce qui sera retourné puisque l'argument type
est vide.
Donc dans le code de OwnNote, cela produit une URL du type http://SERVEUR/owncloud/exindex.php/apps/ownnote/ajax/v0.2/ajaxsetval
, provoquant une erreur d'appel.
L'étude de la fonction standard de OwnCloud démontre donc que les arguments envoyés ne sont pas corrects et qu'il suffit de modifier légèrement le code pour construire correctement l'URL.
Mise en place
Afin de ne pas modifier l'installation réalisée de la version 1.08, le fix est réalisée comme une installation d'une nouvelle version du plugin. Pour mémoire, la version est installée dans le répertoire /var/opt/owncloud/common/apps-available/ownnote/1.08
. Le fix sera mis en place dans le répertoire /var/opt/owncloud/common/apps-available/ownnote/1.08.1
de la façon suivante.
#sudo cp -p -R /var/opt/owncloud/common/apps-available/ownnote/1.08 /var/opt/owncloud/common/apps-available/ownnote/1.08.1 #sudo rm /var/opt/owncloud/common/apps-enabled/ownnote #sudo ln -s /var/opt/owncloud/common/apps-available/ownnote/1.08.1 /var/opt/owncloud/common/apps-enabled/ownnote #sudo chown -h www-data:www-data /var/opt/owncloud/common/apps-enabled/ownnote
Code
L'objectif est donc de modifier la construction de lien. Comme indiqué durant l'étude, les arguments vont être modifiés afin d'obtenir un lien relatif index.php/apps/ownnote
.
function ocOwnnoteUrl() {
// function ocOwnnoteUrl(url) {
// var newurl = OC.linkTo("ownnote",url).replace("apps/ownnote","index.php/apps/ownnote");
var newurl = OC.linkTo("ownnote","index.php") + "/ajax/v0.2/ajaxsetval";
return newurl;
}
$(document).ready(function() {
$('#ownnote-folder').change(function() {
var val = $(this).val();
// $.post(ocOwnnoteUrl("ajax/v0.2/ajaxsetval"), { field: 'folder', value: val }, function (data) {
$.post(ocOwnnoteUrl(), { field: 'folder', value: val }, function (data) {
console.log('response', data);
});
});
$('#ownnote-type').change(function() {
var val = $(this).val();
if (val == "") {
$('#ownnote-folder').val('');
$('#ownnote-folder-settings').css('display', 'none');
// $.post(ocOwnnoteUrl("ajax/v0.2/ajaxsetval"), { field: 'folder', value: '' }, function (data) {
$.post(ocOwnnoteUrl(), { field: 'folder', value: '' }, function (data) {
console.log('response', data);
});
} else
$('#ownnote-folder-settings').css('display', 'block');
});
$('#ownnote-disableannouncement').change(function() {
var da = "";
var c = $(this).is(':checked');
if (c)
da = "checked";
// $.post(ocOwnnoteUrl("ajax/v0.2/ajaxsetval"), { field: 'disableAnnouncement', val: da }, function (data) {
$.post(ocOwnnoteUrl(), { field: 'disableAnnouncement', value: da }, function (data) {
console.log('response', data);
});
});
});
A noter que la signature de la fonction ocOwnnoteUrl
a été modifiée pour ne plus accepter d'argument. En effet, elle est appelée avec la même valeur. Afin de factoriser le code, il est préférable de tout mettre dans le corps de la fonction.
Téléchargement
Le code source du fix est disponible dans l'archive suivante. Celle-ci contient le fichier admin.js
, qu'il faut placer dans le répertoire js
de OwnNote.
admin.js.gz
Valeur base de données
Malgré le correctif, il est apparu impossible de modifier le paramètre Désactiver les annonces
sur la page d'administration. L'erreur provenait des valeurs de la base de données. Le contenu de la table oc_appconfig
pour l'application était le suivant.
mysql> select * from oc_appconfig where appid = 'ownnote'; +---------+---------------------+-------------+ | appid | configkey | configvalue | +---------+---------------------+-------------+ | ownnote | disableAnnouncement | NULL | | ownnote | enabled | yes | | ownnote | folder | Notes | | ownnote | installed_version | 1.08 | | ownnote | types | | +---------+---------------------+-------------+
Pour une raison inconnue, bug OwnCloud ?, quand la valeur est NULL
malgré que cela soit autorisé dans la définition de la table, la mise à jour ne fonctionne pas. Il est donc nécessaire de modifier celle ci avec une chaîne vide, directement dans la base de données.
mysql> update oc_appconfig set configvalue= where configkey='disableAnnouncement' and appid='ownnote'; Query OK, 1 row affected (0,05 sec) Rows matched: 1 Changed: 1 Warnings: 0
Après cette modification, l'activation / désactivation de l'option est opérationnelle.