Classic confinement request: audovia-classic

I would like to request classic confinement for my snap: audovia-classic.
This is a Java 11 version of my music making application, audovia, which is based on Java 8.
The application requires font files which I was able to install in Java 8’s internal directories. However, with changes in the way Java 11 handles fonts, I have been unable to do this with Java 11.
I require classic confinement to enable access to the System fonts to allow my application to work.

Have you tried Snap layouts feature yet?

Thanks for your suggestion.
I put the following in my snap.yaml:
layout:
/usr/share/fonts:
bind: $SNAP/usr/share/fonts
However, the Java program returns the following error:
Exception in thread “main” java.lang.InternalError: java.lang.reflect.InvocationTargetException
at java.desktop/sun.font.FontManagerFactory$1.run(FontManagerFactory.java:86)

Hey

System fonts are already supported and are not a candidate for granting classic confinement. Please look at using one of the desktop interfaces instead (edit) along with desktop helpers that handle the integration.

2 Likes

Thank you for your response.
It is my understanding from the snapd topic, Desktop: allow access to host system fonts, that System fonts are only available to strict confined snaps that use the desktop interface.
My application requires the x11 interface and including the desktop interface appears to make no difference.

This application runs in classic confinement, but in strict confinement, there is an error that is related to fonts but not necessarily the inability to read System fonts.
The application fails with a ReflectiveOperationException in the FontManagerFactory class. It is likely that the Class.forName function is the problem.
The FontManagerFactory class is shown below and is part of Oracle’s OpenJDK version 12.
I would be grateful if anyone could recommend a workaround for this problem or advise if classic confinement would be the only solution.
/*

  • Copyright © 2008, 2014, Oracle and/or its affiliates. All rights reserved.
  • DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  • This code is free software; you can redistribute it and/or modify it
  • under the terms of the GNU General Public License version 2 only, as
  • published by the Free Software Foundation. Oracle designates this
  • particular file as subject to the “Classpath” exception as provided
  • by Oracle in the LICENSE file that accompanied this code.
  • This code is distributed in the hope that it will be useful, but WITHOUT
  • ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  • FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  • version 2 for more details (a copy is included in the LICENSE file that
  • accompanied this code).
  • You should have received a copy of the GNU General Public License version
  • 2 along with this work; if not, write to the Free Software Foundation,
  • Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  • Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  • or visit www.oracle.com if you need additional information or have any
  • questions.
    */

package sun.font;

import java.awt.AWTError;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.awt.Toolkit;
import java.security.AccessController;
import java.security.PrivilegedAction;

import sun.security.action.GetPropertyAction;

/**

  • Factory class used to retrieve a valid FontManager instance for the current

  • platform.

  • A default implementation is given for Linux, Solaris and Windows.

  • You can alter the behaviour of the {@link #getInstance()} method by setting

  • the {@code sun.font.fontmanager} property. For example:

  • {@code sun.font.fontmanager=sun.awt.X11FontManager}
    */
    public final class FontManagerFactory {

    /** Our singleton instance. */
    private static FontManager instance = null;

    private static final String DEFAULT_CLASS;
    static {
    if (FontUtilities.isWindows) {
    DEFAULT_CLASS = “sun.awt.Win32FontManager”;
    } else if (FontUtilities.isMacOSX) {
    DEFAULT_CLASS = “sun.font.CFontManager”;
    } else {
    DEFAULT_CLASS = “sun.awt.X11FontManager”;
    }
    }

    /**

    • Get a valid FontManager implementation for the current platform.

    • @return a valid FontManager instance for the current platform
      */
      public static synchronized FontManager getInstance() {

      if (instance != null) {
      return instance;
      }

      AccessController.doPrivileged(new PrivilegedAction() {

       public Object run() {
           try {
               String fmClassName =
                       System.getProperty("sun.font.fontmanager",
                                          DEFAULT_CLASS);
               ClassLoader cl = ClassLoader.getSystemClassLoader();
               Class<?> fmClass = Class.forName(fmClassName, true, cl);
               instance =
                  (FontManager) fmClass.getDeclaredConstructor().newInstance();
           } catch (ReflectiveOperationException ex) {
               throw new InternalError(ex);
      
           }
           return null;
       }
      

      });

      return instance;
      }
      }

@Wimpress and @popey - please see @songbuilder’s question for help; is this something you’ve come across before?

1 Like

I have tried desktop-glib-only and there is no change. I have also tried desktop-qt5 but I get the message: The linker version ‘2.23’ used by the base ‘core’ is incompatible with files in this snap.

This seems like a build issue. You should build using base: core18 in your snap as this gives snapcraft the best compatibility (it will build things correctly regardless of the operating system version you are on).

1 Like

Thanks for your quick response. My snap is now working. However, I am getting the following message when I start the snap: /snap/audovia-classic/x15/bin/desktop-launch: line 29: /home/donald/.config/user-dirs.dirs: Permission denied.
Is there anything that can be done about this, or can it safely be ignored?

This access is provided by the ‘desktop’ interface. Make sure it is connected and the files owned by the calling user.

1 Like