private static void authenticate(SocketOperations socketOperations) { var authExternal = "\0AUTH EXTERNAL "; var stringUid = $"{socketOperations.Uid}"; var uidBytes = Encoding.ASCII.GetBytes(stringUid); foreach (var b in uidBytes) { authExternal += $"{b:X}"; } socketOperations.WriteLine(authExternal); var line = socketOperations.ReadLine(); if (!line.StartsWith("OK ")) { throw new InvalidOperationException("Authentication failed: " + line); } socketOperations.WriteLine("NEGOTIATE_UNIX_FD"); line = socketOperations.ReadLine(); if (line != "AGREE_UNIX_FD") { throw new InvalidOperationException("Missing support for unix file descriptors"); } socketOperations.WriteLine("BEGIN"); }
private Connection(SocketOperations socketOperations) { this.socketOperations = socketOperations; semaphoreSend = new SemaphoreSlim(1); receiveCts = new CancellationTokenSource(); orgFreedesktopDbus = new OrgFreedesktopDbus(this); receiveTask = Task.Factory.StartNew( receive, receiveCts.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default ); }
public async static Task <Connection> CreateAsync( DbusConnectionOptions options, CancellationToken cancellationToken = default ) { if (options.Address == null) { throw new ArgumentException("No dbus address specified", nameof(options)); } var sockaddr = createSockaddr(options.Address); var socketOperations = new SocketOperations(sockaddr); await Task.Run(() => authenticate(socketOperations), cancellationToken).ConfigureAwait(false); var result = new Connection(socketOperations); await result.orgFreedesktopDbus.HelloAsync(cancellationToken).ConfigureAwait(false); return(result); }
public UnixFdStream(SafeHandle safeHandle, SocketOperations socketOperations) { this.safeHandle = safeHandle; this.socketOperations = socketOperations; socketOperations.SetNonblocking(safeHandle); }
public MessageHeader( SocketOperations socketOperations, Decoder header, ReadOnlySpan <byte> controlBytes, bool isMonoRuntime ) { this.socketOperations = socketOperations; BodySignature = ""; while (!header.IsFinished) { var typeCode = (DbusHeaderType)header.GetByte(); header.GetSignature(); // variant signature switch (typeCode) { case DbusHeaderType.Path: Path = header.GetObjectPath(); break; case DbusHeaderType.InterfaceName: InterfaceName = header.GetString(); break; case DbusHeaderType.Member: Member = header.GetString(); break; case DbusHeaderType.ErrorName: ErrorName = header.GetString(); break; case DbusHeaderType.ReplySerial: ReplySerial = header.GetUInt32(); break; case DbusHeaderType.Destination: Destination = header.GetString(); break; case DbusHeaderType.Sender: Sender = header.GetString(); break; case DbusHeaderType.Signature: BodySignature = header.GetSignature(); break; case DbusHeaderType.UnixFds: var numberOfFds = header.GetUInt32(); var cmsgHeaderBytes = controlBytes.Slice(0, sizeofCmsghdr); var cmsgHeader = MemoryMarshal.Cast <byte, cmsghdr>(cmsgHeaderBytes); var fileDescriptorsBytes = controlBytes.Slice( sizeofCmsghdr, (int)cmsgHeader[0].len - sizeofCmsghdr ); var fileDescriptors = MemoryMarshal.Cast <byte, int>(fileDescriptorsBytes); System.Diagnostics.Debug.Assert(numberOfFds == fileDescriptors.Length); UnixFds = new SafeHandle[numberOfFds]; for (var i = 0; i < numberOfFds; ++i) { if (isMonoRuntime) { UnixFds[i] = new ReceivedFileDescriptorSafeHandle(fileDescriptors[i]); } else { UnixFds[i] = new SafeFileHandle(new IntPtr(fileDescriptors[i]), true); } } break; } header.AdvanceToCompoundValue(); } }