static boolean processPasswordCallbacks(Callback[] callbacks, String serverName,
			String defaultUserID, String loginError) throws IOException {
		getClientAuthenticator();
		if (clientAuthenticator == null) {
			Msg.error(ClientUtil.class, "Unable to authenticate user without ClientAuthenticator");
			return false;
		}
		NameCallback nameCb = null;
		PasswordCallback passCb = null;
		ChoiceCallback choiceCb = null;
		AnonymousCallback anonymousCb = null;
		for (Callback callback : callbacks) {
			if (callback instanceof NameCallback) {
				nameCb = (NameCallback) callback;
				nameCb.setName(defaultUserID);
			}
			else if (callback instanceof PasswordCallback) {
				passCb = (PasswordCallback) callback;
			}
			else if (callback instanceof ChoiceCallback) {
				choiceCb = (ChoiceCallback) callback;
			}
			else if (callback instanceof AnonymousCallback) {
				anonymousCb = (AnonymousCallback) callback;
			}
		}
		if (passCb == null) {
			throw new IOException(
				"Unsupported authentication callback: " + callbacks[0].getClass().getName());
		}
		if (!clientAuthenticator.processPasswordCallbacks("Repository Server Authentication",
			"Repository Server", serverName, nameCb != null, nameCb, passCb, choiceCb, anonymousCb,
			loginError)) {
			return false;
		}
		String name = defaultUserID;
		if (nameCb != null) {
			name = nameCb.getName();
			if (name == null) {
				name = nameCb.getDefaultName();
			}
		}
		Msg.info(ClientUtil.class,
			"Password authenticating to " + serverName + " as user '" + name + "'");
		return true;
	}
Prompt user and change password on server (not initiated by user).
@param parent dialog parent
@param handle server handle
@param serverInfo server information
@throws IOException if error occurs while updating password
Ghidra/Framework/FileSystem/src/main/java/ghidra/framework/client/ClientUtil.java