microsoft/teams.net

Public

mirrored fromhttps://github.com/microsoft/teams.netAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
copilot/setup-copilot-instructions

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

Libraries/Microsoft.Teams.Plugins/Microsoft.Teams.Plugins.AspNetCore.DevTools/Controllers/ActivityController.cs

94lines · modecode

1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the MIT License.
3
4using System.Text;
5using System.Text.Json;
6using System.Text.Json.Nodes;
7
8using Microsoft.AspNetCore.Http;
9using Microsoft.AspNetCore.Mvc;
10using Microsoft.Extensions.DependencyInjection;
11using Microsoft.IdentityModel.Tokens;
12using Microsoft.Teams.Api;
13using Microsoft.Teams.Api.Activities;
14using Microsoft.Teams.Api.Auth;
15
16namespace Microsoft.Teams.Plugins.AspNetCore.DevTools.Controllers;
17
18[ApiController]
19public class ActivityController : ControllerBase
20{
21 private readonly DevToolsPlugin _plugin;
22 private readonly SecurityKey _securityKey;
23
24 public ActivityController(DevToolsPlugin plugin)
25 {
26 _plugin = plugin;
27 _securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("secret_devtools_signing_key_123456"));
28 }
29
30 [HttpPost("/v3/conversations/{conversationId}/activities")]
31 public async Task<IResult> Create(string conversationId, [FromBody] JsonNode body, CancellationToken cancellationToken)
32 {
33 var isClient = HttpContext.Request.Headers.TryGetValue("x-teams-devtools", out var strings) && strings.Any(h => h == "true");
34 body["id"] ??= Guid.NewGuid().ToString();
35
36 if (!isClient)
37 {
38 return Results.Json(new { id = body["id"] }, statusCode: 201);
39 }
40
41 body["from"] ??= JsonSerializer.SerializeToNode(new Account()
42 {
43 Id = "devtools",
44 Name = "devtools",
45 Role = Role.User
46 });
47
48 body["conversation"] = JsonSerializer.SerializeToNode(new Conversation()
49 {
50 Id = conversationId,
51 Type = ConversationType.Personal,
52 Name = "default"
53 });
54
55 body["recipient"] = JsonSerializer.SerializeToNode(new Account()
56 {
57 Id = _plugin.AppId ?? string.Empty,
58 Name = _plugin.AppName,
59 Role = Role.Bot
60 });
61
62 var activity = JsonSerializer.Deserialize<Activity>(JsonSerializer.Serialize(body));
63
64 if (activity is null)
65 {
66 return Results.BadRequest();
67 }
68
69 var descriptor = new SecurityTokenDescriptor
70 {
71 Claims = new Dictionary<string, object>()
72 {
73 { "serviceurl", $"http://localhost:{HttpContext.Request.Host.Port}/" }
74 },
75 SigningCredentials = new SigningCredentials(_securityKey, SecurityAlgorithms.HmacSha256Signature)
76 };
77
78 var tokenHandler = new IdentityModel.JsonWebTokens.JsonWebTokenHandler
79 {
80 SetDefaultTimesOnTokenCreation = false
81 };
82
83 var tokenString = tokenHandler.CreateToken(descriptor);
84 var token = new JsonWebToken(tokenString);
85 var _ = await _plugin.Do(new()
86 {
87 Token = token,
88 Activity = activity,
89 Services = HttpContext.RequestServices.CreateAsyncScope().ServiceProvider,
90 }, cancellationToken);
91
92 return Results.Json(new { id = body["id"] }, statusCode: 201);
93 }
94}