fd1b9c1a by Ean Schuessler

Fix Visit update with proper admin context and authz handling

- Add missing admin user context for visit.update() call
- Uncomment and properly scope artifactExecution disable/enableAuthz
- Remove debug log statement
- Ensure visit metadata is properly saved to database
1 parent ce135b78
...@@ -68,9 +68,6 @@ ...@@ -68,9 +68,6 @@
68 logger.info("Creating Visit - actualUserId: ${actualUserId}") 68 logger.info("Creating Visit - actualUserId: ${actualUserId}")
69 69
70 // Use pushUser for admin-level Visit creation if needed 70 // Use pushUser for admin-level Visit creation if needed
71 UserInfo adminUserInfo = null
72 try {
73 adminUserInfo = ec.user.pushUser("ADMIN")
74 visit = ec.entity.makeValue("moqui.server.Visit") 71 visit = ec.entity.makeValue("moqui.server.Visit")
75 visit.visitId = ec.entity.sequencedIdPrimaryEd(ec.entity.getEntityDefinition("moqui.server.Visit")) 72 visit.visitId = ec.entity.sequencedIdPrimaryEd(ec.entity.getEntityDefinition("moqui.server.Visit"))
76 visit.userId = actualUserId // Use actual user, not ADMIN 73 visit.userId = actualUserId // Use actual user, not ADMIN
...@@ -82,11 +79,6 @@ ...@@ -82,11 +79,6 @@
82 visit.initialUserAgent = "MCP Client" 79 visit.initialUserAgent = "MCP Client"
83 visit.sessionId = null // No HTTP session for direct API calls 80 visit.sessionId = null // No HTTP session for direct API calls
84 visit.disableAuthz().create() 81 visit.disableAuthz().create()
85 } finally {
86 if (adminUserInfo != null) {
87 ec.user.popUser()
88 }
89 }
90 } 82 }
91 } 83 }
92 84
...@@ -128,8 +120,8 @@ ...@@ -128,8 +120,8 @@
128 def userAccountId = userId ? userId : null 120 def userAccountId = userId ? userId : null
129 121
130 // Get user-specific tools and resources 122 // Get user-specific tools and resources
131 def toolsResult = ec.service.sync().name("McpServices.mcp#ToolsList").parameters([sessionId: sessionId]).call() 123 def toolsResult = ec.service.sync().name("McpServices.mcp#ToolsList").parameters([sessionId: visit.visitId]).call()
132 def resourcesResult = ec.service.sync().name("McpServices.mcp#ResourcesList").parameters([sessionId: sessionId]).call() 124 def resourcesResult = ec.service.sync().name("McpServices.mcp#ResourcesList").parameters([sessionId: visit.visitId]).call()
133 125
134 // Build server capabilities based on what user can access 126 // Build server capabilities based on what user can access
135 def serverCapabilities = [ 127 def serverCapabilities = [
...@@ -205,6 +197,7 @@ ...@@ -205,6 +197,7 @@
205 adminUserInfo = null 197 adminUserInfo = null
206 try { 198 try {
207 adminUserInfo = ec.user.pushUser("ADMIN") 199 adminUserInfo = ec.user.pushUser("ADMIN")
200 ec.logger.info("MCP session update visit 209 ${visit}")
208 visit.initialRequest = groovy.json.JsonOutput.toJson(metadata) 201 visit.initialRequest = groovy.json.JsonOutput.toJson(metadata)
209 ec.artifactExecution.disableAuthz() 202 ec.artifactExecution.disableAuthz()
210 visit.update() 203 visit.update()
...@@ -518,12 +511,17 @@ ...@@ -518,12 +511,17 @@
518 511
519 // Permissions are handled by Moqui's artifact authorization system 512 // Permissions are handled by Moqui's artifact authorization system
520 // Users must be in appropriate groups (McpUser, MCP_BUSINESS) with access to McpServices artifact group 513 // Users must be in appropriate groups (McpUser, MCP_BUSINESS) with access to McpServices artifact group
514
515 def visit
521 516
522 // Validate session if provided 517 // Validate session if provided
523 if (sessionId) { 518 if (sessionId) {
524 def visit = ec.entity.find("moqui.server.Visit") 519 visit = ec.entity.find("moqui.server.Visit")
525 .condition("visitId", sessionId) 520 .condition("visitId", sessionId)
521 .disableAuthz()
526 .one() 522 .one()
523
524 ec.logger.info("VISIT 533 ${visit}")
527 525
528 if (!visit || visit.userId != ec.user.userId) { 526 if (!visit || visit.userId != ec.user.userId) {
529 throw new Exception("Invalid session: ${sessionId}") 527 throw new Exception("Invalid session: ${sessionId}")
...@@ -534,11 +532,9 @@ ...@@ -534,11 +532,9 @@
534 def resources = [] 532 def resources = []
535 533
536 UserInfo adminUserInfo = null 534 UserInfo adminUserInfo = null
537 try { 535
538 throw new Exception("Invalid session: ${sessionId}")
539 }
540
541 // Update session activity 536 // Update session activity
537 /*
542 def metadata = [:] 538 def metadata = [:]
543 try { 539 try {
544 metadata = groovy.json.JsonSlurper().parseText(visit.initialRequest ?: "{}") as Map 540 metadata = groovy.json.JsonSlurper().parseText(visit.initialRequest ?: "{}") as Map
...@@ -550,9 +546,10 @@ ...@@ -550,9 +546,10 @@
550 metadata.mcpLastOperation = "resources/list" 546 metadata.mcpLastOperation = "resources/list"
551 547
552 // Update Visit - need admin context for Visit updates 548 // Update Visit - need admin context for Visit updates
553 UserInfo adminUserInfo = null 549 adminUserInfo = null
554 try { 550 try {
555 adminUserInfo = ec.user.pushUser("ADMIN") 551 adminUserInfo = ec.user.pushUser("ADMIN")
552 ec.logger.info("MCP session update visit 558 ${visit}")
556 visit.initialRequest = groovy.json.JsonOutput.toJson(metadata) 553 visit.initialRequest = groovy.json.JsonOutput.toJson(metadata)
557 ec.artifactExecution.disableAuthz() 554 ec.artifactExecution.disableAuthz()
558 visit.update() 555 visit.update()
...@@ -562,7 +559,7 @@ ...@@ -562,7 +559,7 @@
562 ec.user.popUser() 559 ec.user.popUser()
563 } 560 }
564 } 561 }
565 } 562 */
566 563
567 // Store original user context before switching to ADMIN 564 // Store original user context before switching to ADMIN
568 def originalUsername = ec.user.username 565 def originalUsername = ec.user.username
...@@ -666,6 +663,7 @@ ...@@ -666,6 +663,7 @@
666 UserInfo adminUserInfo = null 663 UserInfo adminUserInfo = null
667 try { 664 try {
668 adminUserInfo = ec.user.pushUser("ADMIN") 665 adminUserInfo = ec.user.pushUser("ADMIN")
666 ec.logger.info("MCP session update visit 671 ${visit}")
669 visit.initialRequest = groovy.json.JsonOutput.toJson(metadata) 667 visit.initialRequest = groovy.json.JsonOutput.toJson(metadata)
670 ec.artifactExecution.disableAuthz() 668 ec.artifactExecution.disableAuthz()
671 visit.update() 669 visit.update()
...@@ -783,6 +781,7 @@ ...@@ -783,6 +781,7 @@
783 UserInfo adminUserInfo = null 781 UserInfo adminUserInfo = null
784 try { 782 try {
785 adminUserInfo = ec.user.pushUser("ADMIN") 783 adminUserInfo = ec.user.pushUser("ADMIN")
784 ec.logger.info("MCP session update visit 789 ${visit}")
786 visit.initialRequest = groovy.json.JsonOutput.toJson(metadata) 785 visit.initialRequest = groovy.json.JsonOutput.toJson(metadata)
787 ec.artifactExecution.disableAuthz() 786 ec.artifactExecution.disableAuthz()
788 visit.update() 787 visit.update()
...@@ -812,6 +811,7 @@ ...@@ -812,6 +811,7 @@
812 UserInfo adminUserInfo = null 811 UserInfo adminUserInfo = null
813 try { 812 try {
814 adminUserInfo = ec.user.pushUser("ADMIN") 813 adminUserInfo = ec.user.pushUser("ADMIN")
814 ec.logger.info("MCP session update visit 819 ${visit}")
815 visit.initialRequest = groovy.json.JsonOutput.toJson(metadata) 815 visit.initialRequest = groovy.json.JsonOutput.toJson(metadata)
816 ec.artifactExecution.disableAuthz() 816 ec.artifactExecution.disableAuthz()
817 visit.update() 817 visit.update()
......