29 #include <core/dbus/object.h>
30 #include <core/dbus/property.h>
31 #include <core/dbus/stub.h>
32 #include <core/dbus/asio/executor.h>
34 namespace dbus = core::dbus;
35 namespace media = core::ubuntu::media;
41 object(
impl->access_service()->add_object_for_path(session)),
45 object->get_property<mpris::Player::Properties::CanPlay>(),
46 object->get_property<mpris::Player::Properties::CanPause>(),
47 object->get_property<mpris::Player::Properties::CanSeek>(),
48 object->get_property<mpris::Player::Properties::CanControl>(),
49 object->get_property<mpris::Player::Properties::CanGoNext>(),
50 object->get_property<mpris::Player::Properties::CanGoPrevious>(),
51 object->get_property<mpris::Player::Properties::IsVideoSource>(),
52 object->get_property<mpris::Player::Properties::IsAudioSource>(),
53 object->get_property<mpris::Player::Properties::PlaybackStatus>(),
54 object->get_property<mpris::Player::Properties::LoopStatus>(),
55 object->get_property<mpris::Player::Properties::PlaybackRate>(),
56 object->get_property<mpris::Player::Properties::Shuffle>(),
57 object->get_property<mpris::Player::Properties::MetaData>(),
58 object->get_property<mpris::Player::Properties::Volume>(),
59 object->get_property<mpris::Player::Properties::Position>(),
60 object->get_property<mpris::Player::Properties::Duration>(),
61 object->get_property<mpris::Player::Properties::MinimumRate>(),
62 object->get_property<mpris::Player::Properties::MaximumRate>()
66 object->get_signal<mpris::Player::Signals::Seeked>(),
67 object->get_signal<mpris::Player::Signals::EndOfStream>(),
68 object->get_signal<mpris::Player::Signals::PlaybackStatusChanged>()
76 auto reply = dbus::Message::make_method_return(msg);
77 impl->access_bus()->send(reply);
83 auto reply = dbus::Message::make_method_return(msg);
84 impl->access_bus()->send(reply);
90 auto reply = dbus::Message::make_method_return(msg);
91 impl->access_bus()->send(reply);
101 auto reply = dbus::Message::make_method_return(msg);
102 impl->access_bus()->send(reply);
108 auto reply = dbus::Message::make_method_return(msg);
109 impl->access_bus()->send(reply);
115 in->reader() >> ticks;
116 impl->seek_to(std::chrono::microseconds(ticks));
118 auto reply = dbus::Message::make_method_return(in);
119 impl->access_bus()->send(reply);
129 in->reader() >> texture_id;
130 impl->create_video_sink(texture_id);
132 auto reply = dbus::Message::make_method_return(in);
133 impl->access_bus()->send(reply);
138 auto bus = std::shared_ptr<dbus::Bus>(
new dbus::Bus(core::dbus::WellKnownBus::session));
139 bus->install_executor(dbus::asio::make_executor(bus));
141 auto stub_service = dbus::Service::use_service(bus, dbus::traits::Service<core::Apparmor>::interface_name());
142 apparmor_session = stub_service->object_for_path(dbus::types::ObjectPath(
"/org/freedesktop/DBus"));
145 if (result.is_error())
147 std::cout <<
"Error getting apparmor profile: " << result.error().print() << std::endl;
148 return std::string();
151 return result.value();
156 if (context.empty() || uri.empty())
158 std::cout <<
"Client denied access since context or uri are empty" << std::endl;
162 if (context ==
"unconfined")
164 std::cout <<
"Client allowed access since it's unconfined" << std::endl;
168 size_t pos = context.find_first_of(
'_');
169 if (pos == std::string::npos)
171 std::cout <<
"Client denied access since it's an invalid apparmor security context" << std::endl;
175 const std::string pkgname = context.substr(0, pos);
176 std::cout <<
"client pkgname: " << pkgname << std::endl;
177 std::cout <<
"uri: " << uri << std::endl;
180 if (uri.find(std::string(
".local/share/" + pkgname +
"/")) != std::string::npos
181 || uri.find(std::string(
".cache/" + pkgname +
"/")) != std::string::npos)
183 std::cout <<
"Client can access content in ~/.local/share/" << pkgname <<
" or ~/.cache/" << pkgname << std::endl;
186 else if (uri.find(std::string(
"opt/click.ubuntu.com/")) != std::string::npos
187 && uri.find(pkgname) != std::string::npos)
189 std::cout <<
"Client can access content in own opt directory" << std::endl;
192 else if ((uri.find(std::string(
"/system/media/audio/ui/")) != std::string::npos
193 || uri.find(std::string(
"/android/system/media/audio/ui/")) != std::string::npos)
194 && pkgname ==
"com.ubuntu.camera")
196 std::cout <<
"Camera app can access ui sounds" << std::endl;
204 else if ((pkgname ==
"com.ubuntu.music" || pkgname ==
"com.ubuntu.gallery") &&
205 (uri.find(std::string(
"Music/")) != std::string::npos
206 || uri.find(std::string(
"Videos/")) != std::string::npos
207 || uri.find(std::string(
"/media")) != std::string::npos))
209 std::cout <<
"Client can access content in ~/Music or ~/Videos" << std::endl;
212 else if (uri.find(std::string(
"/usr/share/sounds")) != std::string::npos)
214 std::cout <<
"Client can access content in /usr/share/sounds" << std::endl;
217 else if (uri.find(std::string(
"http://")) != std::string::npos
218 || uri.find(std::string(
"rtsp://")) != std::string::npos)
220 std::cout <<
"Client can access streaming content" << std::endl;
225 std::cout <<
"Client denied access to open_uri()" << std::endl;
232 auto reply = dbus::Message::make_method_return(in);
233 reply->writer() <<
impl->key();
234 impl->access_bus()->send(reply);
245 auto reply = dbus::Message::make_method_return(in);
247 reply->writer() <<
impl->open_uri(uri);
249 reply->writer() <<
false;
250 impl->access_bus()->send(reply);
258 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanPlay>>
can_play;
259 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanPause>>
can_pause;
260 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanSeek>>
can_seek;
261 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanControl>>
can_control;
262 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanGoNext>>
can_go_next;
263 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanGoPrevious>>
can_go_previous;
264 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::IsVideoSource>>
is_video_source;
265 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::IsAudioSource>>
is_audio_source;
267 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::PlaybackStatus>>
playback_status;
268 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::LoopStatus>>
loop_status;
269 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::PlaybackRate>>
playback_rate;
270 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Shuffle>>
is_shuffle;
272 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Volume>>
volume;
273 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Position>>
position;
274 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Duration>>
duration;
281 typedef core::dbus::Signal<mpris::Player::Signals::Seeked, mpris::Player::Signals::Seeked::ArgumentType>
DBusSeekedToSignal;
282 typedef core::dbus::Signal<mpris::Player::Signals::EndOfStream, mpris::Player::Signals::EndOfStream::ArgumentType>
DBusEndOfStreamSignal;
283 typedef core::dbus::Signal<mpris::Player::Signals::PlaybackStatusChanged, mpris::Player::Signals::PlaybackStatusChanged::ArgumentType>
DBusPlaybackStatusChangedSignal;
285 Signals(
const std::shared_ptr<DBusSeekedToSignal>& seeked,
286 const std::shared_ptr<DBusEndOfStreamSignal>& eos,
287 const std::shared_ptr<DBusPlaybackStatusChangedSignal>& status)
298 seeked_to.connect([
this](std::uint64_t value)
328 const core::dbus::types::ObjectPath& session_path)
330 d(new
Private{
this, session_path})
332 d->object->install_method_handler<mpris::Player::Next>(
335 std::placeholders::_1));
336 d->object->install_method_handler<mpris::Player::Previous>(
339 std::placeholders::_1));
340 d->object->install_method_handler<mpris::Player::Pause>(
343 std::placeholders::_1));
344 d->object->install_method_handler<mpris::Player::Stop>(
347 std::placeholders::_1));
348 d->object->install_method_handler<mpris::Player::Play>(
351 std::placeholders::_1));
352 d->object->install_method_handler<mpris::Player::Seek>(
355 std::placeholders::_1));
356 d->object->install_method_handler<mpris::Player::SetPosition>(
359 std::placeholders::_1));
360 d->object->install_method_handler<mpris::Player::CreateVideoSink>(
363 std::placeholders::_1));
364 d->object->install_method_handler<mpris::Player::Key>(
367 std::placeholders::_1));
368 d->object->install_method_handler<mpris::Player::OpenUri>(
371 std::placeholders::_1));
380 return *d->properties.can_play;
385 return *d->properties.can_pause;
390 return *d->properties.can_seek;
395 return *d->properties.can_go_previous;
400 return *d->properties.can_go_next;
405 return *d->properties.is_video_source;
410 return *d->properties.is_audio_source;
415 return *d->properties.playback_status;
420 return *d->properties.loop_status;
425 return *d->properties.playback_rate;
430 return *d->properties.is_shuffle;
435 return *d->properties.meta_data_for_current_track;
440 return *d->properties.volume;
445 return *d->properties.position;
450 return *d->properties.duration;
455 return *d->properties.minimum_playback_rate;
460 return *d->properties.maximum_playback_rate;
465 return *d->properties.loop_status;
470 return *d->properties.playback_rate;
475 return *d->properties.is_shuffle;
480 return *d->properties.volume;
485 return *d->properties.position;
490 return *d->properties.duration;
495 return *d->properties.playback_status;
500 return *d->properties.can_play;
505 return *d->properties.can_pause;
510 return *d->properties.can_seek;
515 return *d->properties.can_go_previous;
520 return *d->properties.can_go_next;
525 return *d->properties.is_video_source;
530 return *d->properties.is_audio_source;
536 return *d->properties.meta_data_for_current_track;
541 return *d->properties.minimum_playback_rate;
546 return *d->properties.maximum_playback_rate;
551 return d->signals.seeked_to;
556 return d->signals.seeked_to;
561 return d->signals.end_of_stream;
566 return d->signals.end_of_stream;
571 return d->signals.playback_status_changed;
core::dbus::Bus::Ptr the_session_bus()