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>
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::AudioStreamRole>(),
62 object->get_property<mpris::Player::Properties::MinimumRate>(),
63 object->get_property<mpris::Player::Properties::MaximumRate>()
67 object->get_signal<mpris::Player::Signals::Seeked>(),
68 object->get_signal<mpris::Player::Signals::EndOfStream>(),
69 object->get_signal<mpris::Player::Signals::PlaybackStatusChanged>()
77 auto reply = dbus::Message::make_method_return(msg);
78 impl->access_bus()->send(reply);
84 auto reply = dbus::Message::make_method_return(msg);
85 impl->access_bus()->send(reply);
91 auto reply = dbus::Message::make_method_return(msg);
92 impl->access_bus()->send(reply);
102 auto reply = dbus::Message::make_method_return(msg);
103 impl->access_bus()->send(reply);
109 auto reply = dbus::Message::make_method_return(msg);
110 impl->access_bus()->send(reply);
116 in->reader() >> ticks;
117 impl->seek_to(std::chrono::microseconds(ticks));
119 auto reply = dbus::Message::make_method_return(in);
120 impl->access_bus()->send(reply);
130 in->reader() >> texture_id;
131 impl->create_video_sink(texture_id);
133 auto reply = dbus::Message::make_method_return(in);
134 impl->access_bus()->send(reply);
139 auto bus = std::shared_ptr<dbus::Bus>(
new dbus::Bus(core::dbus::WellKnownBus::session));
140 bus->install_executor(dbus::asio::make_executor(bus));
142 auto stub_service = dbus::Service::use_service(bus, dbus::traits::Service<core::Apparmor>::interface_name());
143 apparmor_session = stub_service->object_for_path(dbus::types::ObjectPath(
"/org/freedesktop/DBus"));
146 if (result.is_error())
148 std::cout <<
"Error getting apparmor profile: " << result.error().print() << std::endl;
149 return std::string();
152 return result.value();
157 if (context.empty() || uri.empty())
159 std::cout <<
"Client denied access since context or uri are empty" << std::endl;
163 if (context ==
"unconfined")
165 std::cout <<
"Client allowed access since it's unconfined" << std::endl;
169 size_t pos = context.find_first_of(
'_');
170 if (pos == std::string::npos)
172 std::cout <<
"Client denied access since it's an invalid apparmor security context" << std::endl;
176 const std::string pkgname = context.substr(0, pos);
177 std::cout <<
"client pkgname: " << pkgname << std::endl;
178 std::cout <<
"uri: " << uri << std::endl;
181 if (uri.find(std::string(
".local/share/" + pkgname +
"/")) != std::string::npos
182 || uri.find(std::string(
".cache/" + pkgname +
"/")) != std::string::npos)
184 std::cout <<
"Client can access content in ~/.local/share/" << pkgname <<
" or ~/.cache/" << pkgname << std::endl;
187 else if (uri.find(std::string(
"opt/click.ubuntu.com/")) != std::string::npos
188 && uri.find(pkgname) != std::string::npos)
190 std::cout <<
"Client can access content in own opt directory" << std::endl;
193 else if ((uri.find(std::string(
"/system/media/audio/ui/")) != std::string::npos
194 || uri.find(std::string(
"/android/system/media/audio/ui/")) != std::string::npos)
195 && pkgname ==
"com.ubuntu.camera")
197 std::cout <<
"Camera app can access ui sounds" << std::endl;
205 else if ((pkgname ==
"com.ubuntu.music" || pkgname ==
"com.ubuntu.gallery") &&
206 (uri.find(std::string(
"Music/")) != std::string::npos
207 || uri.find(std::string(
"Videos/")) != std::string::npos
208 || uri.find(std::string(
"/media")) != std::string::npos))
210 std::cout <<
"Client can access content in ~/Music or ~/Videos" << std::endl;
213 else if (uri.find(std::string(
"/usr/share/sounds")) != std::string::npos)
215 std::cout <<
"Client can access content in /usr/share/sounds" << std::endl;
218 else if (uri.find(std::string(
"http://")) != std::string::npos
219 || uri.find(std::string(
"rtsp://")) != std::string::npos)
221 std::cout <<
"Client can access streaming content" << std::endl;
226 std::cout <<
"Client denied access to open_uri()" << std::endl;
233 auto reply = dbus::Message::make_method_return(in);
234 reply->writer() <<
impl->key();
235 impl->access_bus()->send(reply);
246 auto reply = dbus::Message::make_method_return(in);
248 reply->writer() <<
impl->open_uri(uri);
250 reply->writer() <<
false;
251 impl->access_bus()->send(reply);
259 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanPlay>>
can_play;
260 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanPause>>
can_pause;
261 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanSeek>>
can_seek;
262 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanControl>>
can_control;
263 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanGoNext>>
can_go_next;
264 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanGoPrevious>>
can_go_previous;
265 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::IsVideoSource>>
is_video_source;
266 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::IsAudioSource>>
is_audio_source;
268 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::PlaybackStatus>>
playback_status;
269 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::LoopStatus>>
loop_status;
270 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::PlaybackRate>>
playback_rate;
271 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Shuffle>>
is_shuffle;
273 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Volume>>
volume;
274 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Position>>
position;
275 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Duration>>
duration;
276 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::AudioStreamRole>>
audio_role;
283 typedef core::dbus::Signal<mpris::Player::Signals::Seeked, mpris::Player::Signals::Seeked::ArgumentType>
DBusSeekedToSignal;
284 typedef core::dbus::Signal<mpris::Player::Signals::EndOfStream, mpris::Player::Signals::EndOfStream::ArgumentType>
DBusEndOfStreamSignal;
285 typedef core::dbus::Signal<mpris::Player::Signals::PlaybackStatusChanged, mpris::Player::Signals::PlaybackStatusChanged::ArgumentType>
DBusPlaybackStatusChangedSignal;
287 Signals(
const std::shared_ptr<DBusSeekedToSignal>& seeked,
288 const std::shared_ptr<DBusEndOfStreamSignal>& eos,
289 const std::shared_ptr<DBusPlaybackStatusChangedSignal>& status)
300 seeked_to.connect([
this](std::uint64_t value)
302 dbus.seeked_to->emit(value);
307 dbus.end_of_stream->emit();
312 dbus.playback_status_changed->emit(status);
330 const core::dbus::types::ObjectPath& session_path)
332 d(new
Private{
this, session_path})
334 d->object->install_method_handler<mpris::Player::Next>(
337 std::placeholders::_1));
338 d->object->install_method_handler<mpris::Player::Previous>(
341 std::placeholders::_1));
342 d->object->install_method_handler<mpris::Player::Pause>(
345 std::placeholders::_1));
346 d->object->install_method_handler<mpris::Player::Stop>(
349 std::placeholders::_1));
350 d->object->install_method_handler<mpris::Player::Play>(
353 std::placeholders::_1));
354 d->object->install_method_handler<mpris::Player::Seek>(
357 std::placeholders::_1));
358 d->object->install_method_handler<mpris::Player::SetPosition>(
361 std::placeholders::_1));
362 d->object->install_method_handler<mpris::Player::CreateVideoSink>(
365 std::placeholders::_1));
366 d->object->install_method_handler<mpris::Player::Key>(
369 std::placeholders::_1));
370 d->object->install_method_handler<mpris::Player::OpenUri>(
373 std::placeholders::_1));
382 return *d->properties.can_play;
387 return *d->properties.can_pause;
392 return *d->properties.can_seek;
397 return *d->properties.can_go_previous;
402 return *d->properties.can_go_next;
407 return *d->properties.is_video_source;
412 return *d->properties.is_audio_source;
417 return *d->properties.playback_status;
422 return *d->properties.loop_status;
427 return *d->properties.playback_rate;
432 return *d->properties.is_shuffle;
437 return *d->properties.meta_data_for_current_track;
442 return *d->properties.volume;
447 return *d->properties.position;
452 return *d->properties.duration;
457 return *d->properties.audio_role;
462 return *d->properties.minimum_playback_rate;
467 return *d->properties.maximum_playback_rate;
472 return *d->properties.loop_status;
477 return *d->properties.playback_rate;
482 return *d->properties.is_shuffle;
487 return *d->properties.volume;
492 return *d->properties.position;
497 return *d->properties.duration;
502 return *d->properties.audio_role;
507 return *d->properties.playback_status;
512 return *d->properties.can_play;
517 return *d->properties.can_pause;
522 return *d->properties.can_seek;
527 return *d->properties.can_go_previous;
532 return *d->properties.can_go_next;
537 return *d->properties.is_video_source;
542 return *d->properties.is_audio_source;
548 return *d->properties.meta_data_for_current_track;
553 return *d->properties.minimum_playback_rate;
558 return *d->properties.maximum_playback_rate;
563 return d->signals.seeked_to;
568 return d->signals.seeked_to;
573 return d->signals.end_of_stream;
578 return d->signals.end_of_stream;
583 return d->signals.playback_status_changed;
core::dbus::Bus::Ptr the_session_bus()