• 12
    • 43
    • We collect Confluence feedback from various sources, and we evaluate what we've collected when planning our product roadmap. To understand how this piece of feedback will be reviewed, see our Implementation of New Features Policy.

      NOTE: This suggestion is for Confluence Server. Using Confluence Cloud? See the corresponding suggestion.

      A customer would like the ability to change/set user profile pictures from the Admin Console. They really would rather not bother current users with the manual task of configuring their profile pictures and they want every user to use a set of professional photographs. Having this sort of functionality would really help them in rolling out a professional looking instance of Confluence.

      Atlassian Update - January 2019

      Hi all,

      Thanks for all your interest in this suggestion.

      While we fully understand the need for administrators to update users’ profile pictures, this is not currently on our roadmap.

      We have however recently introduced a number of improvements to how administrators are able to manage users. These include the ability to delete users’ accounts and the ability to delete just a user’s profile picture, both which help you to meet GDPR requirements. For more information on these, check out our Confluence Server 6.13 and Confluence Server 6.14 release notes.

      We’ll update this issue when we have more information available on this request.

      Best
      Jenny Millman - Product Manager, Confluence Server

      Workaround

      According to Remote Confluence methods:

      The XML-RPC and SOAP APIs are deprecated since Confluence 5.5.
      Confluence has a new REST API that is progressively replacing our existing APIs. We recommend plugin developers use the new REST APIs where possible.

      While there isn't a REST API replacement for the addProfilePicture method, it may be possible to use it via the old XML-RPC and SOAP APIs on newer versions of Confluence. However, as these APIs are deprecated, they may be removed in future versions of Confluence.

            [CONFSERVER-14368] Let Confluence Admins change user profile pictures

            Pinned comments

            Workaround

            According to Remote Confluence methods:

            The XML-RPC and SOAP APIs are deprecated since Confluence 5.5.
            Confluence has a new REST API that is progressively replacing our existing APIs. We recommend plugin developers use the new REST APIs where possible.

            While there isn't a REST API replacement for the addProfilePicture method, it may be possible to use it via the old XML-RPC and SOAP APIs on newer versions of Confluence. However, as these APIs are deprecated, they may be removed in future versions of Confluence.

            Sample Python script that uses the addProfilePicture method via the old XML-RPC API to add a profile picture to a user

            It requires the Remote API (XML-RPC & SOAP) to be enabled as per this document: Enabling the Remote API

            Always test it in a non-production environment first and make sure you have a backup of your Confluence instance.

            addProfilePicture-XML-RPC.py
            #!/usr/bin/env python3
            import xmlrpc.client
            import argparse
            import mimetypes
            import os
            
            # Create argument parser
            parser = argparse.ArgumentParser(description='Add profile picture via Confluence XML-RPC')
            parser.add_argument('-u', '--adminusername', required=True, help='Admin username')
            parser.add_argument('-p', '--adminpassword', required=True, help='Admin password')
            parser.add_argument('--baseurl', required=True, help='Confluence base URL (e.g., https://my-confluence.com/confluence)')
            parser.add_argument('--targetuser', required=True, help='Target user to add profile picture to')
            parser.add_argument('--picturefile', required=True, help='Picture file name')
            
            # Parse arguments
            args = parser.parse_args()
            
            # Extract only the filename from the path
            filename = os.path.basename(args.picturefile)
            
            # Determine MIME type based on file extension (using full path)
            mime_type, _ = mimetypes.guess_type(args.picturefile)
            if mime_type is None or not mime_type.startswith('image/'):
                mime_type = 'image/'  # Default fallback
            
            print(f"Using MIME type: {mime_type}")
            
            # Read the picture file as raw bytes (using full path)
            try:
                with open(args.picturefile, 'rb') as f:
                    picture_data = f.read()
                print(f"Successfully read {len(picture_data)} bytes from {args.picturefile}")
            except FileNotFoundError:
                print(f"Error: Picture file '{args.picturefile}' not found")
                exit(1)
            except Exception as e:
                print(f"Error reading picture file: {e}")
                exit(1)
            
            # Construct the XML-RPC endpoint URL
            xmlrpc_url = f"{args.baseurl}/rpc/xmlrpc"
            print(f"Connecting to: {xmlrpc_url}")
            
            try:
                proxy = xmlrpc.client.ServerProxy(xmlrpc_url)
                
                # Login
                print(f"Logging in as {args.adminusername}...")
                auth_token = proxy.confluence2.login(args.adminusername, args.adminpassword)
                print(f"Login successful. Auth token: {auth_token}")
                
                # Add profile picture
                print(f"Adding profile picture '{filename}' for user '{args.targetuser}'...")
                result = proxy.confluence2.addProfilePicture(auth_token, args.targetuser, filename, mime_type, picture_data)
                print(f"Profile picture added successfully. Result: {result}")
                
                # Logout
                print("Logging out...")
                logout_result = proxy.confluence2.logout(auth_token)
                print(f"Logout successful. Result: {logout_result}")
                
            except xmlrpc.client.Fault as fault:
                print(f"XML-RPC Fault: {fault.faultCode} - {fault.faultString}")
                exit(1)
            except Exception as e:
                print(f"Error during XML-RPC operation: {e}")
                exit(1)
            

            Gabriel Piedade added a comment - Workaround According to Remote Confluence methods : The XML-RPC and SOAP APIs are deprecated since Confluence 5.5 . Confluence has a new REST API that is progressively replacing our existing APIs. We recommend plugin developers use the new REST APIs where possible. While there isn't a REST API replacement for the addProfilePicture method , it may be possible to use it via the old XML-RPC and SOAP APIs on newer versions of Confluence. However, as these APIs are deprecated, they may be removed in future versions of Confluence. Sample Python script that uses the addProfilePicture method via the old XML-RPC API to add a profile picture to a user It requires the Remote API (XML-RPC & SOAP) to be enabled as per this document: Enabling the Remote API Always test it in a non-production environment first and make sure you have a backup of your Confluence instance . addProfilePicture-XML-RPC.py #!/usr/ bin /env python3 import xmlrpc.client import argparse import mimetypes import os # Create argument parser parser = argparse.ArgumentParser(description= 'Add profile picture via Confluence XML-RPC' ) parser.add_argument( '-u' , '--adminusername' , required= True , help = 'Admin username' ) parser.add_argument( '-p' , '--adminpassword' , required= True , help = 'Admin password' ) parser.add_argument( '--baseurl' , required= True , help = 'Confluence base URL (e.g., https://my-confluence.com/confluence)' ) parser.add_argument( '--targetuser' , required= True , help = 'Target user to add profile picture to' ) parser.add_argument( '--picturefile' , required= True , help = 'Picture file name' ) # Parse arguments args = parser.parse_args() # Extract only the filename from the path filename = os.path.basename(args.picturefile) # Determine MIME type based on file extension (using full path) mime_type, _ = mimetypes.guess_type(args.picturefile) if mime_type is None or not mime_type.startswith( 'image/' ): mime_type = 'image/' # Default fallback print (f "Using MIME type : {mime_type}" ) # Read the picture file as raw bytes (using full path) try : with open (args.picturefile, 'rb' ) as f: picture_data = f.read() print (f "Successfully read { len (picture_data)} bytes from {args.picturefile}" ) except FileNotFoundError: print (f "Error: Picture file '{args.picturefile}' not found" ) exit (1) except Exception as e: print (f "Error reading picture file : {e}" ) exit (1) # Construct the XML-RPC endpoint URL xmlrpc_url = f "{args.baseurl}/rpc/xmlrpc" print (f "Connecting to: {xmlrpc_url}" ) try : proxy = xmlrpc.client.ServerProxy(xmlrpc_url) # Login print (f "Logging in as {args.adminusername}..." ) auth_token = proxy.confluence2.login(args.adminusername, args.adminpassword) print (f "Login successful. Auth token: {auth_token}" ) # Add profile picture print (f "Adding profile picture '{filename}' for user '{args.targetuser}' ..." ) result = proxy.confluence2.addProfilePicture(auth_token, args.targetuser, filename, mime_type, picture_data) print (f "Profile picture added successfully. Result: {result}" ) # Logout print ( "Logging out..." ) logout_result = proxy.confluence2.logout(auth_token) print (f "Logout successful. Result: {logout_result}" ) except xmlrpc.client.Fault as fault: print (f "XML-RPC Fault: {fault.faultCode} - {fault.faultString}" ) exit (1) except Exception as e: print (f "Error during XML-RPC operation: {e}" ) exit (1)

            All comments

            Workaround

            According to Remote Confluence methods:

            The XML-RPC and SOAP APIs are deprecated since Confluence 5.5.
            Confluence has a new REST API that is progressively replacing our existing APIs. We recommend plugin developers use the new REST APIs where possible.

            While there isn't a REST API replacement for the addProfilePicture method, it may be possible to use it via the old XML-RPC and SOAP APIs on newer versions of Confluence. However, as these APIs are deprecated, they may be removed in future versions of Confluence.

            Sample Python script that uses the addProfilePicture method via the old XML-RPC API to add a profile picture to a user

            It requires the Remote API (XML-RPC & SOAP) to be enabled as per this document: Enabling the Remote API

            Always test it in a non-production environment first and make sure you have a backup of your Confluence instance.

            addProfilePicture-XML-RPC.py
            #!/usr/bin/env python3
            import xmlrpc.client
            import argparse
            import mimetypes
            import os
            
            # Create argument parser
            parser = argparse.ArgumentParser(description='Add profile picture via Confluence XML-RPC')
            parser.add_argument('-u', '--adminusername', required=True, help='Admin username')
            parser.add_argument('-p', '--adminpassword', required=True, help='Admin password')
            parser.add_argument('--baseurl', required=True, help='Confluence base URL (e.g., https://my-confluence.com/confluence)')
            parser.add_argument('--targetuser', required=True, help='Target user to add profile picture to')
            parser.add_argument('--picturefile', required=True, help='Picture file name')
            
            # Parse arguments
            args = parser.parse_args()
            
            # Extract only the filename from the path
            filename = os.path.basename(args.picturefile)
            
            # Determine MIME type based on file extension (using full path)
            mime_type, _ = mimetypes.guess_type(args.picturefile)
            if mime_type is None or not mime_type.startswith('image/'):
                mime_type = 'image/'  # Default fallback
            
            print(f"Using MIME type: {mime_type}")
            
            # Read the picture file as raw bytes (using full path)
            try:
                with open(args.picturefile, 'rb') as f:
                    picture_data = f.read()
                print(f"Successfully read {len(picture_data)} bytes from {args.picturefile}")
            except FileNotFoundError:
                print(f"Error: Picture file '{args.picturefile}' not found")
                exit(1)
            except Exception as e:
                print(f"Error reading picture file: {e}")
                exit(1)
            
            # Construct the XML-RPC endpoint URL
            xmlrpc_url = f"{args.baseurl}/rpc/xmlrpc"
            print(f"Connecting to: {xmlrpc_url}")
            
            try:
                proxy = xmlrpc.client.ServerProxy(xmlrpc_url)
                
                # Login
                print(f"Logging in as {args.adminusername}...")
                auth_token = proxy.confluence2.login(args.adminusername, args.adminpassword)
                print(f"Login successful. Auth token: {auth_token}")
                
                # Add profile picture
                print(f"Adding profile picture '{filename}' for user '{args.targetuser}'...")
                result = proxy.confluence2.addProfilePicture(auth_token, args.targetuser, filename, mime_type, picture_data)
                print(f"Profile picture added successfully. Result: {result}")
                
                # Logout
                print("Logging out...")
                logout_result = proxy.confluence2.logout(auth_token)
                print(f"Logout successful. Result: {logout_result}")
                
            except xmlrpc.client.Fault as fault:
                print(f"XML-RPC Fault: {fault.faultCode} - {fault.faultString}")
                exit(1)
            except Exception as e:
                print(f"Error during XML-RPC operation: {e}")
                exit(1)
            

            Gabriel Piedade added a comment - Workaround According to Remote Confluence methods : The XML-RPC and SOAP APIs are deprecated since Confluence 5.5 . Confluence has a new REST API that is progressively replacing our existing APIs. We recommend plugin developers use the new REST APIs where possible. While there isn't a REST API replacement for the addProfilePicture method , it may be possible to use it via the old XML-RPC and SOAP APIs on newer versions of Confluence. However, as these APIs are deprecated, they may be removed in future versions of Confluence. Sample Python script that uses the addProfilePicture method via the old XML-RPC API to add a profile picture to a user It requires the Remote API (XML-RPC & SOAP) to be enabled as per this document: Enabling the Remote API Always test it in a non-production environment first and make sure you have a backup of your Confluence instance . addProfilePicture-XML-RPC.py #!/usr/ bin /env python3 import xmlrpc.client import argparse import mimetypes import os # Create argument parser parser = argparse.ArgumentParser(description= 'Add profile picture via Confluence XML-RPC' ) parser.add_argument( '-u' , '--adminusername' , required= True , help = 'Admin username' ) parser.add_argument( '-p' , '--adminpassword' , required= True , help = 'Admin password' ) parser.add_argument( '--baseurl' , required= True , help = 'Confluence base URL (e.g., https://my-confluence.com/confluence)' ) parser.add_argument( '--targetuser' , required= True , help = 'Target user to add profile picture to' ) parser.add_argument( '--picturefile' , required= True , help = 'Picture file name' ) # Parse arguments args = parser.parse_args() # Extract only the filename from the path filename = os.path.basename(args.picturefile) # Determine MIME type based on file extension (using full path) mime_type, _ = mimetypes.guess_type(args.picturefile) if mime_type is None or not mime_type.startswith( 'image/' ): mime_type = 'image/' # Default fallback print (f "Using MIME type : {mime_type}" ) # Read the picture file as raw bytes (using full path) try : with open (args.picturefile, 'rb' ) as f: picture_data = f.read() print (f "Successfully read { len (picture_data)} bytes from {args.picturefile}" ) except FileNotFoundError: print (f "Error: Picture file '{args.picturefile}' not found" ) exit (1) except Exception as e: print (f "Error reading picture file : {e}" ) exit (1) # Construct the XML-RPC endpoint URL xmlrpc_url = f "{args.baseurl}/rpc/xmlrpc" print (f "Connecting to: {xmlrpc_url}" ) try : proxy = xmlrpc.client.ServerProxy(xmlrpc_url) # Login print (f "Logging in as {args.adminusername}..." ) auth_token = proxy.confluence2.login(args.adminusername, args.adminpassword) print (f "Login successful. Auth token: {auth_token}" ) # Add profile picture print (f "Adding profile picture '{filename}' for user '{args.targetuser}' ..." ) result = proxy.confluence2.addProfilePicture(auth_token, args.targetuser, filename, mime_type, picture_data) print (f "Profile picture added successfully. Result: {result}" ) # Logout print ( "Logging out..." ) logout_result = proxy.confluence2.logout(auth_token) print (f "Logout successful. Result: {logout_result}" ) except xmlrpc.client.Fault as fault: print (f "XML-RPC Fault: {fault.faultCode} - {fault.faultString}" ) exit (1) except Exception as e: print (f "Error during XML-RPC operation: {e}" ) exit (1)

            Michael Steiner added a comment - - edited

            6a7878a40114     can you please do this for my 2000 user?  

            joke-   if you have just some users thats fine but not for big/enterprise instances

            Michael Steiner added a comment - - edited 6a7878a40114      can you please do this for my 2000 user?   joke-   if you have just some users thats fine but not for big/enterprise instances

            I have a workaround to change the profile picture as an admin.

            As an admin, you need to be a member of the Confluence group ‘confluence-administrators.’ Then, you can go to user management, search for the user whose profile picture you want to change, and click on ‘Switch User’ on the right.

            Now, you will see everything as this user. Go to Profile, and here you can change the user’s profile picture.

            Schubert System Elektronik GmbH - IT added a comment - I have a workaround to change the profile picture as an admin. As an admin, you need to be a member of the Confluence group ‘confluence-administrators.’ Then, you can go to user management, search for the user whose profile picture you want to change, and click on ‘Switch User’ on the right. Now, you will see everything as this user. Go to Profile, and here you can change the user’s profile picture.

            Kevin added a comment -

            Just keep voting for it and adding comments, such a trivial request and has so much value it baffles me why it cannot be implemented

            Kevin added a comment - Just keep voting for it and adding comments, such a trivial request and has so much value it baffles me why it cannot be implemented

            Bump. It's hard to believe Atlassian still hasn't fixed this. Such a simple change!

            Rich Nacinovich added a comment - Bump. It's hard to believe Atlassian still hasn't fixed this. Such a simple change!

            Please do it

            Oleksandr Kryvorotko added a comment - Please do it

            This ticket is not even assigned to anyone after all these years!  What does that mean?  Nobody cares?

            SEAK Teng-Fong added a comment - This ticket is not even assigned to anyone after all these years!  What does that mean?  Nobody cares?

            Christian added a comment -

            Holy moly... Still not possible? 😅

            Christian added a comment - Holy moly... Still not possible? 😅

            Kevin added a comment -

            I agree, Admins should be able to add user profile pictures, in Jira Cloud as well.

            Kevin added a comment - I agree, Admins should be able to add user profile pictures, in Jira Cloud as well.

            Possible to push this up in priority?  I know it was not in the roadmap but that was in 2019.  We are in 2022 now.

            SEAK Teng-Fong added a comment - Possible to push this up in priority?  I know it was not in the roadmap but that was in 2019.  We are in 2022 now.

              Unassigned Unassigned
              mtaylor@atlassian.com Maleko Taylor (Inactive)
              Votes:
              515 Vote for this issue
              Watchers:
              261 Start watching this issue

                Created:
                Updated: