microsoft/teams.net

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
next/core

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

95lines · 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]
19[Obsolete("Use Minimal APIs instead.")]
20public class ActivityController : ControllerBase
21{
22 private readonly DevToolsPlugin _plugin;
23 private readonly SecurityKey _securityKey;
24
25 public ActivityController(DevToolsPlugin plugin)
26 {
27 _plugin = plugin;
28 _securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("secret_devtools_signing_key_123456"));
29 }
30
31 [HttpPost("/v3/conversations/{conversationId}/activities")]
32 public async Task<IResult> Create(string conversationId, [FromBody] JsonNode body, CancellationToken cancellationToken)
33 {
34 var isClient = HttpContext.Request.Headers.TryGetValue("x-teams-devtools", out var strings) && strings.Any(h => h == "true");
35 body["id"] ??= Guid.NewGuid().ToString();
36
37 if (!isClient)
38 {
39 return Results.Json(new { id = body["id"] }, statusCode: 201);
40 }
41
42 body["from"] ??= JsonSerializer.SerializeToNode(new Account()
43 {
44 Id = "devtools",
45 Name = "devtools",
46 Role = Role.User
47 });
48
49 body["conversation"] = JsonSerializer.SerializeToNode(new Conversation()
50 {
51 Id = conversationId,
52 Type = ConversationType.Personal,
53 Name = "default"
54 });
55
56 body["recipient"] = JsonSerializer.SerializeToNode(new Account()
57 {
58 Id = _plugin.AppId ?? string.Empty,
59 Name = _plugin.AppName,
60 Role = Role.Bot
61 });
62
63 var activity = JsonSerializer.Deserialize<Activity>(JsonSerializer.Serialize(body));
64
65 if (activity is null)
66 {
67 return Results.BadRequest();
68 }
69
70 var descriptor = new SecurityTokenDescriptor
71 {
72 Claims = new Dictionary<string, object>()
73 {
74 { "serviceurl", $"http://localhost:{HttpContext.Request.Host.Port}/" }
75 },
76 SigningCredentials = new SigningCredentials(_securityKey, SecurityAlgorithms.HmacSha256Signature)
77 };
78
79 var tokenHandler = new IdentityModel.JsonWebTokens.JsonWebTokenHandler
80 {
81 SetDefaultTimesOnTokenCreation = false
82 };
83
84 var tokenString = tokenHandler.CreateToken(descriptor);
85 var token = new JsonWebToken(tokenString);
86 var _ = await _plugin.Do(new()
87 {
88 Token = token,
89 Activity = activity,
90 Services = HttpContext.RequestServices.CreateAsyncScope().ServiceProvider,
91 }, cancellationToken);
92
93 return Results.Json(new { id = body["id"] }, statusCode: 201);
94 }
95}