28 #include <core/dbus/object.h>
29 #include <core/dbus/property.h>
30 #include <core/dbus/stub.h>
31 #include <core/dbus/asio/executor.h>
33 namespace dbus = core::dbus;
34 namespace media = core::ubuntu::media;
40 object(
impl->access_service()->add_object_for_path(session)),
44 object->get_property<mpris::Player::Properties::CanPlay>(),
45 object->get_property<mpris::Player::Properties::CanPause>(),
46 object->get_property<mpris::Player::Properties::CanSeek>(),
47 object->get_property<mpris::Player::Properties::CanControl>(),
48 object->get_property<mpris::Player::Properties::CanGoNext>(),
49 object->get_property<mpris::Player::Properties::CanGoPrevious>(),
50 object->get_property<mpris::Player::Properties::IsVideoSource>(),
51 object->get_property<mpris::Player::Properties::IsAudioSource>(),
52 object->get_property<mpris::Player::Properties::PlaybackStatus>(),
53 object->get_property<mpris::Player::Properties::LoopStatus>(),
54 object->get_property<mpris::Player::Properties::PlaybackRate>(),
55 object->get_property<mpris::Player::Properties::Shuffle>(),
56 object->get_property<mpris::Player::Properties::MetaData>(),
57 object->get_property<mpris::Player::Properties::Volume>(),
58 object->get_property<mpris::Player::Properties::Position>(),
59 object->get_property<mpris::Player::Properties::Duration>(),
60 object->get_property<mpris::Player::Properties::MinimumRate>(),
61 object->get_property<mpris::Player::Properties::MaximumRate>()
65 object->get_signal<mpris::Player::Signals::Seeked>(),
66 object->get_signal<mpris::Player::Signals::EndOfStream>(),
67 object->get_signal<mpris::Player::Signals::PlaybackStatusChanged>()
75 auto reply = dbus::Message::make_method_return(msg);
76 impl->access_bus()->send(reply);
82 auto reply = dbus::Message::make_method_return(msg);
83 impl->access_bus()->send(reply);
89 auto reply = dbus::Message::make_method_return(msg);
90 impl->access_bus()->send(reply);
100 auto reply = dbus::Message::make_method_return(msg);
101 impl->access_bus()->send(reply);
107 auto reply = dbus::Message::make_method_return(msg);
108 impl->access_bus()->send(reply);
114 in->reader() >> ticks;
115 impl->seek_to(std::chrono::microseconds(ticks));
117 auto reply = dbus::Message::make_method_return(in);
118 impl->access_bus()->send(reply);
128 in->reader() >> texture_id;
129 impl->create_video_sink(texture_id);
131 auto reply = dbus::Message::make_method_return(in);
132 impl->access_bus()->send(reply);
137 auto bus = std::shared_ptr<dbus::Bus>(
new dbus::Bus(core::dbus::WellKnownBus::session));
138 bus->install_executor(dbus::asio::make_executor(bus));
140 auto stub_service = dbus::Service::use_service(bus, dbus::traits::Service<core::Apparmor>::interface_name());
141 apparmor_session = stub_service->object_for_path(dbus::types::ObjectPath(
"/org/freedesktop/DBus"));
144 if (result.is_error())
146 std::cout <<
"Error getting apparmor profile: " << result.error().print() << std::endl;
147 return std::string();
150 return result.value();
155 if (context.empty() || uri.empty())
157 std::cout <<
"Client denied access since context or uri are empty" << std::endl;
161 if (context ==
"unconfined")
163 std::cout <<
"Client allowed access since it's unconfined" << std::endl;
167 size_t pos = context.find_first_of(
'_');
168 if (pos == std::string::npos)
170 std::cout <<
"Client denied access since it's an invalid apparmor security context" << std::endl;
174 const std::string pkgname = context.substr(0, pos);
175 std::cout <<
"client pkgname: " << pkgname << std::endl;
176 std::cout <<
"uri: " << uri << std::endl;
179 if (uri.find(std::string(
".local/share/" + pkgname +
"/")) != std::string::npos
180 || uri.find(std::string(
".cache/" + pkgname +
"/")) != std::string::npos)
182 std::cout <<
"Client can access content in ~/.local/share/" << pkgname <<
" or ~/.cache/" << pkgname << std::endl;
185 else if (uri.find(std::string(
"opt/click.ubuntu.com/")) != std::string::npos
186 && uri.find(pkgname) != std::string::npos)
188 std::cout <<
"Client can access content in own opt directory" << std::endl;
191 else if ((uri.find(std::string(
"/system/media/audio/ui/")) != std::string::npos
192 || uri.find(std::string(
"/android/system/media/audio/ui/")) != std::string::npos)
193 && pkgname ==
"com.ubuntu.camera")
195 std::cout <<
"Camera app can access ui sounds" << std::endl;
203 else if (pkgname ==
"com.ubuntu.music" &&
204 (uri.find(std::string(
"Music/")) != std::string::npos
205 || uri.find(std::string(
"Videos/")) != std::string::npos))
207 std::cout <<
"Client can access content in ~/Music or ~/Videos" << std::endl;
210 else if (uri.find(std::string(
"http://")) != std::string::npos
211 || uri.find(std::string(
"rtsp://")) != std::string::npos)
213 std::cout <<
"Client can access streaming content" << std::endl;
218 std::cout <<
"Client denied access to open_uri()" << std::endl;
225 auto reply = dbus::Message::make_method_return(in);
226 reply->writer() <<
impl->key();
227 impl->access_bus()->send(reply);
238 auto reply = dbus::Message::make_method_return(in);
240 reply->writer() <<
impl->open_uri(uri);
242 reply->writer() <<
false;
243 impl->access_bus()->send(reply);
251 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanPlay>>
can_play;
252 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanPause>>
can_pause;
253 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanSeek>>
can_seek;
254 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanControl>>
can_control;
255 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanGoNext>>
can_go_next;
256 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanGoPrevious>>
can_go_previous;
257 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::IsVideoSource>>
is_video_source;
258 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::IsAudioSource>>
is_audio_source;
260 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::PlaybackStatus>>
playback_status;
261 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::LoopStatus>>
loop_status;
262 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::PlaybackRate>>
playback_rate;
263 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Shuffle>>
is_shuffle;
265 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Volume>>
volume;
266 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Position>>
position;
267 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Duration>>
duration;
274 typedef core::dbus::Signal<mpris::Player::Signals::Seeked, mpris::Player::Signals::Seeked::ArgumentType>
DBusSeekedToSignal;
275 typedef core::dbus::Signal<mpris::Player::Signals::EndOfStream, mpris::Player::Signals::EndOfStream::ArgumentType>
DBusEndOfStreamSignal;
276 typedef core::dbus::Signal<mpris::Player::Signals::PlaybackStatusChanged, mpris::Player::Signals::PlaybackStatusChanged::ArgumentType>
DBusPlaybackStatusChangedSignal;
278 Signals(
const std::shared_ptr<DBusSeekedToSignal>& seeked,
279 const std::shared_ptr<DBusEndOfStreamSignal>& eos,
280 const std::shared_ptr<DBusPlaybackStatusChangedSignal>& status)
291 seeked_to.connect([
this](std::uint64_t value)
321 const core::dbus::types::ObjectPath& session_path)
323 d(new
Private{
this, session_path})
325 d->object->install_method_handler<mpris::Player::Next>(
328 std::placeholders::_1));
329 d->object->install_method_handler<mpris::Player::Previous>(
332 std::placeholders::_1));
333 d->object->install_method_handler<mpris::Player::Pause>(
336 std::placeholders::_1));
337 d->object->install_method_handler<mpris::Player::Stop>(
340 std::placeholders::_1));
341 d->object->install_method_handler<mpris::Player::Play>(
344 std::placeholders::_1));
345 d->object->install_method_handler<mpris::Player::Seek>(
348 std::placeholders::_1));
349 d->object->install_method_handler<mpris::Player::SetPosition>(
352 std::placeholders::_1));
353 d->object->install_method_handler<mpris::Player::CreateVideoSink>(
356 std::placeholders::_1));
357 d->object->install_method_handler<mpris::Player::Key>(
360 std::placeholders::_1));
361 d->object->install_method_handler<mpris::Player::OpenUri>(
364 std::placeholders::_1));
373 return *d->properties.can_play;
378 return *d->properties.can_pause;
383 return *d->properties.can_seek;
388 return *d->properties.can_go_previous;
393 return *d->properties.can_go_next;
398 return *d->properties.is_video_source;
403 return *d->properties.is_audio_source;
408 return *d->properties.playback_status;
413 return *d->properties.loop_status;
418 return *d->properties.playback_rate;
423 return *d->properties.is_shuffle;
428 return *d->properties.meta_data_for_current_track;
433 return *d->properties.volume;
438 return *d->properties.position;
443 return *d->properties.duration;
448 return *d->properties.minimum_playback_rate;
453 return *d->properties.maximum_playback_rate;
458 return *d->properties.loop_status;
463 return *d->properties.playback_rate;
468 return *d->properties.is_shuffle;
473 return *d->properties.volume;
478 return *d->properties.position;
483 return *d->properties.duration;
488 return *d->properties.playback_status;
493 return *d->properties.can_play;
498 return *d->properties.can_pause;
503 return *d->properties.can_seek;
508 return *d->properties.can_go_previous;
513 return *d->properties.can_go_next;
518 return *d->properties.is_video_source;
523 return *d->properties.is_audio_source;
529 return *d->properties.meta_data_for_current_track;
534 return *d->properties.minimum_playback_rate;
539 return *d->properties.maximum_playback_rate;
544 return d->signals.seeked_to;
549 return d->signals.seeked_to;
554 return d->signals.end_of_stream;
559 return d->signals.end_of_stream;
564 return d->signals.playback_status_changed;
core::dbus::Bus::Ptr the_session_bus()