AttributeExtensions.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using STUN.Enums;
  2. using STUN.Message;
  3. using STUN.Message.Attributes;
  4. using System.Linq;
  5. using System.Net;
  6. namespace STUN.Utils
  7. {
  8. public static class AttributeExtensions
  9. {
  10. public static Attribute BuildChangeRequest(bool changeIp, bool changePort)
  11. {
  12. return new()
  13. {
  14. Type = AttributeType.ChangeRequest,
  15. Length = 4,
  16. Value = new ChangeRequestAttribute { ChangeIp = changeIp, ChangePort = changePort }
  17. };
  18. }
  19. public static IPEndPoint? GetMappedAddressAttribute(this StunMessage5389? response)
  20. {
  21. var mappedAddressAttribute = response?.Attributes.FirstOrDefault(t => t.Type == AttributeType.MappedAddress);
  22. if (mappedAddressAttribute is null)
  23. {
  24. return null;
  25. }
  26. var mapped = (MappedAddressAttribute)mappedAddressAttribute.Value;
  27. return new IPEndPoint(mapped.Address!, mapped.Port);
  28. }
  29. public static IPEndPoint? GetChangedAddressAttribute(this StunMessage5389? response)
  30. {
  31. var changedAddressAttribute = response?.Attributes.FirstOrDefault(t => t.Type == AttributeType.ChangedAddress);
  32. if (changedAddressAttribute is null)
  33. {
  34. return null;
  35. }
  36. var address = (ChangedAddressAttribute)changedAddressAttribute.Value;
  37. return new IPEndPoint(address.Address!, address.Port);
  38. }
  39. public static IPEndPoint? GetXorMappedAddressAttribute(this StunMessage5389? response)
  40. {
  41. var mappedAddressAttribute =
  42. response?.Attributes.FirstOrDefault(t => t.Type == AttributeType.XorMappedAddress) ??
  43. response?.Attributes.FirstOrDefault(t => t.Type == AttributeType.MappedAddress);
  44. if (mappedAddressAttribute is null)
  45. {
  46. return null;
  47. }
  48. var mapped = (AddressAttribute)mappedAddressAttribute.Value;
  49. return new IPEndPoint(mapped.Address!, mapped.Port);
  50. }
  51. public static IPEndPoint? GetOtherAddressAttribute(this StunMessage5389? response)
  52. {
  53. var addressAttribute =
  54. response?.Attributes.FirstOrDefault(t => t.Type == AttributeType.OtherAddress) ??
  55. response?.Attributes.FirstOrDefault(t => t.Type == AttributeType.ChangedAddress);
  56. if (addressAttribute is null)
  57. {
  58. return null;
  59. }
  60. var address = (AddressAttribute)addressAttribute.Value;
  61. return new IPEndPoint(address.Address!, address.Port);
  62. }
  63. }
  64. }