Bug administration OwnNote

De EjnTricks

Sur les version 1.07 et 1.08, suite au passage à la version OwnCloud 9.0.X, 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.


Hand-icon.png Votre avis

Nobody voted on this yet

 You need to enable JavaScript to vote


Study icon.png 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.


Command-icon.png 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


Icon Personnalisation.png 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.


Download-icon.png 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


Icon-database-search.png 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 authorisé 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.