[vlc-devel] [PATCH 1/2] dvdnav: Improve user information about insufficient permissions
Alexandre Janniaux
ajanni at videolabs.io
Tue May 5 10:07:40 CEST 2020
Hi,
I would probably put #ifdef around DVDProbeMacOSPermission
instead of inside as the function seems to depicts a MacOS
specificity.
Otherwise LGTM.
Regards,
--
Alexandre Janniaux
Videolabs
On Mon, May 04, 2020 at 08:09:13PM +0200, david.fuhrmann at gmail.com wrote:
> From: David Fuhrmann <dfuhrmann at videolan.org>
>
> The mentioned security setting is only relevant for accessing
> RAW block devices (/dev/xxx), which is one of the main use cases
> for this module (accessing an optical drive).
> It is not relevant for file or folder access.
>
> Probe for this case explicitly to inform the user only there.
>
> This is only relevant starting with macOS Catalina.
> ---
> modules/access/Makefile.am | 2 +-
> modules/access/dvd_helper.h | 57 +++++++++++++++++++++++++++++++++++++
> modules/access/dvdnav.c | 19 ++++++++-----
> 3 files changed, 70 insertions(+), 8 deletions(-)
> create mode 100644 modules/access/dvd_helper.h
>
> diff --git a/modules/access/Makefile.am b/modules/access/Makefile.am
> index b73fda5f4c..265683c3f8 100644
> --- a/modules/access/Makefile.am
> +++ b/modules/access/Makefile.am
> @@ -242,7 +242,7 @@ endif
> EXTRA_LTLIBRARIES += libvcd_plugin.la
> access_LTLIBRARIES += $(LTLIBvcd)
>
> -libdvdnav_plugin_la_SOURCES = access/dvdnav.c demux/mpeg/ps.h demux/mpeg/pes.h
> +libdvdnav_plugin_la_SOURCES = access/dvd_helper.h access/dvdnav.c demux/mpeg/ps.h demux/mpeg/pes.h
> libdvdnav_plugin_la_CFLAGS = $(AM_CFLAGS) $(DVDNAV_CFLAGS)
> libdvdnav_plugin_la_LIBADD = $(DVDNAV_LIBS)
> libdvdnav_plugin_la_LDFLAGS = $(AM_LDFLAGS) -rpath '$(accessdir)'
> diff --git a/modules/access/dvd_helper.h b/modules/access/dvd_helper.h
> new file mode 100644
> index 0000000000..403b44c542
> --- /dev/null
> +++ b/modules/access/dvd_helper.h
> @@ -0,0 +1,57 @@
> +/*****************************************************************************
> + * dvd_helper.h: dvdnav / dvdread helper functions
> + *****************************************************************************
> + * Copyright (C) 2020 VLC authors and VideoLAN
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU Lesser General Public License as published by
> + * the Free Software Foundation; either version 2.1 of the License, or
> + * (at your option) any later version.
> + *
> + * This program 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 Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public License
> + * along with this program; if not, write to the Free Software Foundation,
> + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
> + *****************************************************************************/
> +
> +#include <sys/stat.h>
> +#include <unistd.h>
> +
> +#include <vlc_fs.h>
> +
> +
> +inline static int DVDProbeMacOSPermission( const char *psz_file )
> +{
> +#ifdef __APPLE__
> + /* Check is only relevant starting macOS Catalina */
> + if( __builtin_available( macOS 10.15, * ) )
> + {
> + /* Continue. The check above cannot be negated. */
> + }
> + else
> + {
> + return VLC_SUCCESS;
> + }
> +
> + /* This is only relevant when accessing RAW block devices */
> + struct stat stat_buf;
> + if( vlc_stat( psz_file, &stat_buf ) != 0 )
> + return VLC_SUCCESS; // Continue with probing to be on the safe side
> +
> + if( !S_ISBLK( stat_buf.st_mode ) && !S_ISCHR( stat_buf.st_mode ) )
> + return VLC_SUCCESS;
> +
> + /* Check that device access in fact fails with EPERM error */
> + int retVal = access( psz_file, R_OK );
> + if( retVal == -1 && errno == EPERM )
> + return VLC_EGENERIC;
> +
> + return VLC_SUCCESS;
> +#else
> + return VLC_SUCCESS;
> +#endif
> +}
> diff --git a/modules/access/dvdnav.c b/modules/access/dvdnav.c
> index f082f1021b..a62950c605 100644
> --- a/modules/access/dvdnav.c
> +++ b/modules/access/dvdnav.c
> @@ -65,6 +65,8 @@ dvdnav_status_t dvdnav_jump_to_sector_by_time(dvdnav_t *, uint64_t, int32_t);
> #include "../demux/mpeg/ps.h"
> #include "../demux/timestamps_filter.h"
>
> +#include "dvd_helper.h"
> +
> /*****************************************************************************
> * Module descriptor
> *****************************************************************************/
> @@ -364,6 +366,16 @@ static int AccessDemuxOpen ( vlc_object_t *p_this )
> if( !forced && ProbeDVD( psz_file ) != VLC_SUCCESS )
> goto bailout;
>
> + if( forced && DVDProbeMacOSPermission( psz_file ) != VLC_SUCCESS )
> + {
> + msg_Err( p_demux, "Path %s cannot be opened due to unsufficient permissions", psz_file );
> + vlc_dialog_display_error( p_demux, _("Problem accessing a system resource"),
> + _("Potentially, macOS blocks access to your disc. "
> + "Please open \"System Preferences\" -> \"Security & Privacy\" "
> + "and allow VLC to access your external media in \"Files and Folders\" section."));
> + goto bailout;
> + }
> +
> /* Open dvdnav */
> psz_path = ToLocale( psz_file );
> #if DVDNAV_VERSION >= 60100
> @@ -375,13 +387,6 @@ static int AccessDemuxOpen ( vlc_object_t *p_this )
> #endif
> {
> msg_Warn( p_demux, "cannot open DVD (%s)", psz_file);
> -
> -#ifdef __APPLE__
> - vlc_dialog_display_error( p_demux, _("Problem accessing a system resource"),
> - _("Potentially, macOS blocks access to your disc. "
> - "Please open \"System Preferences\" -> \"Security & Privacy\" "
> - "and allow VLC to access your external media in \"Files and Folders\" section."));
> -#endif
> goto bailout;
> }
>
> --
> 2.21.1 (Apple Git-122.3)
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
More information about the vlc-devel
mailing list